对视频驱动的具体实现,以DM3730 ISP驱动的设计与实现为例进行介绍。ISP驱动中使用isp_video作为以上单一矩形节点的抽象以及管理实体。可见实际的操作是由子设备完成的,子设备与具体功能相关。具体如下:这里操作的主要目的就是注册v4l2的子设备和I2C的设备,通过I2C总线适配将视频子设备与I2C的Camera Sensor关联起来,从而实现完整的驱动和设备连接。......
2023-11-22
TI DM3730的frame buffer驱动针对的硬件设备是display controller,硬件框图如图6-9所示。图6-9引自《DM3730芯片手册》中第1624页框图。
图6-9 DM3730 display控制器硬件框图
从图6-9可见,DM3730支持3个不同的显示通道,而且所有的通道都通过DMA自动获得显示信息进行显示,不同的通道可以以一定顺序进行叠加,在显示硬件上也可以有两个显示设备,硬件提供了在不同的显示通道以及硬件显示设备切换的能力。
1ᤫ整体框架
为了支持硬件的各种功能,在相应的驱动设计过程中TI设计了DSS(display subsystem)架构支持该功能。整体的架构如图6-10所示。
图6-10 DM3730显示子系统软件整体架构
从图6-10可见,在驱动框架部分,DSS的设计支持frame buffer和V4L2两种架构,这是由于两种类型的设备都是通过硬件的display子系统进行显示,它们之间可以通过叠加子系统进行叠加,这样相当于在硬件层进行了硬件加速,可以实现良好的显示效果。
在系统设计中还开放了sys文件系统接口,可以方便地进行切换和设置,来满足各种动态的需求。
DSS系统中各个模块与硬件的对应关系如图6-11所示。
从图6-11可见,不同的pipeline是由overlay进行管理来表示不同的overlay层,而man-ager则是管理硬件的叠加控制以及之后的显示通路,会对应到显示接口,display部分是对显示接口的控制,panel则是对应真实的显示设备。
开放的sys接口如下:
图6-11 DSS软件模块与硬件对应关系图
通过以上的设置就可以实现显示的切换、叠加等复杂的功能。
2ᤫFrame Buffer驱动
接下来看看framebuffer驱动是如何实现的。TI frame buffer驱动的核心管理实体是omapfb2_device。
从内容看其管理了上层fb_info以及内部的overlay、manager还有display,实际它就是display subsystem的逻辑实体。
相关的初始化是在platform驱动的probe中进行的,具体分析如下:
通过以上初始化后,就可以通过sys文件系统对相关属性进行设置了。另外frame buffer的可变参数也是可以修改的(如FBIOPAN_DISPLAY命令)。驱动应对这种修改通过mapfb_apply_changes来实现。具体分析如下:(www.chuimin.cn)
frame buffer的驱动还有重要的内容就是对显示存储空间的分配和映射,下面进行相关的分析。
显示存储空间的分配系统会在初始化的时候通过启动参数预留,相关代码分析如下:
显存的空间通过vram统一管理,这部分空间不在内核的管理范围内,相应的分配也是由vram的分配函数omap_vram_alloc来进行,具体的分配工作则是在驱动probe中通过omapfb_create_frame buffers来执行的。
驱动也提供了相应的映射接口omapfb_mmap,分析如下:
从分析中可见,设置了虚拟地址区域的操作接口mmap_user_ops,由于相应的映射是通过io_remap_pfn_range的整体映射,并不需要进行缺页异常的操作,所以mmap_user_ops只提供了open和release的接口用于引用计数的操作。
用户对frame buffer的操作基本都通过以上的功能完成。
3ᤫ显示设备的管理
从DSS硬件可见,其可以支持多个显示设备,这有些类似于总线,为了能够同时支持多个显示设备,驱动设计并实现了一种逻辑总线———dss_bus。相关分析如下:
另外在设备与驱动绑定需要相应的注册接口,具体的分析如下:
可见dssbus管理的实体就是设备omap_dss_device和驱动omap_dss_driver,在omap_dss_device中主要是显示设备的硬件信号信息,而omap_dss_driver则是操作接口(包括功能和电源管理操作)。
如果整个dss编进内核的话,相应的初始化如下:
可见bus的初始化要早于相应的驱动,这样就在dss驱动初始化probe的过程中将所有的显示设备信息注册,而驱动注册的时候就可以将二者绑定。
这样就完成了多种显示设备的管理,从而可以实现各种复杂的功能。
有关深入剖析Linux内核与设备驱动的文章
对视频驱动的具体实现,以DM3730 ISP驱动的设计与实现为例进行介绍。ISP驱动中使用isp_video作为以上单一矩形节点的抽象以及管理实体。可见实际的操作是由子设备完成的,子设备与具体功能相关。具体如下:这里操作的主要目的就是注册v4l2的子设备和I2C的设备,通过I2C总线适配将视频子设备与I2C的Camera Sensor关联起来,从而实现完整的驱动和设备连接。......
2023-11-22
实际音频驱动的分析会以DM 3730的相关驱动为例进行说明。图6-17引自《DM 3730芯片手册》中第3096页框图。下面来看看dai相关的实现细节。4codec模块对codec模块部分,之前在codec的注册函数snd_soc_register_codec定义可见其会将co-dec driver和codec侧的dai同时注册,因为这两者都是与codec相关的。这里以DM3 730板上的twl4030为例,介绍相关的框架。对于codec主要是由codec driver来提供控制接口,而由codec dai来提供数据传输能力。......
2023-11-22
图6-4分辨率指标从图6-4可见,目前各种显示分辨率,不仅大小不同,长宽比也是各种各样的,这些分辨率主要有两种不同的标准,一种是4∶3的PC相关的显示器标准,另外一种是16∶9的TV相关的标准。对显示驱动基本的需求就是能够支持这些各种不同分辨率和长宽比的显示设备,并对这些设备进行相应的控制,使得系统能有较好的输出效果。......
2023-11-22
整体的frame buffer框架如图6-5所示。了解frame buffer的框架还要先从为用户提供的接口开始。图6-7可变参数中硬件信息的含义固定信息是在frame buffer的操作过程中并不发生变化的。从整体分析,frame buffer的框架很直接,主要就是直接管理实际的设备,而相关的操作与应用层直接相关。......
2023-11-22
1芯片片内内存使用TI芯片相关的内存管理,对片外内存来说,可以通过启动参数将需要内核管理的内存进行设置。这样做的原因是由于需要连续的物理内存空间,并且对内核的物理内存管理影响最小。3独立cmem管理之前简单说明芯片厂商的独立内存管理,针对于TI的视频芯片,TI提供了cmem的内存管理驱动,主要是连续内存管理。有了该内存管理功能,TI的多媒体框架和编解码库就可以使用连续的物理内存空间,高效地完成多媒体处理相关的功能。......
2023-11-22
图4-24DM 3730物理空间设置IO空间映射的目的就是将这些物理地址映射到整个内核的地址空间中。首先来看ioremap虚拟地址返回是如何实现的。DM 3730等TI芯片就是通过该方法来实现该功能的。注意__arm_ioremap_caller使用的是vmalloc的空间进行映射,在相应版本内核中vmalloc的空间和TI芯片的IO映射空间是完全分开的,所以这里要直接返回相应的虚拟地址。......
2023-11-22
设备模型中管理驱动的数据结构是device_driver,其中包含驱动提供的通用服务的接口,下面对它进行分析:来看看sys文件系统中驱动之下主要管理哪些实体:从driver_private可见,其中主要的信息是运行中使用该驱动的设备列表。以platform驱动实体为例进行分析:其中定义了总线设备相关的服务接口:从platform驱动注册接口可以看出,抽象层的服务接口都被换为实例化的接口,这样内嵌的driver可以通过设备模型核心提供的标准操作进行管理,也可以通过这些实例化接口进行转换。......
2023-11-22
USB的设计为非对称式的,它是主从式总线,任何USB事务都是由主机引发的。USB总线拓扑如图7-12所示。图7-12引自《USB2.0规范》。USB总线已经成为使用最广泛的设备连接标准。每个USB设备至少有两个端点/管道,分别是进和出两个方向,编号为0,用于控制总线上的设备。总体上来说,系统对USB总线驱动的需求就是要能按规范实现总线的各种功能,并且满足总线的各种无关性的需求。......
2023-11-22
相关推荐