【Linux驱动学习(1)】USB与input子系统,linux统一设备模型,枚举,USB描述符深入剖析
时间:2023-11-13 19:37:00
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链表,然后匹配。
匹配后执行really_probe()函数,这个函数就是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)open input主机提交设备节点urb开始获取数据。
4.返回主机后如何处理数据?
有数据返回后,被调用hid_irq_in(),从usb device读取数据并报告,通过input子系统报告事件,然后继续提交urb,进行轮询。