【导语】在Android系统移植中,有很重要的一个部份工作,就是为新平台上的硬件设备移植驱动程序。由于Android系统是基于Linuxkernel内核完善,所以这儿说的移植驱动程序,当然就是基于Android系统平台开发适应联通设备的Linux内核驱动程序。
一.Android系统中Linux内核与设备驱动
Android系统中使用了Linux内核作为自己的操作系统linux程序移植到android,不仅linux的通用代码之外,主要还包含三个方面的东西:
Android系统中Linux内核与设备驱动的结构如右图示:
Android系统一般用于联通设备和其他的嵌入式设备,因而都基于ARM体系结构,在ARM体系结构具有多种处理器。因而,对于不同对的处理器,基于相同的外围设备,驱动程序也可能不一样。
须要说明的是上图中的Goldfish:
Android模拟器通过运行一个Goldfish的虚拟CPU,Goldfish拿来运行arm926926t指令集(arm926926t属于armv5架构),但是仿真了输入/输出,例如鼠标输入和LCD输出。这个模拟器虽然是在qemu之上开发的,输入/输出是基于libSDL的。既然Goldfish是被模拟器运行的虚拟CPU,这么当Android在真实的硬件设备上运行时,我们就须要除去它。
二.Android系统上的设备驱动
具体来说是有以下:
在实际应用中,通过下边的图,体会下一个量产的平板中用到了什么硬件,感受下其中涉及到的驱动:
三.Android系统专用驱动
看一下Google为基于Linuxkernel而订制的Android系统专用驱动程序:
(1)AndroidBinder
AndroidBinder是基于OpenBinder框架的一个驱动,用于Android平台的进程间通讯(InterProcess
Communication,IPC)。原先的Linux系统下层应用的进程间通讯主要是D-bus(Desktopbus),采用消息总线的形式来进行IPC。
源代码坐落drivers/staging/android/binder.c。
(2)Android电源管理
Android电源管理是基于标准Linux电源管理系统的轻量级Android电源管理驱动,针对嵌入式设备做
了好多优化。借助锁和定时器来切换系统状态,控制设备在不同状态下的帧率红帽子linux,已达到节能的目的。
源代码坐落:
-[]kernel/power/earlysuspend.c
-[]kernel/power/consoleearlysuspend.c
-[]kernel/power/fbearlysuspend.c
-[]kernel/power/wakelock.c
-[]kernel/power/userwakelock.c
Android5.0版本引用JobSchedule调度程序,便于降低设备续航时间。
(3)低显存管理器(LowMemoryKiller)
比Linux的标准的OOM(OutOfMemory)机制愈发灵活,它可以依照须要
杀害进程以释放须要的显存。源代码坐落drivers/staging/android/lowmemorykiller.c。
(4)匿名共享显存(Ashmem)
为进程间提供大块共享显存,同时为内核提供回收和管理这个显存的机制。源代码坐落
mm/ashmem.c。
(5)AndroidPMEM(Physical)
PMEM用于向用户空间提供连续的化学显存区域,DSP和个别设备只能工作在连续的物
理显存上。
源代码坐落drivers/misc/pmem.c。
(6)AndroidLogger
一个轻量级的日志设备,用于抓取Android系统的各类日志,是Linux所没有的。
源代码坐落drivers/staging/android/logger.c。
(7)AndroidAlarm
提供了一个定时器,用于把设备从睡眠状态唤起,同时它还提供了一个虽然在设备睡眠时也会
运行的时钟基准。源代码坐落drivers/rtc/alarm.c。
(8)USBGadget驱动
一个基于标准LinuxUSBgadget驱动框架的设备驱动,Android的USB驱动是基于gaeget框架的。
源代码坐落
-[]drivers/usb/gadget/android.c
-[]drivers/usb/gadget/f_adb.c
-[]drivers/usb/gadget/f_mass_storage.c
(9)AndroidRamConsole
为了提供调试功能,Android容许将调试日志信息写入一个被称为RAMConsole的设备
里,它是一个基于RAM的Buffer。源代码坐落drivers/staging/android/ram_console.c。
(10)Androidtimeddevice
提供了对设备进行定时控制的功能,目前支持vibrator和LED设备。源代码坐落
drivers/staging/android/timed_output.c(timed_gpio.c)。
(11)Yaffs2文件系统
Android采用Yaffs2作为MTDnandflash文件系统,源代码坐落fs/yaffs2/目录下。
Yaffs2是一个快速稳定的应用于NAND和NORFlash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,
Yaffs2能使用更小的显存来保存其运行状态linux程序移植到android,因而它占用显存小。Yaffs2的垃圾回收十分简单并且快速linux系统应用,因而能表
现出更好的性能。Yaffs2在大容量的NANDFlash上的性能表现尤为突出,特别适宜大容量的Flash储存。
四.Android驱动开发主要工作
Linux系统将设备驱动分为以下三类:
驱动程序是介于系统和硬件之间的桥梁,实现硬件和系统之间的交互是我们底层开发的主要任务。在Android系统中,我们通常须要编撰内核级和用户级的程序来完成具体的任务。
4.1实现系统和硬件之间交互的几种方法4.2内核空间和用户空间的交互
前面讲了系统与硬件交互的几种方法提及了,在具体的交互中,驱动程序驱动具体的硬件模块工作时涉及到一个内核空间和用户空间交互的概念。
现代的计算机体系结构中储存管理一般都包含保护机制。提供保护的目的,是要防止系统中的一个任务访问属于另外的或属于操作系统的储存区域。如在IntelX86体系中,就提供了特权级这些保护机制,通过特权级别的区别来限制对储存区域的访问。
基于这些架构,Linux操作系统对自身进行了界定:一部份核心软件独立于普通应用程序,运行在较高的特权级别上,(Linux使用Intel体系的特权级3来运行内核。)它们留驻在被保护的显存空间上,拥有访问硬件设备的所有权限,Linux将此称为内核空间。
相对的,其它部份被作为应用程序在用户空间执行。它们只能看见容许它们使用的部份系统资源,而且不能使用个别特定的系统功能,不能直接访问硬件,不能直接访问内核空间,其实还有其他一些具体的使用限制。(Linux使用Intel体系的特权级0来运行用户程序。)
通过下边的图,看一下内核空间与用户空间的交互关系: