下面以4.1.1节所介绍的系统初始化流程为例,来看看不同的处理器启动流程的区别。图4-4和图4-5分别是DM 816X和DM 3730的启动流程。其中原因是芯片内部片内内存大小。接下来以TI芯片为基础进行整个系统的初始化过程详解。之前讨论内核初始化需求的时候,提到初始化代码应该在初始化之后释放相应的内存空间,这里可以看出Linux内核已经将初始化相关的代码统一存放并管理,一方面方便初始化时调用,另一方面可以在系统初始化之后将这部分空间释放。......
2023-11-22
在Linux中,体系结构相关的代码都在arch目录下。之前介绍的TI处理器都属于ARM体系结构。在arch/arm目录下,和TI处理器相关的目录有mach-davinci、mach-omap1、mach-omap2、plat-omap。这些目录相关的说明见表2-7。
表2-7 TI处理器内核特殊代码目录说明
表2-7中有一个奇怪的现象,新一代DaVinci处理器的代码不是在mach-davinci中,而是在mach-omap2中。这看似奇怪的问题,可以换个角度来考虑,既然把它们放到一起必定是有原因的,这个原因是什么呢?老话常说“物以类聚,人以群分”,软件也不例外,放到一起的代码相似度也要高一些。从这个角度考虑,新一代Da Vinci芯片应该和OMAP2及以后的OMAP处理器在芯片内部结构方面相似度更高一些。之前介绍DM 3730,DM 81XX和Sitara系列芯片在电源管理部分都有模块PRCM(DM 36X等老的Da Vinci没有PRCM模块),这个PRCM实际就是相似度的表现之一。另外芯片内的某些接口模块也是相同的。这些相似度使得将新一代Da Vinci芯片代码放入mach-omap2目录下管理更合适。新一代Da Vinci芯片的代码也一并在OMAP3的代码分支下管理,TI自己维护的代码分支如下:
Sitara系列芯片的代码也是在mach-omap2目录下,但是代码管理在单独的分支下,TI自己维护的Sitara代码分支如下:
了解软件系统一个好的方式是从Makefile入手进行分析。下面从linux-omap3分支的mach-omap2目录下的Makefile入手,了解OMAP和DaVinci芯片内核特殊代码的结构。其中OMAP相关的内容笔者会保留和DM 3730相关的部分(DM 3730属于OMAP3系列芯片),去除OMAP2和OMAP4相关的内容。(www.chuimin.cn)
了解mach-omap2之后就该来认识plat-omap目录了。该目录主要为各种设备驱动提供统一的接口操作,以此屏蔽芯片的特殊操作,比如GPIO、DMA、时钟等。早期的Linux内核中并没有提供这些设备的统一操作接口,随着Linux内核的发展,逐渐增加了这些设备的统一接口,该目录存在的意义就必然减小。
至此可以明确从芯片的复杂度来看,DM 3730是最复杂的,相对于其他芯片来说其技术含量也是最高的。可以说如果能深刻理解DM 3730及其Linux内核代码,那么除了个别DM3730没有包含的设备接口驱动外,再看其他芯片的代码都是游刃有余的。因此笔者会以TI官方发布的Android开发包中DM 3730的内核代码为主,进行Linux内核及设备驱动的剖析,但是为了避免局限性,必要时会扩展到其他芯片,以及新版本的内核进行说明。
有关深入剖析Linux内核与设备驱动的文章
下面以4.1.1节所介绍的系统初始化流程为例,来看看不同的处理器启动流程的区别。图4-4和图4-5分别是DM 816X和DM 3730的启动流程。其中原因是芯片内部片内内存大小。接下来以TI芯片为基础进行整个系统的初始化过程详解。之前讨论内核初始化需求的时候,提到初始化代码应该在初始化之后释放相应的内存空间,这里可以看出Linux内核已经将初始化相关的代码统一存放并管理,一方面方便初始化时调用,另一方面可以在系统初始化之后将这部分空间释放。......
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-10DM3730显示子系统软件整体架构从图6-10可见,在驱动框架部分,DSS的设计支持frame buffer和V4L2两种架构,这是由于两种类型的设备都是通过硬件的display子系统进行显示,它们之间可以通过叠加子系统进行叠加,这样相当于在硬件层进行了硬件加速,可以实现良好的显示效果。开放的sys接口如下:图6-11DSS软件模块与硬件对应关系图通过以上的设置就可以实现显示的切换、叠加等复杂的功能。TI frame buffer驱动的核心管理实体是omapfb2_device。驱动应对这种修改通过mapfb_apply_changes来实现。......
2023-11-22
对视频驱动的具体实现,以DM3730 ISP驱动的设计与实现为例进行介绍。ISP驱动中使用isp_video作为以上单一矩形节点的抽象以及管理实体。可见实际的操作是由子设备完成的,子设备与具体功能相关。具体如下:这里操作的主要目的就是注册v4l2的子设备和I2C的设备,通过I2C总线适配将视频子设备与I2C的Camera Sensor关联起来,从而实现完整的驱动和设备连接。......
2023-11-22
1芯片片内内存使用TI芯片相关的内存管理,对片外内存来说,可以通过启动参数将需要内核管理的内存进行设置。这样做的原因是由于需要连续的物理内存空间,并且对内核的物理内存管理影响最小。3独立cmem管理之前简单说明芯片厂商的独立内存管理,针对于TI的视频芯片,TI提供了cmem的内存管理驱动,主要是连续内存管理。有了该内存管理功能,TI的多媒体框架和编解码库就可以使用连续的物理内存空间,高效地完成多媒体处理相关的功能。......
2023-11-22
当代码输入计算机时,计算机按照同样的数学方法,根据代码本体重新计算,将结果与输入的校验位比较,由此检验输入的代码是否正确。国际标准图书号与国际物品代码国际标准图书号与国际物品代码中校验位的计算方法相同。4)将10减去余数Y后即为校验位R。如相减后的数值为10,则校验位为0。3)根据Y的值参照对照表得到校验码R。......
2023-11-23
图4-24DM 3730物理空间设置IO空间映射的目的就是将这些物理地址映射到整个内核的地址空间中。首先来看ioremap虚拟地址返回是如何实现的。DM 3730等TI芯片就是通过该方法来实现该功能的。注意__arm_ioremap_caller使用的是vmalloc的空间进行映射,在相应版本内核中vmalloc的空间和TI芯片的IO映射空间是完全分开的,所以这里要直接返回相应的虚拟地址。......
2023-11-22
DM 3730微处理器框架如图2-1所示。图2-1DM 3730系统框图图2-1引自TI的《DM 3730芯片手册》中第187页框图。从框图中可见DM 3730的主要核心与外围接口。DM 3730有三个核心处理器单元:①ARM Cortex-A8:负责系统控制和外围接口驱动。另外为了降低功耗,DM 3730的外部内存接口设计成LPDDR接口,I/O工作电压也设计成1.8V,可见为了满足高性能低功耗的需求,DM 3730在框架设计方面已经做足了工作,这也是它能流行的一个原因。......
2023-11-22
相关推荐