这里说的最小Linux系统,就是没有移植QT等图形界面的系统,可以通过SecureCRT等软件登录Linux系统的文件系统,并进行一些ARM开发板上的Linux下的应用开发或测试,当然注意的是你做的更改并不会保存到emmc中,所以下次重启的时候,你的更改就会自动取消,要想你的更改有效,只能做进文件系统中后,重新用SD卡升级系统。当然,也可以用nfs形式来挂载Linux文件系统,这样更便于开发和调试。

注意,UT4418用的uboot版本是U-boot-2014.7,Linux内核的版本是linux-3.4.39,文件系统是用busybox做的ramdisk形式的。

要做UT4418上面的最小Linux系统,要进行以下的工作:

1、擦除4418上的emmc上下载的与android相关的镜像;

2、用busybox制作根文件系统,并做成ramdisk.img的形式;

3、重新配置编译内核;

4、用SD卡升级系统,并修改bootargs参数,使得文件系统能够被成功挂载。

下面将详细讲述每个步骤的操作,最后还会介绍一点Linux下的简单应用。

 

1、擦除4418的emmc上下载的与android相关的镜像

4418开发板在出厂的时候烧录的是android4.4的系统,所以我们要跑Linux的文件系统,就先要擦除emmc上与android相关的镜像。

长按电源键开机后,迅速敲击空格键进入U-boot命令终端,设置bootdelay为2s并保存。

用以下命令查看emmc的使用情况:

mmc list    //列举出u-boot中设置的可用的mmc设备

mmcinfo    //显示当前使用的mmc设备的相关信息

mmc dev [dev] [part]   //显示或者修改当前使用的mmc设备或者分区

mmc part    //显示当前mmc设备的可用分区

 

emmc的分区是U-boot和一个叫“utscript”的脚本共同来实现的,这个脚本我们一般不做修改,需要特殊的工具修改才能生效。

还可以用fdisk 2命令来查看mmc的分区情况,2是当前使用的mmc设备的编号,其分区大概的情况如下图:

linux最小系统镜像_linux最小系统镜像

 

我们要擦除android相关的镜像,就是要擦除下载的system分区中的镜像、cache分区中的镜像、userdata分区中的镜像。擦除命令用mmc erase blk# cnt,其中blk是起始的块数,cnt是块的数量,都是十六进制,这里我们没必要擦除整个分区,我们只需擦除每个分区中下载的镜像的大小即可。比如这里system分区有754M大小,而system.img镜像才300M大小,我们可以擦除个310M,这样就可以了,能够大大缩短操作时间。具体操作如下:

mmc erase 20800 9B000   //擦除system分区中的镜像

mmc erase 199800 4800   //擦除cache分区中的镜像

mmc erase 280000 15000  //擦除userdata

boot分区中的boot.img镜像包括内核镜像和ramdisk文件系统,当我们擦除android的system、cache和userdata后,系统能够加载Linux内核,但后面启动就不正常了,出现了错误。这里我们需要重新对emmc分区,按照正常的情况,把内核镜像kernel和文件系统镜像ramdisk分开。

 

2、用busybox制作根文件系统,并做成ramdisk.img的形式

在这里busybox就不详细介绍了,用busybox做根文件系统也是嵌入式软件开发的一个基本功,多做几次基本上也没什么问题啦,要注意的是,可能有的同学会调Linux的驱动,那么在做文件系统的时候就要注意使得文件系统能够支持insmod,rmmod,lsmod等命令,它是在Linux Module Utilites下设置的,不选Simplified modutils就会出现相应的上述命令,选上就可以啦。

用busybox做根文件系统,最后会得到一个_install的目录,这就是我们需要的根文件系统,当然,还不完善,还缺少一些必要的目录和文件。做好后,再用genext2fs工具做成ramdisk.img的形式即可,命令为genext2fs -b 6144 -N 800 -d _install ramdisk.img,当然,参数都是可以修改的。

鉴于这个操作篇幅较长,这里只是简述要点,对于底子薄的同学,后面我会另外整理出一份详细的用busybox做根文件系统的文档以供参考。另外,不用busybox,用buildroot也可以做文件系统,大家可以尝试一下。

 

3、重新配置编译内核

这里配置内核,主要是让内核支持ramdisk形式的文件系统,顺便也让内核支持一下nfs服务,后面我们用nfs服务来挂载我们的文件系统的时候也会用到。

让内核支持ramdisk形式的文件系统的配置如下图:

 

linux最小系统镜像_linux最小系统镜像_02

 

linux最小系统镜像_linux最小系统镜像_03

 

linux最小系统镜像_linux最小系统镜像_04

即在Device Drivers ----> [*] Block devices ----> <*> RAM block device support上选上这些项,并且默认的RAM disk的大小我们也可以修改,这里默认是4M,估计一般如果做一些应用在文件系统里的话,最后的ramdisk.img可能会大于4M,这里我们就设置个40M。

 

linux最小系统镜像_linux最小系统镜像_05

NFS服务在内核里面的配置如下:

 

linux最小系统镜像_开发板_06

配置完后,即可到android源码目录kk下面用如下命令重新编译内核:

./build.sh -t kernel

最后就会在我们的result目录下面的boot目录里面或者在kk/linux/kernel/kernel-3.4.39/

arch/arm/boot下面生成我们需要的uImage镜像。

但我们这里不是烧录的uImage镜像,由于uboot的加载命令是ext4loade,所以还要把uImage做成一个ext4格式的镜像,这里用到一个工具试make_ext4fs,它是编译安卓源码后生成的工具,在./out/host/linux-x86/bin/下面。我们先建一个kernel目录,把uImage拷贝进去,还有result目录下面的boot里面的logo.bmp也拷贝到kernel目录中,这个图像会被uboot加载为LCD的背景图。最后,可用以下命令来生成我们需要的kernel.img镜像:

./out/host/linux-x86/bin/make_ext4fs -s -l 15M kernel.img kernel

这里参数l是指定生成的kernel.img的大小,后面的kernel是源文件目录。

 

4、用SD卡烧写系统,并修改bootargs参数,使文件系统能够被成功挂载

制作4418的SD卡启动卡,然后把要烧录的镜像都拷贝到SD卡中,包括上面做的ramdisk.img和kernel.img,然后插入SD卡到开发板中,开发板就会自动升级,直至开发板左上角部分最后显示“Update Successful”,说明升级完毕,关机,拔掉SD卡,重启开机进入uboot命令行,设置bootargs参数。

bootargs参数设置如下:

setenv bootargs root=/dev/mmcblk0p2 init=/linuxrc console=ttyAMA0,115200n8 mmc=2

saveenv

然后再敲入reset命令重启系统,会重启然后加载内核,直至最后出现“Please press Enter to activate this console”,敲击Enter键即可进入最小的Linux文件系统。

 

5、Linux部分简单应用

5.1 Input设备触摸屏的测试

input设备包括按键、触摸屏等,在系统下对应的设备文件是/dev/event0或者/dev/input/event0等。这类设备的底层驱动都是采用input_report_key()、input_report_abs()等函数向上报告事件,所以我们可在Linux的用户空间读取侦听input的event事件(包括类型、键值、状态)来验证驱动。

说到这里,android系统的toolbox下提供了两个工具getevent和sendevent,getevent就可以用来获取input事件,sendevent可以模拟发出input事件。我们采用的是和getevent功能一样的一个开源工具——evtest。把它移植到我们的文件系统中即可使用。

进入文件系统后,我们可以直接输入命令:

evtest -h

即可查看evtest的用法。下面详细讲解怎样用evtest来检测触摸屏。

找到触摸屏对应的设备文件是/dev/input/event4,我们可以用如下命令查看input设备的详细情况:

cat /proc/bus/input/devices

下面开始进入测试,输入命令evtest /dev/input/event4即可开始测试,下测试过程中当我们触摸屏的不同位置时,就会得到不同的坐标值:

 

linux最小系统镜像_开发板_07

左上:

 

linux最小系统镜像_开发板_08

左下:

 

linux最小系统镜像_开发板_09

中间:

 

linux最小系统镜像_开发板_10

右下:

 

linux最小系统镜像_根文件系统_11

屏幕坐标范围是800*480,通过上面的测试我们可以发现,当我们触摸到不同位置时,x和y的坐标值就不一样。这说明我们的触摸屏是可以正常工作的。

 

5.2 基于以太网的聊天室小程序

在做这个实验前,先简单配置一下我们的网络,可以直接在挂起来的文件系统的终端用一下命令来配置:

ifconfig eth0 192.168.1.12 netmask 255.255.255.0 up

注意开发板的IP配置要与我们的主机或者虚拟机要在同一个网段,我的主机配置如下:

 

linux最小系统镜像_根文件系统_12

至于Ubuntu虚拟机我们可以通过右上角的双箭头形式的网络设置再创建一个静态IP的链接,用于开发中应用,如下图:

 

linux最小系统镜像_文件系统_13

linux最小系统镜像_根文件系统_14

 

你可以根据实际情况来设置自己电脑的IP为静态,这样就不会自动的DHCP分配,你的IP一直是变化的,这样不方便开发。

设置好后,我们可以直接在开发板上向我们的主机发一些数据包,看能不能收到,如果说没有丢失,就说明我们的网络是好的,操作如下:

ping -c 3 192.168.1.20

上述命令是向我们的主机发送3个数据包,然后会收到来自主机的回应,说明我们的网络是可用的。

聊天室程序分成客户端和服务器端,交叉编译成server和client两个可执行程序后,在开发板的后台运行服务器端程序,然后再运行我们的客户端程序进行登录,并输入一些聊天程序,然后服务器就会把聊天信息都打印显示出来。

./server &

./client

具体的应用,详情请参考原程序。

注意你配置的电脑的IP不同,也需要在源程序中修改IP后再交叉编译了才能在开发板上正确运行。

 

 

最后,总结一下,我们这里是实现了UT4418上面的最小Linux系统,我们还可以在此基础上移植QT,使用Linux+QT来实现图形界面。当然,为了方便开发和调试,我们首先也要把nfs和tftp服务搭建起来,使用nfs来挂载我们的文件系统,调好后再烧写到开发板上。甚至于还可以移植Ubuntu系统,无图形界面的Ubuntu Core系统和桌面版的Linaro Ubuntu系统。有兴趣的同学都可以尝试一下,如果有机会的话,后面会再整理出文档来介绍。

这一块是属于系统移植一块比较简单的内容,通俗的说,就是给我们的开发板装系统,就像我们买了台电脑,拿来就要重装系统一样。只涉及uboot源码的简单修改;启动参数bootargs和bootcmd的配置;内核简单的相关配置;根文件系统的制作。还有一些嵌入式工具的使用和一些应用开发。装好系统后,向上我们可以做嵌入式的Linux应用开发,多线程,多进程,网络编程等。QT,数据库等。向下我们可以做Linux驱动,再进一步学习android驱动。至于真正的系统移植,涉及uboot源码和Linux内核源码的移植,等大家基本功扎实了就可以自己去尝试啦。