打印
[应用相关]

STM32 USB HID设备驱动分析

[复制链接]
1000|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
西门扫雪|  楼主 | 2015-9-30 11:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、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(字符串描述)

沙发
西门扫雪|  楼主 | 2015-9-30 11:53 | 只看该作者
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节点用于本机发送主机接收(查询模式)。

使用特权

评论回复
板凳
mark0668| | 2015-9-30 12:37 | 只看该作者
好资料,感谢分享

使用特权

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

本版积分规则

33

主题

286

帖子

1

粉丝