进入源码的arch/arm/boot/dts
目录下,将NXP的设备树源码imx6ull-14x14-evk.dts
复制一份并重命名为imx6ull-alientek-emmc.dts
,然后进行修改。修改参考正点原子提供的开发指南37.3
和37.4
章。
我们可以修改一下源码根目录下的主Makefile,这样就可以直接使用make dtbs
对设备树进行编译了。将ARCH
和CROSS_COMPILE
修改为如下所示:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabihf-
make menuconfig
打开图形化配置界面,将LAN8720A的驱动加入。路径如下:
然后重新编译一次:
make all -j2
我们可以在BusyBox的官网下载到源码:https://busybox.net/downloads/
例如,我们下载1.29.0版本的busybox-1.29.0.tar.bz2
在nfs服务器目录下创建rootfs目录,即在Ubuntu的~/imx6ull/nfs
目录下创建rootfs目录
将下载的busybox-1.29.0.tar.bz2
复制到~/imx6ull/tools
目录下,并解压
tar -vxjf busybox-1.29.0.tar.bz2
修改顶层Makefile,将CROSS_COMPILE和ARCH修改为如下所示:
CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
ARCH ?= arm
添加busybox中文字符支持
打开busybox-1.29.0/libbb/printable_string.c文件,找到printable_string函数,修改如下:
打开busybox-1.29.0/libbb/unicode.c文件,找到unicode_conv_to_printable2函数,修改如下:
配置Busybox
在busybox-1.29.0/
目录下输入 make defconfig
命令预配置busybox,然后通过make menuconfig
图形化界面配置,进入Setting->Build static binary (no shared libs),不要选中改选项:
然后是Setting->vi-style line editing commands,将其选中:
然后配置Linux System Utilities->mdev (16 kb) ,确保其全部选中:
最后配置Setting->Support Unicode,确保其选中:
然后保存、退出。
编译busybox
配置完成即可以编译,编译结果指定为之前创建的rootfs目录:
make install CONFIG_PREFIX=/home/william/imx6ull/nfs/rootfs/
在rootfs目录下添加lib
目录;
进入之前安装的交叉编译工具链目录:
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/
将此目录下所有的.so和.a文件拷贝到rootfs/lib目录下:
cp *so* *.a /home/william/imx6ull/nfs/rootfs/lib/ -d
我们将复制过去的软链接ld-linux-armhf.so.3
删除:rm ld-linux-armhf.so.3
重新在/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib
目录下将其重新复制过去:
cp ld-linux-armhf.so.3 /home/william/imx6ull/nfs/rootfs/lib/
然后可以看到,ld-linux-armhf.so.3不再是软连接了
进入/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
目录下,将此目录下所有的.so和.a文件也拷贝到rootfs/lib目录下
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
cp *so* *.a /home/william/imx6ull/nfs/rootfs/lib/ -d
在rootfs的usr目录下创建lib目录
进入/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/
目录下,将此目录下所有的.so和.a文件也拷贝到rootfs/lib目录下
cp *so* *.a /home/william/imx6ull/nfs/rootfs/usr/lib/ -d
在rootfs目录下创建dev、proc、mnt、sys、tmp、root等文件夹:
mkdir dev proc mnt sys tmp root
在uboot命令行下设置bootargs里的root为:
设置命令:
=> setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.101:/home/william/imx6ull/nfs/rootfs ip=192.168.1.104:192.168.1.101:192.168.1.1:255.255.255.0::eth0:off'
=> saveenv
然后使用boot
命令启动linux内核
可以看到,我们进入了根文件系统,说明我们的根文件系统工作了,使用ls命令测试可以看到:
在进入系统是有这样一行提示
说明rootfs还缺少文件
rcS是个shell脚本,Linux内核启动后需要启动一些服务,而rcS就是规定启动哪些文件的脚本文件。在rootfs中创建/etc/init.d/rcS文件,然后输入如下代码:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
创建好文件/etc/init.d/rcS 以后一定要给其可执行权限!
使用如下命令给予/ec/init.d/rcS 可执行权限: chmod 777 rcS
第1 行,表示这是一个 shell 脚本。
第 3 行,PATH 环境变量保存着可执行文件可能存在的目录,这样我们在执行一些命令或者可执行文件的时候就不会提示找不到文件这样的错误。
第4 行,LD_LIBRARY_PATH 环境变量保存着库文件所在的目录。
第5 行,使用export 来导出上面这些环境变量,相当于声明一些“全局变量”。
第 7 行,使用 mount 命令来挂载所有的文件系统,这些文件系统由文件/etc/fstab 来指定,所以我们一会还要创建/etc/fstab 文件。
第8 和9 行,创建目录/dev/pts,然后将devpts 挂载到/dev/pts 目录中。
第11 和12 行,使用 mdev 来管理热插拔设备,通过这两行,Linux 内核就可以在/dev 目录下自动创建设备节点。关于 mdev 的详细内容可以参考 busybox 中的docs/mdev.txt 文档。
/etc/fstab 里面定义了该挂载哪些文件。
在rootfs 中创建/etc/fstab 文件,fstab 在Linux 开机以后自动配置哪些需要自动挂载的分区,然后输入如下代码:
#
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
创建完成重新启动Linux,结果如下
可以看出,启动成功,没有错误提示,但是我们需要创建一个文件/etc/inittab。
inittab 的详细内容可以参考 busybox 下的文件 examples/inittab。init 程序会读取/etc/inittab这个文件,inittab 由若干条指令组成。每条指令的结构都是一样的,由以“:”分隔的4 个段组成,格式如下:
<id>:<runlevels>:<action>:<process>
id:每个指令的标识符,不能重复。但是对于 busybox 的init 来说, id 有着特殊意义。对于 busybox 而言 id 用来指定启动进程的控制 tty,一般我们将串口或者 LCD 屏幕设置为控制tty。
runlevels:对 busybox 来说此项完全没用,所以空着。
action:动作,用于指定process可能用到的动作。busybox 支持的动作如图所示:
process:具体的动作,比如程序、脚本或命令等。
参考 busybox 的 examples/inittab 文件,我们也创建一个/etc/inittab,在里面输入如下内容:
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
第2 行,系统启动以后运行/etc/init.d/rcS 这个脚本文件。
第3 行,将console 作为控制台终端,也就是 ttymxc0。
第4 行,重启的话运行/sbin/init。
第5 行,按下ctrl+alt+del 组合键的话就运行/sbin/reboot,看来ctrl+alt+del 组合键用于重启系统。
第6 行,关机的时候执行/bin/umount,也就是卸载各个文件系统。
第7 行,关机的时候执行/sbin/swapoff,也就是关闭交换分区。
/etc/initta 文件创建好以后就可以重启开发板即可,至此!根文件系统要创建的文件就已经全部完成了。
测试能不能和局域网外的网络进行连接,只需要使用ping命令ping一下百度的官网,就可以找到开发板是否能接入互联网。
ping www.baidu.com
如下所示:
提示测试失败,www.daidu.com是个bad address,即地址不对,出现这个错误是因为地址解析失败了,并没有解析出其对应的IP地址。
我们需要配置域名解析服务器的IP地址,一般域名解析地址可以设置为所处网络处的网关地址,比如192.168.1.1
;也可以设置成114.114.114.114
,这个是运营商的域名解析地址。
在/etc/
目录下新建resolv.conf
文件,然后输入如下内容:
nameserver 114.114.114.114
nameserver 192.168.1.1
内容很简单,nameserver表示这是个域名服务器,设置了两个域名服务地址。
修改好以后保存退出,重启开发板,重新ping一下百度的官网:
可见ping百度官网成功了,即域名解析成功了。
如过还是无法ping通,需要在/etc/init.d/rcS
文件中添加一行,设置默认网关:
route add default gw 192.168.0.1