01介绍
前面写过两遍关于 USB 协议基础的帖子,如果对 USB 协议不了解,可以去看看下列的基础内容。
这篇开始使用 M62 板子来实现 USB 的设备开发,首先从最简单的 USB HID 键盘开始。固件的 SDK 使用的是 CherryUSB 开源 USB 固件。CherryUSB 是一个小而美的、可移植性高的、用于嵌入式系统的 USB 主从协议栈。设备端的协议执行流程如下图:
02描述符
CherryUSB 实现好了一套 USB 的设备协议,只需要使用的 CheryyUSB 提供的接口调用就可以实现想要的 USB 设备了。首先应该为 USB 设备填描述符。描述符的种类很多,先得理解他们的含义。
设备 (Device) :就是一个实实在在的 USB 设备,比如 USB 鼠标,U 盘。
配置(Configuration):一个 USB 设备可以有多种配置。比如 4G 上网卡就有 2 种配置:U 盘、上网卡。第 1 次把 4G 上网卡插入电脑时,它是一个 U 盘,可以安装里面的程序。装好程序后,把它再次插入电脑,它就是一个上网卡。驱动程序可以选择让它工作于哪种配置,同一时间只能有一种配置有效。大多数的 USB 设备只有一种配置。
接口 (Interface) :每个配置下可以有多个接口,这个接口不是硬件上的接口,可以把这个接口理解为功能,一个接口就代表该设备当前支持的一种功能。
端点 (Endpoint) :每个接口可以有多个端点。USB 主机和设备就是通过端点进行数据交互的。每个端点地址对应一个方向,例如端点 2-IN,端点 2-OUT,这两个含义完全不同。
对于 HID 设备来说还有 HID 描述符和 HID 报告描述符。
HID 描述符:描述设备数据包的固定代码字节数组,包括设备支持多少个包,包有多大,以及包中每个字节和比特的含义。
HID 报告描述符:HID 报告描述符是一个硬编码的字节数组,用于描述设备的数据包。这包括:设备支持多少数据包,数据包有多大,以及数据包中每个字节和位的用途。
下面来一一看看它们都怎么写的。
设备描述符
cherryUSB 中封装了宏来定义设备描述符:
详细说说字段表示的意思:
配置描述符
cherryUSB 中封装了宏来定义配置描述符:
接口描述符
接口描述符是需要自己写成数组的:
端点描述符
HID 描述符
HID 报告描述符
03设备的实现
在设备连接时设备端就需要向主机上报各种描述符,主机这时候就会识别到设备然后给 USB 设备分配端口(USB 协议基础中的设备枚举)。
连接完成后设备就可以通过 usbd_ep_start_write 函数(cherryUSB 提供的 API)向主机上报数据了。
在主函数中调用它, 如下就实现了一个不断向主机发送字母 a 的 usb 键盘设备。
为了能和真实的键盘对应上,这里特意使用矩阵键盘接上板子来读取矩阵键盘的键值,将对应的键值转换成对应的 hid 报告发送给电脑端。
硬件的接线顺序如下:
在矩阵键盘扫描的 task 里面循环扫描矩阵键盘,如果按键有按下直接转换成对应的 hid 键值:
这些键值的定义可以在这里找到:
在 usb 键盘的 task 里面则取接受消息,并把消息发松给 pc 端。
04USB描述符的查看
Windows 下可以使用 usbview 来查看 usb 描述符信息,这有利于我们调试分析使用。
05USB协议调试软件
usb 协议相对还是比较复杂的,任何的描述符写错了都可能导致设备没办法正常的工作。这时候好用的调试软件就非常的重要了。
USBlyzer, WireShark 都是可以用来抓 USB 数据包进行分析的。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !