打印

请香主和其他对usb hid熟悉的大侠帮忙解决问题

[复制链接]
3784|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhaoyu2005|  楼主 | 2013-1-25 16:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前的状况:
采用stm32f103rbt6主控芯片的设备,根据例程修改成自定义hid设备,PC能识别、正常安装驱动,用bushound能收发数据。
上位机软件(公司请别人写的)能发送数据到设备,但是上位机软件收不到设备返回的数据,设备返回的数据只能到总线一级。
请问知道的大侠,问题可能出在哪里,需要怎么修改?(感觉是报告描述符的问题,但是不知道怎么改,在网上也找了好久了,也改过多次测试,但是没弄好)
另外再说下情况:本人属于usb生手,第一次弄,参考stm的例程,和百合工作室还有其他的例子,修改的报告描述符,没用报告ID。
如果需要看usb的某个文件,我马上上传。
hid报告描述符的相关网页也看了不少,但是始终没能彻底理解。
请各位帮忙,谢谢了
沙发
IJK| | 2013-1-25 17:09 | 只看该作者
估计hid报告描述符 写得有问题,导致 enumeration 未成功。

使用特权

评论回复
板凳
zhaoyu2005|  楼主 | 2013-1-26 09:38 | 只看该作者
自己顶下,请问2L大侠,枚举和识别是什么关系,现在的情况是上位机软件能发送数据到设备,设备返回数据不能到软件,请问应大侠报告描述符大概修改哪些项目?

使用特权

评论回复
地板
Kelan| | 2013-1-26 10:19 | 只看该作者
USB解决方案可以找我,包括上位机软件(可提供自定义的DLL接口)

使用特权

评论回复
5
zhaoyu2005|  楼主 | 2013-1-28 09:14 | 只看该作者
沉得真快,自己顶

使用特权

评论回复
6
lxyppc| | 2013-1-28 10:02 | 只看该作者
楼主最好用usb.org上的descriptor tool来生成HID设备的报告描述符
如果没有用到report ID,在收发的时候需要使用0作为report ID

使用特权

评论回复
7
zhaoyu2005|  楼主 | 2013-1-28 14:23 | 只看该作者
lxyppc 发表于 2013-1-28 10:02
楼主最好用usb.org上的descriptor tool来生成HID设备的报告描述符
如果没有用到report ID,在收发的时候需 ...

谢谢,下了个工具,不过是一条一条生成的。另外就是报告描述符是参考改的。增加了首字节0,不过还是不行,目前正看HID文档,希望能找到问题根源

使用特权

评论回复
8
zhaoyu2005|  楼主 | 2013-1-29 14:10 | 只看该作者
自己再顶几天

使用特权

评论回复
9
zhaoyu2005|  楼主 | 2013-1-31 09:50 | 只看该作者
高手都抢票去了么?

使用特权

评论回复
10
zdx818| | 2013-1-31 13:40 | 只看该作者
本帖最后由 zdx818 于 2013-1-31 13:47 编辑

说了半天,都没有上程序
参考下我以前8位机的吧。
// From        "USB Device        Class Definition for Human Interface Devices (HID)".
// Section 7.1:
// "When a Get_Descriptor(Configuration) request is        issued,
// it returns the Configuration        descriptor,        all        Interface descriptors,
// all Endpoint        descriptors, and the HID descriptor        for        each interface."
code const hid_configuration_descriptor        HIDCONFIGDESC =
{
        { //配置描述符
                0x09,                                                                // bLength                                                //描述符大小(字节)
                        0x02,                                                                // bDescriptorType                        //常数(02h)
#ifdef _USER_EndPoint3_                //使用端点3
                        0x3000,         //48个字节                                        // wTotalLength        (= 9+9+9+7+7+7)//此配置传回的所有数据大小(字节)
#else
                        0x2900,         //41个字节                                        // wTotalLength        (= 9+9+9+7+7)/此配置传回的所有数据大小(字节)
#endif
                        0x01,                                                                // bNumInterfaces                        //此配置支持的接口数目
                        0x01,                                                                // bConfigurationValue                //Set_Configuration与Get_Configuration要求的标识符
                        0x00,                                                                // iConfiguration                        //此配置的字符串描述符的索引值
                        0x80,                                                                // bmAttributes                                //自身电源/总线电源        以及远程唤醒设置
                        //0xfe                                                                // MaxPower        (in        2mA        units)        //需要总线电源,表示法为(最大毫安/2)
                        0xc8                                                                // MaxPower        (in        2mA        units)        //需要总线电源,表示法为(最大毫安/2)
        },
        { //接口描述符
                0x09,                                                                // bLength                                                //描述符大小(字节)
                        0x04,                                                                // bDescriptorType                        //常数(04h)
                        0x00,                                                                // bInterfaceNumber                        //识别此接口的数字
                        0x00,                                                                // bAlternateSetting                //用来选择一个替代设置的数值
#ifdef _USER_EndPoint3_                //使用端点3
                        0x03,                                                                // bNumEndpoints                        //除了端点0外,支持的端点数值 1,2,3
#else
                        0x02,                                                                // bNumEndpoints                        //除了端点0外,支持的端点数值 1,2
#endif
                        0x03,                                                                // bInterfaceClass (3 =        HID)//类别码
                        0x00,                                                                // bInterfaceSubClass                //子类别码
                        0x00,                                                                // bInterfaceProcotol                //协议码
                        0x00                                                                // iInterface                                //此接口的字符串描述符的索引值
                },
                { //HID类别描述符
                        0x09,                                                                // bLength                                        //描述符大小(字节)
                                0x21,                                                        // bDescriptorType                        //常数(21h)表示HID类别
                                0x0101,                                                        // bcdHID                                        //HID规范版本号码
                                0x00,                                                        // bCountryCode                                //硬件目的国家的识别数字(00)表示不支持的国家
                                0x01,                                                        // bNumDescriptors                        //支持的附属描述符数目
                                0x22,                        //报表                        // bDescriptorType                        //类别描述符的类型(报表或实体)
                                HID_REPORT_DESCRIPTOR_SIZE_LE        // wItemLength (tot. len. of report        descriptor)//报表描述符的总长度
                                // 可选
                }
                ,{ //端点1描述符,方向输出
                        0x07,                                                                // bLength                                        //描述符大小(字节)
                                0x05,                                                        // bDescriptorType                        //常数(05h)
                                0x01,                         //OUT_EP1                // bEndpointAddress                        //端点数目与方向,位7是端点方向:Out等于0,In等于1
                                0x03,                                                        // bmAttributes                                //支持的传输类型,中断传输
                                EP1_PACKET_SIZE_LE,                                // MaxPacketSize (LITTLE ENDIAN)//支持的最大信息包
                                2                                                                // bInterval                                //最大延迟/轮询时距/NAK速率
                }
                ,{ // 端点2描述符,方向输入
                        0x07,                                                                // bLength                                        //描述符大小(字节)
                                0x05,                                                        // bDescriptorType                        //常数(05h)
                                0x82,                         //IN_EP2                // bEndpointAddress                        //端点数目与方向,位7是端点方向:Out等于0,In等于1
                                0x03,                                                        // bmAttributes                                //支持的传输类型,中断传输
                                EP2_PACKET_SIZE_LE,                                // MaxPacketSize (LITTLE ENDIAN)//支持的最大信息包
                                3                                                                // bInterval                                //最大延迟/轮询时距/NAK速率
                }
#ifdef _USER_EndPoint3_                //使用端点3
                ,{ // 端点3描述符,方向输入
                        0x07,                                                                // bLength                                        //描述符大小(字节)
                                0x05,                                                        // bDescriptorType                        //常数(05h)
                                0x83,                         //IN_EP3                // bEndpointAddress                        //端点数目与方向,位7是端点方向:Out等于0,In等于1
                                0x03,                                                        // bmAttributes                                //支持的传输类型,中断传输
                                EP3_PACKET_SIZE_LE,                                // MaxPacketSize (LITTLE ENDIAN)//支持的最大信息包
                                4                                                                // bInterval                                //最大延迟/轮询时距/NAK速率
                }
#endif
};
//报表
code const hid_report_descriptor HIDREPORTDESC =
{
        0x06,                        //0000 0110        项目类型 01:Global        项目的数据字节数目 10:两字节
        0x00, 0xff,                                  // USAGE_PAGE        (Vendor        Defined        Page 1)//未定义
        0x09, 0x01,                                  // USAGE (Vendor Usage 1)                //保留

        0xA1, 0x01,                                  // COLLECTION        (Application)        //有共同用途
        //OUTPUT 项目
        0x85, Out_Report_ID,           //        Report ID                                //报表号码标识符ID
        0x95, Out_Report_Size,           //        REPORT_COUNT ()                        //项目的数据域位的数目 长度
        0x75, 0x08,                                   //        REPORT_SIZE        (8)                        //项目字段的大小(8位)
        0x26, 0xff,        0x00,                   //        LOGICAL_MAXIMUM        (255)        //报表项目的最大数值
        0x15, 0x00,                                   //        LOGICAL_MINIMUM        (0)                //报表项目的最小数值
        0x09, 0x01,                                   //        USAGE (Vendor Usage        1)
        0x91, 0x02,                                   //        OUTPUT (Data,Var,Abs)        //输出:数据,变量,绝对
        //INPUT        项目
        0x85, In_Report_ID,                   //        Report ID                                //报表号码标识符ID
        0x95, In_Report_Size,           //        REPORT_COUNT ()                        //项目的数据域位的数目 长度
        0x75, 0x08,                                   //        REPORT_SIZE        (8)                        //项目字段的大小(8位)
        0x26, 0xff,        0x00,                   //        LOGICAL_MAXIMUM        (255)        //报表项目的最大数值
        0x15, 0x00,                                   //        LOGICAL_MINIMUM        (0)                //报表项目的最小数值
        0x09, 0x01,                                   //        USAGE (Vendor Usage        1)
        0x81, 0x02,                                   //        INPUT (Data,Var,Abs)        //输入:数据,变量,绝对
        //FEATURE 项目
        0x85, Feature_Report_ID,   //        Report ID                                //报表号码标识符ID
        0x95, Feature_Report_Size, //        REPORT_COUNT ()                        //项目的数据域位的数目 长度
        0x75, 0x08,                                   //        REPORT_SIZE        (8)                        //项目字段的大小(8位)
        0x26, 0xff,        0x00,                   //        LOGICAL_MAXIMUM        (255)        //报表项目的最大数值
        0x15, 0x00,                                   //        LOGICAL_MINIMUM        (0)                //报表项目的最小数值
        0x09, 0x01,                                   //        USAGE (Vendor Usage        1)
        0xB1, 0x02,                                   //        FEATURE        (Data,Var,Abs)        //特征:数据,变量,绝对

        0xC0                                           //        end        Application        Collection
};
#define        STR0LEN        4
code const unsigned        char String0Desc [STR0LEN] =
{
        STR0LEN,                                                                // bLength                                        //描述符大小(字节)
        0x03,                                                                // bDescriptorType                        //常数(03h)
#ifdef _USER_Chinese_PRC        //0x0804表示中国
        0x08, 0x04                                                        //16位的语言码,0x0409表示English(United States)
#else
        0x09, 0x04                                                        //16位的语言码,0x0409表示English(United States)
#endif
}; // End of String0Desc
#define        STR1LEN        sizeof ("成都公司")        * 2
code const unsigned        char String1Desc [STR1LEN] =
{
        STR1LEN+2,                                                           // bLength                                        //描述符大小(字节)
        0x03,                                                                // bDescriptorType                        //常数(03h)
        0x10,0x62,0xFD,0x90,0x74,0x51,0x1A,0x4E,0xC,0x54,0x1B,0x52,0x50,0x96,0x6C,0x51,0xF8,0x53
        ,0, 0
}; // End of String1Desc
//code const unsigned char String1Desc0        [] ={"四川"};
#define        STR2LEN        sizeof ("兴业张开发")        * 2
code const unsigned        char String2Desc [STR2LEN] =
{
        STR2LEN+2,                                                           // bLength                                        //描述符大小(字节)
        0x03,                                                                // bDescriptorType                        //常数(03h)
        0x74,0x51,0x1A,0x4E,0xC,0x54,0x1B,0xE3,0x4E,0x65,0x79,0x0,0x5F,0xD1,0x53
        ,0, 0
}; // End of String2Desc
//#define        STR3LEN        sizeof ("01335329")        * 2
#define        STR3LEN        sizeof ("兴业")        * 2
code const unsigned        char String3Desc [STR3LEN] =
{
        STR3LEN+2,                                                           // bLength                                        //描述符大小(字节)
        0x03,                                                                // bDescriptorType                        //常数(03h)
        0x74,0x51,0x1A,0x4E,0x1B,0x52
        ,0, 0
}; // End of String1Desc
unsigned char* const STRINGDESCTABLE []        =
{
        String0Desc,
        String2Desc,
        String1Desc,
        String3Desc
};

字符串删除了一些。


使用特权

评论回复
11
skyfight| | 2013-1-31 15:40 | 只看该作者
可怜的娃

使用特权

评论回复
12
zhaoyu2005|  楼主 | 2013-1-31 16:53 | 只看该作者
zdx818 发表于 2013-1-31 13:40
说了半天,都没有上程序
参考下我以前8位机的吧。
// From        "USB Device        Class Definition fo ...

十分感谢大侠,没有贴程序,主要是怕大家没耐心看,另外就是希望高手指点下可能哪里出问题了,我验证解决,直接让我改哪里就行,我怕不明所以,下次还不会。
刚刚看好HID 1.11英文文档,理解大概70%,还是没看出问题出在哪里。
和大侠的对比了下,我的 报告描述符 没有报告ID和FEATURE 项,其他的类似,我参考别人的改的。接下来添上报告ID。另外请教下:FEATURE 项的作用,这个我没理解

使用特权

评论回复
13
jiayou0054| | 2013-2-3 22:13 | 只看该作者
把你的报表描述符传上来,一起看看吧。

使用特权

评论回复
14
jiayou0054| | 2013-2-3 22:14 | 只看该作者
把你的报表描述符传上来,一起看看吧。

使用特权

评论回复
15
jiayou0054| | 2013-2-3 22:14 | 只看该作者
把你的报表描述符传上来,一起看看吧。

使用特权

评论回复
16
zhaoyu2005|  楼主 | 2013-2-4 09:46 | 只看该作者
这就贴报告描述符
const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
{   
0x06, 00,0xFF,/* USAGE_PAGE (User define) */
0x09, 0x01, /* USAGE (User define) */
0xa1, 0x01, /* COLLECTION (Application) */

// The Input report
0x05,0x01,        //
//0x09,0x03, // USAGE ID - Vendor defined
0x15,0x00, // LOGICAL_MINIMUM (0)
0x26,0xff,0x00, // LOGICAL_MAXIMUM (255)
0x75,0x08, // REPORT_SIZE (8)
0x95,0x40, // REPORT_COUNT (64)
0x81,0x82, // INPUT (Data,Var,Abs)


// The Output report
0x05,0x02,        //
//0x09,0x04, // USAGE ID - Vendor defined
0x15,0x00, // LOGICAL_MINIMUM (0)
0x26,0xff,0x00,// LOGICAL_MAXIMUM (255)
0x75,0x08, // REPORT_SIZE (8)
0x95,0x20, // REPORT_COUNT (32)
0x91,0x82, // OUTPUT (Data,Var,Abs)

// The Feature report


0xc0 /* END_COLLECTION */
};

使用特权

评论回复
17
lxyppc| | 2013-2-4 11:27 | 只看该作者
为啥把usage id给注释掉了?

使用特权

评论回复
18
lxyppc| | 2013-2-4 11:30 | 只看该作者
这个是我经常用的,不带feature的报告,没有report id
    0x05, 0x8c, // USAGE_PAGE (Generic Desktop)
    0x09, 0x01, // USAGE (0)
    0xa1, 0x01, // COLLECTION (Application)
    0x09, 0x01, //     USAGE(01)
    0x15, 0x00, //     LOGICAL_MINIMUM (0)
    0x25, 0xff, //     LOGICAL_MAXIMUM (255)
    0x95, 64,   //     REPORT_COUNT (64) 64 bytes
    0x75, 0x08, //     REPORT_SIZE (8) 8 bits
    0x81, 0x02, //     INPUT (Data,Var,Abs)
    0x09, 0x02, //     USAGE(02)
    0x91, 0x02, //     OUTPUT (Data,Var,Abs)
    0xc0        // END_COLLECTION

使用特权

评论回复
19
zhaoyu2005|  楼主 | 2013-2-16 09:50 | 只看该作者
本帖最后由 zhaoyu2005 于 2013-2-16 10:00 编辑
lxyppc 发表于 2013-2-4 11:30
这个是我经常用的,不带feature的报告,没有report id


谢谢大侠,我试试,之前试过带usage id,不行。找不到问题在哪儿。
刚才仔细看了下,最初的和大侠你的差不多。
差别在:usage id 用的 03和04,LOGICAL_MAXIMUM  0x26, 0xff,0x00,另外就是发送字节是32
我也是参考别人例子改的,按道理应该正常,但是数据用bushound能看到,就会软件接收不到

使用特权

评论回复
20
zhaoyu2005|  楼主 | 2013-2-19 09:41 | 只看该作者
不好意思,这两天联系不上做软件的,没法测试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

2940

帖子

9

粉丝