【Android源码 栏目提醒】:网学会员在Android源码 频道为大家收集整理了“ARM架构的Android操作系统开发 - 体系结构“提供大家参考,希望对大家有所帮助!
ARM 架构的
Android 操作系统开发概述
Android 是一种以 Linux 为基础的开放源代码操作系统,主要使用于便携设备。
随着近几年智能手机的流行,
Android 系统越来越受到欢迎。
Android 操作系统以其开放性和良好的移植性自其诞生以来就受到广大嵌入式爱好者的关注。
ARM 公司于 1991 年在英国剑桥成立,主要出售芯片设计技术的授权。
目前,采用 ARM技术知识产权(IP)核的微处理器,即我们通常所说的 ARM 微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于 ARM 技术的微处理器应用约占据了 32 位 RISC 微处理器 75%以上的市场份额,ARM 技术正在逐步渗入到我们生活的各个方面。
本文介绍嵌入式系统 1.Bootloader 移植、 2.AndroidLinux 内核移植 和 驱动移植ARM 平台介绍2.1 开发平台的选择 选择开发平台主要依据就是系统的需求, 本项目的主要目的是实现无线传感器网络和嵌入式系统相结合, 来实现家庭的环境等监测, 在最大限度满足嵌入式家庭健康安全系统实时性、安全性、可靠性要求的同时,低成本也是本项目的主要目的之一。
近年来,以 ARM 为核心的嵌入式系统应用越来越广泛,技术日趋成熟,被越来越多的应用与工业、服务业等领域。
低功耗、体积小、价格低等特点,使得 ARM 系列处理器更适合做家庭的控制平台。
在这里选用基于 ARM9 内核的处理器和 LINUX 操作系统作为本项目的嵌入式开发平台。
ARM9 处理器包括 ARM920T、ARM922T 和 ARM940T,主要用于手持设备、视频电话、PDA、机顶盒、家用网关等产品中。
与 ARM7 处理器相比,ARM9 处理器具有以下特点:5级流水线、采用哈佛结构、引入高速缓存和写缓存、支持 MMU 等显著优点。
操作系统方面,LINUX 是应用最广泛的操作系统,集成了很多网络协议,更重要的是在 2.6.X后的内核中配置了 FTDI 的 USB 转串口驱动,这对于我们的 ARM 平台和网关通信提供很大的便利。
综上考虑,本项目中选用了博创公司的开发板 UP‐NETARM2410‐S该开发板的硬件配置如表 2.1 所示。
采用了三星公司的基于 ARM920T 结构的处理器,该处理器完全能够满足本系统的各项需求。
该平台还配有 JTAG 仿真器和串口通信线等部件,这就大大节省了开发时间。
表 2.1 UP‐NETARM2410‐S 硬件配置2.2 Linux 操作系统 嵌入式 Linux 是标准 Linux 经过小型化裁剪处理之后的专用 Linux 操作系统, 能够固化于容量只有几 KB 或者几 MB 的存储器芯片或单片机中,适合于特定嵌入式应用场合。
目前已经开发成功的嵌入式系统大约有一半使用的都是嵌入式 Linux。
Linux 系统具有鲜明的层次结构且内核完全开放,Linux 有许多体积小性能高的微内核和系统组成,这样用户就可以根据自己的应用需要容易地对内核进行裁剪, 在低成本的前提下,设计和开发满足自己需求的嵌入式系统。
Linux 还具有强大的网络功能,可以利用 Linux 的网络协议栈开发出嵌入式 TCP/IP网络协议栈。
Linux 还具有一套完整的工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,还可已使用内核调试器来进行操作系统内核调试。
Linux 内核有五个主要的子系统构成。
图 2.3 所示。
他们分别是进程调度、内存管理、虚拟文件系统、网络接口、进程间通信。
下面做简单介绍。
(1)进程调度:控制着进程对 CPU 的访问,当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。
(2)内存管理:许多个进程安全地共享主内存区域。
内存管理从逻辑上可以分为硬件无关的部分和硬件相关的部分。
硬件无关的部分提供了进程的映射和虚拟内存的对换:硬件相关的部分为内存管理硬件提供了虚拟接口。
(3)虚拟文件系统:藏了各种不同硬件的具体细节,为所有的设备提供了统一的接口。
虚拟文件系统可分为逻辑文件系统和设备驱动程序。
(4)网络接口:供了对各种网络标准协议的存取和各种网络硬件的支持。
(5)进程间的通信:持进程间的各种通信机制。
图 2.1Linux 内核结构开发过程本移植项目选用 Bootloadervivi 使用 AndroidLinux 内核,版本号是 2.6.25.2.1Bootloader 移植移植 vivi 并使用 vivi 对 NandFlash 进行分区。
2.1.1 重分区vivi 的 MTD 分区表:分区前: vivipartshow mtdpartinfo.6partitions name offset size flag ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ vivi :0x00000000 0x00020000 0 128k param :0x00020000 0x00010000 0 64k kernel :0x00030000 0x00400000 0 1M root:0x00430000 0x00300000 4 3M user :0x00730000 0x03800000 0 59M ucos:0x03f30000 0x000cc000 0 816k开发板自带的 vivi 的 kernel 分区只有 1M,而我们的内核有 1.7M,从而必须将 NandFlash 重分区以适应我们的内核。
2.1.2 内核变大make 时加上 V1 参数,可得 vmlinux 的链接命令如下:/home/yang/yangdroid/prebuilt/linux‐x86/toolchain/arm‐eabi‐4.2.1/bin/arm‐eabi‐ld‐EL ‐p‐‐no‐undefined‐X ‐ovmlinux‐Tarch/arm/kernel/vmlinux.ldsarch/arm/kernel/head.oarch/arm/kernel/init_task.oinit/built‐in.o ‐‐start‐groupusr/built‐in.oarch/arm/kernel/built‐in.oarch/arm/mm/built‐in.oarch/arm/common/built‐in.oarch/arm/mach‐s3c2410/built‐in.oarch/arm/mach‐s3c2400/built‐in.oarch/arm/mach‐s3c2412/built‐in.oarch/arm/mach‐s3c2440/built‐in.oarch/arm/mach‐s3c2442/built‐in.oarch/arm/mach‐s3c2443/built‐in.oarch/arm/nwfpe/built‐in.oarch/arm/plat‐s3c24xx/built‐in.okernel/built‐in.o mm/built‐in.ofs/built‐in.oipc/built‐in.osecurity/built‐in.ocrypto/built‐in.oblock/built‐in.oarch/arm/lib/lib.alib/lib.aarch/arm/lib/built‐in.olib/built‐in.odrivers/built‐in.osound/built‐in.onet/built‐in.o‐‐end‐group.tmp_kallsyms2.o将上述命令转换为图形可得内核
源码根目录下 vmlinux 的构成: 图 4.1 vmlinux 构成上图还显示了 vmlinux 中个功能模块的相对大小。
2.6 的内核比 2.4 的增加了许多内核特性,从而 kernel 大小增加;保留了内核对多文件系统类型的支持,fs 大小增加;增加了
Android 相关驱动,drivers 大小增加;内核未进行适当剪裁,链接了一些无用模块和驱动。
2.1.3 使用 vivi 进行分区 修改 arch/s3c2410/smdk.c,将结构体数组 default_mtd_partitions 修改如下: mtd_partition_tdefault_mtd_partitionsname:vivioffset:0size:0x00020000flag:0name:paramoffset:0x00020000size:0x00010000flag:0 name: kernel offset: 0x00030000 size: 0x00400000 flag: 0 name: root offset:0x00430000 size: 0x00300000 flag: MF_BONFS name: user offset: 0x00730000 size:0x03800000flag: 0name:ucosoffset:0x03f30000size:0x000cc000flag:02.1.4 vivi 的烧写以上是对 vivi 源代码的修改。
接下来的工作是把编译 vivi 并把 vivi 烧写到博创开发板。
烧写的基本步骤如下所示:在烧写 vivi 的过程中要确定并口于 JTAG 相连接,也要保证开发板的电源打开。
//烧写 vivi或者 uboot 使用的是 Jtag,烧写到 Norflash。
在此后出现的要求三次输入参数,第一次是让选择 Flash,选 0,然后回车。
第二次是选择JTAG 对 flash 的两种功能,也选 0,然后回车。
第三次是让选择起始地址,选 0,然后回车,等待大约 3-5 分钟的烧写时间。
烧写 vivi 完成后的界面如下图 5.2 所示: 图 4.2 烧写 vivi 界面然后选择 2 退出烧写界面。
2.2 AndroidLinux 内核移植2.2.1 添加 MTD 分区表信息修改 arch/arm/plat‐s3c2410xx/common‐smdk.c,静结构体数组 smdk_default_part 修改如下://这个是 kernel 下的 arch 目录staticstructmtd_partitionsmdk_default_nand_part0.namevivi.size0x00020000.offset01.nameparam.size0x00010000.offset0x00020000 2.namekernel.size0x00400000.offset0x00030000 3.nameroot.size0x00300000offset:0x00430000 4.nameuser.size0x03800000.offset0x00730000 5.nameucos.size0x000cc000.offset0x03f300002.2.2 配置内核在终端输入:makemenuconfig。
在配置内核前,先拷贝 s3c2410 开发板的默认配置到内核根目录下,以简化配置过程。
//把开发板的 config 拷贝到内核的根目录下,名称为.config.pwd/home/tekkaman/working/kernel/linux‐2.6.22.2cparch/arm/configs/s3c2410_defconfig.configmakemenuconfig以下是在 s3c2410_defconfig 基础上要配置的选项Generalsetup ‐‐‐ Configurestandardkernelfeaturesforsmallsystems ‐‐‐ SystemType ‐‐‐ S3C2410Machines ‐‐‐ SMDK2410/A9M2410 只留下这项 “N”掉 S3C2412 Machines ‐‐‐ S3C2440 Machines ‐‐‐ 和 S3C2443 Machines ‐‐‐里的所有选项。
DeviceDrivers ‐‐‐ “N”掉 Parallelportsupport ‐‐‐ 里的所有选项。
PlugandPlaysupport ‐‐‐“N”掉里所有选项 Networkdevicesupport ‐‐‐Ethernet10or100Mbit ‐‐‐ “N”掉DM9000support 和 GenericMediaIndependentInterfacedevicesupport OtherISAcards NE2000/NE1000support“N”掉 Ethernet1000Mbit ‐‐‐和 Ethernet10000Mbit ‐‐‐ USBNetworkAdapters ‐‐‐ Multi‐purposeUSBNetworkingFramework MMC/SDcardsupport ‐‐‐ RealTimeClock ‐‐‐ “N”掉 SetsystemtimefromRTConstartupandresume NetworkFileSystems‐‐ NFSfilesystemsupport 选上以下选项,因为在挂载 NFS 时可能出现 protocol 不支持的情况 ProvideNFSv3clientsupport ProvideclientsupportfortheNFSv3ACLprotocolextension ProvideNFSv4clientsupportEXPERIMENTAL AllowdirectI/OonNFSfiles NFSserversupport ProvideNFSv3serversupport ProvideserversupportfortheNFSv3ACLprotocolextension ProvideNFSv4serversupportEXPERIMENTAL ProvideNFSserveroverTCPsupport RootfilesystemonNFS2.3 移植触摸屏驱动2.3.1 触摸屏中断响应过程2.3.2 S3C2410 模数转换器(ADC)及触摸屏控制器3C2410 内置 1 个 8 信道的 10bit模数转换器(ADC),该ADC能以 500KSPS的采样资料将外部的模拟信号转换为 10bit分辩率的数字量。
同时ADC部分能与CPU的触摸屏控制器协同工作,完成对触摸屏绝对地址的测量。
下图是ADC及触摸屏控制器部分的逻辑示意图(图 1) 在S3C2410 的ADC以及触摸屏控制器的基础上外接触摸屏的示意图(图 2)2.3.3 ADC 及触摸屏控制器的工作模式:1. ADC普通转换模式(NormalConversonMode) 普通转换模式(AUTO_PST0XY_PST0)是用来进行一般的ADC转换之用的,例如通过ADC测量电池电压等等。
2. 独立X/Y轴坐标转换模式(SeparateX/YPositionConversionMode)独立X/Y轴坐标转换模式其实包含了X轴模式和Y轴模式 2 种模式。
首先进行X轴的坐标转换(AUTO_PST0,XY_PST1),X轴的转换资料会写到ADCDAT0 寄存器的XPDAT中,等待转换完成后,触摸屏控制器会产生相应的中断。
然后进行Y轴的坐标转换(AUTO_PST0,XY_PST2) ,Y轴的转换资料会写到ADCDAT1 寄存器的YPDAT中,等待转换完成后,触摸屏控制器会产生相应的中断。
3. 自动X/Y轴坐标转换模式(AutoX/YPositionConversionMode) 自动X/Y轴坐标转换模式(AUTO_PST1,XY_PST0)将会自动地进行X轴和Y轴的转换操作,随后产生相应的中断。
4. 中断等待模式(WaitforInterruptMode) 在系统等待“Pen Down” ,即触摸屏按下的时候,其实是处于中断等待模式。
一旦被按下,实时产生“INT_TC”中断信号。
每次发生此中断都,X轴和Y轴坐标转换资料都可以从相应的资料寄存器中读出。
5. 闲置模式(StandbyMode)在该模式下转换资料寄存器中的值都被保留为上次转换时的资料。
2.3.4 几个重要的存储器:1. ADC控制寄存器ADCCON:配置选择的模拟通道,启动A/D转换,A/D转换器欲分频因子 的设置;2. (配置 ADC触摸屏控制寄存器ADCTSC:用来配置自动X/Y位置转换模式和等待中断模式, XP,XM,YP,YM来实现X位置转换和Y位置转换)3. ADC转换数据寄存器ADCDAT0,ADCDAT1:用来存取A/D转换后的数据。
2.3.5 触摸屏移植步骤:将 s3c2410_ts.c 文件拷到 linux2.6.25/drivers/input/touchscreen 目录下,头文件则拷到
源码包的 include/asm/arch 下第一:我们需要修改 linux2.6.25/drivers/input/touchscreen 目录下的 makefile 文件,在文件的最后添加 : obj‐CONFIG_TOUCHSCREEN_S3C2410s3c2410_ts.o第二:我们需要修改 linux2.6.25/drivers/input/touchscreen/Kconfig 中添加: configTOUCHSCREEN_S3C2410 tristateSamsungS3C2410touchscreeninputdriver dependsonARCH_SMDK2410INPUTINPUT_TOUCHSCREEN selectSERIO help SayYhereifyouhavethes3c2410touchscreen. IfunsuresayN. TocompilethisdriverasamodulechooseMhere:the modulewillbecalleds3c2410_ts.configTOUCHSCREEN_S3C2410_DEBUG booleanSamsungS3C2410touchscreendebugmessages dependsonTOUCHSCREEN_S3C2410 help Selectthisifyouwantdebugmessages修改完成以后,在我们配置内核的时候,就会增加关系 s3c2410 的触摸屏配置,我们选择上这些配置就可以把驱动增加进去了Devicedrivers‐‐ Inputdevicesupport‐‐ Touchscreens‐‐ SamsungS3C2410touchscreeninputdriver Samsungs3c2410touchscreendebugmessage第三:在 /linux‐2.6.25/arch/arm/mach‐s3c2410/mach‐smdk2410.c 中增加如下内容:include staticstructs3c2410_ts_mach_infos3c2410_ts_cfg__initdata .delay10000 .presc49 .oversampling_shift2 在 smdk2410_devices 结构中,添加: s3c_device_ts 在 smdk2410_map_io 函数中添加: set_s3c2410ts_infos3c2410_ts_cfg第四:在 /linux‐2.6.25/arch/arm/mach‐s3c2410/devs.h 文件中添加: externstructplatform_devices3c_device_ts第五:在 arch/arm/mach‐s3c2410/devs.c 文件中添加如下几行: /Touchscreen/include staticstructs3c2410_ts_mach_infos3c2410ts_info void__initset_s3c2410ts_infostructs3c2410_ts_mach_infohard_s3c2410ts_infomemcpys3c2410ts_infohard_s3c2410ts_infosizeofstructs3c2410_ts_mach_infoEXPORT_SYMBOLset_s3c2410ts_infostructplatform_devices3c_device_ts.names3c2410‐ts.id‐1.dev.platform_datas3c2410ts_infoEXPORT_SYMBOLs3c_device_ts第六:将 regs‐adc.h 这个头文件里的define S3C2410_ADCTSC_XY_PST 0x3/proc/sys/kernel/printk,修改一下打印级别,然后按触摸屏,日志上就有触摸点的 x 和 y 坐标函数调用流程:module_inits3c2410ts_init‐‐s3c2410ts_init‐‐ platform_driver_registers3c2410ts_driver‐‐s3c2410ts_probe‐‐input_register_devicets.dev//向输入子系统注册输入设备总结 本文首先分析了目前嵌入式系统的特点,重点描述了嵌入式 linux 以及
Android 移植到S3C2410 芯片上相关步骤和事宜。
详细介绍了 vivi 的移植、
Android 内核移植和触摸屏驱动移植。
上一篇:
如何将Android应用程序编译至image rom
下一篇:
7*30m公路预应力混凝土连续梁桥上部结构设计