阅读:1115回复:3
急问:采用inb(),outb()时读写数据都正常,ind(),outd()却不对,why
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,读的时候却正常? 不知道为什么,也不知道说清楚了没有,哪位可以帮忙解释一下,小弟刚开始搞驱动,谢谢了 |
|
最新喜欢:dongyr |
沙发#
发布于:2003-10-13 15:41
看看你的数据类型和ram的数据线配不配合,如果你的数据线只是8条的话,那么肯定会乱码。
|
|
|
板凳#
发布于:2003-10-13 16:41
哦 谢谢
一语点醒梦中人啊 疏忽了 谢谢了 |
|
地板#
发布于:2003-10-13 16:43
解决了问题了阿?
|
|
|