在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2675|回复: 4

请教关于PCI驱动与app通讯的问题

[复制链接]
发表于 2008-7-14 16:55:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
环境:DS3.2,winxp,xpddk,基本上就是在DS3.2的架构上面加了点东西,而且也基本上是在网上那个9054实现IO的例程上面搬下来的(只是不知道我下的那个版本是不是真的正确的……)
NTSTATUS FirstDevice:eviceControl(KIrp I)
{
      NTSTATUS status=STATUS_SUCCESS;
      switch(I.IoctlCode())
      {
       case IOCTL_800:
               status=IOCTL_800Queue.QueueIrp(I);
               break;
       default:
               status=STATUS_INVALID_DEVICE_REQUEST;
               break;
      }
      return status;
}
void FirstDevice::Serial_IOCTL_800_Handler(KIrp I)
{
      NTSTATUS status= STATUS_SUCCESS;
      KMemory Mem(I.Mdl());
      USHORT count;
      USHORT Offset;
      ULONG input Size=I.IoctlInputBufferSize();
      ULONG outputSize=I.IoctlOutputBufferSize();
      PVOID inputBuffer=I.IoctlBuffer();
      PVOID outputBuffer=NULL;
      outputBuffer=Mem.MapToSystemSpace();
      Offset=*((PUSHORT)inputBuffer);
      count=*((PUSHORT)inputBuffer+1);
      PciMemory0.inw(Offset,(PUSHORT)outputBuffer,count);
      if(FALSE)
      {
            status=STATUS_INVALID_PARAMETER;
            I.Information()=0;
      }
      else
      {
      }
      I.Information()=count*sizeof(USHORT);
      I.Status()=status;
      IOCTL_800Queue.PnpNextIrp(I);
}
//app
char* sLinkName=//这里是文件的路径和文件名,选的是直接生成sys的目录
先调用如下函数:
m_hDevice=CreateFile(sLinkName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
得到了一个有效的句柄,然后定义两个全局缓冲区
#define IOCTL_INBUF_SIZE   800
#define IOCTL_OUTBUF_SIZE 800
USHORT bufOutput[IOCTL_OUTBUF_SIZE];
USHORT bufInput[IOCTL_INBUF_SIZE+2];
再在一个按键的函数里面调用DeviceIoControl:
void CFirstTestDlg::OnButtonRead()
{
       ULONG nOutput;
       USHORT offset=0;
       bufInput[0]=offset;
       bufInput[1]=IOCTL_OUTBUF_SIZE;
       if(!DeviceIoControl(m_hDevice,IOCTL_800,bufInput,2*sizeof(USHORT),bufOutput,IOCTL_OUTBUF_SIZE*sizeof(USHORT),&nOutput,NULL))
       {
           ……
       }
       else
         ……
}
编译通过,在初始化的时候也读到了合法的文件句柄,但是在按下Read按钮的时候,执行的是if当中的语句,显然DeviceIoControl函数并没有从驱动读到数据,请问这里出了什么和通讯失败相关的错误?
小弟初学PCI驱动,对windows的编程也是一知半解(对C++还算了解一些,C是最熟悉的,一直在用)所以,还希望能够尽可能详细地指教,谢谢。
 楼主| 发表于 2008-7-14 16:59:36 | 显示全部楼层
见鬼,第一行是
……:: DeviceControl(……)
没想到这里也出类似的表情问题……
从代码的第一行到//app    都是驱动层的
 楼主| 发表于 2008-7-14 17:23:57 | 显示全部楼层
声明一下,硬件的板卡应该是好使的,买的别人的IO卡。
 楼主| 发表于 2008-7-15 08:40:22 | 显示全部楼层
人工置顶,直到找到答案为止
 楼主| 发表于 2008-7-16 10:41:59 | 显示全部楼层
没人回答?是不是问题太低级了?又或者我漏了什么关键信息?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-13 04:33 , Processed in 0.019041 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表