USB与input子系统
-
- 一、linux由统一设备模型组成
- 二、USB描述符四大描述符
- 三、USB如何逐步枚举?
- 四、input生成设备的过程
- 五、linux usb子系统---通信
一、linux由统一设备模型组成
1、linux成千上万的设备,如何匹配驱动?
- ①DTS的compatible与driver匹配对应?
- ②在驱动器中写一个相同的name的device和driver就匹配了?
- ③usb里面device与driver的PID/VID匹配一样吗?
2、统一设备模型概念
- 统一:归纳、分类、抽象
- 设备:成千上万不同功能的硬件设备
- 模型:标准数据结构和接口
①“四大金刚”
- struct bus_byte:以驱动总线为例USB/I2C/SPI等
- struct_class:抽象设备的高层视图描述了同类设备的集合。
- struct device:描述具体设备
- struct device_driver:描述连接到总线的具体设备的驱动。
当有一个device注册时,它将经历driver链表,然后匹配,匹配规则可以自定义。 当一个driver注册时,它将经历device链表,然后匹配。 匹配后执行()函数,这个函数就是device和driver匹配后执行的函数。
我在百度网盘上上传了统一设备模型的详图,主要包括bus、class、device如何匹配关系,如何驱动文件节点等。如果你感兴趣,你可以理解 链接:https://pan.baidu.com/s/17_7WqEtXOL2lJBYbY_hGPQ 提取码:x6e7
读完这里可以回答开头的问题,linux成千上万的设备,如何匹配驱动? driver_register()遍历bus_type上的klist_devices根据match函数匹配。 device_register()遍历bus_type上的klist_driver根据match函数匹配。 ②三大基石
- struct kobject:类似于面向对象语言object提供参考计数、名称、父指针等信息。
- struct kset:kobject一个集合体。
- struct kobj_type:描述kobject类型和特点。
3、遇到过的USB问题 ①枚举失败 ②带宽不足 ③没有通信数据
二、USB描述符四大描述符
1、描述符 描述符在linux的表示 2、 注意:一个USB主机最多只能分配127个地址(1~127)最多只能连接5层集线器(第五层)hub只能连接设备)。
三、USB如何逐步枚举?
1.下图是插入鼠标枚举的调用栈。hub_event,终点是input_register_device,注册input设备
四、input生成设备的过程
(1) ①获取设备描述符,配置描述符合 ②注册usb device (2) ①符合分析配置描述 ②注册一个或多个usb interface device (3) ①鼠标的interface是一个hid class ②获取hid class描述符 ③注册鼠标的hid device (4)整个input生成设备的过程
附上Linux USB如果您感兴趣,可以了解子系统详解图 链接:https://pan.baidu.com/s/1meE72qRqJPeQGfn0x9aZYw 提取码:sdug
五、linux usb子系统-通信
1、传输方式 控制传输:高优先传输一般用于枚举 中断传输:保证查询频率的传输usb2.0是1ms,免驱触摸框 等时传输:用于音频设备、视频设备等数据量大、实时性要求高的场合 批量传输:用在数据量大、对数据实时性要求不高的场合,带驱触摸框 2、在linux内核,usb通信数据在urb(usb request block)中,urb是usb通信基本数据元。
3、hid的urb数据通信是什么时候开始的? 应用层(如EventHub) input主机提交设备节点urb开始获取数据。 4.返回主机后如何处理数据? 有数据返回后,被调用hid_irq_in(),从usb device读取数据并报告,通过input子系统报告事件,然后继续提交urb,进行轮询。