阅读:1742回复:9
请做过D12上位机程序的朋友帮忙看看(问题很具体)
我使用VC++编写上位机程序控制Philips公司的PDIUSBD12芯片,在写到对D12端口读写的函数DeviceIoControl时,遇到了问题,看别人的程序,是这么使用的:
bResult = DeviceIoControl(hDevice, IOCTL_WRITE_REGISTERS, (PVOID)&ioBlock, sizeof(IO_BLOCK), NULL, 0, &nBytes, NULL); 其中,IOCTL_WRITE_REGISTERS在一个头文件中有定义,定义如下: #define FILE_DEVICE_USB_SCAN 0x8000 #define IOCTL_INDEX 0x0800 #define IOCTL_GET_VERSION CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_CANCEL_IO CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX+1, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_WAIT_ON_DEVICE_EVENT CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX+2, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_READ_REGISTERS CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX+3, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_WRITE_REGISTERS CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX+4, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_GET_CHANNEL_ALIGN_RQST CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX+5, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_GET_DEVICE_DESCRIPTOR CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX+6, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_RESET_PIPE CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX+7, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_GET_USB_DESCRIPTOR CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX+8, METHOD_BUFFERED, FILE_ANY_ACCESS) 程序中只用到IOCTL_READ_REGISTERS和IOCTL_WRITE_REGISTERS,我不清楚 #define FILE_DEVICE_USB_SCAN 0x8000 #define IOCTL_INDEX 0x0800 根据什么定义的,在D12的产品手册中哪里能够找到相关信息? |
|
最新喜欢:![]() |
沙发#
发布于:2003-10-06 10:49
请问:
你USB设备上位机驱动,有没有做! 也就是说,当插入USB,主机能否认识! 如果驱动没有问题,才能考虑应用的问题。 我做过,与此相关的工作,我愿帮忙,但要把问题讲清楚。 王涛 于南京 |
|
板凳#
发布于:2003-10-06 11:59
驱动是好使的,也就是说,上位机能够与USB外设正常通讯,应用程序也是好用的。
我就是不知道这些代码是根据什么写出来的? |
|
地板#
发布于:2003-10-08 09:07
请问:d12驱动在win2000下也能用吗?
|
|
|
地下室#
发布于:2003-10-08 10:46
这个ctl code d12的手册中是没有的,具体定义如下:
定义I/O控制代码 DeviceIoControl的Code参数是一个32位数值常量,图9-9显示了操作系统分割这个32位代码的一种方式。 图9-9. I/O控制代码中的域 这些域的解释如下: Device type(16位,CTL_CODE宏的第一个参数) 指出能实现这个控制操作的设备类型。我并不知晓Windows 98或Windows 2000中的任何“IOCTL police”,但是我认为该域的内容实际上是任意的。习惯上我们使用与驱动程序中调用IoCreateDevice时使用的同一个值(例如,FILE_DEVICE_UNKNOWN)。 访问代码(“A”占2位,CTL_CODE的第四个参数) 指出使用设备句柄发出这个控制操作时,应用程序必须具有的访问权限。 Function code(12位,CTL_CODE的第二个参数) 指出该代码描述的是哪一个控制操作。Microsoft保留了该域的前半部分,从0到2047的值。因此我们只能使用从2048到4095之间的值。 缓冲方式(“M”占两位,CTL_CODE的第三个参数) 指出I/O管理器如何处理应用程序提供的输入输出缓冲区。在后面段中当讲述如何实现IRP_MJ_DEVICE_CONTROL时,我会更详细地讲述这个域。 需要阐明一点,编写驱动程序时,你可以自由地设计一系列IOCTL操作,应用程序也可以使用这些IOCTL操作与你的驱动程序对话。虽然有时你定义的IOCTL操作在数值上与其它人定义的完全相同,但系统不会被这种重叠所迷惑,因为你定义的IOCTL代码仅被你的驱动程序解释。 |
|
5楼#
发布于:2003-10-09 21:26
回pandengzhe,驱动在2000下可以用,但在XP下不能用。
|
|
6楼#
发布于:2003-10-09 21:32
jinghuiren,感谢你的回答,但是我看不到图9-9啊,能就这个问题详细解释一下吗,或者将相关的资料给我发个邮件好吗?谢谢!
|
|
7楼#
发布于:2003-10-10 08:24
zzz1995:
帮我看看好吗? http://www.driverdevelop.com/forum/html_52363.html?1065745157 |
|
|
8楼#
发布于:2003-10-10 11:06
ft!你还非要看见那个图呀!格式如下:
31 16 15 14 13 2 1 0 ---Device type------ A ------ Function code----- M - ok,满意了吧。 |
|
9楼#
发布于:2003-10-10 11:30
看看walter oney的programming the microsoft windows driver model这本书吧,以上内容就是这本书中的,本站有电子书下载,你会有收获的。
|
|