dreamcatcher
驱动牛犊
驱动牛犊
  • 注册日期2003-08-28
  • 最后登录2010-05-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1115回复:3

急问:采用inb(),outb()时读写数据都正常,ind(),outd()却不对,why

楼主#
更多 发布于:2003-10-13 11:47
PCI的驱动程序; 采用bufferIO
//PCI9054Device.cpp
.
.
.
NTSTATUS PCI9054Device::DeviceControl(KIrp I)
{
NTSTATUS status;
switch (I.IoctlCode())
{
case PCI9054_IOCTL_800_reed0:
status = PCI9054_IOCTL_800_reea0_Handler(I);
break;

case PCI9054_IOCTL_801_write0:
status = PCI9054_IOCTL_801_write0_Handler(I);
break;

default:
// Unrecognized IOCTL request
status = STATUS_INVALID_PARAMETER;
break;
}
.
.
.
NTSTATUS PCI9054Device::PCI9054_IOCTL_800_write0_Handler(KIrp I)
{
 ...
PULONG pbuffer=(PULONG)I.IoctlBuffer();
ULONG  dwtotalsize=I.IoctlInputBufferSize(CURRENT); //bytes
m_MemoryRange1_Spce0.outd(0x00,pbuffer,dwtotalsize );
...
}
NTSTATUS PCI9054Device::PCI9054_IOCTL_800_reed0_Handler(KIrp I)
{
...
m_MemoryRange1_Spce0.ind(0x00,pbuffer,dwtotalsize );
...
}
在应用程序中;
向设备些数据:
void Test_PCI9054_IOCTL_801_write0(void)
{
...
ULONG bufInput[IOCTL_INBUF_SIZE];
ULONG nOutput;
...
if (!DeviceIoControl(hDevice,
PCI9054_IOCTL_801_write0,
bufInput,
IOCTL_INBUF_SIZE,
NULL,
0,
&nOutput,
NULL)
  )
{
printf(\"ERROR: DeviceIoControl returns %0x.\", GetLastError());
Exit(1);
}
...
}
从设备读数据:
void Test_PCI9054_IOCTL_800_read0(void)
{
ULONG bufOutput[IOCTL_OUTBUF_SIZE];
ULONG nOutput;
           if (!DeviceIoControl(hDevice,
            PCI9054_IOCTL_800_reed0,
           NULL,
0,
bufOutput,
           IOCTL_OUTBUF_SIZE,
 &nOutput,
 NULL)
  )
{
printf(\"ERROR: DeviceIoControl returns %0x.\", GetLastError());
Exit(1);
}
问题是;采用以上方法,向设备写入ULONG 或 in型t数据,只能有部分数据写入设备,比如IOCTL_INBUF_SIZE=16,那么只有前4个数据写入正确,其他的读出来都是乱码,或者说更本就没有写入设备ram;
但是若写入UCHAR数据则读写正常,也就是说按字节读写没有问题;
是不是应用程序中的数据大小 和 驱动中处理的数据大小不匹配?

还有,不是说DeviceIoControl中的nOutput返回实际读写的数据数吗,为什么在写的时候,总是0,读的时候却正常?

不知道为什么,也不知道说清楚了没有,哪位可以帮忙解释一下,小弟刚开始搞驱动,谢谢了

最新喜欢:

dongyrdongyr
CYoung
驱动中牛
驱动中牛
  • 注册日期2003-06-10
  • 最后登录2005-01-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-10-13 15:41
看看你的数据类型和ram的数据线配不配合,如果你的数据线只是8条的话,那么肯定会乱码。
答得好的话,请兄弟们加点分,那是对我的肯定
dreamcatcher
驱动牛犊
驱动牛犊
  • 注册日期2003-08-28
  • 最后登录2010-05-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-13 16:41
哦 谢谢
一语点醒梦中人啊
疏忽了
谢谢了
CYoung
驱动中牛
驱动中牛
  • 注册日期2003-06-10
  • 最后登录2005-01-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-10-13 16:43
解决了问题了阿?
答得好的话,请兄弟们加点分,那是对我的肯定
游客

返回顶部