1、摘要
-
版本型号:ubuntu18.04 ARM板型号:imx6ull-emmc-8g核心板
-
要在Linux内核中进行驱动的编写,因此要找到kernel源码,适配内核kernel到板子上。
-
本文主要记录对imx6ull进行系统移植
-
U-Boot是官方自带的,没有再重新烧录。里面也有如何移植正点原子的U-Boot
-
内核kernel是正点原子配置好的,不是由出厂源码NXP改的。
-
根文件系统rootfs需要自己配置搭建,没有现成的
-
-
配置移植前提:配置好网络、IP、nfs以及tftp等其他
-
本文参照【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81、以及正点原子6ull教学视频,内容都能在文档中找到只是提取了我用到的,会将链接附在后面。
2、说明流程
正点原子驱动开发指南里第一次看是会一头懵, 里面有两类。
- 如果你想直接使用只是为了编写驱动,那么就移植正点原子配置好的U-boot以及kernel,就是本文的顺序。
- 如果想要由NXP提供的 Linux 源码开始配置,就按照教程中第三十七章步骤配置
移植顺序:
- 要先移植一个 bootloader 代码,这个 bootloader 代码用于启动 Linux 内核,bootloader 有很多,常用的就是 U-Boot。
- 移植好 U-Boot 以后再移植 Linux 内核,移植完 Linux 内核以后Linux 还不能正常启动。
- 还需要再移植一个根文件系统(rootfs),根文件系统里面包含了一些最常用的命令和文件。
3、移植U-Boot
其实并不用移植U-Boot,因为板子自带的U-Boot就可以使用,如果想要学如何配置U-Boot,就看一下这节或者看视频,如果不用就可以跳过此节。
3.1 参照视频:
https://www.bilibili.com/video/BV1DK411P775/?p=100&vd_source=4b1e60ea63d719404f67042d7e6c32d1
3.2 正点原子有可以直接使用的uboot
uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7.tar.bz2
创建一个uboot
文件夹。将压缩包解压
3.3 修改部分内容
如果是第一次编译,需要输入指令sudo apt-get install libncurses5-dev
安装ncurses 库。
输入命令,将内容写进入。
vi mx6ull_alientek_emmc.sh
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr256_nand_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
修改权限:chmod 777 mx6ull_alientek_emmc.sh
-
运行
./mx6ull_alientek_emmc.sh
,此时会生成u-boot.bin
3.3 使用SD卡烧录
-
将SD卡插到电脑上,先格式化,随后连接到Ubuntu
-
将
imxdownload
移动到.bin目录下 -
终端指令
ls /dev/sd* -l
查看是哪个区,可以看到是/dev/sdb
-
输入指令:
./imxdownload u-boot.bin /dev/sdb
-
将板子的启动BOOT拨码拨到SD卡启动模式(板子上有标记)
-
将卡入重新启动复位。此时是烧录进去了。但是启动的时候修改环境变量使用
saveenv
保存后,下次再重启的时候之前保存的都没了。看他提示保存到NAND
里面,没有保存到Flash
里面
4、移植Linux内核
移植Linux内核使用的是正点原子配置好的,因此只需要修改部分内容就可以用了。
4.1 参考视频
https://www.bilibili.com/video/BV1DK411P775?p=129&vd_source=4b1e60ea63d719404f67042d7e6c32d1
4.2 修改文件
-
编译内核之前需要先在 ubuntu 上安装 lzop 库 :
sudo apt-get install lzop
-
新建文件
alientek_linux
,将内核复制到该文件夹中linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2
解压 -
创建脚本文件:
vi mx6ull_alientek_emmc.sh,填写下面内容
-
#!/bin/sh make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j12
-
修改权限
chmod 777 mx6ull_alientek_emmc.sh
./mx6ull_alientek_emmc.sh
-
将生成好的
zImage
复制到tftp
目录下:cp ./arch/arm/boot/zImage ~/nfs/tftpboot/ -f
-
修改顶层Makefile
-
在顶层目录下运行:
make imx6ull-14x14-emmc-7-1024x600-c.dtb
-
将该文件也复制到
tftp
目录下。
4.3 配置板子
-
启动模式选用默认的
EMMC
启动模式 -
配置板子的ip:
setenv ipaddr 192.168.1.203
-
配置主机的ip:
setenv serverip 192.168.1.200
-
保存一下ethaddr:
setenv ethaddr 00:04:9f:04:d2:35
-
saveenv
-
tftp 80800000 zImage
-
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
-
bootz
0
x
80800000
-
0
x
83000000
可以看到这里下载的内核时间是正确的,代表烧录进去了。
最后这里是提示没有根文件系统。属于正常的,因为还没有配根文件 。
可以将上面6、7、8三个命令存储到环境变量中,尽量自己手打,否则很容易出错,这样就可以保证复位之后自动下载进去了,而不是手动敲命令。
至此内核移植成功。
5、移植根文件系统rootfs
对应【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 第三十八章 根文件系统构建
根文件系统正点原子没有提供现成的,因此需要自己配置一个根文件系统。
构建根文件系统,可以构建的软件:busybox(用于学习)、buildroot(用于做产品,更加集成方便)、yocto。这里用的busybox
5.1 修改内容
-
复制压缩包busybox到目录下,解压
-
修改顶层Makefile
- 这个在安装的交叉编译环境中,可以进入根目录查找:
cd /user/local/arm/
,注意替换的内容 -
以及
- 这个在安装的交叉编译环境中,可以进入根目录查找:
-
修改busybox,使其支持中文字符
-
打开文件
busybox-1.29.0/libbb/printable_string.c
,找到函数printable_string
,修改两处内容 -
打开文件
busybox-1.29.0/libbb/unicode.c
,找到函数unicode_conv_to_printable2
,修改两处内容
-
5.2 配置busybox
-
使用默认配置,输入命令:
make defconfig,
有.config
表示成功 -
打开图形化界面修改部分配置命令:
make menuconfig
-
Location: -> Settings -> Build static binary (no shared libs)
不选中,这个是来决定是静态编译 busybox 还是动态编译,这里要动态编译所以不勾选。 -
Location: -> Settings -> vi-style line editing commands
选中 -
Location: -> Linux Module Utilities -> Simplified modutils
不选中 Location: -> Linux System Utilities -> mdev (16 kb)
确保下面的全部选中,默认都是选中的-
Location: -> Settings -> Support Unicode
选中-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables
选中
-
5.3 编译busybox
-
将编译的结果存放到创建的
nfs
目录下的rootfs
目录中:make install CONFIG_PREFIX=/home/linux/nfs/rootfs
此时可以看到创建成功了,在自己的nfs目录下的rootfs中。
5.4 增加lib文件
-
根文件系统中添加动态库:
mkdir lib
-
进入到
/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 ~/nfs/rootfs/lib/ -d
(-d不要省略) -
切换到
nfs/rootfs/lib
中,可以看到已经复制过来了,但是还要修改 -
输入命令
ls ld-linux-armhf.so.3 -l
查看此文件详细信息,可以看到是软连接文件,相当于快捷方式。 -
删除
nfs/rootfs/lib
目录下的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 ~/nfs/rootfs/lib/
-
此时在rootfs下可以看到
ld-linux-armhf.so.3
不是软链接
-
-
进入目录:
/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
-
cp *so* *.a ~/nfs/rootfs/lib/ -d
-
成功
5.5 向 rootfs 的“usr/lib”目录添加库文件
-
在rootfs/usr/下创建一个lib目录:
mkdir lib
-
进入到
/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
cp *so* *.a ~/nfs/rootfs/usr/lib/ -d
-
此时可以看到成功了
-
可以查看大小:
du ./lib ./usr/lib/ -sh
5.6 创建其他的文件夹
mkdir dev proc mnt sys tmp root
5.7 板子修改环境变量绑定
这个命令要自己去看一下是什么意思,要自己手敲,注意空格和符号不能错
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.200:/home/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.203:192.168.1.200:192.168.1.1:255.255.255.0::eth0:off'
saveenv
5.8 完善根文件系统
在rootfs目录下,创建/etc/init.d/rcS
文件 ,输入以下内容,再修改权限chmod 777 rcS
,这里rcS文件是一个shell脚本,可以在最后一行将想要开机自启动的程序的可执行文件写进去,就可以实现开机自动执行该程序。
#!/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
#开机自启动,这个是自己想要启动的程序,可以删掉不要
cd /driver
./hello &
cd /
在 rootfs 中创建/etc/fstab
文件,输入以下内容
#<file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
在 rootfs 中创建/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
可以创建一个driver
文件夹用来存放自己的文件
5.9 根文件报错
[ 8.670640] gpio_dvfs: disabling
[ 8.673955] VSD_3V3: disabling
[ 8.677024] can-3v3: disabling
[ 8.680346] ALSA device list:
[ 8.683327] #0: wm8960-audio
解决方案:https://blog.csdn.net/HuangChen666/article/details/132273615
6、效果
这个是最终配置好的效果,佛祖这个代码是在rcS文件中最后一行可执行程序hello运行结果
7、总结
该文件用到的所有资料都是在正点原子官网上下载的,叫:【正点原子】阿尔法Linux开发板(A盘)-基础资料
配置根文件系统是比较麻烦的,如果有不理解的地方还是建议看一下驱动开发文档,里面说明很详细,我这里只是自己做的一个总结。