STM32 自定义HID USB设备的实现
来源:互联网 发布:淘宝卖家下载什么软件 编辑:程序博客网 时间:2024/04/30 16:49
最近需要使用STM32开发一个设备通过HID协议与主机通信,于是开始学习USB,发现USB这个体系实在太庞大了,直接看USB的例程根本看不懂,完全找不到突破口,最后在网上找到一本不错的书《圈圈教你玩USB》,这本书能够很好地带你入门。枚举过程,请求,令牌,数据包,端点,描述符,这些知识都讲的很清楚,只有清楚了这些,再去看代码就能明白是怎么回事了。
接下来总结一个我个人的理解:对于HID设备,STM32有例程,但是怎么修改成符合自己要求的HID设备呢?首先,HID设备必需有报告描述符,报告描述符描述的是数据的长度以及用途,所以最重要的就是修改报告描述符,如我现在只是需要用来传数据,一次最大16字节长度;修改后的报告描述符如下:
const u8 CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] = { //这是一个全局(bType为1)条目,将用途页选择为普通桌面Generic Desktop Page。 //后面跟1字节数据(bSize为1),后面的字节数就不注释了,自己根据bSize来判断。 0x05, 0x01, // USAGE_PAGE (Generic Desktop) //这是一个局部(bType为2)条目,用途选择为0x00。在普通桌面页中, //该用途是未定义的,如果使用该用途来开集合,那么系统将不会把它 //当作标准系统设备,从而就成了一个用户自定义的HID设备。 0x09, 0x00, // USAGE (0) //这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示 //该集合是一个应用集合。它的性质在前面由用途页和用途定义为 //用户自定义。 0xa1, 0x01, // COLLECTION (Application) //这是一个全局条目,说明逻辑值最小值为0。 0x15, 0x00, // LOGICAL_MINIMUM (0) //这是一个全局条目,说明逻辑值最大为255。 0x25, 0xff, // LOGICAL_MAXIMUM (255) //这是一个局部条目,说明用途的最小值为1。 0x19, 0x01, // USAGE_MINIMUM (1) //这是一个局部条目,说明用途的最大值8。 0x29, 0x08, // USAGE_MAXIMUM (8) //这是一个全局条目,说明数据域的数量为16个。 0x95, 0x10, // REPORT_COUNT (16) //这是一个全局条目,说明每个数据域的长度为8bit,即1字节。 0x75, 0x08, // REPORT_SIZE (8) //这是一个主条目,说明有16个长度为8bit的数据域做为输入。 0x81, 0x02, // INPUT (Data,Var,Abs) //下面这个主条目用来关闭前面的集合。bSize为0,所以后面没数据。 0xc0 // END_COLLECTION }; /* CustomHID_ReportDescriptor */另外,别忘了去端点描述符修改数据长度
/* USB Configuration Descriptor *//* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */const u8 CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] = { 0x09, /* bLength: Configuation Descriptor size */ USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ CUSTOMHID_SIZ_CONFIG_DESC, /* wTotalLength: Bytes returned */ 0x00, 0x01, /* bNumInterfaces: 1 interface */ 0x01, /* bConfigurationValue: Configuration value */ 0x00, /* iConfiguration: Index of string descriptor describing the configuration*/ 0xC0, /* bmAttributes: Bus powered */ 0x32, /* MaxPower 100 mA: this current is used for detecting Vbus */ /************** Descriptor of Custom HID interface ****************/ /* 09 */ 0x09, /* bLength: Interface Descriptor size */ USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */ 0x00, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints */ 0x03, /* bInterfaceClass: HID */ 0x00, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ 0x00, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ 0, /* iInterface: Index of string descriptor */ /******************** Descriptor of Custom HID HID ********************/ /* 18 */ 0x09, /* bLength: HID Descriptor size */ HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */ 0x10, /* bcdHID: HID Class Spec release number */ 0x01, 0x00, /* bCountryCode: Hardware target country */ 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ 0x22, /* bDescriptorType */ CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */ 0x00, /******************** Descriptor of Custom HID endpoints ******************/ /* 27 */ 0x07, /* bLength: Endpoint Descriptor size */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ 0x81, /* bEndpointAddress: Endpoint Address (IN) */ 0x03, /* bmAttributes: Interrupt endpoint */ 0x10, /* wMaxPacketSize: 16 Bytes max */ 0x00, 0x20, /* bInterval: Polling Interval (32 ms) */ /* 34 */ 0x07,/* bLength: Endpoint Descriptor size */ USB_ENDPOINT_DESCRIPTOR_TYPE,/* bDescriptorType: *//*Endpoint descriptor type */ 0x01,/* bEndpointAddress: *//*Endpoint Address (OUT) */ 0x03,/* bmAttributes: Interrupt endpoint */ 0x10,/* wMaxPacketSize: 16 Bytes max */ 0x00, 0x20,/* bInterval: Polling Interval (20 ms) */ /* 41 */ } ;剩下的就根据自己需要去修改数据OUT处理和数据IN处理函数,来进行自己的数据处理,从而实现自定义HID。
当然使用HID进行数据传输并不是好的办法,USB有专门用于数据传输的协议,CDC,想要实现肯定是有办法的,但是因为我主机要求使用HID通信,我也只能使用HID来做了,什么CDC等要用到的时候再研究了。
1 0
- STM32 自定义HID USB设备的实现
- STM32 USB HID 自定义设备 bulk 传输
- 自定义 HID 设备的实现
- STM32 USB HID设备驱动分析
- -00-开始【USB-HID在STM32上的实现】
- android usb与自定义HID设备通讯
- LINUX 自定义USB Gadget HID 设备
- 自定义USB-HID设备_笔记
- linux下自定义USB HID设备
- STM32配置CH375B成HID Host模式读取自定义HID设备的数据 ——STM32端口初始化
- STM32配置CH375B成HID Host模式读取自定义HID设备的数据 ——STM32配置CH375B接口函数
- USB HID设备读写代码实现c++
- STM32 USB HID 键盘
- stm32 usb hid
- usb hid通信 STM32
- 自定义 HID 设备的实现――下位机
- USB HID设备
- USB HID设备
- 软件架构---工程理论篇
- SQL中SUBSTRING函数的用法
- 何志丹软件架构师、高级程序员证书备案,方便以后交流、找工作
- PHP版的ftok函数实现
- 九度1003(高精度模板)
- STM32 自定义HID USB设备的实现
- linux中nslookup查询ns
- 淘宝最基础的优化:标题优化
- Reverse Linked List II
- 绘制 乘法口诀表
- 数据库表备份SQL语句
- .Net 获取文件的CRC32标识
- [Leetcode]Linked List Cycle
- nohup命令及其输出文件