stm 32 USB隐藏报告

时间:2015-06-12 14:26:15

标签: usb report hid stm32 descriptor

两个星期后,我试图将我的卡(stm32F4)配置为与usb对话,并在Windows 7下使用电脑进行对话。我使用此描述符取得了成功:

__ALIGN_BEGIN static uint8_t HID_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
    0x06, 0xFF, 0x00,      // USAGE_PAGE (Vendor Page: 0xFF00)                      
    0x09, 0x01,            // USAGE (Demo Kit)                  
    0xa1, 0x01,            // COLLECTION (Application)
    //0x85, 0x01,                   //     REPORT_ID (1)             
    0x09, 0x02,                    //     USAGE (DATA)
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
    0x26, 0xff,0x00,               //     LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x04,                    //     REPORT_COUNT (4)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs,Vol)
    0xc0                           // END_COLLECTION
}; 

像这样的窗口识别我的卡就像一个兼容的HID组件。

现在,如果我想像uint32那样发送32位数据,那么Windows会识别该卡,但会看到一个错误,告诉它无法启动它!我的描述符:

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
    0x06, 0xFF, 0x00,      // USAGE_PAGE (Vendor Page: 0xFF00)                      
    0x09, 0x01,            // USAGE (Demo Kit)                  
    0xa1, 0x01,            // COLLECTION (Application)        
    0x09, 0x02,                    //     USAGE (DATA)
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
    0x27, 0xff,0xff,0xff,0xff,               //     LOGICAL_MAXIMUM (65535)
    0x75, 0x20,                    //     REPORT_SIZE (32)
    0x95, 0x01,                    //     REPORT_COUNT (1)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs,Vol)
    0xc0                           // END_COLLECTION
};

我不明白为什么它不起作用!

之后,我使用USBlyser在我的电脑上扫描我的其他USB设备,我把这个描述符关于我的spacespilot 3D鼠标:

Endpoint Descriptor 83 3 In, Interrupt, 16 ms
Offset Field Size Value Description 
0 bLength 1 07h  
1 bDescriptorType 1 05h Endpoint 
2 bEndpointAddress 1 83h 3 In 
3 bmAttributes 1 03h Interrupt 
 1..0: Transfer Type  ......11  Interrupt 
 7..2: Reserved  000000..   
4 wMaxPacketSize 2 0007h 7 bytes 
6 bInterval 1 08h 16 ms 

Interface 1 HID Report Descriptor Multi-Axis Controller
Item Tag (Value) Raw Data 
Usage Page (Generic Desktop) 05 01  
Usage (Multi-Axis Controller) 09 08  
Collection (Application) A1 01  
    Collection (Physical) A1 00  
        Report ID (1) 85 01  
        Logical Minimum (-500) 16 0C FE  
        Logical Maximum (500) 26 F4 01  
        Physical Minimum (-32768) 36 00 80  
        Physical Maximum (32767) 46 FF 7F  
        Usage (X) 09 30  
        Usage (Y) 09 31  
        Usage (Z) 09 32  
        Report Size (16) 75 10  
        Report Count (3) 95 03  
        Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02  
    End Collection C0

如果我试试这个,它运作正常:

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
    0x05, 0x01,      // Usage Page (Generic Desktop)                    
    0x09, 0x08,            //Usage (Multi-Axis Controller)               
    0xa1, 0x01,            // COLLECTION (Application)
    0xa1, 0x00,            // Collection (Physical)
    0x85, 0x01,            // Report ID (1)
    0x16,0x0c,0xfe,        //logical minimum (-500)
    0x26,0xf4,0x01,        //logical maximum (500)
    0x35,0x00,               // Physical Minimum (0)
    0x46,0xff,0x00,              //Physical Maximum (255)
    0x09,0x30,             //Usage(X)
    0x09,0x31,                       //Usage(Y)
    0x09,0x32,                       //Usage(Z)
    0x09,0x33,                      //Usage(RX)
    0x09,0x34,                      //Usage(RY)
    0x09,0x35,                      ////Usage(RZ)
    0x75, 0x08,                    //     REPORT_SIZE (16)
    0x95, 0x06,                    //     REPORT_COUNT (6)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs,Vol)
    0xc0,                           // END_COLLECTION
    0xc0                           // END_COLLECTION
};

但是如果我尝试使用与我的3D鼠标相同的描述符:

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
    0x05, 0x01,      // Usage Page (Generic Desktop)                    
    0x09, 0x08,            //Usage (Multi-Axis Controller)               
    0xa1, 0x01,            // COLLECTION (Application)
    0xa1, 0x00,            // Collection (Physical)
    0x85, 0x01,            // Report ID (1)
    0x16,0x0c,0xfe,        //logical minimum (-500)
    0x26,0xf4,0x01,        //logical maximum (500)
    0x35,0x00,0x80,              // Physical Minimum (-32768)
    0x46,0xff,0x7f,              //Physical Maximum (32767)
    0x09,0x30,             //Usage(X)
    0x09,0x31,                       //Usage(Y)
    0x09,0x32,                       //Usage(Z)
    0x75, 0x10,                    //     REPORT_SIZE (16)
    0x95, 0x03,                    //     REPORT_COUNT (3)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs,Vol)
    0xc0,                           // END_COLLECTION
    0xc0                           // END_COLLECTION
};

Windows给我同样的错误,无法启动设备!!!

如果有人能说我出了什么问题。我是否需要一个特殊的Windows驱动程序才能发送32位数据(int32)?有关信息,我使用hid库为我的app pc端。

你知道我怎么解决这个问题吗?我非常失望......

2 个答案:

答案 0 :(得分:1)

偶然发现了这一点,希望你能找到答案,但为了后人的缘故,我会权衡。

LOGICAL_MAXIMUM 4字节描述符标记(0x27)仅对0x7FFFFFFF有效,因为它描述了带符号 int数据字段的最大值。如果要描述unsigned int数据字段,则需要使用LOGICAL_MAXIMUM 8字节描述符标记,如下所示:

0x28,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00

你的第二个例子可行,我想除了物理最大描述符标签的拼写错误。它应该是0x36而不是0x35。

答案 1 :(得分:0)

当我尝试最后一个描述符(使用stm32f1的Arduino USBComposite库)时,Windows给我一个有关该描述符包含未知项的错误。但是,当我将“物理最小值”行中的0x35更改为0x36时,Windows识别出该项目。