linux usb 枚举 通信 device等理解

本文描述下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功能

linux usb 枚举 通信 device等理解

 

2 device侧

资源的定义如使用多少interface和endpoint

linux usb 枚举 通信 device等理解

linux usb 枚举 通信 device等理解

linux usb 枚举 通信 device等理解

 

为什么要定义如上的结构体?在rndis的协议里有如下描述需要2个interface,以及每个interface的端点等

linux usb 枚举 通信 device等理解

下面就是调用相关API注册等工作

linux usb 枚举 通信 device等理解