6ull--系统移植(U-Boot、内核kernel、根文件系统rootfs)

1、摘要

  1. 版本型号:ubuntu18.04        ARM板型号:imx6ull-emmc-8g核心板

  2. 要在Linux内核中进行驱动的编写,因此要找到kernel源码,适配内核kernel到板子上。

  3. 本文主要记录对imx6ull进行系统移植

    1. U-Boot是官方自带的,没有再重新烧录。里面也有如何移植正点原子的U-Boot

    2. 内核kernel是正点原子配置好的,不是由出厂源码NXP改的。

    3. 根文件系统rootfs需要自己配置搭建,没有现成的

  4. 配置移植前提:配置好网络、IP、nfs以及tftp等其他

  5. 本文参照【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81、以及正点原子6ull教学视频,内容都能在文档中找到只是提取了我用到的,会将链接附在后面。

2、说明流程

正点原子驱动开发指南里第一次看是会一头懵, 里面有两类。

  1. 如果你想直接使用只是为了编写驱动,那么就移植正点原子配置好的U-boot以及kernel,就是本文的顺序。
  2. 如果想要由NXP提供的 Linux 源码开始配置,就按照教程中第三十七章步骤配置

移植顺序:

  1. 要先移植一个 bootloader 代码,这个 bootloader 代码用于启动 Linux 内核,bootloader 有很多,常用的就是 U-Boot
  2. 移植好 U-Boot 以后再移植 Linux 内核,移植完 Linux 内核以后Linux 还不能正常启动。
  3. 还需要再移植一个根文件系统(rootfs),根文件系统里面包含了一些最常用的命令和文件。
U-Boot Linux kernel rootfs 这三者一起构成了一个完整的 Linux 系统,一个可以正常使用、功能完善的 Linux 系统。

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
  1. 修改权限:chmod 777 mx6ull_alientek_emmc.sh
  2. 运行./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 修改文件

  1. 编译内核之前需要先在 ubuntu 上安装 lzop 库 :sudo apt-get install lzop

  2. 新建文件alientek_linux,将内核复制到该文件夹中linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2解压

  3. 创建脚本文件:vi mx6ull_alientek_emmc.sh,填写下面内容

  4. #!/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
  5. 修改权限chmod 777 mx6ull_alientek_emmc.sh ./mx6ull_alientek_emmc.sh

  6. 将生成好的zImage复制到tftp目录下:cp ./arch/arm/boot/zImage ~/nfs/tftpboot/ -f

  7. 修改顶层Makefile

  8. 在顶层目录下运行:make imx6ull-14x14-emmc-7-1024x600-c.dtb

  9. 将该文件也复制到tftp目录下。

4.3 配置板子

  1. 启动模式选用默认的EMMC启动模式

  2. 配置板子的ip:setenv ipaddr 192.168.1.203

  3. 配置主机的ip:setenv serverip 192.168.1.200

  4. 保存一下ethaddr:setenv ethaddr 00:04:9f:04:d2:35

  5. saveenv

  6. tftp 80800000 zImage

  7. tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb

  8. bootz 0x80800000 - 0x83000000

可以看到这里下载的内核时间是正确的,代表烧录进去了。

 

最后这里是提示没有根文件系统。属于正常的,因为还没有配根文件 。

可以将上面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.3rm 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盘)-基础资料

配置根文件系统是比较麻烦的,如果有不理解的地方还是建议看一下驱动开发文档,里面说明很详细,我这里只是自己做的一个总结。

相关推荐

  1. [IMX6ULL]移植lf-v2022.04 U-boot

    2024-06-07 12:32:07       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-07 12:32:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-07 12:32:07       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-07 12:32:07       82 阅读
  4. Python语言-面向对象

    2024-06-07 12:32:07       91 阅读

热门阅读

  1. C#实现定时执行任务

    2024-06-07 12:32:07       27 阅读
  2. VBA实战(Excel)(5):介绍一种排列组合算法

    2024-06-07 12:32:07       26 阅读
  3. python常用Web框架介绍

    2024-06-07 12:32:07       22 阅读
  4. mvn 命令报没有配置jdk环境

    2024-06-07 12:32:07       27 阅读
  5. K8s:无状态

    2024-06-07 12:32:07       35 阅读
  6. 化学反应冷媒降温制冷量计算方法

    2024-06-07 12:32:07       30 阅读
  7. GeoJson 几何对象实例说明(2024-06-06)

    2024-06-07 12:32:07       30 阅读
  8. rust嵌入式开发之总结

    2024-06-07 12:32:07       34 阅读