前言:本系列文章主要讲解正点原子linux开发板 开发过程的一些记录;
本章主要讲解将NXP官方提供的linux,移植到正点原子的linux开发板上;
一般一款linux开发板的设计与开发,都会参考芯片原厂的demo板,而芯片原厂会对demo板提供一套完整的资料。所以在使用第三方设计的开发板或自己做的电路板时,都会参考芯片远程的demo板的设计;在软件方面也会移植demo板配套的工具等,毕竟芯片原厂提供的资料匹配兼容性肯定是比其它的好的。
本部分主要介绍,相关设计的软件,以及NXP原厂linux编译测试。
uboot移植可参考一下:
<Linux开发> -之-系统移植 uboot移植过程详细记录(第一部分)
<Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分)
<Linux开发> -之-系统移植 uboot移植过程详细记录(第三部分)(uboot移植完结)
接下来讲解移植过程记录:
一、linux移植前期准备
注:以下准备工作,可参考正点原子linux开发手册
1、安装虚拟机和ubuntu;(一般是这样,方便和window环境一起使用)
2、安装交叉编译工具;(编译用)
3、安装FileZillaClient;(方便和window传输文件)
4、安装vscode;(方便uboot源码的一些修改)
5、正点原子Linux开发板;(或IMX6ULL同系列开发板。一般操作过程都差不多,毕竟都是NXP的)
6、安装TFTP->TFTP安装操作。
7、ubuntu安装lzop库,编译需要:命令:sudo apt-get install lzop
工具准备好后,同uboot一样,先验证NXP官方提供的linux直接使用,看看如何。
二、NXP原厂Linux测试
1、将NXP原厂linu,传输到ubuntu,并解压,重命名为:linux-imx-rel_imx_4.1.15_2.1.0_ga_onefu。
(1)通过FileZillaClient 将 linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2传输到ubuntu对应目录下。
(2)使用命令:“tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2” ,将压缩包解压。
(3)使用命令:" mv linux-imx-rel_imx_4.1.15_2.1.0_ga linux-imx-rel_imx_4.1.15_2.1.0_ga_onefu“ 重命名文件夹名称。
2、编写运行脚本
(1)在解压的根目录下创建“imx6ull_onefu_emmc.sh”
命令:“touch imx6ull_onefu_emmc.sh”
(2)用VScode打开脚本输入下面内容:
#!/bin/sh
#清理工程
make ARCH=arm CROSS_COMPILE=arm-gnueabihf- distclean
#使用默认配置文件imx_v7_mfg_defconfig来配置Linux内核
make ARCH=arm CROSS_COMPILE=arm-gnueabihf- imx_v7_mfg_defconfig
#打开Linux的图形配置界面
make ARCH=arm CROSS_COMPILE=arm-gnueabihf- menuconfig
#编译Linux
make ARCH=arm CROSS_COMPILE=arm-gnueabihf- all -j16
#注1: ARCH=arm 设置目标为arm架构
#注2: CROSS_COMPILE=arm-linux-gnueabihf- 指定编译工具链前缀
#注3: -j16 使用16核编译
(3)赋予脚本可执行权限
chmod 777 imx6ull_onefu_emmc.sh //给予可执行权限
./imx6ull_onefu_emmc.sh //执行shell脚本编译内核
3、将目录arch/arm/boot下生成zImage镜像文件和arch/arm/boot/dts目录下生成imx6ull-alientek-emmc.dtb文件,拷贝到tftp目录下,重启开发板,在uboot命令模式中使用tftp命令下载这两个文件并启动。
(1)拷贝zImage和imx6ull-alientek-emmc.dtb
命令:
cp /home/water/water/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_onefu/arch/arm/boot/zImage .
cp /home/water/water/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_onefu/arch/arm/boot/dts/imx6ull-14x14-evk.dtb .
chmod 777 *
(3)打开CRT,进入uboot界面
(4)通过TFTP下载Linux和设备树
命令:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
第一句是将linux镜像下载到地址0x80800000。
第二句是将设备树下载到地址0x83000000。
下图是linux镜像下载过程。
下图是设备树下载过程。
(5)运行linux
下载完成后,输入命令:”bootz 80800000 - 83000000“,运行。
由上图可看到,linux内核已经启动了,说明linux可以正常运行。
如果EMMC中存在根文件系统,则可以进入到linux系统里面使用命令行,进行操作,如下图,按回车,即可看到对应命令行输出切换了。
三、NXP原厂linux运行现象分析
1、根文件系统缺失错误
Linux内核启动以后是需要根文件系统的,根文件系统存在哪里是由uboot的bootargs环境变量指定,bootargs会传递给Linux内核作为命令行参数。比如上一小节设置root=/dev/mmcblk1p2,也就是说根文件系统存储在/dev/mmcblk1p2中,也就是EMMC的分区2中。这是因为正点原子的EMMC版本开发板出厂的时候已经EMMC的分区2中烧写好了根文件系统,所以设置root=/dev/mmcblk1p2。如果我们不设置根文件系统路径,或者说根文件系统路径设置错误的话会出现什么问题?这个问题是很常见的,我们在实际的工作中开发一个产品,这个产品的第一版硬件出来以后我们是没有对应的根文件系统可用的,必须要自己做根文件系统。在构建出对应的根文件系统之前Linux内核是没有根文件系统可用的,此时Linux内核启动以后会出现什么问题呢?带着这个问题,我们将uboot中的bootargs环境变量改为“console=ttymxc0,115200”,也就是不填写root的内容了,命令如下:
setenv bootargs 'console=ttymxc0,115200' //设置
bootargs saveenv //保存
修改完成以后重新从网络启动,启动以后会有如下图所示错误:
在上图中最后会有下面这一行:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
也就是提示内核崩溃,因为VFS(虚拟文件系统)不能挂载根文件系统,因为根文件系统目录不存在。即使根文件系统目录存在,如果根文件系统目录里面是空的依旧会提示内核崩溃。这个就是根文件系统缺失导致的内核崩溃,但是内核是启动了的,只是根文件系统不存在而已。
2、在有根文件系统时,正常进入linux。
四、总结:
至此,NXP原厂linux编译运行测试完成。由上面现象可看出,原厂的Linux内核是能正常编译运行的。但是由于正点原子的linux开发板的硬件电路设计和原厂demo板的的设计存在差异,例如网络、LCD等。这些部分在原厂的Linux中是需要修改,才能匹配正点原子的Linux 开发板的。所以接下来的部分讲解,就是对整个NXP原厂Linux移植到正点原子Linux开发板上的操作。
综上所述,如有不足、错误、遗漏之处,可联系作者修改、补充。
相互交流才能促进大家共同进步哟。
作者联系方式QQ:759521350