【Android源码 栏目提醒】:网学会员--在 Android源码 编辑为广大网友搜集整理了:基于ARM9+S3C2440的Android操作系统移植 - 研究报告绩等信息,祝愿广大网友取得需要的信息,参考学习。
华东师范大学 硕士学位论文基于ARM9 S3C2440的
Android操作系统移植 别:硕士 专业:通信与信息系统 指导教师:刘锦高 20100401 论文摘要 Android一词的本义指“机器人”,同时也是Go091e于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放和完整的移动软件。
Android操作系统以其开放性和良好的移植性自其诞生以来就受到广大嵌入式爱好者和生产制造商的关注。
本文讲述Andriod操作系统的特点和其发展前景,并与Linux操作系统比较,描述其特有的驱动和文件结构。
现市场上Andriod移动设备大多基于ARMll平台,此类开发平台广泛应用于商业产品。
本文讨论Andriod操作系统移植到AlW9开发平台的可行性,讲述移植过程,设计电路板和PCB,移植Andriod内核与文件系统,总结在移植过程中碰到的问题。
最后将Andriod操作系统移植到AIW9开发平台,启动Android内核挂载文件系统完成主要的应用功能。
关键词:Android,删9,移植,内核,文件系统 ABSTRACT Android primitiVely means robot and the name of Linux platf0眦open source operationsystem build by Google on NoV 5th 2007.This platfonn consiSts of operation system,inte斟ationlibra叫,GUI,application programe.Android is the firSt open source and mobile software madef.0r mobile tenninal. Android OS haVe been popular with embedded system fans and m肌ufacturers since it w邪bom with the characters of opening and transplant.This article describes both the character ofAndroid and the凡ture of its deVelopment.Android has its particular driVer and file system whichis di仃erent仔om Linux.Now moSt portable deVices of Android are baLsed on AI℃M 11 platfonn、Vhich is印plied mostly in commercial pmducts.Here we talk about the feas.bilit),oftransplanting Android OS t0 ARM9,list the progress of designing deta订s such as schematic,PCB,Android kemel a|ld Android file system,summarize the problems when make it realize.In theend Android 0S can boot its kemel and mount file system success如lly and transplant t0 AItM9platfonIl with main application向nction.KEY WORD:Android,AItM9,1’ransplant,Kemel,File system 第1章绪论1.1嵌入式Andro i d概述 Android是由Go091e开发的,基于Linux内核的软件平台和操作系统。
自它诞生以来,它的功能和易用性不断得到完善。
目前已有多款基于Andriod操作系统的手机问世,得到不少好评,其市场占有率也在不断上升。
Android之所以得到用户的认可与其特性密不可分: ·应用程序框架支持组件重用与替换; ·Dalvik虚拟机专门为移动设备做了优化; ·内部集成基于开源WebKit浏览器引擎: ·优化图形库,3D图形库基于OpenGL ES 1.O; ·#SQLite用作结构化数据存储; ·多媒体支持常见音视频和静态印象文件格式; ·GSM电话; ·B1uetooth,EDGE,3G,and WiFi; ·照相机,GPS,指南针,和加速度计; ·开发环境友好和Eclipse集成开发环境插件; 图1 Androi d手机 Android的发布会同一个核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。
这些应用程序都由一系列服务和系统组成: ·一个可扩展的视图:新建应用程序,包括列表,网格,文本框,按钮,以及一个可嵌入的web浏览器。
·内容管理器:使得应用程序可以访问另一个应用程序的数据或者共享它们自己的数据。
·一个资源管理器:提供非代码资源的访问,如图形,和分层文件。
·一个通知管理器:使应用程序可以在状态栏中显示客户通知信息。
·一个活动类管理器:管理应用程序生命周期并提供常用的导航回退功能。
Android内核和文件系统较之前的Linux内核和Qtopia文件系统功能和界面都做了补充和改进,设计更加人性化,操作更加简便实用,在系统驱动中更加入了对重力传感器的支持和应用程序,使得在产品的新颖性上可以和Iphone一较高下,这也是其为何获得众多用户和产品开发商青睐的原因。
1.2嵌入式Android应用与发展趋势 Android自它诞生之日起,就面临着诸多手机软件平台的挑战。
首先它需要获得广大设备制造商的认可,争取手机操作系统软件的市场份额并继续生存下去。
Symbian软件平台发言人表示:Android只是另一个linux,Symbian对其它软件与其形成的竞争并不感到担心。
Sy册bian平台智能手机占有大部分市场份额。
与Iphone相似,Android采用WebKit浏览器引擎,具备触摸屏、高级图形显示和上网功能,用户能够在手机上查看电子邮件、搜索网址和观看视频节目。
但是Android比Iphone等其他手机有更强搜索功能,界面更友好,是一种融入全部web应用的单一平台。
Android手机系统引人入胜之处在于其开放性和服务免费。
Android是一个对第三方软件完全开放的平台,开发者在为其开发程序时拥有很大的自由度,突破了iPhone等只能添加为数不多固定软件的枷锁;同时与Windows Mobile、Sylnbian等厂商不同,Android操作系统免费向开发人员提供,可节省相当的成本。
Androi d操作系统经过一段时间的成长,Android项目已经从手机运营商、手机厂商、开发者和消费者那里获得了大力支持。
Google移动平台主管AndyRubin表示,与软件开发合作伙伴的密切接触一直在进行中,Go091e已经向服务提供商、芯片厂商和手机销售商提供Android平台,并组建了“开放手机联盟”,其成员超过30家。
图2 Andriod Logo 越来越多的用户和产品制造商正在投入到Andriod的使用和开发当中,目前各公司对Android系统开发和应用人才的需求也越来越高,投入也越来越大,特别是在经济危机之后,越来越多的公司倾向于使用开源和免费的软件,这又进一步推动了Andriod操作系统的发展与普及。
在可以预见的将来,相信Android会给用户带来更多的功能、更人性化的操作系统,为开发商和产品制造商带来更大的利益。
1.3本文工作及内容 本文基于对Android和Linux内核及文件系统的特点和分析,将市场上普遍应用于ARMll设备的Andriod操作系统移植到ARM9 S3C2440平台上,针对ARM9平台设计电路原理图、PCB板、移植Linux操作系统,为Linux内核打补丁完成Android内核移植,移植内核必要的驱动程序(Binder、Power、网络驱动),制作文件系统。
使Android内核可以启动并挂载相应的文件系统,使系统实际应用于ARM9嵌入式设备中。
文章最后对移植的效果和问题进行测试和分析。
第2章Andro i d系统的设计与构建2.1 Android硬件平台设计2.1.1硬件平台资源 硬件平台的设计参考友善之臂ARM9原理图并加以修改n1。
原理图中有如下设备n1,S3C2440A‘”、64M SDRAM‘¨、64M Nand F1ash‘钉、LCD、DM9000网络芯片‘盯、2个串口、1个摄像头接口、1个USB Host、1个USB S1ave、1个SD卡存储、1路立体声音频输出口Ⅲ、6个按键、实时时钟电池等。
2.1.2原理图修改 电路原理图设计系统直接从Nand F1ash启动。
保留一个串口uartO终端调试,增加一个AD模数转换、1个PwM控制蜂鸣器、1个12C总线AT24C08芯片¨1、去掉一个USB S1ave、为了使系统信号有更好的完整性更改SDRAM匹配电阻33欧姆为22欧姆,如下图3所示。
更改网口电平转换器为HR911103A提高系统的集成度(图4)。
其次设计电路板为4层PCB板,Top 1ayer和Bott伽1ayer用于布信号线,中间层为电源层和地层。
在原理图中将芯片各引脚引到电路板边缘,便于调试。
·RA.7 LscLKl 1 r= LnSRAS 2 3 4 22 图3更改匹配电阻和排阻为22欧姆 4 图4更改网口电平转换接口为HR911103A2.1.3 PcB版图的布局 PCB板布局为12cm x 6cm设计,为使电路板能够获得较好的布局和良好的信号完整性,安排S3C2440芯片位于电路板中间,电路板电源部分在电路板左下角为整块电路板供电,键盘按键在电路板正下方,音频和12C存储芯片位于板子右下;左边是UART串口输出和SDRAM,右边是CMOS摄像头接口,DM9000网络芯片位于电路板的左上角,尽量与电源分开避免干扰,中间是NAND FLASH和AD模数转换,SD卡接口和外接调试接口位于电路板的右上方。
图5 PCB板布局示意图2.2 Android软件平台设计2.2.1 Androi d操作系统体系结构 Android操作系统体系结构如下图所示‘91 图6 Android操作系统体系结构 Android操作系统采用software stack架构,主要分为三部分。
1.底层以Linux内核为基础,使用C语言开发,提供硬件驱动功能。
2.中间层包括函数库Library和虚拟机Virtual Machine,为上层应用程序调用驱动 提供函数接口。
3.上层应用程序使用Java开发,由各公司自行维护。
Android的体系结构使得应用程序可以在不考虑底层驱动接口情况下,方便地移植到另一操作平台而应用程序不用多做改动,为应用程序软件的编写提高了效率,也为产品的升级和维护提供了方便,压缩了软件平台开发的周期。
这是Android得以在短期得到推广的主要原因之一。
2.2.2 Android和Linux操作系统的不同 将Google网站下载的Android Linux内核与标准Linux 2.6.29内核比较‘旧,Android 6 内核增加了其特有的功能。
2.2.2.1基于ARM架构增加GoId—Fj sh平台在Gold—Fish平台的基础上相应增加硬件设备目录。
kernel/arch/arm/mach—goldfi shkernel/include/asm—arm/arch—goldfishGold—Fish平台采用ARM926T CPU作为处理器,而要流畅运行Android CPU主频应该在500Mhz以上,所以最好选用ARMll及以上平台进行开发。
2.2.2.2增加Ya仟s2 FLASH文件系统 在内核fs目录下增加fs/yaffs2文件系统n11,但是在移植文件系统时发现Andr。
id内蜷和对Yaffs2文件系统的支持与Linux并不兼容,一些Flash块和页的读写操作略有不同,在移植时候需要做适当的修改。
2.2.2.3增加Andro i d相关设备驱动 驱动程序位于kernel/drivers/
android,增加的驱动程序如下表所示。
Androi d IPC系统 Binder Android日志系统 Logger Android电源管理 Power Android闹钟管理 Alarm Android内存控制台 Ra皿一conso le Android时钟控制的gpio Timed-gpio 表l Android相关设备驱动列表1.Binder驱动程序解决进程间通信,也能共享对象。
IPC过程是通过内核一个模块(或用户空间的守护进程),中转和翻译不同进程需要共享的对象,以取得所有进程似乎处于同一个名字空间的效果。
2.一个轻量级的日志设备,用于抓取Android系统的各种日志。
3.一个基于标准Linux电源管理系统的轻量级Andriod电源管理驱动,针对嵌入式设备做了很多优化。
4.提供一个定时器用于把设备从睡眠状态唤醒,同时也提供了一个即使在设备睡眠时也会运行的时钟基准。
5.为了提供调试功能,Andriod允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAM的Buffer。
6.提供了一种使用时钟控制引脚电平的设备驱动。
2.2.2.4增加switch驱动程序 驱动程序相应的目录为kernel/drivers/switch/。
2.2.2.5增加新的共享内存处理方式 相应增加的文件为kernel/姗/ashmem.c。
它为进程间提供大块内存,同时为内核提供回收和管理这些内存的机制。
Android GoldFish相应的平台驱动与文件列表如下所示。
G01dFish平台相关驱动 驱动文件位置 字符输出设备 kernel/drivers/char/goldfi sh—tty.c 图象显示设备 kernel/drivers/video/goldfishfb.c 键盘输入设备 kernel/drivers/input/keyboard/goldfi sh—events.c RTC设备 kernel/drivers/rtc/rtc—901dfish.c USB Device设备 kernel/drivers/usb/gadget/
android—adb.c SD卡设备 kernel/drivers/mmc/host/goldfish.c FLASH设备 kernel/drivers/mtd/devices/goldfish—nand.c LED设备 kernel/drivers/leds/1edtrig—sleep.c 电源设备 kernel/drivers/power/901dfish—battery.c 音频设备 kernel/arch/arm/mach—901dfish/audio.c 电源管理 kernel/arch/arm/mach—goldfish/pm.c 时钟管理 kernel/arch/arm/mach—goldfish/timer.c 表2为Linux内核所做补丁2.2.3 Android主要驱动程序特征2.2.3.1 Bi nder Binder驱动程序n21是一个miscdevice,主设备号为10,此设备号使用动态获得,其设备的节点为/dev/binder,Binder驱动程序会在proc文件系统中建立自己的信息/proc/binder,其中包含以下内容。
proc目录:调用Binder各个进程的内容state文件:使用函数binder_read-proc—statetransactions文件:使用函数binder—read-proc—transactionstransaction_109文件:使用函数binder—read_proc—transaction_109faileQ—transactioLlog文件:使用函数binderJead-proc—transaction_log Binder文件被打开后,其私有数据类型struct binder_proc包含当前进程、进程ID、内存映射信息、Binder的统计信息和线程信息等。
在用户空间对Binder驱动程序进行控制主要使用接口是姗ap、poll和ioctl。
Binder相关文件作为Android uitls库一部分,这个库编译后名称为1ibut订s.so,是Android系统中的一个公共库。
主要文件的路径如下所示。
frameworks/base/inc lude/ut i l s/术frameworks/base/libs/utils/木 Service Manager是一个守护进程,它位于Android文件系统中,负责启动各个进程之间的服务,对于相关的两个需要通讯的进程,它们通过调用1ibutils.so实现通讯,而真正通讯的机制是内核空间中的一块共享。
92.2.3.2 Power Android电源管理通过锁和定时器来切换系统状态,使系统功耗降至最低,整个系统电源管理架构图如下n羽。
^c张斟sc掰燕N饼^脚嘞柚¨岍叮s狮婚 劓冀|。
雌sc承搿;H莎F辫科瞄啪礴糊铀撕印9¨ 图7 Andriod电源管理框架 内核代码在drivers/
android/power.c中其对Kernel提供接口函数如下所示。
//初女台化Suspend lockEXPORT—SYMBOL(
android—init—suspend一10ck):EXPORT—SYMBOL(
android_uninit—suspenQ-10ck): //释放suspend lock相关资源EXPORT-SYMBOL(
android-10ck_suspend): //申请lock,必须调用相应 //的unlock来释放它 wakelock,EXPORT—SYMBOL(
android—locILsuspend—auto—expire)://申i青partial //定时到后会自动释放EXPORT—SYMBOL(
android—unlocIc_suspend): //释放10ckEXPORT.SYMBOL(
android』ower_Wakeup): //唤醒系统到onEXPORT—SYMBOL(
android—register—early—suspend): //注册early suspend的驱动EXPORT-SYMBOL(
android_unregister_early-suspend)://取消已经注册的early //suspend的驱动提供给Android Framework层的proc文件如下: ”/sys/
android—power/acquire—partial—._Wake一10ck” //申请partial wake 10ck 1n’/sys/
android—power/acquire—full—Ⅳake一10ck” //申t青full wake lock’/sys/
android_power/release-Waktlock” //释放相应的wake lock一/sys/androi d—power/request—state一 //请求改变系统状态,进standby //和回到wakeup两种状态”/sys/androi d—power/state” //指示当前系统的状态 Android的电源管理主要是通过Wake lock来实现的,在最底层主要是通过如下三个队列来实现其管理。
stat ic LIST-HEAD(g—inact ive一10cks): static LIST—HEAD(g—active—partial—Ⅳake—locks): stat i c LIS’r-HEAD(g——act ive—ful l—wake—locks): 所有初始化后的10ck都会被插入到艮inactivejocks的队列中,而当前活动的partial wake lock都会被插入到g_active_partial-Wake-locks队列中,活动的fullwake lock被插入到g_active_fullJake-locks队列中,所有的partial Wake lock和full wake lock在过期后或unlock后都会被移到inactive的队列,等待下次的调用。
在Kernel层使用wake lock步骤如下: lock1.调用函数
android.init—suspena一10ck初始化一个wake2.调用申请函数
android_lock-suspend或
android_lock-suspend-auto—expire请求10ck,这里只能申请partial wake 10ck,如果要申请Full wake 10ck,则需要调用函数
android—lock—partial—suspend—auto—expire。
3.如果是auto expire的wake lock则可以忽略,不然必须及时把相关wake lock释放掉,否则会造成系统长期运行在高功耗的状态。
4.驱动卸载或不再使用Wake 10ck时调用
android-uninit—suspenQ_lock释放资源。
系统的状态如下所示。
USER AWAKE //Ful l on statusUSER NOTIFICATION //Early suspended driver but //CPU keep onUSER—SLEEP //CPU enter sleep mode 11 P■R姗■啊辫“峨■caqHt哇 图8状态切换示意图 系统正常开机后进入到AwAI(E状态,Backli曲t会从最亮慢慢调节到用户设定的亮度,系统 screen off timer(settings一>sound&display一>Display settings一>Screentimeout)开始计时,在计时时间到之前,如果有任何activity事件发生,如Touch click,keyboard pressed等事件,则将Reset screen off t imer,系统保持在AWAKE状态。
如果应用程序在这段时间内申请Full wake lock,那么系统也将保持AWAKE状态,除非用户按下power key。
AwAKE状态下如果电池电量低或者是用AC供电,screen off timer时间满并且选中Keep screen on while pluged in选项,backlight会强制调节到DIM状态。
如果Screen off timer时间用完,并且没有Full wake 10ck或者用户按power key,那么系统状态将被切换到NOTIFICATl0N,并且调用所有已经注册g_early-suspend-handlers函数,把LCD和Backlight在第一阶段关闭。
接下来系统会判断是否有partial wake lockacquired,如果有则等待其释放,在等待过程中如果有user activity事件发生,系统则马上回到AWAI(E状态:如果没有,则系统会马上调用函数pm-suspend关闭其它相关驱动,让CPU进入休眠状态。
系统在Sleep状态时如果检测到任何wakeup source,则CPU会从S1eep状态被唤醒,并且调用相关驱动的resume函数,接下来调用前期注册的early suspend驱动的resume函数,使系统状态回到AwAl(E状态。
2.2.4 Android软件平台移植步骤2.2.4.1 Android内核移植方法 Android内核移植有2个方法可以实现软件平台的移植。
12l-下载
android内核将andriod内核代码移植到适合于s3c2440的系统平台上,这样做的好处的代码版本比较新,保留andriod比较完整的结构和驱动程序。
但是经过实践,下载Android Linux 2.6.25内核进行移植并没有成功,内核下载到开发板上调试失败,内核输出报错。
出错与系统内核底层给驱动程序分配内存地址空间时调用空指针有关,导致内存泄露,经过修改还是不能成功。
出错于/衄/slub.c中的内存分配函数,如下所示。
void幸kmenLcache-.al 10c(struct l【nlerILcache木s, gfp—t gfpflags) ( return slab—a1 10c(s, gfpflags, 一l,——bui ltin—return—address(0)):)EXPORT-SYMBOL(I(Inem.cache—alloc): 内核有自己独有且固定空间分配方式,修改其分配函数不一定会得到稳定高效的内核功能,也不是移植的主要工作。
2.先将linux2.6.xx内核移植到s3c2440的系统平台‘143‘1副,然后在linux系统内核上打patch m1,让linux内核具有与
android内核同样的属性。
这样的方法适合于已经将硬件驱动程序移植到目标板的1inux内核,但是这样会有冲突,特别是在yaffs2文件系统目录下,andriod和原linux内核中的yaffs2文件系统不兼容,打上的patch包会产生木.rej文件,需要手动进行比较修改,对比fs文件目录下的冲突文件。
然后移植开发板驱动程序,如DM9000网络驱动,LCD与触摸屏的驱动,文件系统yaffs2和
android文件系统。
在实现过程中首先成功完成内核的移植,然后试验kernel是否可以挂载yaffs2文件系统。
在yaffs2文件系统挂载成功以后,可以在终端看见文件系统目录,查看文件系统命令是否可执行。
接着再试着挂载qtopia文件系统查看在qtopia文件系统下文件系统是否可以正常挂载,GUI界面是否可以启动,触摸屏驱动是否可以使用等。
最后再移植
android文件系统,让andriod内核挂载andriod自身的文件系统,这里需要成功移植binder和power驱动,否则UI界面不能成功启动。
在andriod文件系统中servicemanager需要对电源的电压进行检测,如果电平低于设置要求系统将自动复位重启。
Android整个移植的步骤如下图所示。
图9 Android操作系统移植流程图2.2.4.2 Android文件系统移植方法 移植Android文件系统前,需要设置工作环境安装Git和Repo来获得Android文件系统代码。
全部代码大约2.1GB,编译完成后约6GB。
在编译前需要安装一些软件保证其成功编译n7四3。
Python 2.4, which you can download from python.org. which you download from jaVa.sun.com·JaVa 6JDK 5。
O, update 12 or higher, canis not supported, because of incompatibilities with@0Verride.Gjt】.5.4 or newer. You can find it at http://git.or.cz/.安装Repo Repo是一个网络下载工具它与Git配合使用可以对Android代码进行版本控制,更好的管理Android源代码n91。
按照如下步骤安装、初始化、配置.