本文描述下linux下的usb一些知识点的理解;
Usb的驱动分为主机侧的和设备侧2部分:
- 主机侧驱的理解:
主机侧的驱动分为3部分;host控制器的驱动(包括OHCI EHCI XHCI等)+ usb core+usb设备驱动(如usb鼠标、usb转串口等)
Host控制器驱动:
各个芯片厂商不同,一般厂商提供的SDK里会提供;
Usb core:
完成usb控制器和usb设备驱动的连接和设备枚举的过程;
Usb设备枚举网上资料很多;大概就是按照usb的协议完成从usb device中读取设备描述符、配置描述符、接口描述符、端点描述符等;代码都在hub_init函数中完成;当检测到有新的设备插入,读取相关的描述符后,会调用对应的usb设备驱动的probe函数;
Usb设备驱动:
各个usb设备的驱动,大部分设备kernel已经提供,如需自己添加就参考kernel中相应的代码就可以,框架基本相同;如usb鼠标驱动、usb转串口驱动等
- usb device侧的理解
usb device侧实现的功能比较少常用的:HID、mass、rndis、uvc、uac等;驱动分为udc驱动、udc的API、function驱动;udc驱动为usb device控制器的驱动,udc的APIkernel标准;我们需要关注的只有function驱动;
function驱动框架网上资源很多;主要就是完成3部分工作
1 相关资源的设置
2 调用api完成注册
3 实现对应的功能
- 关于通信的理解
Usb通信分为控制、中断、bluck、iso四个;上面介绍的描述符,通信实际上就是和usb devie的端点完成;
Usb通信可以理解为2台pc间的通信,interface可以理解为2台pc安装的微信
QQ聊天工具,而端点就是聊天工具里的联系人。
通信都是host端发起,无论读写;usb device端只是把数据放到本地的usb fifo中;当数据被发送后会回调驱动中的回调函数;
通信过程中使用 的端点资源等根据不同的function协议完成;
- 例子
下面以rndis为例说明,代码是 tiny4412开发板代码
Rndis是实现usb转网卡的功能,需要主机侧和device侧的支持;
1 Host侧不做重点描述,
如usb device rndis插入后,枚举后知道为rndis功能会调用到如下的probe函数,完成相关的rndis功能
2 device侧
资源的定义如使用多少interface和endpoint
为什么要定义如上的结构体?在rndis的协议里有如下描述需要2个interface,以及每个interface的端点等
下面就是调用相关API注册等工作