一、开发环境

  1. 嵌入式 Linux 开发板:100ASK-6ULL-V11(即:由百问网出品的 i.MX6ULL-PRO);
  2. 系统:Ubuntu 18.04(已配置交叉编译工具链);
  3. 待移植的 Linux 内核:由 NXP 官方维护的 imx_5.4.47_2.2.0

二、下载待移植的 Linux 内核源码

可以使用以下命令:

git clone https://github.com/nxp-imx/linux-imx
cd linux-imx
git branch -a
git checkout remotes/origin/imx_5.4.47_2.2.0

NXP 官方的项目集合了多个版本的 Linux 内核,项目较大,如果多次克隆失败的话,也可以通过韦东山老师的仓库来克隆:

git clone https://gitee.com/weidongshan/linux-imx
cd linux-imx
git reset 63736cb7c46268a6e6aab654ad3849d85d5581a0 --hard

三、移植 Linux 内核

1. 建立单板相关配置

建立单板的配置文件:

cp arch/arm/configs/imx_v7_defconfig arch/arm/configs/imx_v7_angus_defconfig 

为了方便,我们使用由百问网制作的基于Linux 4.9.88 内核的设备树文件来适配大多数设备,然后再对无法驱动的设备单独处理:

cp ~/100ask_imx6ull-sdk/Linux-4.9.88/arch/arm/boot/dts/100ask_imx6ull-14x14.dts arch/arm/boot/dts/imx6ull-14x14-angus.dts

修改设备树文件imx6ull-14x14-angus.dts的对应项为:

&can1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_flexcan1>;
    xceiver-supply = <&reg_can_3v3>;
    status = "okay";
};

在编译设备树的文件arch/arm/boot/dts/Makefile中添加我们的板子:

2. 适配触摸屏、蓝牙和 WiFi 驱动

触摸屏驱动

同样,拷贝之前的触摸屏驱动程序到对应文件夹:

cp -rfd ~/100ask_imx6ull-sdk/Linux-4.9.88/drivers/input/touchscreen/gt9xx/ ./drivers/input/touchscreen/

在文件drivers/input/touchscreen/Makefile的结尾处添加:

obj-$(CONFIG_TOUCHSCREEN_GT9XX) += gt9xx/ 

在文件drivers/input/touchscreen/Kconfig中引入触摸屏的 Kconfig:

在文件arch/arm/configs/imx_v7_angus_defconfig中添加对应项:

蓝牙和 WiFi 驱动

由于暂时用不到蓝牙和 WiFi,因此我们没有做出适配。

对这部分有兴趣的话可以参考 i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0百问网的改动自行尝试。

3. 编译 Linux 内核、设备树,启动开发板

编译并将得到的Linux 内核和设备树文件拷贝至 TFTP 目录:

 make distclean
 make imx_v7_angus_defconfig
 make zImage -j4
 make dtbs
 cp arch/arm/boot/zImage ~/tftpboot/
 cp arch/arm/boot/dts/imx6ull-14x14-angus.dtb ~/tftpboot/

启动开发板并进入 U-Boot,设置相关的环境变量:

setenv fdt_file imx6ull-14x14-angus.dtb  // 设置需要下载的设备树文件名称
setenv ip_dyn no  // 关闭自动配置 IP
setenv serverip 10.10.10.30  // 设置服务器的 IP 地址
setenv ipaddr 10.10.10.30  // 设置开发板的 IP 地址
saveenv

启动后加载 eMMC 中原有的根文件系统

由于我们还没有制作自己的根文件系统,可以暂时使用 eMMC 中已有的根文件系统来启动 Linux,配置环境变量bootargs

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv

通过 TFTP 下载 Linux 内核和设备树:

tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-angus.dtb
bootz 80800000 - 83000000

成功启动开发板!

image.png

使用命令uname -a 查看内核版本:

确实是5.4.47

启动后加载新构建的根文件系统

当我们按照下一篇《i.MX6ULL 开发板系统移植与根文件系统构建(三):根文件系统的构建》制作好新的根文件系统后,可以尝试通过 NFS 挂载新构建的根文件系统。

根据实际情况设置环境变量bootargs

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=10.10.10.30:/home/book/nfs_rootfs/buildrootfs,v3,tcp rw ip=10.10.10.31:10.10.10.30:10.10.10.10:255.255.0.0::eth0:off'
saveenv

同样通过 TFTP 下载 Linux 内核和设备树:

tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-angus.dtb
bootz 80800000 - 83000000

可以看出,开发板的根文件系统确实是通过 NFS 挂载的:

完工!

参考资料

[1] https://github.com/nxp-imx/linux-imx/tree/imx_5.4.47_2.2.0

[2] https://gitee.com/weidongshan/linux-imx

[3] 正点原子【第三期】手把手教你学Linux之系统移植和根文件系统构建篇

[4] i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0

 

最后修改:2024 年 04 月 23 日
如果觉得我的文章对你有用,请随意赞赏