imx6ull开发板移植新版uboot、kernel和文件系统
在学习嵌入式Linux驱动之前需要把开发和测试环境给配置好,所以需要在开发板上移植一套系统。正点原子提供了imx6ull开发板的移植教程,不过其移植的版本是比较老,所以,本文参考了正点原子的移植教程,给出了较新版的uboot,kernel和文件系统的移植流程,该移植后的系统也将作为后面嵌入式驱动教程的构建和测试系统。
1 配置交叉编译器
ARM交叉编译器是移植的基础,它可以从Arm GNU Toolchain Downloads – Arm Developer这个网站下载下来。基于我们使用Linux
操作系统构建imx6ull的软件,需选择arm-none-linux-gnueabihf
这一类别的编译器使用,本文选择的是该编译器的14.2.Rel1版本。下载之后将压缩包解压到某个位置,然后修改/etc/profile
文件的内容,在末尾加上下面的两行:
export PATH=$PATH:/usr/local/arm/arm-none-linux-gnueabihf/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm/arm-none-linux-gnueabihf/lib
你只需要修改上述的路径(/usr/local/arm/arm-none-linux-gnueabihf
)为你自己解压的路径即可。修改完成后执行source /etc/profile
更新配置,这时执行arm-none-linux-gnueabihf-gcc -v
看到下图所示内容即为配置成功。
2 移植uboot-imx_v2024.04
从NXP官方维护的uboot-imx仓库中下载lf_v2024.04
分支的源码并解压。首先需要配置的是设备树,没错,在较新版本的uboot中也使用设备树来配置硬件属性了。在源码的arch/arm/dts/文件夹下创建我们自己配置的设备树源文件imx6ull-myboard.dts,添加以下内容(根据分析imx6ul-14x14-evk.dtsi得到):
#include "imx6ull-14x14-evk-emmc.dts" //包含原本imx6ull EVK开发板的设备树配置
/ {
spi-4 {
status = "disable"; //spi-4使用了网卡芯片的复位口,需要关闭
};
};
&fec1 {
status = "disable"; //只需要一个网卡,关闭
};
&fec2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet2>;
phy-mode = "rmii";
phy-handle = <ðphy1>;
phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>; //设置复位口
phy-reset-duration = <200>; //复位时间
phy-reset-post-delay = <200>; //复位后延时时间
status = "okay";
mdio {
#address-cells = <1>;
#size-cells = <0>;
ethphy0: ethernet-phy@2 {
compatible = "ethernet-phy-id0022.1560";
reg = <2>;
micrel,led-mode = <1>;
clocks = <&clks IMX6UL_CLK_ENET_REF>;
clock-names = "rmii-ref";
};
ethphy1: ethernet-phy@1 {
compatible = "ethernet-phy-id0022.1560";
reg = <1>;
micrel,led-mode = <1>;
clocks = <&clks IMX6UL_CLK_ENET2_REF>;
clock-names = "rmii-ref";
};
};
};
&lcdif {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lcdif_dat
&pinctrl_lcdif_ctrl>;
display = <&display0>;
status = "okay";
display0: display@0 {
bits-per-pixel = <24>;
bus-width = <24>;
display-timings { //根据LCD屏参数设置
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <51200000>;
hactive = <1024>;
vactive = <600>;
hfront-porch = <160>;
hback-porch = <140>;
hsync-len = <20>;
vback-porch = <20>;
vfront-porch = <12>;
vsync-len = <3>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <1>;
pixelclk-active = <0>;
};
};
};
};
接着,还需要将设备树源文件imx6ull-myboard.dts添加到arch/arm/dts/Makefile中对应的设备树编译列表上:
...
dtb-$(CONFIG_MX6ULL) += \
imx6ull-14x14-evk.dtb \
imx6ull-14x14-evk-emmc.dtb \
imx6ull-14x14-evk-gpmi-weim.dtb \
imx6ull-9x9-evk.dtb \
imx6ull-colibri-emmc-eval-v3.dtb \
imx6ull-colibri-eval-v3.dtb \
imx6ull-myir-mys-6ulx-eval.dtb \
imx6ull-seeed-npi-imx6ull-dev-board.dtb \
imx6ull-phytec-segin-ff-rdk-emmc.dtb \
imx6ull-dart-6ul.dtb \
imx6ull-somlabs-visionsom.dtb \
imx6ulz-bsh-smm-m2.dtb \
imx6ulz-14x14-evk.dtb \
imx6ulz-14x14-evk-emmc.dtb \
imx6ulz-14x14-evk-gpmi-weim.dtb \ # 不要忘了反斜杠
imx6ull-myboard.dtb # 添加,是dtb不是dts!
...
下一步对配置文件进行修改。首先用make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
将原本官方默认的配置导入到当前配置。然后用make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig
对配置进行修改,首先修改默认设备树(Device Tree Control->)为imx6ull-myboard:
然后修改网卡驱动支持(Device Drivers->Ethernet PHY (physical media interface) support->),去掉Micrel Ethernet PHYs support并勾选Realtek Ethernet PHYs support。
最后用make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf-
编译,得到u-boot-dtb.imx文件,将该文件烧写即可。
3 移植Linux-imx-6.12.y
从NXP官方维护的linux-imx仓库中下载lf-6.12.y
分支的源码并解压。首先还是得配置设备树,但是这里不需要额外的工作了,上面用的imx6ull-myboard.dts仍然可用,只是位置有变化,设备树源文件在arch/arm/boot/dts/nxp/imx文件下,将imx6ull-myboard.dts放进该文件夹并修改文件夹下的Makefile文件即可:
...
dtb-$(CONFIG_SOC_IMX6UL) += \
imx6ul-14x14-evk.dtb \
imx6ul-14x14-evk-csi.dtb \
imx6ul-14x14-evk-emmc.dtb \
imx6ul-14x14-evk-btwifi.dtb \
imx6ul-14x14-evk-ecspi-slave.dtb \
imx6ul-14x14-evk-ecspi.dtb \
imx6ul-14x14-evk-gpmi-weim.dtb \
imx6ul-9x9-evk.dtb \
imx6ul-9x9-evk-ldo.dtb \
imx6ul-9x9-evk-btwifi.dtb \
imx6ul-ccimx6ulsbcexpress.dtb \
imx6ul-ccimx6ulsbcpro.dtb \
imx6ul-geam.dtb \
imx6ul-isiot-emmc.dtb \
imx6ul-isiot-nand.dtb \
imx6ul-kontron-bl.dtb \
imx6ul-kontron-bl-43.dtb \
imx6ul-liteboard.dtb \
imx6ul-tqma6ul1-mba6ulx.dtb \
imx6ul-tqma6ul2-mba6ulx.dtb \
imx6ul-tqma6ul2l-mba6ulx.dtb \
imx6ul-opos6uldev.dtb \
imx6ul-pico-dwarf.dtb \
imx6ul-pico-hobbit.dtb \
imx6ul-pico-pi.dtb \
imx6ul-phytec-segin-ff-rdk-emmc.dtb \
imx6ul-phytec-segin-ff-rdk-nand.dtb \
imx6ul-prti6g.dtb \
imx6ul-tx6ul-0010.dtb \
imx6ul-tx6ul-0011.dtb \
imx6ul-tx6ul-mainboard.dtb \
imx6ull-14x14-evk.dtb \
imx6ull-14x14-evk-emmc.dtb \
imx6ull-14x14-evk-btwifi.dtb \
imx6ull-14x14-evk-gpmi-weim.dtb \
imx6ull-9x9-evk.dtb \
imx6ull-9x9-evk-ldo.dtb \
imx6ull-9x9-evk-btwifi.dtb \
imx6ull-colibri-aster.dtb \
imx6ull-colibri-emmc-aster.dtb \
imx6ull-colibri-emmc-eval-v3.dtb \
imx6ull-colibri-emmc-iris.dtb \
imx6ull-colibri-emmc-iris-v2.dtb \
imx6ull-colibri-eval-v3.dtb \
imx6ull-colibri-iris.dtb \
imx6ull-colibri-iris-v2.dtb \
imx6ull-colibri-wifi-aster.dtb \
imx6ull-colibri-wifi-eval-v3.dtb \
imx6ull-colibri-wifi-iris.dtb \
imx6ull-colibri-wifi-iris-v2.dtb \
imx6ull-dhcom-drc02.dtb \
imx6ull-dhcom-pdk2.dtb \
imx6ull-dhcom-picoitx.dtb \
imx6ull-dhcor-maveo-box.dtb \
imx6ull-jozacp.dtb \
imx6ull-kontron-bl.dtb \
imx6ull-myir-mys-6ulx-eval.dtb \
imx6ull-opos6uldev.dtb \
imx6ull-phytec-segin-ff-rdk-nand.dtb \
imx6ull-phytec-segin-ff-rdk-emmc.dtb \
imx6ull-phytec-segin-lc-rdk-nand.dtb \
imx6ull-phytec-tauri-emmc.dtb \
imx6ull-phytec-tauri-nand.dtb \
imx6ull-seeed-npi-dev-board-emmc.dtb \
imx6ull-seeed-npi-dev-board-nand.dtb \
imx6ull-tarragon-master.dtb \
imx6ull-tarragon-micro.dtb \
imx6ull-tarragon-slave.dtb \
imx6ull-tarragon-slavext.dtb \
imx6ull-tqma6ull2-mba6ulx.dtb \
imx6ull-tqma6ull2l-mba6ulx.dtb \
imx6ull-uti260b.dtb \
imx6ulz-14x14-evk.dtb \
imx6ulz-14x14-evk-btwifi.dtb \
imx6ulz-14x14-evk-emmc.dtb \
imx6ulz-14x14-evk-gpmi-weim.dtb \
imx6ulz-bsh-smm-m2.dtb \
imx6ull-myboard.dtb
...
然后导入默认官方配置,这里就不用更改了,直接编译即可。执行make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- imx_v7_defconfig
和make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf-
,得到Zimage和imx6ull-myboard.dtb。在运行该内核的时候,会看到许多提示报错,这是因为主要用的还是官方的设备树文件,其中有一些并不适配正点原子的开发板,但是这不影响使用,在经过学习后正确的配置设备树文件,这些报错也将会不见,如果实在觉得烦,可以把对应的设备驱动在配置中取消掉。
4 Buildroot构建文件系统
Buildroot可以用来方便的构建文件,并且还可以方便的导入一些常用的库(ffmpeg等)。从官网下载最新稳定版的buildroot-2025.02,然后使用make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig
对其进行配置即可。所需配置的项如下:
- Target options
- Target Architecture --> ARM (little endian)
- Target Architecture Variant --> cortex-A7
- Toolchain
- Toolchain type --> External toolchain
- Toolchain ---> Arm ARM 14.2.rel1
- Toolchain origin --> Pre-installed toolchain
- Toolchain path --> *编译器的路径,bin所在的文件夹*
- System configuration
- System hostname --> *自行设置*
- System banner --> *自行设置*
- /dev management --> Dynamic using devtmpfs + mdev
- Root password --> *自行设置*
- Target packages *可以自行添加各种库*
- Filesystem images
- [*]ext2/3/4 root filesystem
- ext2/3/4 variant --> ext4
- exact size --> *自行设置,小就调大点*
- [*]tar the root filesystem
- Compression method --> bzip2
最后执行make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf-
可以在buildroot的output/images文件夹下得到打包压缩好的rootfs.tar.bz2,即自己做的文件系统。
如果遇到什么问题,欢迎在下面讨论😊。