首页 理论教育Linux内核设备驱动:TI芯片帧缓冲驱动实现解析

Linux内核设备驱动:TI芯片帧缓冲驱动实现解析

【摘要】:图6-10DM3730显示子系统软件整体架构从图6-10可见,在驱动框架部分,DSS的设计支持frame buffer和V4L2两种架构,这是由于两种类型的设备都是通过硬件的display子系统进行显示,它们之间可以通过叠加子系统进行叠加,这样相当于在硬件层进行了硬件加速,可以实现良好的显示效果。开放的sys接口如下:图6-11DSS软件模块与硬件对应关系图通过以上的设置就可以实现显示的切换、叠加等复杂的功能。TI frame buffer驱动的核心管理实体是omapfb2_device。驱动应对这种修改通过mapfb_apply_changes来实现。

TI DM3730的frame buffer驱动针对的硬件设备是display controller,硬件框图如图6-9所示。图6-9引自《DM3730芯片手册》中第1624页框图。

978-7-111-49426-3-Chapter06-80.jpg

图6-9 DM3730 display控制器硬件框图

从图6-9可见,DM3730支持3个不同的显示通道,而且所有的通道都通过DMA自动获得显示信息进行显示,不同的通道可以以一定顺序进行叠加,在显示硬件上也可以有两个显示设备,硬件提供了在不同的显示通道以及硬件显示设备切换的能力。

1ᤫ整体框架

为了支持硬件的各种功能,在相应的驱动设计过程中TI设计了DSS(display subsystem)架构支持该功能。整体的架构如图6-10所示。

978-7-111-49426-3-Chapter06-81.jpg

图6-10 DM3730显示子系统软件整体架构

从图6-10可见,在驱动框架部分,DSS的设计支持frame buffer和V4L2两种架构,这是由于两种类型的设备都是通过硬件的display子系统进行显示,它们之间可以通过叠加子系统进行叠加,这样相当于在硬件层进行了硬件加速,可以实现良好的显示效果。

在系统设计中还开放了sys文件系统接口,可以方便地进行切换和设置,来满足各种动态的需求。

DSS系统中各个模块与硬件的对应关系如图6-11所示。

从图6-11可见,不同的pipeline是由overlay进行管理来表示不同的overlay层,而man-ager则是管理硬件的叠加控制以及之后的显示通路,会对应到显示接口,display部分是对显示接口的控制,panel则是对应真实的显示设备。

开放的sys接口如下:

978-7-111-49426-3-Chapter06-82.jpg

978-7-111-49426-3-Chapter06-83.jpg

978-7-111-49426-3-Chapter06-84.jpg

图6-11 DSS软件模块与硬件对应关系图

978-7-111-49426-3-Chapter06-85.jpg

通过以上的设置就可以实现显示的切换、叠加等复杂的功能。

2ᤫFrame Buffer驱动

接下来看看framebuffer驱动是如何实现的。TI frame buffer驱动的核心管理实体是omapfb2_device。

978-7-111-49426-3-Chapter06-86.jpg

从内容看其管理了上层fb_info以及内部的overlay、manager还有display,实际它就是display subsystem的逻辑实体。

相关的初始化是在platform驱动的probe中进行的,具体分析如下:

978-7-111-49426-3-Chapter06-87.jpg

978-7-111-49426-3-Chapter06-88.jpg

978-7-111-49426-3-Chapter06-89.jpg

978-7-111-49426-3-Chapter06-90.jpg

通过以上初始化后,就可以通过sys文件系统对相关属性进行设置了。另外frame buffer的可变参数也是可以修改的(如FBIOPAN_DISPLAY命令)。驱动应对这种修改通过mapfb_apply_changes来实现。具体分析如下:(www.chuimin.cn)

978-7-111-49426-3-Chapter06-91.jpg

978-7-111-49426-3-Chapter06-92.jpg

978-7-111-49426-3-Chapter06-93.jpg

frame buffer的驱动还有重要的内容就是对显示存储空间的分配和映射,下面进行相关的分析。

显示存储空间的分配系统会在初始化的时候通过启动参数预留,相关代码分析如下:

978-7-111-49426-3-Chapter06-94.jpg

978-7-111-49426-3-Chapter06-95.jpg

978-7-111-49426-3-Chapter06-96.jpg

显存的空间通过vram统一管理,这部分空间不在内核的管理范围内,相应的分配也是由vram的分配函数omap_vram_alloc来进行,具体的分配工作则是在驱动probe中通过omapfb_create_frame buffers来执行的。

驱动也提供了相应的映射接口omapfb_mmap,分析如下:

978-7-111-49426-3-Chapter06-97.jpg

978-7-111-49426-3-Chapter06-98.jpg

978-7-111-49426-3-Chapter06-99.jpg

从分析中可见,设置了虚拟地址区域的操作接口mmap_user_ops,由于相应的映射是通过io_remap_pfn_range的整体映射,并不需要进行缺页异常的操作,所以mmap_user_ops只提供了open和release的接口用于引用计数的操作。

用户对frame buffer的操作基本都通过以上的功能完成。

3ᤫ显示设备的管理

从DSS硬件可见,其可以支持多个显示设备,这有些类似于总线,为了能够同时支持多个显示设备,驱动设计并实现了一种逻辑总线———dss_bus。相关分析如下:

978-7-111-49426-3-Chapter06-100.jpg

978-7-111-49426-3-Chapter06-101.jpg

另外在设备与驱动绑定需要相应的注册接口,具体的分析如下:

978-7-111-49426-3-Chapter06-102.jpg

978-7-111-49426-3-Chapter06-103.jpg

可见dssbus管理的实体就是设备omap_dss_device和驱动omap_dss_driver,在omap_dss_device中主要是显示设备的硬件信号信息,而omap_dss_driver则是操作接口(包括功能和电源管理操作)。

如果整个dss编进内核的话,相应的初始化如下:

978-7-111-49426-3-Chapter06-104.jpg

可见bus的初始化要早于相应的驱动,这样就在dss驱动初始化probe的过程中将所有的显示设备信息注册,而驱动注册的时候就可以将二者绑定。

这样就完成了多种显示设备的管理,从而可以实现各种复杂的功能。