阅读:1913回复:7
HID类设备的问题?
现已实现HID 类 USB设备的枚举和数据传输,使用的是D12,不过都是通过端点1进行的,现想改为通过端点2进行,请问哪个做过类似的设计,需要改动哪些地方?
就我理解的:要改写收发端点描述符,相应的写收端点地址,但实验了不行,数据传输不了,好象还需要改动HID-report? code char hid_report_desc_table[] = { 0x06,0xA0,0xFF, // Usage Page (FFA0H = vendor defined) 0x09,0x01, // Usage (vendor defined) 0xA1,0x01, // Collection (Application) //The input report 0x09,0x01, // Usage (vendor defined) 0x15,0x00, // Logical minimum (0) 0x25,0xFF, // Logical maximum (255) 0x75,0x08, // Report size (8 bits) 0x95,0x0f, // Report count (16 fields) 0x81,0x02, // Input (Data, variable, absolute) // The output report 0x09,0x02, // Usage (vendor defined) 0x75,0x08, // Report size (8 bits) 0x95,0x0f, // Report count (16 fields) 0x91,0x02, // Output (Data, Variable, Absolute) 0xC0 // End Collection }; 这里需要改写哪些啊?高手指点下? |
|
沙发#
发布于:2005-05-05 21:01
code unsigned char DeviceDescr[]=
{ 0x12,//sizeof(USB_DEVICE_DESCRIPTOR),//0x12 0x01,//USB_DEVICE_DESCRIPTOR_TYPE,//01 device 0x10,0x01,//SWAP(),//Spec v1.10 npw SWAP is not MACRO so it can be expanded(1.10) 0x0,//class code 0x0,//subclass code 0x0,//protocol code 0x10,//EP0_PACKET_SIZE,//16 0x34,0x12,//SWAP(),//Vendor ID 0x78,0x56,//SWAP(),//product ID 0x02,0x01,//SWAP(),// bcd Device 0x01,//0x01,//imanufacture 0x02,//0x02,//iproduct 0x03,//0x03,//iserial number 0x1//num of configuration }; code unsigned char ConfigDescr[]= //congif + interface + HID Class +EP { 0x09,//sizeof(USB_CONFIGURATION_DESCRIPTOR),//09 length 0x02,//USB_CONFIGURATION_DESCRIPTOR_TYPE,//2 ////////////////it has to be modified 0x22,0x00,//(9+9+7+???????) 34 ge 0x1,//bNumInterfaces 0x1,//bConfigurationValue 0x04,//0x4,//iConfiguration 0xc0,//bmAttributes self powered 1,1,00,0000 0x32//MaxPower }; code unsigned char InterfaceDescr[]= { 0x09,//sizeof(USB_INTERFACE_DESCRIPTOR),//bLength : 0x09 0x04,//USB_INTERFACE_DESCRIPTOR_TYPE,//bDescriptorType : 0x04 0x0,//bInterfaceNumber : 0x00 1 (o based) 0x0,//bAlternateSetting : 0x00(none) 0x01,//bNumEndpoints 0x03,//0xDC,//bInterfaceClass : 0x08 (USB specified device class) 0x0,//0xA0,//bInterfaceSubClass : 0x06 0x0,//0xB0,//bInterfaceProtocol : 0x50 (class specific) 0x05//0x5//iInterface }; code unsigned char HidDescr[]= { 0x09,//db 09h ; Descriptor length (9 bytes) 0x21,//db 21h ; Descriptor type (HID) 0x00,0x01,//db 00h,01h ; HID class release number (1.00) 0x00,//db 00h ; Localized country code (None) 0x01,//db 01h ; # of HID class dscrptr to follow (1) 0x22,//db 22h ; Report descriptor type (HID) 0x34,0x00// ; Total length of report descriptor 52 bytes //db (end_hid_report_desc_table - hid_report_desc_table),00h }; code unsigned char EP1_TxDescr[]= { //Descriptor (Endpoint 0x00) Fields: 0x07,//sizeof(USB_ENDPOINT_DESCRIPTOR),//bLength : 0x07 0x05,//bDescriptorType : 0x05 0x81,//bEndpointAddress : 0x81 (ep #1, IN) 0x03,//bmAttributes : 0x03 (Transfer Type : Interrupt) 0x16,0x00,//wMaxPacketSize : 0x0040 100//bInterval : 0x00 (10 milliseconds) }; code unsigned char USB_HID_REPORT_DESCRIPTOR[]= { //hid_report_desc_table: 0x06, 0xA0, 0xFF, // ; Usage Page (vendor defined) FFA0 0x09, 0x01, // ; Usage (vendor defined) 01 0xA1, 0x01, //; Collection (Application) 0x09, 0x02, //; Usage (vendor defined) 02 0xA1, 0x00, //; Collection (Physical) 0x06, 0xA1, 0xFF,// ; Usage Page (vendor defined) FFA1 //The input report 0x09, 0x03, //; usage - vendor defined 0x09, 0x04, //; usage - vendor defined 0x15, 0x80, // ; Logical Minimum (-128) 0x25, 0x7F, //; Logical Maximum (127) 0x35, 0x00, //; Physical Minimum (0) 0x45, 0xFF,//; Physical Maximum (255) //0x66, 0x00, 0x00; Unit (None (2 bytes)) 0x75, 0x08, //; Report Size (8) (bits) 0x95, 0x02, //; Report Count (2) (fields) 0x81, 0x02, //; Input (Data, Variable, Absolute) //The output report 0x09, 0x05, //; usage - vendor defined 0x09, 0x06, //; usage - vendor defined 0x15, 0x80, //; Logical Minimum (-128) 0x25, 0x7F, //; Logical Maximum (127) 0x35, 0x00, //; Physical Minimum (0) 0x45, 0xFF, //; Physical Maximum (255) //0x66, 0x00, 0x00; Unit (None (2 bytes)) 0x75, 0x08, //; Report Size (8) (bits) 0x95, 0x02, //; Report Count (2) (fields) 0x91, 0x02, //; Output (Data, Variable, Absolute) 0xC0, // ; End Collection 0xC0 //; End Collection }; 以上是我做的试验设备的HID描述符号 用的是端点1 IN端点 如要改变,只需将HID报告描述符的report count行的大小改成相应的字节大小即可。 上面定义的是两个字节的输出报告 和2个字节的输入报告 希望以上信息对你有用。。。。 |
|
板凳#
发布于:2005-05-05 20:51
HID 设备 如果要输入输出的话
除控制端点外,一般 只需要一个端点。 而且这个端点是中断IN端点。这个端点是用于输入数据到主机的。 其余的端点就闲置不用了。 而输出数据到设备,有两种方式可选择; 一种是通过控制端点,传输到设备 一种是通过中断OUT端点,传输到设备。 第一种方法是通过控制传输,传输到设备 第二种方法我没有试过。但资料上说,如果要用这种方法,需要一个额外的OUT端点。 读写设备用的API为WriteFile和ReadFile 没有必要按照DDK上所说的一步步调用那些函数 至于到底用那个端点好像都没有限制。 感觉端点只是一个数据缓冲区。 如果传输数据的量小于60 也就没有必要将 端点描述符中的 wMaxPacketSize 设置为60 设置为传输数据包的大小就可以了。 应用程序设置的缓冲区 的第一个字节为 报告描述符的索引。 如果没有多个报告描述符,则清零 后面的才是输入输出描述符的存储区域 所以缓冲区比输入输出描述符多一个字节 并且在首次使用之前要用ZeroMemory清零 [编辑 - 5/5/05 by zhaobeishengcool] |
|
地板#
发布于:2005-05-01 16:53
哪个高手指点下啊!!!!!!
|
|
地下室#
发布于:2005-05-01 12:33
谢谢楼主
|
|
5楼#
发布于:2005-04-29 13:48
不是的,不止要改写Endpoint Descriptor,应该还要改写Report Descriptor,因为我提供的那个报表是16个字节的,端点2是64个字节的啊,可能是这样!
我改写了Endpoint Descriptor,能发现hid硬件,但数据通过端点2传输不行 |
|
6楼#
发布于:2005-04-28 21:56
应该改写的是Endpoint Descriptor, 和Report Descriptor无关。
其实关键在设法让Windows显示\"发现新硬件\"。否则任何改动无效。我正在发愁如何让Windows显示\"发现新硬件\",特意发了一个帖子请教大家。我现在用的是笨办法,每次改变Vendor ID. 你能帮我吗? |
|
7楼#
发布于:2005-04-28 14:59
自己顶下!
|
|