一、NXP官方linux内核
1. 下载
如果想直接使用的话可以去我的资源里面下载,想动手亲自移植的可以跟着步骤来
NXP官方linux仓库地址为: https://github.com/Freescale/linux-fslc/tree/5.4-2.1.x-imx。
选择该分支下载zip包即可,不要整个仓库下载,太大了:
2. 编译
sudo apt-get install lzop
sudo apt-get install libncurses5-dev
设置临时环境变量(编译器版本为7.5.0):
编译器使用的是,可以去官网下载
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
清理构建:
make distclean
查看arch/arm/configs目录下imx6ull相关的单板:
配置:
make imx_v7_defconfig
配置好之后编译:
make -j32
编译成功后,进入arch/arm/boot目录可以看到编译出的linux镜像,在dts目录下是编译出的设备树文件,找找evk的设备树:
3. 下载到开发板
将内核镜像和设备树文件拷贝到tftp根目录中:
cp zImage /home/book/linux/tftpboot
cp dts/imx6ull-14x14-evk-emmc.dtb /home/book/linux/tftpboot
接下来在开发板上进入uboot,确保bootargs环境变量的值如下:
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv
加载这两个文件:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk-emmc.dtb
启动内核:
bootz 80800000 - 83000000
4. 启动结果分析
因为EMMC中有出厂烧写的文件系统,所以Linux内核成功挂载了根文件系统,启动成功,但是也有一些问题:
LCD屏幕无显示;
网卡eth0报错,但是可以获取到ip,可以ping通主机;
接下来,我们就基于NXP官方提供的linux,针对正点原子imx6ull开发板进行一些配置参数的修改,修复LCD和网络问题。
二、移植linux内核
1. 新建单板
(1)新建单板配置文件
进入 arch/arm/configs 目录,复制一份新的单板文件:
cp arch/arm/configs/imx_v7_defconfig arch/arm/configs/imx_v7_atk_defconfig
(2)新建设备树文件
进入 arch/arm/boot/dts 目录,复制一份新的设备树文件:
cp arch/arm/boot/dts/imx6ull-14x14-evk-emmc.dts arch/arm/boot/dts/imx6ull-14x14-atk-emmc.dts
查看该文件,依赖于evk板子的设备树,需要将该文件也复制一份出来:注意修改依赖的名称为你所修改的imx6ull-14x14-atk.dts
cp arch/arm/boot/dts/imx6ull-14x14-evk.dts arch/arm/boot/dts/imx6ull-14x14-atk.dts
接下来再看下一级依赖:我这里都是修改过的
cp arch/arm/boot/dts/imx6ul-14x14-evk.dtsi arch/arm/boot/dts/imx6ul-14x14-atk.dtsi
接着修改同级目录下的Makefile,添加新建的文件:
(3)编译测试
make distclean
make imx_v7_atk_defconfig
make
使用新的内核和设备树启动,方便起见,设个环境变量,下次直接用命令启动:
setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull-14x14-atk-emmc.dtb;bootz 80800000 - 83000000'
saveenv
2. 修改网络驱动
(1)修改SR8201F的复位引脚驱动
修改设备树文件arch/arm/boot/dts/imx6ul-14x14-atk.dtsi,搜索 GPIO5_IO07、GPIO5_IO08,发现已被spi4使用,删除这两行后,代码如下:
pinctrl_spi4: spi4grp {
fsl,pins = <
MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10 0x70a1
MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1
>;
};
接着再找到spi4,删除与这两个GPIO相关的代码,删除后如下:
spi4 {
compatible = "spi-gpio";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi4>;
status = "okay";
gpio-sck = <&gpio5 11 0>;
gpio-mosi = <&gpio5 10 0>;
num-chipselects = <1>;
#address-cells = <1>;
#size-cells = <0>;
gpio_spi: gpio_spi@0 {
compatible = "fairchild,74hc595";
gpio-controller;
#gpio-cells = <2>;
reg = <0>;
registers-number = <1>;
registers-default = /bits/ 8 <0x57>;
spi-max-frequency = <100000>;
};
};
接着将复位引脚加入到 pinctrl_enet1 节点的描述中:
MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10b0
接着将复位引脚加入到 pinctrl_enet2 的代码中:
MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10b0
接着搜索fec1和fec2节点,添加网络驱动复位引脚使用,添加的代码如下:
phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
(2)修改SR8201F的PHY地址
修改mdio节点中的地址: 默认是2
至此,设备树修改完成。
根据 SR8201F 收据手册上的要求,SR8201F 在复位结束以



3. 修改LCD驱动
本文用的是正点原子 7’ RGB屏幕,分辨率1024*600,设备树中找到lcdif节点的补充描述,改一下屏幕参数和时序即可:
&lcdif {
assigned-clocks = <&clks IMX6UL_CLK_LCDIF_PRE_SEL>;
assigned-clock-parents = <&clks IMX6UL_CLK_PLL5_VIDEO_DIV>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lcdif_dat
&pinctrl_lcdif_ctrl>;
display = <&display0>;
status = "okay";display0: display@0 {
bits-per-pixel = <16>;
bus-width = <24>;display-timings {
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>;
};
};
};
};
重新编译设备树,启动,可以看到LCD左上角显示企鹅logo:
如果开发板无法通过nfs挂载ubuntu24.04,可以参考: