.

.

.

.

.

昨天已经编译了 Android 4.2.2 的源码,详见《Ubuntu 14.04 编译 Android 4.2.2 for Tiny4412》一文。

今天我们继续剩下的工作,让我们的 android 系统可以跑在 Tiny4412 开发板上。

Android 和 Linux 是两码事,Android 系统是基于 Linux 内核的。我们编译的 Android 源码是 Android 系统本身的源码,而内核是指通过原生 Linux 源码移植过来的内核源码,所以它们需要我们分别编译。并且 Android 系统的版本号和 Linux 源码的版本号是没有严格意义上的对应关系的,只要某个版本的 Linux 内核能支撑起某个版本的 Android 系统,那么它们就可以组合使用。

内核就不多说了,它在 Android 中的作用跟在其它 Linux 发行版中的作用没什么区别,我们简单介绍一下 Android 文件系统的结构。

Linux 系统的启动过程:bootloader(GRUB)---->zImage(Kernel)---->ramdisk(临时根,在内存中)---->rootfs(永久根,在磁盘上)

Android 的启动过程:bootloader(厂商提供)---->zImage(Kernel)---->ramdisk(永久根,为了提速所以放在内存中)
那么 Android 的 ramdisk 中存放了什么呢,通常分为四个分区:

[fat32] 内置存储空间。fat32 不是名字,是分区格式。
[system] 系统启动时挂载到system目录
[data] 系统启动时挂载到data目录
[cache] 相当于swap分区

其中 system 分区和 data 分区是 Android 系统中非常重要的两个分区,我们简单介绍一下它们常用的作用。

system:

  [app] xxx.apk | 系统自带的软件安装目录,普通用户无权卸载。像电话本、拨号器、短信等等系统应用都安装在这里。还有许多定制版手机被无良厂商预装了各种无法被卸载的垃圾程序都放在这里。这里的程序都是用 Java 编写的。

  [framework] xxx.jar | 存放用 Java 编写的库

  [bin] xxx | 存放本地程序,一般都是由 C/C++/asm 编写

  [lib] xxx.so | 存放用 C/C++/asm 编写的库

data:

  这个目录在内存中,是android系统的家目录。系统配置文件都在这个分区中,恢复出厂设置通常就是格式化该分区。

好了,android 的文件系统就先简单介绍到这了,下面开始今天的正题吧,编译 Linux 内核源码。

我手上用的是 Linux 3.5 的内核,并且已经被大神们移植过了,所以我就不再执行 make menuconfig 了,而是直接用大神给做好的配置文件进行编译了。自己还没有研究过怎么移植内核,上次折腾到半夜还失败了,所以这次先老老实实的拿大神移植好的内核做实验,等过段时间研究好了内核移植再拿出来分享。

既然有了大神移植好的内核,那么编译起来也就简单多了,过程当中也没有遇到什么坑。

[yuhuashi@local android]$ tar xzf linux-3.5-.tgz
[yuhuashi@local android]$ cd linux-3.5/
[yuhuashi@local linux-3.5]$ cp tiny4412_linux_defconfig .config
[yuhuashi@local linux-3.5]$ make -j4
......此处省略一万字
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready

OK,看到上面这两句话我们就知道编译成功了,并且编译好的内核放在了 arch/arm/boot/zImage 这里。

可以开始烧写系统到开发板了,鸡冻ing...

====================华丽的分割线====================

接下来我们将编译好的数据拷贝到SD卡上,然后就可以通过SD卡烧写系统了。

首先将友善之臂(Tiny4412 开发板的制造商)提供的 Superboot(就是个 bootloader) 烧写到 SD 卡上,使我们的 SD 卡可以引导起来。

1.插入 SD 卡

2.查看 SD 卡对应的设备文件

[yuhuashi@local tools]$ sudo fdisk -l
Disk /dev/sdc: MB, bytes
heads, sectors/track, cylinders, total sectors
Units = sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x00000000 Device Boot Start End Blocks Id System
/dev/sdc1 + b W95 FAT32

可见我的 SD 卡是 /dev/sdc,各位在后面看到我的命令中包含 /dev/sdc 或 /dev/sdc1 时,需要替换成你机器上查询出来对应的设备文件路径,千万不要写错了!

====前方高能预警,请无关人员立即撤离,相关人员必须在意识清醒的情况下谨慎操作!!!====

3.将 Superboot 烧写到 SD 卡上

其实可以自己用 read(2)、write(2) 函数等方式烧写,我已经有一个现成的工具了,所以直接就拿来用了。各位如果没有烧写工具可以自己写一个,因为我没有该工具的源码所以就不贴源码了,注意别把分区表覆盖了就行。

另外 bootloader 是烧写在设备上的(即/dev/sdc),而不是烧写在分区上的(/dev/sdc1)。

[yuhuashi@local tools]$ ./write4412boot
Usage:<./write4412boot> <boot.bin> <dev>
[yuhuashi@local tools]$ sudo ./write4412boot ../images_all/Superboot4412.bin /dev/sdc
start ...........
end ...........

4.将 ramdisk-u.img、system.img、userdata.img 以及 linux 内核 linux-x.x/arch/arm/boot/zImage 以及 Superboot4412.bin 拷贝到SD卡images目录下。

[yuhuashi@local android-4.2.2_r1]$ mkdir -p /media/yuhuashi/2CAA-71B6/images/Android4.2.2/
[yuhuashi@local android-4.2.2_r1]$ cp ramdisk-u.img system.img userdata-4g.img /media/yuhuashi/2CAA-71B6/images/Android4.2.2/
[yuhuashi@local android-4.2.2_r1]$ cp userdata-16g.img userdata-8g.img userdata.img /media/yuhuashi/2CAA-71B6/images/Android4.2.2/
[yuhuashi@local android-4.2.2_r1]$ cd ..
[yuhuashi@local android]$ cd linux-3.5/
[yuhuashi@local linux-3.5]$ cp arch/arm/boot/zImage /media/yuhuashi/2CAA-71B6/images/Android4.2.2/
[yuhuashi@local android-4.2.2_r1]$ cp ~/arm/class_boot/source/images_all/Superboot4412.bin /media/yuhuashi/2CAA-71B6/images/

我们前面已经将 Superboot 烧写到 SD 卡上了,之所以还要再拷贝 一份到 SD 卡上,是因为之前烧写 Superboot 是为了让 SD 卡可以启动,而现在拷贝到 SD 卡上的这份 Superboot 是为了一会儿烧写进 eMMC 中在开发板上引导我们的 Android 系统。

注意我拷贝的一个镜像叫做  userdata-4g.img,昨天说过在 Android 编译完成后,我们执行 ./gen-img.sh 命令生成了几个 img 文件,其中包含 userdata-16g.img、userdata-4g.img、userdata-8g.img、userdata.img,这几个镜像适用于不同大小的 eMMC 的设备。一般来说使用 userdata.img 就可以了,但是 友善之臂 的开发板有些特殊,4GB eMMC 的板子必须使用 userdata-4g.img 才行。

5.在 SD 卡的 images 文件夹中创建 FriendlyARM.ini 文件

[yuhuashi@local images]$ vim FriendlyARM.ini
#This line cannot be removed. by FriendlyARM(www.arm9.net) CheckOneButton=No
Action = Install
OS = Android LowFormat = No
VerifyNandWrite = No LCD-Mode = No
CheckCRC32=No StatusType = Beeper | LED ################### Android 4.2. ####################
Android-BootLoader = Superboot4412.bin
Android-Kernel = Android4.2.2/zImage
Android-CommandLine = console=ttySAC0,115200n8 androidboot.console=ttySAC0 ctp= skipcali=y vmalloc=512m ethmac=1C:6F::::7E lcd=S70 uhost=n
Android-RamDisk =Android4.2.2/ramdisk-u.img
Android-RootFs-InstallImage = Android4.2.2/system.img
Android-UserData-4G = Android4.2.2/userdata-4g.img
Android-UserData-8G = Android4.2.2/userdata-8g.img
Android-UserData-16G = Android4.2.2/userdata-16g.img
Android-UserData = Android4.2.2/userdata.img

注意第一行的注释不要删掉,不然 Superboot 可能无法引导。

完成后卸载掉 SD 卡,然后将卡插入到开发板的插槽中,将启动模式开关拨动到 SD 卡启动。

[yuhuashi@local images]$ cd ~
[yuhuashi@local ~]$ umount /media/yuhuashi/2CAA-71B6

最后请注意:LZ将编译好的系统烧写到开发板上死活启动不了,后来才发现原因是:将 Superboot4412 烧写到SD卡上的时候必须使用USB接口的读卡器,不能使用笔记本内置的读卡器!原因不明,如果有知道原因的童鞋请告诉LZ哈。

编译 Linux 3.5 内核烧写 Android 4.2.2 到 Tiny4412 开发板的更多相关文章

  1. Tiny4412 开发板 编译环境搭建【转】

    本文转载自:http://blog.csdn.net/beijiwei/article/details/51055369 版权声明:本文为博主原创文章,未经博主允许不得转载. /*********** ...

  2. 【嵌入式】bootloader,linux,filesystem的烧写

    平台: 深圳市优龙科技有限公司的FS2410(基于ARM9) 准备: 1.用串口(UART1,J8)线与PC机相连,这个是用来传输数据和显示信息的 2.连接USB数据下载线(usb device),注 ...

  3. 手把手教你写Kconfig---基于tiny4412开发板

    转自:http://blog.csdn.net/morixinguan/article/details/54744237 今天,我就来教大家写写最简单的Kconfig,什么是Kconfig? 我们配置 ...

  4. 《linux 内核全然剖析》编译linux 0.12 内核 Ubuntu 64bits 环境

    我×.. . 最终好了,大概3 4个小时吧...各种毛刺问题.终究还是闯过来了.. .. ubuntu2@ubuntu:~/Downloads/linux-0.00-050613/linux-0.00 ...

  5. 手把手教你写Linux设备驱动---中断(三)--workqueue实现(基于友善之臂4412开发板) 【转】

    转自:http://blog.csdn.net/morixinguan/article/details/69680909 上节,我们讲到如何来实现tasklet小任务机制 http://blog.cs ...

  6. 4418之Android Eclipse导入应用程序在开发板上调试

    由于在开发板上 LEDtest 应用已经默认安装了,所以在开发板上调试已安装应用的时候,需要做一下处理才能够正常连接.基于迅为iTOP4418开发板如下图所示,在打开工程“ledtest”,打开“bi ...

  7. Linux学习之路2-linux系统烧写

    fastboot烧写方式 准备工作: 硬件– 串口线连接开发板串口con3到PC的串口– OTG线连接开发板的OTG接口和PC的USB接口软件– 串口工具(超级终端),默认波特率为115200– 烧写 ...

  8. iMX6Q/PLUS开发板烧写设备树内核的Ubuntu系统

    基于迅为-iMX6D.iMX6Q 和 iMX6PLUS 三个硬件版本,设备树镜像的烧写方法以及镜像所在目录,镜像名称全部一致,所以作者将烧写章节合并到一起. 请注意,如果购买的是 iMX6D 版本,想 ...

  9. 1_jz2440在linux下烧写裸机程序

    常用的烧写方法有: 1.使用并口工具烧写:接线(参考百问网JZ2440V2开发板使用手册),使用oflash烧写(速度比较慢),可烧写.bin文件,从新上电观察效果.可烧写u_boot. 2.使用op ...

随机推荐

  1. 【Algorithm】二分查找

    今天在学习<编程之美>的时候,看到一个二分查找的题目,发现原来我真的不懂二分查找. 二分查找时候注意的事项: 在求二分查找的中间点时没有使用 midIndex = (minIndex + ...

  2. 【struts2】Struts2的异常处理

    在Action中execute方法声明为:public String execute() throws Exception,这样,Action可以抛出任何Exception. 1)自己实现异常处理 我 ...

  3. 【sql】CHARINDEX

    语法:CHARINDEX ( expressionToFind ,expressionToSearch [ , start_location ] ) 参数: 1)expressionToFind 包含 ...

  4. 【转】对 Rust 语言的分析

    对 Rust 语言的分析 Rust 是一门最近比较热的语言,有很多人问过我对 Rust 的看法.由于我本人是一个语言专家,实现过几乎所有的语言特性,所以我不认为任何一种语言是新的.任何“新语言”对我来 ...

  5. Linux C 编程一站式学习

    个人认为这是一个挺不错的从C语言到Linux系统开发的教程,这本是两个网上的文档. 其中 一本是<How To Think Like A Computer Scientist: Learning ...

  6. SharePoint 2013 Farm 安装指南——构建一个双层SharePoint Farm

    最近要对公司里的SharePoint进行升级,由于旧的系统SharePoint 2010已经有2年了,上面改动比较多,而且权限也很混乱了,所以下定决心要对其做一次升级,重新部署一台新的SharePoi ...

  7. javascript some()函数用法详解

    参数说明callback: 要对每个数组元素执行的回调函数.thisObject : 在执行回调函数时定义的this对象. 功能说明对数组中的每个元素都执行一次指定的函数(callback),直到此函 ...

  8. dig 命令

    dig命令是常用的域名查询工具,可以用来测试域名系统工作是否正常. 语法 dig(选项)(参数) 选项 @<服务器地址>:指定进行域名解析的域名服务器: -b<ip地址>:当主 ...

  9. Lua中and、or的一些特殊使用方法

    Lua中的逻辑运算符:与(and).或(or)和非(not),与其它语言的逻辑运算符功能一致,这里不做赘述.仅仅说一点,全部的逻辑运算符将false和nil视为假,其它不论什么东西视为真.0也视为真. ...

  10. 自定义Django中间件(登录验证中间件实例)

    前戏 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装饰 ...