xiaozhou123
驱动牛犊
驱动牛犊
  • 注册日期2005-01-13
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1913回复:7

HID类设备的问题?

楼主#
更多 发布于:2005-04-27 13:21
现已实现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
 
 };
这里需要改写哪些啊?高手指点下?
zhaobeishengcoo
驱动牛犊
驱动牛犊
  • 注册日期2004-02-25
  • 最后登录2005-05-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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个字节的输入报告

希望以上信息对你有用。。。。
zhaobeishengcoo
驱动牛犊
驱动牛犊
  • 注册日期2004-02-25
  • 最后登录2005-05-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-05 20:51
HID 设备 如果要输入输出的话
除控制端点外,一般 只需要一个端点。
而且这个端点是中断IN端点。这个端点是用于输入数据到主机的。
其余的端点就闲置不用了。

而输出数据到设备,有两种方式可选择;
一种是通过控制端点,传输到设备
一种是通过中断OUT端点,传输到设备。

第一种方法是通过控制传输,传输到设备
第二种方法我没有试过。但资料上说,如果要用这种方法,需要一个额外的OUT端点。

读写设备用的API为WriteFile和ReadFile
没有必要按照DDK上所说的一步步调用那些函数

至于到底用那个端点好像都没有限制。
感觉端点只是一个数据缓冲区。

如果传输数据的量小于60
也就没有必要将 端点描述符中的 wMaxPacketSize 设置为60
设置为传输数据包的大小就可以了。

应用程序设置的缓冲区 的第一个字节为 报告描述符的索引。
如果没有多个报告描述符,则清零
后面的才是输入输出描述符的存储区域
所以缓冲区比输入输出描述符多一个字节
并且在首次使用之前要用ZeroMemory清零



[编辑 -  5/5/05 by  zhaobeishengcool]
xiaozhou123
驱动牛犊
驱动牛犊
  • 注册日期2005-01-13
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-01 16:53
哪个高手指点下啊!!!!!!
ultrajack
驱动牛犊
驱动牛犊
  • 注册日期2005-04-25
  • 最后登录2005-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-01 12:33
谢谢楼主
xiaozhou123
驱动牛犊
驱动牛犊
  • 注册日期2005-01-13
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-04-29 13:48
不是的,不止要改写Endpoint Descriptor,应该还要改写Report Descriptor,因为我提供的那个报表是16个字节的,端点2是64个字节的啊,可能是这样!
我改写了Endpoint Descriptor,能发现hid硬件,但数据通过端点2传输不行
Descriptor
驱动牛犊
驱动牛犊
  • 注册日期2005-03-13
  • 最后登录2006-01-19
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-04-28 21:56
应该改写的是Endpoint Descriptor, 和Report Descriptor无关。
其实关键在设法让Windows显示\"发现新硬件\"。否则任何改动无效。我正在发愁如何让Windows显示\"发现新硬件\",特意发了一个帖子请教大家。我现在用的是笨办法,每次改变Vendor ID.
你能帮我吗?
xiaozhou123
驱动牛犊
驱动牛犊
  • 注册日期2005-01-13
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-04-28 14:59
自己顶下!
游客

返回顶部