Android板级支持与硬件相关子系统
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 Android的Linux操作系统

Android是基于Linux操作系统的,Linux操作系统包括Linux内核和驱动程序。Linux操作系统位于Android软件系统的最低的一个层次。

Android系统目前可以支持ARM、x86平台,这些平台之间的可移植性是由Linux操作系统的移植性来实现的。Android系统基本上使用的是标准的Linux 2.6内核,与其他嵌入式平台的Linux系统类似。

↘2.3.1 Android中的Linux操作系统的特定内容

Android中使用Linux操作系统,主体部分是Linux的通用代码。除此之外,主要包含三个方面的内容。

·板级移植

·Android的内核组件

·各种硬件的驱动程序

在Android的Linux操作系统的3个方面中,板级移植是对一个硬件平台最基础的Linux支持;Android的内核组件包括专用的内核模块和驱动程序,它们并非标准Linux中的内容,却是Android系统的Linux中通用的内容;各种硬件设备驱动程序则是每一个硬件模块所需要的驱动程序。

Android系统通常用于移动设备或者其他的嵌入式设备,因此多基于ARM体系结构,在ARM体系结构中具有多种处理器。对于同一种处理器,不同的外围设备,也可能将使用不同的驱动程序。如图2-1所示为Android中的Linux内核与驱动。

图2-1 Android中的Linux内核与驱动

↘2.3.2 Android的Linux的基本支持

Android的Linux的基本支持包括板级移植部分和Android的内核组件部分。这两个部分完成后,基本的Android系统即可运行。

1.板级移植部分

从Linux系统的角度,板级移植的核心部分位于arch/<arch>/<mach>目录中。<arch>表示的是一种体系结构,例如arm、x86等。<mach>表示的是一种机器或者硬件平台,例如mach-msm对应高通的MSM平台的机器,mach-omap2对应德州仪器的OMAP平台的机器,mach-goldfish则是Android仿真器使用goldfish处理器。此部分的移植通常要实现名称为struct machine_desc的结构体,其中包括了内存、定时器、中端等几部分操作系统运行最基础的内容,需要各个不同的硬件单独实现。

除此之外,为了让一个基本的Android系统可以运行,还需要具有文件系统和基本的调试手段。文件系统通常构建于Flash等存储器上,可以使用yaffs或者ext等文件系统。基本的调试手段可以使用串口或者USB设备,它们通常使用Linux中标准的实现方式。

对于一个特定的硬件平台,如果是新构建,则需要做Linux的板级移植部分。如果是从其他平台移植到Android中,则不需要做板级移植部分。

2.Android的内核组件

Android的内核组件是Android为Linux操作系统增加的内容,它们与硬件无关。这些内核组件大部分以驱动程序的形式存在,各个模块相对独立。电源管理则作为一个全局的部分存在。Android的内核组件可以从Android的Linux内核的通用代码中得到,它们的源代码大都以独立的文件,在KConfig和Makefile中有相关的项目。Android内核组件中的驱动程序被放置到drivers/staging/android/目录中,电源管理的部分在kernel/power/目录中,另有一些分散于源代码各个部分的实现内容和对应的头文件。

对于支持Android的各种硬件平台,都需要这些Android的内核组件,并且各个不同的Android设备所使用的这部分内容也是相同的。对于已经完成了Linux部分支持、但是不支持Android的平台,构建Android的内核组件是主要的工作。Android的内核组件方面的工作实际上只是搬移相同的代码,不属于真正的硬件适配(或称移植)的工作。

↘2.3.3 Android各个硬件设备的驱动程序

Android系统各个硬件设备的驱动程序,就是Linux操作系统的驱动程序。Linux的驱动有其固有的写法,Android系统中的硬件设备的驱动程序也一定遵从这些写法,可以使用字符设备、块设备、网络设备、sys文件系统、proc文件系统作为内核空间和用户空间的接口。用户空间通过内核空间中的驱动程序完成对硬件的访问和控制。Android中各种硬件设备的驱动程序是Android系统BSP支持的重点。

这些驱动程序与Android系统有关系,因此它们实际上是Android各个硬件相关的子系统和具体的各种硬件的中间层。根据Android各个硬件相关的子系统的自身移植层及在Linux内核中驱动的框架的成熟度,分成了3种不同情况。

第一种情况是完全使用Linux中标准的驱动架构。这种情况的特点是驱动程序框架在Linux中已经成熟而标准化,Android硬件相关的子系统直接使用这种驱动程序作为某个子系统所使用的驱动程序。

这种情况的例子包括:用户输入系统使用input驱动程序的字符设备节点,尤其是其中的event设备;无线局域网子系统使用wlan驱动提供的网络设备,蓝牙子系统使用bluetooth提供的网络设备;电池信息系统使用内核中Power Supply模块提供的sys文件系统接口。

第二种情况是基本使用Linux中标准的驱动架构,但是也可以选择其他形式的驱动。这种情况是Linux中已经有程序的驱动程序,Android硬件相关的子系统可以支持这种情动程序,但是又给了实现者选择的机会。此时,不同驱动的差异需要依靠硬件抽象层来进行屏蔽。

这种情况的例子包括:显示子系统一般使用标准帧缓冲(FrameBuffer)驱动程序的字符设备节点,但是也可以使用变化的帧缓冲驱动,或者其他驱动程序;音频子系统可以使用标准的OSS或者ALSA驱动程序的各个字符设备节点,也可以使用其他形式的驱动;照相机子系统一般使用标准V4L2驱动作为字符设备节点,但是可以使用变化的V4L2驱动或其他驱动配合V4L2驱动,或完全的其他驱动;背光和指示灯子系统使用led驱动程序提供sys文件系统作为接口,但也可以有其他的形式;定位系统和电话则通常使用内核中的tty驱动的字符设备节点,但也有其他的实现方式。

第三种情况是使用各种自定义的驱动程序。对于某些模块,标准Linux内核没有针对的驱动程序框架。因此Android硬件相关的子系统不需要遵从任何标准,使用各种能实现功能的驱动均可,由硬件抽象层作为对上层的接口,屏蔽不同驱动之间的差异。

这种情况的例子包括:传感器子系统可以使用原始字符设备、MISC字符设备或者sys文件系统作为驱动的接口;OpenGL和多媒体编解码加速部分可以根据具体平台的情况使用各种类型的驱动程序。