当前位置:首页 > 单片机 > 单片机
[导读]一、USB HID的设备描述符分析 USB HID的设备描述符用以下结构定义: Device_Property DEVICE_PROP Device_Property = { CustomHID_init, CustomHID_Reset, CustomHID_Status_In, CustomHID_Status_O

一、USB HID的设备描述符分析

USB HID的设备描述符用以下结构定义:

Device_Property

DEVICE_PROP Device_Property =

{

CustomHID_init,

CustomHID_Reset,

CustomHID_Status_In,

CustomHID_Status_Out,

CustomHID_Data_Setup,

CustomHID_NoData_Setup,

CustomHID_Get_Interface_Setting,

CustomHID_GetDeviceDescriptor,

CustomHID_GetConfigDescriptor,

CustomHID_GetStringDescriptor,

0,

0x40/*MAX PACKET SIZE*/

};

这是装载了多个函数指针的结构体,用于统一管理USB的多属性及状态,包括USB初始化、复位、输入输出状态、数据传输参数请求、获得设备状态、设备描述符、配置描述符以及字符串描述符。下面按定义顺序介绍下其中主要函数的含义:


1.USB初始化


包括IO初始化、控制管脚初始化、底层初始化以及中断配置。USB初始化完成后就使能了 USB中断,响应函数为void USB_Istr(void),当与主机交互时便会进入中断进行处理。


该中断函数处理的中断主要有三个


①正常中断类型ISTR_CTR


这个中断是处理USB的正常节点读取、输入输出等。根据索引的节点编号进行不同的处理,当索引为0节点时(通常为控制节点),程序会调用In0_Process()改变USB控制状态,调用Setup0_Process()设置USB本地参数,调用Out0_Process()输出结果。


当索引节点为其他时,调用(*pEpInt_OUT[EPindex-1])();进行相应节点的程序处理。


本程序中1节点为主机发送本机接收节点EP1_OUT_Callback,通过调用这个函数,可以把主机发送过来的数据通过函数USB_SIL_Read(EP1_OUT,USB_Receive_Buffer)提取出来放在USB_Receive_Buffer,长度等于或小于64个字节。这就是接收中断。


2节点为主机接收节点EP1_IN_Callback,用于本地USB发送,本程序不采用中断发送的方式,而采用查询发送的方式,通过函数UserToPMABufferCopy(data,ENDP1_TXADDR, dataNum)发送到主机,封装为USB_SendData.


通过这几个过程,主机就可以对本机进行控制、发送以及接收数据了。


②复位请求中断ISTR_RESET


当主机发来复位信号时,调用复位函数CustomHID_Reset对本机进行复位,对端点0、1、2的功能进行设置。


③挂起中断ISTR_SUSP


进入挂起中断时调用Suspend,然后关闭USB时钟进入低功耗模式。


④唤醒中断ISTR_WKUP


调用Resume,进行状态恢复。


2.USB复位CustomHID_Reset


对本机进行复位,对端点0、1、2的功能进行设置。


3.请求数据相关参数CustomHID_Data_Setup、CustomHID_NoData_Setup


调用CustomHID_GetReportDescriptor, 加载CustomHID_GetConfigDescriptor对USB协议参数进行加载,用于Setup0_Process()设置过程。


4.CustomHID_GetDeviceDescriptor(设备描述符)


设备描述符主要获得的参数包括USB设备最大包长度bMaxPacketSize40(一般固定为64个字节)、协议类型bDeviceProtocol、生产商编号idVendor、产品编号idProduct以及设备编号bcdDevice。用于Setup0_Process()设置过程。


5.CustomHID_GetConfigDescriptor(配置描述符)


配置描述符主要包括的参数有对USB供电的配置MaxPower、节点数量bNumEndpoints、设备类型bInterfaceClass(HID)、接口类型nInterfaceProtocol(0=none,1=keyboard, 2=mouse)、输入节点属性、输出节点属性等。用于Setup0_Process()设置过程。


6.CustomHID_GetStringDescriptor(字符串描述)

ONE_DESCRIPTOR String_Descriptor[4] ={

{(uint8_t*)CustomHID_StringLangID, CUSTOMHID_SIZ_STRING_LANGID},

{(uint8_t*)CustomHID_StringVendor, CUSTOMHID_SIZ_STRING_VENDOR},

{(uint8_t*)CustomHID_StringProduct_AD, CUSTOMHID_SIZ_STRING_PRODUCT},

{(uint8_t*)CustomHID_StringSerial, CUSTOMHID_SIZ_STRING_SERIAL}

};

字符串描述符包括以下几个部分:

1) CustomHID_StringLangID 设备描述符的语言识别码 LangID = 0x0409: U.S.English

2) CustomHID_StringVendor 生产商名称字符串

3) CustomHID_StringProduct 设备名称字符串

4) CustomHID_StringSerial 设备编号字符串


用于Setup0_Process()设置过程。


归纳起来,可以简单的说这样总结,USB HID驱动用一个数据结构描述了USB的各个属性,对USB初始化后,便可以进入中断进行请求处理,0端点用于状态控制以及参数设置(中断方式),1端点用于主机发送本机接收(中断方式),2节点用于本机发送主机接收(查询模式)。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭