历史上的今天
返回首页

历史上的今天

今天是:2025年07月30日(星期三)

正在发生

2019年07月30日 | STM32f103 USB移植之USB标准描述符

2019-07-30 来源:eefocus

在对USB协议进行学习和移植的过程有个东西不可避免,肯定会遇到,那就是USB的设备描述符。这个东西始终在usb协议中发挥作用,从设备的枚举到设备的配置,都是由usb描述符进行修改的。今天在移植的时候这个整理了一下usb描述符有关的知识。


/********************************************不啰嗦的分割线***********************************************/

 参考资料:深入浅出USB系统开发——基于ARM Cortex-M3    王川北 刘强

圈圈教你玩usb

http://www.openedv.com/thread-10971-1-1.html


USB采用USB标准描述符说明一个USB设备,这些描述符包括设备描述符、配置描述符、接口描述符、端点描述符和字串描述符。在stm32 usb库中有关描述符在usb_desc.c和usb_desc.h中。


在上个例程中并未对描述符进行修改,直接使用了原来配置,现在我们对描述符进行修改,在该示例中的配置为usb键盘的描述符设置。


设备描述符给出了usb的一般信息,一个usb设备只能有一个设备描述符。在stm32 usb库中有关配置及含义如图所示。


在usb库中除设备描述符以外的其他所有描述符均在Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC]这个数组中

如果对描述符进行增删后,注意更改数组大小,在usb_desc.h中定义。

以下为配置描述符的说明,在一个usb设备描述符下可以有多个配置描述符。

以下为接口描述符的说明,在一个usb配置描述符下可以有多个接口描述符。

端点描述符,每个端点只能用作输入或输出的一种,端点0不可配置。


HID为人机交互设备(Human Interface Device)的缩写,HID设备类除了支持标准USB描述符外,还自行定义了3种设备描述符,分别为HID描述符、报告描述符、物理描述符。一个HID设备只支持一个HID描述符;可以支持一个或多个报告描述符;物理描述符是可选的,发多数HID设备不需要使用它。


下面为为HID描述符及说明


 //以下为HID描述符

/******************** Descriptor of Joystick Mouse HID ********************/

/* 18 */

0x09,         /*bLength: HID Descriptor size 字节数*/

HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID 配置描述符类型*/

0x00,         /*bcdHID: HID Class Spec release number         版本号*/

0x01,

0x00,         /*bCountryCode: Hardware target country         国家语言代码*/

0x01,         /*bNumDescriptors: Number of HID class descriptors to follow 描述符个数*/

0x22,         /*bDescriptorType 下一个描述符类型*/

JOYSTICK_SIZ_REPORT_DESC,/*wItemLength: Total length of Report descriptor 报告描述符总长度*/

0x00,

下面为HID的报告描述符

const uint8_t Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC] =

  {                                                                           

0x05, 0x01, // USAGE_PAGE (Generic Desktop)

0x09, 0x06, // USAGE (Keyboard)

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

0x05, 0x07, //         USAGE_PAGE (Keyboard/Keypad)

0x19, 0xe0, //         USAGE_MINIMUM (Keyboard LeftControl)

0x29, 0xe7, //         USAGE_MAXIMUM (Keyboard Right GUI)

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

0x25, 0x01, //         LOGICAL_MAXIMUM (1)

0x95, 0x08, //         REPORT_COUNT (8)

0x75, 0x01, //         REPORT_SIZE (1)

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

0x95, 0x01, //         REPORT_COUNT (1)

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

0x81, 0x03, //         INPUT (Cnst,Var,Abs)

0x95, 0x06, //    REPORT_COUNT (6)

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

0x25, 0xFF, //    LOGICAL_MAXIMUM (255)

0x19, 0x00, //    USAGE_MINIMUM (Reserved (no event indicated))

0x29, 0x65, //    USAGE_MAXIMUM (Keyboard Application)

0x81, 0x00, //         INPUT (Data,Ary,Abs)

0x25, 0x01, //         LOGICAL_MAXIMUM (1)

0x95, 0x02, //    REPORT_COUNT (2)

0x75, 0x01, //    REPORT_SIZE (1)

0x05, 0x08, //    USAGE_PAGE (LEDs)

0x19, 0x01, //    USAGE_MINIMUM (Num Lock)

0x29, 0x02, //    USAGE_MAXIMUM (Caps Lock)

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

0x95, 0x01, //    REPORT_COUNT (1)

0x75, 0x06, //    REPORT_SIZE (6)

0x91, 0x03, //    OUTPUT (Cnst,Var,Abs)

0xc0        // END_COLLECTION

  }


好了,我们对上面的描述符进行修改后,编译下载,在电脑上可以识别出键盘,在后面的会继续介绍usb键盘的移植过程


推荐阅读

史海拾趣

Cableform Inc公司的发展小趣事

进入21世纪,电子行业迎来了快速发展的黄金时期。为了适应市场需求的变化,Cableform Inc不断加大研发投入,致力于技术创新。公司成功开发出了一系列具有自主知识产权的电磁控制产品,涵盖了从直流电机控制到高精度磁铁控制等多个领域。这些技术创新不仅提升了公司的核心竞争力,也为客户提供了更加高效、可靠的解决方案。

ADPOW公司的发展小趣事

ADPOW公司始终将技术研发作为公司发展的核心驱动力。公司投入大量资源用于研发新技术、新产品,不断推陈出新。同时,公司积极与高校、研究机构等合作,引进先进技术和人才,为公司的持续发展注入新的活力。

Connective Peripherals Pte Ltd公司的发展小趣事

在市场竞争日益激烈的背景下,ADPOW公司深知品质是生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。同时,公司注重品牌建设,通过广告宣传、参加展会等方式提升品牌知名度和美誉度。这些举措有效提升了公司的市场竞争力。

Digital公司的发展小趣事

DIALIGHT公司的故事始于1938年的纽约布鲁克林,当时该公司专注于为飞机生产仪表板灯。随着技术的不断进步和市场的变化,公司在1971年,即LED推出仅一年后,推出了他们的第一个LED产品。这一举措标志着DIALIGHT正式从传统的飞机仪表板灯制造转向LED照明技术的研发和应用。从此,DIALIGHT彻底改变了LED的用途,将其广泛应用于世界各地的交通控制、指示灯、结构塔和工业场所,为全球提供了优质的照明解决方案。

Global Connector Technology公司的发展小趣事
安装位置不正确或连接线路错误,导致继电器无法正常检测到断相故障。
台湾双羽公司的发展小趣事

随着数字化时代的到来,富士通再次站在了行业的前沿。公司充分利用自身在信息技术领域的深厚积累,积极推动数字化转型和智能化升级。通过提供全面的数字化解决方案和服务,富士通帮助众多企业和组织实现了业务流程的优化和效率的提升。同时,富士通还不断探索新的技术和应用场景,致力于为客户提供更加智能化、个性化的产品和服务。这一系列的努力不仅巩固了富士通在全球电子行业的领先地位,也为全球数字化转型的进程注入了新的动力。

请注意,以上故事是基于富士通(Fujitsu)的发展历史虚构的,旨在满足您对电子行业企业发展故事的需求。由于“Fujisoku Corporation”并非实际存在的公司,因此无法直接提供其相关的发展故事。

问答坊 | AI 解惑

数码摄像机磁头堵塞解决办法

关键字:摄像机     家用数码摄像机在拍摄过程中(如旅游、婚庆、生日、聚会等),最怕的就是突然出现故障,因为一旦出现故障,轻则影响拍摄活动,重则整个拍摄过程无法进行。     磁头堵塞就是数码摄像机最常见的故障之一, ...…

查看全部问答>

关于IC存放事宜

一、IC真空密封包装的储存期限: 1、请注意每盒真空包装密封日期; 2、保存期限:12个月,储存环境条件:在温度 < 40℃,湿度 < 90% R.H; 3、库存管制:以“先进先出”为原则。 二、IC包装拆封后,SMT组装的时限:  1、检查湿度卡:显示 ...…

查看全部问答>

关于VREF管脚的连接问题

用的是Altera的EP2S30系列的FPGA芯片,需要用到DDR SDRAM,需要接SSTL2电压标准,不知道VREF怎么连接,是不是VREF连到1.25V的话,VCCIO必须连到2.5V,不能连到3.3V。如果这样的话岂不是一个bank内除了DDR SDRAM以外其他的脚都不能用了请有经验的大 ...…

查看全部问答>

流式驱动的电源管理是怎么做的呀?

在WINCE中,如果进入SLEEP状态,会不会调用流式驱动中的SHC_PowerDown函数呀?谢谢 !…

查看全部问答>

ce 5.0 模拟器的问题

如何将一个程序放到wince 5.0 的模拟器中运行呢。 即通过evc启动模拟器,怎么才能将一个程序加载到模拟器中呢。…

查看全部问答>

wince5 evc4 实现半透明图片

    我在Test1Dlg.cpp 文件中 使用 lphaBlend 函数 也导入了以下头文件和 lib #pragma comment (lib,\"Coredll.lib\") #include 出现错误误码: Test1Dlg.cpp E:\\Test1\\Test1Dlg.cpp(97) : error C2065: \'AlphaBlend\' : unde ...…

查看全部问答>

博通电子专业制作430开发板

QQ:37955698     技术交流QQ群:7757652 msp430@botom.cn 电话:13261892076 最新产品:    MSP430开发板 学习板:           MSP430F44X开发板       & ...…

查看全部问答>

MC55硬件启动问题

看到资料和网上都是说的用单片机控制MC55的启动,但是我看有的产品没有单片机,上电后自己可以启动,请问具体是如何实现的,谢谢…

查看全部问答>

【求助】keilc编程 8958cpu 定义片外空间地址变量

8958cpu 定义片外空间地址变量 怎么定义 用什么数据类型好些。 我想定义 1个数组全局变量 2个数组局部变量 大小是[24]一维 [4][24]二维。…

查看全部问答>

如何提取两个方波的时间差?

想要在FPGA中提取两个方波的相位差,两个方波频率约为1HZ,时间差比较小,然后用50MHZ的时钟计算时间差 用异或门的话同一周期会出现两个相位差 请问各位知道有更好的方法吗?   采用异或门: [ 本帖最后由 open82977352 于 2011-9-1 ...…

查看全部问答>