前言:
推荐快速上手资料:
《圈圈教你玩usb》讲用一个usb模块+51如何让电脑识别出一个usb设备,也介绍了不少相关的字段内容。
其他例如uac\hid相关字段怎么看的建议去官网下载文档
USB-IF官方网站:Front Page | USB-IF
USB中文网:USB中文网
这里不讨论3.0。
一、基本概念
数据脚:dm dp
电源脚:vcc gnd
usb的角色:主和从,一切数据由主发起,从响应,类似ble,即使从发数据也是主发起。
usb常见版本:低速,全速,高速分别对应于USB1.0,USB1.1,USB2.0,
1.1、插入检测机制
图片来源:USB连接电路图 - USB中文网
这里可以看到从机默认d+ d-是高,主机默认是低,接上去后主机这两个脚就是高然后主机发现设备接入就会去枚举从机。
这里实际以具体的平台和硬件为主,例如我最近用的平台方案,从机这两个引脚不接主是3.3v,接了是1.几v,通过读d+的状态寄存器来判断是否插拔。
这里这里从机的上拉还有讲究的,D+接的是fs(全速)和hs(高速),D-接的是低速。
1.2、枚举
在主机检测到从机硬件接入后就会去枚举它,这部分内容较多,随便打开一个支持usb的平台的原厂代码就能看到相关的内容,不同厂家的框架不一样,总体的内容差不多。大概的流程百度能搜到一堆。
细节的字段用usb分析仪能抓取下来,所以这里不关注数据流,controller大都是平台做好的。
1.3、常见工具
usb分析仪:这个还是整一个非常方便好用,
bus hound:这个不太行(测试私有通讯之类可以),而且我在公司的电脑买了个绿联的hub插进去后就蓝屏。
Usb devicetree viewer:枚举没异常的时候可以看到你的改动是否生效,有异常就看不到了。
二、从机日常改动总结
这里描述下平时可能会需要理解的内容,usb枚举上报的信息全手写的话工作量巨大,可以基于厂家提供的去理解再去修改定制一个能满足自己需求的。
1、枚举由主机发起,所以如果接入检测不到设备的话用分析仪一抓就知道原因(可能软件,也可能硬件)。
2、设备描述符(device desc):usb的版本,PID、VID、配置描述增加和减少符改动都会改到这里,数据包的最长长度,fs设备最长是64字节。
3、配置描述符(configuration desc):配置描述符之类的内容字段长度修改都会改到这里;usb设备是否需要供电、供电多少(认证之类可能改到这里);
4、接口描述符(interface desc):每个接口描述符有自己的接口号,每个接口下面有对应的端点,当需要增加或者修改功能的时候会改到这里,例如接口的功能类型(audio?hid?bulk?)
5、端点描述符(endpoint desc):usb功能的数据通道最小单元,最高位为方向,为1的时候代表这是一个“in”端点,否则是“out”端点,这里“in”是主机的“in”,“out”也是一样,0端点是系统用的,此外不同方向的端点为两个端点互不影响;端点的类型,例如通过中断传输,音频的会使用iso。
6、hid描述符(hid desc):如果有hid的话会有这个,描述hid的情况例如国家码,hid报表描述符的长度。
7、uac:这部分建议参考usb官方文档《Basic audio device》,有描述一个耳机设备的通路(音频源到音频输出)会有哪些内容,这对理解uac的描述符会很有帮助,下面图片来自官方文档,usb out就是usb接口的out,usb in就是usb的in。
麦克风(外部设备声音输入到主机):
扬声器(主的声音输出到外部设备):
a.audio control interface header desc:有几个接口(输入一个输出一个)?是哪些接口号?
b.aidio control input terminal desc:描述接口,如上图里的id号和功能(例如usb out为id1,输出流数据;id3 speaker连接的feat是id2,声音通道数);
c.audio control feature unit desc:描述一个feature,这个feat两边的id是上面最后一个图的id1\id3,feat的id是3,
最后还有端点描述来描述具体的音频数据流,例如数据格式,采样率,数据宽度,一次性多少字节等等。
8、hid报表描述符(hid report desc):这个是枚举的时候有个请求单独获取的,hid支持很多种设备类型,其中有标准的设备也有其他用户自定义的,标准的例如键盘(包括键盘是否支持控制主机音量大小,音乐播放还是暂停,键值数据结构等等),鼠标(滑动,鼠标左右键或者其他按键),触摸设备等等;一个hid报表描述符需要描述很多功能的话他们之间用各自的report ID来区分,描述符描述的功能数据结构也分方向,可能是in也可能是out。
hid这部分无论是ble的hid服务还是usb的报表描述符是通用的,印象中细节上还是有些区别本人没记录,看懂一次忘记一次。总之hid这部分很难读懂,找个需求对的上的然后看懂一个然后修改出一个适合自己的比从0写一个难度小很多。