图6-4分辨率指标从图6-4可见,目前各种显示分辨率,不仅大小不同,长宽比也是各种各样的,这些分辨率主要有两种不同的标准,一种是4∶3的PC相关的显示器标准,另外一种是16∶9的TV相关的标准。对显示驱动基本的需求就是能够支持这些各种不同分辨率和长宽比的显示设备,并对这些设备进行相应的控制,使得系统能有较好的输出效果。......
2023-11-22
通常的分类方式是将设备分为字符设备、块设备和网络设备。这种分类方式在Linux内核的层次分析中已经讨论过,三种设备面向完全不同的三种应用,并且它们的数据组织形式以及数据特点还是有着明显的差别的。字符设备的数据可以认为是流式时变的;块设备的数据是以块为数据单元的;网络设备的数据组织形式是和数据链路层的数据组织相关的。这样的分类方式只是在高级抽象层中对主设备相关的分类,对具体的设备究竟如何划分并没有涉及。
谈到设备分类,还会想到Linux内核中的drivers目录,drivers目录下的子目录本身就是对设备驱动的分类。图3-10是2.6.37 Linux内核drivers目录下的子目录,目录中可以看到抽象的设备(如char、block),也可以看到具体的设备(如media、rtc等),有些是和设备以及电源管理框架相关(如base、power、cpuidle、cpufreq、thermal等),还有基于代码维护考虑创建的目录(如staging该目录下的驱动还没有确认合并进代码主干)。看到这么多子目录并不清楚drivers目录下的驱动究竟是以什么原则进行子目录的设计,究竟应该如何将设备进行分类。由于Linux内核中drivers目录下子目录设置有代码管理的原因,每个子目录都对应着Linux内核的一个project。由于Linux内核是分布式开发的,通过porject进行目录的定义对代码管理来说是比较好的方式。随着Linux内核的发展,目录也在不断地增加,有时也会对目录进行整理移动,比如音频相关的框架和驱动就移动到内核的根目录下的sound
图3-10 2.6.37 Linux内核drivers目录子目录
目录中。
还有一种设备分类,就是看看内核自己是怎么分的。这就要看看内核开放给我们的接口sys文件系统。新的Linux内核在提供信息方面已经做得比较完善,相应的设备信息可以通过sys文件系统一探究竟。下面是sys/class中的信息。
从中可以发现,sys/class的信息很多和drivers目录下的信息相似,而且信息量更大,细节更多。比如scsi就有四个相关的条目,spi也有三个相关的条目。这是由于总线中会有多种类型设备来保证设备互连。其他部分有些是横切功能(如dma、gpio等),有些是用户接口功能(如sound、graphic等),总之是包含所有类型的信息。(www.chuimin.cn)
讨论过数据操作形式的设备分类、驱动目录的分类以及sys文件系统分类等方法后,读者对实际设备如何工作、驱动如何实现仍然十分模糊,而且对实际设备的实现层次没有清晰的认识。这里首先来看看PC上的硬件层次。PC上的硬件层次如图3-11所示。
图3-11 硬件层次图
以图中Webcam为例,硬件上从CPU到Webcam经过了PCI总线和USB总线,然后才连接Webcam,这样硬件实际就是Webcam、USB、PCI三层。硬件上有了层次的概念,同样的在驱动框架中也应该有对应的层次概念。驱动的层次如图3-12所示。图3-12中圈起来的部分是实现Webcam功能相关的模块,video_device是Webcam视频功能的驱动框架,uvc_driver则是Webcam的具体实现驱动,相应的usb_driver就是硬件层中USB的具体实现。这里有个问题,为什么没有PCI呢?PCI如何体现呢?驱动软件中已经将PCI封装到具体的USB总线实现中,毕竟USB设备本身并不关心其所在的PCI总线的实现细节,通过USB的实现屏蔽PCI的细节,可以让开发者只关注直接关联的接口实现,降低实现的复杂度。对硬件的层次关系与驱动的层次关系进行比较可以发现,硬件的层次关系是站在从设备互联的角度从处理器到功能设备,而软件驱动的层次角度是从功能到设备互联,刚好是反向过程。这样从硬件的层次需求出发来理解设备驱动会更清晰、更明确。
图3-12 驱动层次
看过Webcam的例子后,再重新考虑设备分类的问题,硬件通过各种总线实现层次扩展。那么按照这种层次的需要进行设备分类,一定会有全新的视角。再考虑Webcam软件驱动的层次,首先是功能的抽象,然后是设备连接的抽象,这正好符合设备的两个基本需求———功能和互联。设备分类完全可以从这两个层次需求的角度考虑。
有关深入剖析Linux内核与设备驱动的文章
图6-4分辨率指标从图6-4可见,目前各种显示分辨率,不仅大小不同,长宽比也是各种各样的,这些分辨率主要有两种不同的标准,一种是4∶3的PC相关的显示器标准,另外一种是16∶9的TV相关的标准。对显示驱动基本的需求就是能够支持这些各种不同分辨率和长宽比的显示设备,并对这些设备进行相应的控制,使得系统能有较好的输出效果。......
2023-11-22
图7-8引自《MMC规范》。需要根据这些控制器的属性值正确地操作MMC设备。图7-9MMC信号传输特点图7-9以单一的读操作为例,可见MMC的信号主要通过CMD传送命令,并且需要响应,通过DAT信号传送数据。另外由于MMC连接的设备可能会以卡的形式存在,这就需要能够支持对设备插入的检测,在系统级别也需要能够对设备插拔进行支持。总体上来说,MMC总线驱动的需求就是要能实现总线的各种功能,并且满足总线的各种无关性需求。......
2023-11-22
音频设备还有可能有多路数据源,而在设备内部作混音,所以在考虑控制需求的时候,同样要考虑相关的应用以及混音通路的设置。这样更进一步要求控制流能够和数据流分离。然而控制流和数据流不仅要考虑分离又要考虑关联,毕竟控制部分同样需要能够获取数据流格式等相关的信息。......
2023-11-22
USB的设计为非对称式的,它是主从式总线,任何USB事务都是由主机引发的。USB总线拓扑如图7-12所示。图7-12引自《USB2.0规范》。USB总线已经成为使用最广泛的设备连接标准。每个USB设备至少有两个端点/管道,分别是进和出两个方向,编号为0,用于控制总线上的设备。总体上来说,系统对USB总线驱动的需求就是要能按规范实现总线的各种功能,并且满足总线的各种无关性的需求。......
2023-11-22
Linux内核有一类特殊的用户,就是系统管理员,这些用户需要对内核有一定的了解,并对内核进行相应的设置。Linux内核也要满足性能需求,需要更快、更高、更强。内核和驱动开发人员需要Linux内核提供基本功能和框架的支持。......
2023-11-22
应用层需要统一的接口对设备进行操作,内核中还需要良好的框架和机制对这些设备进行管理,而很多情况下还需要设备能够被发现并绑定正确的驱动,这些都是需要内核框架的支持。无论是应用层的设备还是横切功能,在设备管理中都是高层的抽象概念。一个良好的设备实现框架,如字符设备框架,也是设备开发的重要需求。这些都是对设备及设备开发的需求。......
2023-11-22
SPI是一种高速、全双工、同步总线。这样就允许单个SPI总线上连接多个SPI从设备。对于SPI总线从设备并没有固化的地址,而是通过CS信号区分不同的设备。另外因为SPI总线频率最高可以达到70MHz,所以需要较大吞吐量的操作方案进行数据传输,通常使用DMA进行操作。总体上来说,系统对于SPI总线驱动的需求就是要能实现总线的各种功能,并且满足类似于I2C总线的各种无关性需求。图7-5SPI总线数据传输信号规范......
2023-11-22
设备模型中管理驱动的数据结构是device_driver,其中包含驱动提供的通用服务的接口,下面对它进行分析:来看看sys文件系统中驱动之下主要管理哪些实体:从driver_private可见,其中主要的信息是运行中使用该驱动的设备列表。以platform驱动实体为例进行分析:其中定义了总线设备相关的服务接口:从platform驱动注册接口可以看出,抽象层的服务接口都被换为实例化的接口,这样内嵌的driver可以通过设备模型核心提供的标准操作进行管理,也可以通过这些实例化接口进行转换。......
2023-11-22
相关推荐