图4-24DM 3730物理空间设置IO空间映射的目的就是将这些物理地址映射到整个内核的地址空间中。首先来看ioremap虚拟地址返回是如何实现的。DM 3730等TI芯片就是通过该方法来实现该功能的。注意__arm_ioremap_caller使用的是vmalloc的空间进行映射,在相应版本内核中vmalloc的空间和TI芯片的IO映射空间是完全分开的,所以这里要直接返回相应的虚拟地址。......
2023-11-22
1ᤫ芯片片内内存使用
TI芯片相关的内存管理,对片外内存来说,可以通过启动参数将需要内核管理的内存进行设置。而片内内存则有各种各样的使用方式,DM3730芯片是将其直接映射到内核虚拟地址空间的特定地址以供使用,采用该方法的原因主要是由于电源管理很多功能需要片内内存。这里介绍一下映射部分,具体的使用则在芯片电源管理部分进行介绍。相关映射代码如下:
omap_map_sram是将片内内存映射到内核的虚拟地址空间,使用的方式是按照IO映射进行的,主要是由于对于ARM体系结构使用统一的地址,另外需要关掉cache进行映射,映射到omap_sram_base(使用变量是因为可以根据芯片调整)指定的地址。该接口是在板级支持的map_io中被调用,这样DM 3730内核就可以直接使用相应的虚拟地址进行操作了。使用相应空间的接口函数是omap_sram_push,详细代码如下:
从omap_sram_push可见,其采用从后往前的方式进行分配,主要是将需要的数据复制到相应的片内空间。芯片电源管理部分可知具体的数据内容,这里可以先说明一下,其内容主要是执行的代码。
2ᤫ芯片保留物理内存
SoC内部通常有些模块需要在启动时保留部分内存空间。这样做的原因是由于需要连续的物理内存空间,并且对内核的物理内存管理影响最小。DM 3730同样有该需求,看看DM3730是如何实现相应功能的:
之前在介绍Linux内核初始化时看到arm_memblock_init,其中会根据启动时的参数获得物理内存的memblock信息,在该接口中会调用板级的reserve接口,就可以保留内存空间,使得Linux内核不管理这部分物理内存,而是留给板级相关的驱动去管理,这就相当于Linux内核开出一块保留区域给处理器自由使用。DM 3730就是利用该接口,保留了相关的内存,为特殊的驱动使用,包括显示驱动和DSP相关功能部分。具体的内容还是在实际驱动中进行介绍。(www.chuimin.cn)
3ᤫ独立cmem管理
之前简单说明芯片厂商的独立内存管理,针对于TI的视频芯片,TI提供了cmem的内存管理驱动,主要是连续内存管理。其主要目的是针对视频SoC的视频加速应用,如视频编解码功能。视频编解码功能通常属于应用的范畴,而如果通过硬件加速来实现视频编解码,则其需要连续的物理空间,这就相当于要在应用中使用连续的物理内存。如果由Linux内核直接管理和提供这部分内存是无法实现的,这样芯片厂商就开发相应的驱动,通过将物理内存交由驱动管理,而不是内核直接管理来实现该功能。具体的映射则通过虚拟地址的映射机制来实现。
对于TI的cmem有两种分配模式:一种是采用pool算法实现的,通过参数来设定所管理的物理空间的地址范围及每个内存池的大小及数目,以驱动的形式管理这部分内存;另一种是heap模式,把内存区域作为堆来使用。这两种模式对于内存的管理都是通过IO控制来完成。下面是一个使用的例子:
这个例子就是对大块的物理内存使用堆模式,而对于片内的内存采用了pool模式管理。
当然对内存管理不可忽视的是处理器cache相关的操作,为了给相关的应用提供完整的功能,独立的内存管理同样也要提供cache相关的操作接口,对于cmem提供的完整操作接口如下:
从功能看已经设计了完整的内存管理和cache管理功能。有了该内存管理功能,TI的多媒体框架和编解码库就可以使用连续的物理内存空间,高效地完成多媒体处理相关的功能。
有关深入剖析Linux内核与设备驱动的文章
图4-24DM 3730物理空间设置IO空间映射的目的就是将这些物理地址映射到整个内核的地址空间中。首先来看ioremap虚拟地址返回是如何实现的。DM 3730等TI芯片就是通过该方法来实现该功能的。注意__arm_ioremap_caller使用的是vmalloc的空间进行映射,在相应版本内核中vmalloc的空间和TI芯片的IO映射空间是完全分开的,所以这里要直接返回相应的虚拟地址。......
2023-11-22
内存管理是Linux内核非常重要的功能,可以说是最基础的功能之一。图4-31存储系统层次结构整个内存管理的首要需求自然是内存物理空间的管理。特别是视频应用需求的不断增长使得内存管理的需求也发生了变化,由于图像分辨率以及显示分辨率的不断提高,而协处理器通常又需要连续的物理内存,这样就有对于几兆甚至十几兆连续内存管理的需求。而原有的Linux内核内存管理并不能满足这种需求,这样就需要开发新的内存管理方法。......
2023-11-22
对视频驱动的具体实现,以DM3730 ISP驱动的设计与实现为例进行介绍。ISP驱动中使用isp_video作为以上单一矩形节点的抽象以及管理实体。可见实际的操作是由子设备完成的,子设备与具体功能相关。具体如下:这里操作的主要目的就是注册v4l2的子设备和I2C的设备,通过I2C总线适配将视频子设备与I2C的Camera Sensor关联起来,从而实现完整的驱动和设备连接。......
2023-11-22
DM 3730的I2C控制器框架如图7-4所示。图7-4引自《DM 3730芯片手册》中第2798页的框图。关于DM 3730I2C的驱动部分,主要分析相关初始化和总线传输的操作。由于I2C作为控制和获取状态信息,数据量并不大,而且相关的操作频率并不高,这样在中断中进行相关的处理,对系统的影响并不大。......
2023-11-22
图6-10DM3730显示子系统软件整体架构从图6-10可见,在驱动框架部分,DSS的设计支持frame buffer和V4L2两种架构,这是由于两种类型的设备都是通过硬件的display子系统进行显示,它们之间可以通过叠加子系统进行叠加,这样相当于在硬件层进行了硬件加速,可以实现良好的显示效果。开放的sys接口如下:图6-11DSS软件模块与硬件对应关系图通过以上的设置就可以实现显示的切换、叠加等复杂的功能。TI frame buffer驱动的核心管理实体是omapfb2_device。驱动应对这种修改通过mapfb_apply_changes来实现。......
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
考虑到电源管理的需求涉及处理器和各种设备,一方面是处理器尽可能减少功耗,另一方面是设备尽可能减少功耗。图5-30Linux电源管理各个功能从图5-30可见Linux内核的电源管理功能有与处理器相关的CPUIdle和CPUFreq,也有与设备相关的runtime pm,另外还有与整个系统待机时SLM相关的低功耗电源管理功能。下面分别对这些功能框架进行介绍。具体的驱动同样会在SoC电源管理部分进行讲解。对具体设备的电源管理实现,将在设备驱动中进行详细分析。......
2023-11-22
从图3-2中可以理解Linux内核就是将硬件的功能抽象出来,为用户的应用程序提供各种系统服务。与用户相关的属性是与Linux内核中整体安全性相关的,这部分功能通常和硬件具体功能关系不大,而是附加在逻辑功能之上的属性。本书是以嵌入式系统为基础进行说明,所以将重点放在硬件设备的具体功能以及Linux内核在硬件之上的具体实现方面。Linux内核的整体框架如图3-3所示。图3-3清晰地展现了Linux内核的实现层次,以及应用层功能和硬件功能的对应关系。......
2023-11-22
相关推荐