1芯片片内内存使用TI芯片相关的内存管理,对片外内存来说,可以通过启动参数将需要内核管理的内存进行设置。这样做的原因是由于需要连续的物理内存空间,并且对内核的物理内存管理影响最小。3独立cmem管理之前简单说明芯片厂商的独立内存管理,针对于TI的视频芯片,TI提供了cmem的内存管理驱动,主要是连续内存管理。有了该内存管理功能,TI的多媒体框架和编解码库就可以使用连续的物理内存空间,高效地完成多媒体处理相关的功能。......
2023-11-22
现在看看具体芯片在地址映射这部分是如何实现的。内存部分的映射完全可以通过启动参数以及一些宏定义实现。通过mem和vmalloc这两个内核提供的启动参数以及VMALLOC_START和VMALLOC_END两个宏,可以将lowmem和vmalloc的空间定下来。相关的宏定义DM 3730和DM 816X的内核代码如下:
vmalloc的空间是在lowmem之后的8MB开始的,当然vmalloc的空间不是随意大小的,会有最小空间的限制,默认限制如下:
当然相应的大小可以由启动参数vmalloc进行设置,但是也不能小于16MB。有了总的内存设置(启动参数mem),有了vmalloc空间的结束设置和最小空间限制,内存的映射基本就解决了。如果内存容量超出了这些空间,还有pkmap可以进行映射。当然之前说明新的内核中(DM 3730和DM 816X没有相应版本的实现)VMALLOC_END已经直接由ARM内核设定为0xff000000了,这样的调整对于实现没有太大的影响,因为这是地址空间的调整,具体映射的内容可以在映射模块内部解决兼容性的问题。
2.IO空间在内核中的映射
接下来的重点是IO空间的映射。首先,来看看DM 3730的物理空间是如何设置的,如图4-24所示。图4-24引自《DM 3730芯片手册》中第204页的表,由于表比较大,这里只截取一部分。
图4-24 DM 3730物理空间设置
IO空间映射的目的就是将这些物理地址映射到整个内核的地址空间中。下面来看看DM3730内核中映射关系是怎样的。在arch/arm/plat-omap/include/mach/io.h中定义映射关系如下:
可见映射是从0xf8000000开始的,正好是在vmalloc之后,这样就不会有空间重叠的问题。从物理地址的角度和图4-24中描述的地址也是吻合的,只是代码中每部分的空间只保留使用的部分,不像物理上预留了更多的空间。
有了这样的映射关系之后,就要解决两个问题:一个是ioremap如何返回正确的虚拟地址;另外一个就是实际的映射建立。(www.chuimin.cn)
首先来看ioremap虚拟地址返回是如何实现的。在ARM的io.h中有如下定义:
可见,可以通过定义特别的arch_ioremap来实现ioremap的重定向。DM 3730等TI芯片就是通过该方法来实现该功能的。下面来看看细节,在arch/arm/plat-omap/include/mach/io.h中有如下定义:
最终由omap_ioremap来实现ioremap的功能,看看omap_ioremap的代码就清楚了。代码如下:
其中所做的工作就是,如果是映射关系中的物理地址就直接转换为相应的虚拟地址并返回,否则就使用ARM内核提供的__arm_ioremap_caller进行映射。注意__arm_ioremap_caller使用的是vmalloc的空间进行映射,在相应版本内核中vmalloc的空间和TI芯片的IO映射空间是完全分开的,所以这里要直接返回相应的虚拟地址。新内核的iotable_init是通过vmal-loc空间的静态分配来将这部分地址在初始化的时候保留,这样就可以直接使用ARM内核的ioremap而不需要进行重定向了。新内核的该功能进一步减少了不同处理器之间的差别,减少了移植的工作量。
具体映射的建立则是从板级相关的初始化接口map_io开始。对于DM 3730相应的map_io为omap3_map_io,其内容如下:
重点是在omap34xx_map_common_io中,该函数及相关函数详细说明。其代码如下:
IO空间页表的映射是通过ARM内核提供的iotable_init实现的。映射之后就进行寄存器的访问以及片内RAM的初始化,片内RAM的初始化由于和内存管理相关,还是放在内存管理的实现中进行说明。而对于具体的映射属性是通过omap34xx_io_desc数组定义的,具体的数组内容可以通过实际代码来了解细节。
有关深入剖析Linux内核与设备驱动的文章
1芯片片内内存使用TI芯片相关的内存管理,对片外内存来说,可以通过启动参数将需要内核管理的内存进行设置。这样做的原因是由于需要连续的物理内存空间,并且对内核的物理内存管理影响最小。3独立cmem管理之前简单说明芯片厂商的独立内存管理,针对于TI的视频芯片,TI提供了cmem的内存管理驱动,主要是连续内存管理。有了该内存管理功能,TI的多媒体框架和编解码库就可以使用连续的物理内存空间,高效地完成多媒体处理相关的功能。......
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
对视频驱动的具体实现,以DM3730 ISP驱动的设计与实现为例进行介绍。ISP驱动中使用isp_video作为以上单一矩形节点的抽象以及管理实体。可见实际的操作是由子设备完成的,子设备与具体功能相关。具体如下:这里操作的主要目的就是注册v4l2的子设备和I2C的设备,通过I2C总线适配将视频子设备与I2C的Camera Sensor关联起来,从而实现完整的驱动和设备连接。......
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
图6-10DM3730显示子系统软件整体架构从图6-10可见,在驱动框架部分,DSS的设计支持frame buffer和V4L2两种架构,这是由于两种类型的设备都是通过硬件的display子系统进行显示,它们之间可以通过叠加子系统进行叠加,这样相当于在硬件层进行了硬件加速,可以实现良好的显示效果。开放的sys接口如下:图6-11DSS软件模块与硬件对应关系图通过以上的设置就可以实现显示的切换、叠加等复杂的功能。TI frame buffer驱动的核心管理实体是omapfb2_device。驱动应对这种修改通过mapfb_apply_changes来实现。......
2023-11-22
从图3-2中可以理解Linux内核就是将硬件的功能抽象出来,为用户的应用程序提供各种系统服务。与用户相关的属性是与Linux内核中整体安全性相关的,这部分功能通常和硬件具体功能关系不大,而是附加在逻辑功能之上的属性。本书是以嵌入式系统为基础进行说明,所以将重点放在硬件设备的具体功能以及Linux内核在硬件之上的具体实现方面。Linux内核的整体框架如图3-3所示。图3-3清晰地展现了Linux内核的实现层次,以及应用层功能和硬件功能的对应关系。......
2023-11-22
首先要明确,这里讲述的地址映射框架主要是指内核空间虚拟地址的使用和映射。嵌入式系统通常是采用ARM的处理器,相应的地址映射框架自然就从Linux内核的ARM体系结构入手。图4-19ARM内核地址空间映射关系2.内核中的映射实现和相关的权限管理地址映射的代码框架如图4-20所示。图4-20ARM地址映射代码框架谈到create_mapping的映射,就会涉及体系结构中不同的访问方式和权限。......
2023-11-22
相关推荐