USB的设计为非对称式的,它是主从式总线,任何USB事务都是由主机引发的。USB总线拓扑如图7-12所示。图7-12引自《USB2.0规范》。USB总线已经成为使用最广泛的设备连接标准。每个USB设备至少有两个端点/管道,分别是进和出两个方向,编号为0,用于控制总线上的设备。总体上来说,系统对USB总线驱动的需求就是要能按规范实现总线的各种功能,并且满足总线的各种无关性的需求。......
2023-11-22
1.总线相关以及核心框架
针对USB功能,Linux内核中提供了主设备和从设备两个不同的框架,这里主要介绍作为主设备的框架。USB总线主设备框架还是以bus_type作为入口来了解总线框架。
usb_bus_type中重要的是usb_device_match,下面来了解细节:
从分析中可知,USB总线框架主要管理的是两类设备,分别是usb_device和usb_inter-face。从USB规范的角度可知usb_interface更专注于功能,应该是获得描述符之后才创建的,而usb_device则对应于USB物理设备。这样就从逻辑功能和物理层面都对设备进行管理,从管理层次上来说也是完整的。对应的驱动包括usb_device_driver和usb_driver,其中usb_device_driver对应于usb_device,而usb_driver则对应于usb_interface。usb_device_driver主要用于实现设备发现,而usb_driver则主要实现与功能模块的关联以及电源管理相关的功能。
像其他总线设备一样,总线控制器负责总线事务的交互。USB主设备总线框架就是对以上内容的管理,具体架构如图7-14所示。
图7-14 Linux USB主设备总线架构
从图7-14可见,USB总线框架各模块划分,包括host software主要负责协议相关的部分,包括枚举设备、数据传输等;USBDI(USB driver interface)主要负责屏蔽USB细节,为其他功能框架使用USB总线传输的接口层;USBD(即USB driver)负责USB设备的功能关联;HCDI则是屏蔽不同总线控制器之间的差别;最后Host Controller Driver是具体的总线控制器的驱动,相应地负责与总线控制器交互完成总线传输。
这样整体框架从层次的角度就完整了。
2.总线控制器相关
USB总线框架对总线控制器的管理主要是通过usb_hcd来实现的,其详细分析如下:
从管理实体中可见,其中除了自身的属性和状态之外还包含了root hub相关的信息,这与硬件及规范一致。另外重要的就是hc_driver,其中包含实际操作的接口,负责总线传输。由于USB总线控制器有不同的类型,如OHCI、EHCI、UHCI、XHCI等,这里usb_hcd是对所有这些总线控制器共性的抽象,相应的hcd_priv指向不同控制器私有的属性,主要是定义不同的传输排列方式以及控制状态寄存器等。这里与其他总线控制器实体不同的是没有设备模型的实体,主要是由于USB总线控制器与root hub的亲密关系,而root hub本身就是设备,而设备的层次关系通过usb_bus中的controller进行关联。
关于总线控制器,USB框架提供了创建以及注册管理的接口。首先来了解创建的接口usb_create_hcd:
从分析中可见,USB总线控制器的操作已经与USB总线以及root hub的操作相结合,这与它们之间的紧密关系是分不开的。
对于注册与管理接口,USB框架的接口为usb_add_hcd,主要功能是初始化并注册总线控制器,其中同样包括注册USB总线以及创建并注册root hub。在调用了usb_add_hcd时,就创建了总线,从而可以进行设备发现以及驱动功能绑定的工作。
框架提供了统一的传输以及其他总线控制器功能操作接口,具体如下:
这样总线控制器的底层与上层就完整了。
3.总线设备相关
USB设备在总线框架中已经有所介绍,主要由usb_device和usb_interface共同完成。先来了解usb_device的详细信息:(www.chuimin.cn)
从分析中可见,总线规范中关于设备的各种属性都在usb_device中有了体现。再来看看interface的管理实体:
usb_interface会在枚举时创建usb_host_interface,其中包含了endpoint的信息,这与总线规范是一致的,另外通过interface_to_usbdev可以关联到usb_device(通过dev的parent关联的),这样设备层面就都关联在一起了。
总线设备最重要的功能就是设备发现,USB总线的设备发现流程如图7-15所示。
这里主要是hub的功能,最终会通过usb_new_device来将usb_device注册进系统,相应的usb_device是通过usb_alloc_dev进行分配的,在usb_new_device中会读取描述符,在注册之后就会进行对应设备驱动的match工作。在总线框架中可知,usb_device直接返回的值为1,这是由于系统中只有一个对应于usb_device的驱动,即usb_generic_driver,细节如下:
图7-15 Linux USB设备发现流程
接下来设备发现的功能由generic_probe实现,下面来看看细节:
这里主要是读取配置信息,并进行配置。在usb_set_configuration中会根据设备的属性创建所有的usb_interface并注册。这样USB系统就开始对功能驱动的匹配工作,相应的进入到USB总线match工作的后半部分,即usb_interface相关的部分,找到相应的驱动再执行probe,从而完成整个设备发现及驱动绑定的功能。
4.总线传输接口
USB总线传输主要是实现USB总线规范中的四种传输,在Linux USB框架中通过urb进行管理,主要内容如下:
USB总线的传输是以urb为核心展开的。具体的流程如图7-16所示。
为了简化USB总线传输操作,USB总线框架提供了如下接口以实现几种类型的总线传输功能:
图7-16 Linux USB总线传输流程图
USB总线框架已经为主要功能都提供了统一的操作,并提供了良好的接口供驱动开发。
有关深入剖析Linux内核与设备驱动的文章
USB的设计为非对称式的,它是主从式总线,任何USB事务都是由主机引发的。USB总线拓扑如图7-12所示。图7-12引自《USB2.0规范》。USB总线已经成为使用最广泛的设备连接标准。每个USB设备至少有两个端点/管道,分别是进和出两个方向,编号为0,用于控制总线上的设备。总体上来说,系统对USB总线驱动的需求就是要能按规范实现总线的各种功能,并且满足总线的各种无关性的需求。......
2023-11-22
SPI总线框架对这两类设备进行管理,具体的框架如图7-6所示。通常的SPI驱动都是在内核实现并在内核态执行的,所以就不对spidev进行详细的分析。SPI总线框架整体的功能就是这样,接下来看看具体各部分的实现。在SPI总线框架中相应的实体是spi_board_info,内容如下:其中的主要信息是与总线信号相关的属性。......
2023-11-22
也正是因为Linux内核的唯一性,各个不同发布版本拥有相同的框架。Linux内核是在整个Linux系统的最底层,它负责管理硬件,运行用户程序,并保持系统整体的安全性和完整性。可以说是Linux系统的根和灵魂。图3-1中看到Linux内核还有另一层面的含义。这对于Linux内核同样适用。所以对Linux内核的剖析、学习和研究也不能独立于系统进行,而是要综合考虑应用、内核和硬件等各方面的信息和内容。这样才能更全面、深刻地理解Linux内核。......
2023-11-22
VFS的实现是以“一切皆是文件”为需求出发点的。要理解VFS的框架首先看一下VFS和系统的静态关系框图,如图5-1所示。从图5-1可见,VFS是用户层的直接接口,是面向用户的服务。图5-1VFS和系统静态关系图在图5-2中每个节点被使用时都会在VFS层中创建dentry,这样可以快速通过文件名进行查找和定位,Linux内核中对dentry的管理组织形式如图5-3所示。以上是系统运行时VFS对文件名的组织管理,这是VFS管理的一个方面。......
2023-11-22
DM 3730的I2C控制器框架如图7-4所示。图7-4引自《DM 3730芯片手册》中第2798页的框图。关于DM 3730I2C的驱动部分,主要分析相关初始化和总线传输的操作。由于I2C作为控制和获取状态信息,数据量并不大,而且相关的操作频率并不高,这样在中断中进行相关的处理,对系统的影响并不大。......
2023-11-22
SPI是一种高速、全双工、同步总线。这样就允许单个SPI总线上连接多个SPI从设备。对于SPI总线从设备并没有固化的地址,而是通过CS信号区分不同的设备。另外因为SPI总线频率最高可以达到70MHz,所以需要较大吞吐量的操作方案进行数据传输,通常使用DMA进行操作。总体上来说,系统对于SPI总线驱动的需求就是要能实现总线的各种功能,并且满足类似于I2C总线的各种无关性需求。图7-5SPI总线数据传输信号规范......
2023-11-22
考虑到电源管理的需求涉及处理器和各种设备,一方面是处理器尽可能减少功耗,另一方面是设备尽可能减少功耗。图5-30Linux电源管理各个功能从图5-30可见Linux内核的电源管理功能有与处理器相关的CPUIdle和CPUFreq,也有与设备相关的runtime pm,另外还有与整个系统待机时SLM相关的低功耗电源管理功能。下面分别对这些功能框架进行介绍。具体的驱动同样会在SoC电源管理部分进行讲解。对具体设备的电源管理实现,将在设备驱动中进行详细分析。......
2023-11-22
整体的frame buffer框架如图6-5所示。了解frame buffer的框架还要先从为用户提供的接口开始。图6-7可变参数中硬件信息的含义固定信息是在frame buffer的操作过程中并不发生变化的。从整体分析,frame buffer的框架很直接,主要就是直接管理实际的设备,而相关的操作与应用层直接相关。......
2023-11-22
相关推荐