历史上的今天
返回首页

历史上的今天

今天是:2024年10月30日(星期三)

正在发生

2020年10月30日 | STM32的CustomHID的各描述符介绍

2020-10-30 来源:eefocus

俗话说的好,看协议手册,不如看源代码来的好! 在USB的工程中,USB的各描述符定义在usb_desc.c文件里面,这里就将USB的各描述符定义代码贴上来,各个数值的意义都已经详细注释。当然很细节的东西看不懂还是建议去看手册去!!!


/* USB标准设备描述符*/

const uint8_t CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] =

{

    0x12,                       /*bLength:长度,设备描述符的长度为18字节*/

    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType:类型,设备描述符的编号是0x01*/

    0x00,                       /*bcdUSB:所使用的USB版本为2.0*/

    0x02,

    0x00,                       /*bDeviceClass:设备所使用的类代码*/

    0x00,                       /*bDeviceSubClass:设备所使用的子类代码*/

    0x00,                       /*bDeviceProtocol:设备所使用的协议*/

    0x40,                       /*bMaxPacketSize:最大包长度为64字节*/

    0x83,                       /*idVendor:厂商ID为0x0483*/

    0x04,

    0x50,                       /*idProduct:产品ID为0x5704*/

    0x57,

    0x00,                       /*bcdDevice:设备的版本号为2.00*/

    0x02,

    1,                          /*iManufacturer:厂商字符串的索引*/

    2,                          /*iProduct:产品字符串的索引*/

    3,                          /*iSerialNumber:设备的序列号字符串索引*/

    0x01                        /*bNumConfiguration:设备有1种配置*/

}; /* CustomHID设备描述符 */



/* USB配置描述符集合(配置、接口、端点、类、厂商)(Configuration, Interface, Endpoint, Class, Vendor */

const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =

{

    0x09,   /*bLength:长度,设备字符串的长度为9字节*/

    USB_CONFIGURATION_DESCRIPTOR_TYPE, /*bDescriptorType:类型,配置描述符的类型编号为0x2*/

    CUSTOMHID_SIZ_CONFIG_DESC,     /*wTotalLength:配置描述符的总长度为41字节*/    

    0x00,

    0x01,         /*bNumInterfaces:配置所支持的接口数量1个*/

    0x01,         /*bConfigurationValue:该配置的值*/

    0x00,         /*iConfiguration:该配置的字符串的索引值,该值为0表示没有字符串*/              

    0xC0,         /* bmAttributes:设备的一些特性,0xc0表示自供电,不支持远程唤醒

     D7:保留必须为1,D6:是否自供电,D5:是否支持远程唤醒,D4~D0:保留设置为0*/

//    0x32,       /*从总线上获得的最大电流为100mA */

    0x96,         /*MaxPower:设备需要从总线上获取多少电流,单位为2mA,0x96表示300mA*/


    /**************  HID接口描述符****************/

    0x09,         /*bLength:长度,接口描述符的长度为9字节 */

    USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType:接口描述符的类型为0x4 */

    0x00,         /*bInterfaceNumber:该接口的编号*/

    0x00,         /*bAlternateSetting:该接口的备用编号 */

    0x02,         /*bNumEndpoints:该接口所使用的端点数*/

    0x03,         /*bInterfaceClass该接口所使用的类为HID*/

    0x00,         /*bInterfaceSubClass:该接口所用的子类 1=BOOT, 0=no boot */

    0x00,         /*nInterfaceProtocol :该接口使用的协议0=none, 1=keyboard, 2=mouse */

    0,            /*iInterface: 该接口字符串的索引 */


    /*****************HID描述符 ********************/

    0x09,         /*bLength: HID描述符的长度为9字节 */

    HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID的描述符类型为0x21 */

    0x10,         /*bcdHID: HID协议的版本为1.1 */

    0x01,

    0x00,         /*bCountryCode: 国家代号 */

    0x01,         /*bNumDescriptors: 下级描述符的数量*/

    0x22,         /*bDescriptorType:下级描述符的类型*/

    CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: 下一集描述符的长度*/

    0x00,


    /********************输入端点描述符******************/

    0x07,         /* bLength: 端点描述符的长度为7字节*/

    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: 端点描述符的类型为0x21*/

    0x82,         /* bEndpointAddress: 该端点(输入)的地址,D7:0(OUT),1(IN),D6~D4:保留,D3~D0:端点号*/               

    0x03,         /* bmAttributes: 端点的属性为为中断端点.

     D0~D1表示传输类型:0(控制传输),1(等时传输),2(批量传输),3(中断传输)

     非等时传输端点:D2~D7:保留为0

     等时传输端点:

     D2~D3表示同步的类型:0(无同步),1(异步),2(适配),3(同步)

     D4~D5表示用途:0(数据端点),1(反馈端点),2(暗含反馈的数据端点),3(保留),D6~D7:保留,*/

    0x40,         /* wMaxPacketSize: 该端点支持的最大包长度为64字节*/

    0x00,

    0x02,         /* bInterval: 轮询间隔(2 ms) */

    

/********************输出端点描述符******************/

    0x07,   /* 端点描述符的长度为7字节 */

    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: 端点描述符的类型为0x21*/

    0x01,   /* bEndpointAddress: 该端点(输出)的地址,D7:0(OUT),1(IN),D6~D4:保留,D3~D0:端点号*/

    0x03,   /* bmAttributes: 端点的属性为为中断端点 */

    0x40,   /* wMaxPacketSize: 该端点支持的最大包长度为64字节  */

    0x00,

    0x02,   /* bInterval: 轮询间隔(2 ms) */

}; 


/* HID的报告描述符*/

const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] = 

0x05, 0x8c, /* USAGE_PAGE (ST Page) */ 

0x09, 0x01, /* USAGE (Demo Kit) */ 

0xa1, 0x01, /* COLLECTION (Application) */ 

// 输入报告 

0x09,0x03, // USAGE ID - Vendor defined 

0x15,0x00, // LOGICAL_MINIMUM (0) 

0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255) 

0x75,0x08, // REPORT_SIZE (8bit) 

0x95,0x40, // REPORT_COUNT (64Byte) 

0x81,0x02, // INPUT (Data,Var,Abs) 


// 输出报告 

0x09,0x04, // USAGE ID - Vendor defined 

0x15,0x00, // LOGICAL_MINIMUM (0) 

0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255) 

0x75,0x08, // REPORT_SIZE (8bit) 

0x95,0x40, // REPORT_COUNT (64Byte) 

0x91,0x02, // OUTPUT (Data,Var,Abs) 


0xc0 /* END_COLLECTION */ 

}; 



/* 语言ID描述符 */

const uint8_t CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID] =

{

    CUSTOMHID_SIZ_STRING_LANGID,    /*bLength:本描述符的长度为4字节*/

    USB_STRING_DESCRIPTOR_TYPE,     /*bDescriptorType:字符串描述符的类型为0x03*/

    0x09,     /*bString:语言ID为0x0409,表示美式英语*/

    0x04

}; /* LangID = 0x0409: U.S. English*/


/*厂商字符串描述符*/

const uint8_t CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR] =

{

    CUSTOMHID_SIZ_STRING_VENDOR, /*bLength:厂商字符串描述符的长度*/

    USB_STRING_DESCRIPTOR_TYPE,  /*bDescriptorType:字符串描述符的类型为0x03*/

    'M', 0, 'y', 0, 'U', 0,'S', 0,'B', 0, '_', 0, 'H', 0,'I',0,'D',0  /*自定义*/

};


/*产品的字符串描述符*/

const uint8_t CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT] =

{

    CUSTOMHID_SIZ_STRING_PRODUCT,   /* bLength:产品的字符串描述符*/

    USB_STRING_DESCRIPTOR_TYPE,     /* bDescriptorType:字符串描述符的类型为0x03*/

    'B', 0, 'y', 0, ' ', 0, 'v', 0, 'i', 0, 'e', 0,'w',0,'t',0,'o',0,'o',0,'l',0/*自定义*/

};


/*产品序列号的字符串描述符*/

uint8_t CustomHID_StringSerial[CUSTOMHID_SIZ_STRING_SERIAL] =

{

    CUSTOMHID_SIZ_STRING_SERIAL,    /* bLength:产品序列号*/

    USB_STRING_DESCRIPTOR_TYPE,     /* bDescriptorType:字符串描述符的类型为0x03*/

    'x', 0, 'x', 0, 'x', 0,'x', 0,'x', 0, 'x', 0, 'x', 0 /*自定义*/

};


usb_desc.c文件中涉及到的一些宏定义都在usb_desc.h中有定义,如下

#define USB_DEVICE_DESCRIPTOR_TYPE              0x01   //设备描述符类型

#define USB_CONFIGURATION_DESCRIPTOR_TYPE       0x02   //配置描述符类型

#define USB_STRING_DESCRIPTOR_TYPE              0x03   //字符串描述符类型

#define USB_INTERFACE_DESCRIPTOR_TYPE           0x04   //接口描述符类型

#define USB_ENDPOINT_DESCRIPTOR_TYPE            0x05   //端点描述符类型


#define HID_DESCRIPTOR_TYPE                     0x21   //HID描述符类型

#define CUSTOMHID_SIZ_HID_DESC                  0x09   //HID描述符的长度

#define CUSTOMHID_OFF_HID_DESC                  0x12   //HID描述符在配置描述符集合数组中的偏移


#define CUSTOMHID_SIZ_DEVICE_DESC               18    //设备描述符的长度

#define CUSTOMHID_SIZ_CONFIG_DESC               41    //配置描述符的长度

#define CUSTOMHID_SIZ_REPORT_DESC               33    //报告描述符的的长度

#define CUSTOMHID_SIZ_STRING_LANGID             4    //语言ID字符串描述符的长度

#define CUSTOMHID_SIZ_STRING_VENDOR             20    //厂商字符串描述符的长度

#define CUSTOMHID_SIZ_STRING_PRODUCT            24    //产品字符串描述符的长度

推荐阅读

史海拾趣

Custom Components Inc公司的发展小趣事

随着业务规模的不断扩大,CCI面临着日益严峻的供应链管理挑战。为了降低生产成本、提高交货速度并保障产品质量,CCI对供应链管理进行了全面优化。

公司首先加强了与原材料供应商的合作与沟通,确保原材料的稳定供应和成本控制。同时,CCI还引入了先进的生产管理系统和质量控制体系,实现了生产过程的数字化和智能化。此外,公司还通过优化物流运输和库存管理等方式,进一步提高了供应链的效率和灵活性。

Dongguan City Niuhang Electronics Co.LTD公司的发展小趣事

为了进一步提升技术水平和市场竞争力,Dongguan City Niuhang Electronics Co.LTD积极开展国际合作与交流。公司与多家国际知名半导体企业建立了紧密的合作关系,共同开展技术研发和市场拓展。通过与国际同行的交流与合作,公司不仅学到了先进的技术和管理经验,还拓宽了国际市场渠道,为公司的长远发展奠定了坚实基础。

粤翔(FlyWin)公司的发展小趣事
如二极管、电阻等,用于防止电流反向或过载,保护电路安全。
Flamar公司的发展小趣事

Flamar公司自成立以来,始终将技术创新视为企业发展的核心驱动力。在电子元件领域,公司研发团队成功开发出一种新型高性能磁耦合传送臂,这一创新产品凭借其高效、稳定的传输性能,在半导体设备制造中迅速获得市场认可。通过不断的技术迭代和优化,Flamar公司的磁耦合传送臂逐渐成为行业内的标杆产品,帮助公司在激烈的市场竞争中脱颖而出。

Hitron公司的发展小趣事

随着电子行业的全球化趋势日益明显,Flamar公司积极实施国际化战略,通过设立海外研发中心、生产基地和销售网络,不断拓展全球市场。公司先后在欧洲、亚洲等地建立分支机构,与当地企业建立紧密的合作关系,共同推动电子技术的创新与应用。通过国际市场的开拓,Flamar公司不仅实现了业务规模的快速增长,还进一步提升了品牌的国际知名度和影响力。

EZchip Technologies Ltd公司的发展小趣事

随着技术的不断成熟和市场的认可,EZchip开始寻求更广阔的市场空间。公司通过与全球知名通信设备制造商建立合作关系,将其产品应用于各类网络设备和解决方案中。同时,EZchip还积极参与国际标准制定和行业交流活动,不断提升品牌影响力。通过市场拓展和合作,EZchip的产品逐渐覆盖了全球多个国家和地区,成为了网络通信行业的重要参与者。

问答坊 | AI 解惑

请问谁有LTH1550-01的实用电路图?

本帖最后由 paulhyde 于 2014-9-15 09:11 编辑 请问谁有LTH1550-01的实用电路图?或中文资料?  …

查看全部问答>

大家第一个项目都做了多久啊?

最近调试项目都快吐了,想看看牛人们都用了多少时间完成自己第一个项目的啊,大家交流交流~…

查看全部问答>

民用监控误区:PC/嵌入式DVR如何选择?

◆选购安防监控录像系统的误区     目前民用级安防监控主要是来源一些小规模的商业需求,相比一些大规模的安防工程,对于监控的线路基本维持在8路以内,自己购买设备便可以进行调试安装。     目前这类民用级监控系统的选 ...…

查看全部问答>

KEIL汇编中单步调试中如何看一个ram的值(求救)

比如 data_led equ 60h .... loop: mov data_led,a inc a jmp loop ... 如何看data_led的变化?在那个窗口可以观察到? 是用那个memeny window吗 那个好像是看rom的窗口 不知道是不是 因为我用那个窗口试过,在0x60h单元中的值总是不会变 ...…

查看全部问答>

请教ADS调试ARM的问题,不知道如何入门。。

如题。 正在学习ARM的开发,采用的是ARM920T的内核。为了进一步熟悉其架构,现想先进行一些简单的开发,比如用汇编调试一下MOV等指令,看看内部寄存器的变化情况,选用JTAG仿真器和AXD进行调试。这个应该算是最简单的入门吧? 现在的问题是,我用 ...…

查看全部问答>

请问在ARM中如何用汇编语言实现冒泡排序算法

请问在ARM中如何用汇编语言实现冒泡排序算法?我想定义一组数字,以此来用冒泡法来排序,不知道如何定义这组数,又该如何引用啊?…

查看全部问答>

请问一个usb的问题

问一下 pdiusbd12中检查它的型号的时候,为什么要读取两次? U32 tmp;                 D12Cmd = 0xfd;         tmp = D12Dat;         tmp = tmp…

查看全部问答>

HP的待遇以及文化!!

帮我拿个主意!!我最近去了一家培训公司面试,面试的是HP的电话技术支持工程师 400多个人面试,最后通过的就六个人,其中有我一个!!! 通知我明天去复试,是HP亲自面试,各位说我去不去??? 最主要的是这家公司要岗前培训,有费用4800多元 ...…

查看全部问答>