uboot移植
使用正点原子的 imx6ull开发板进行uboot移植。
将npx官方的uboot移植到整点原子的imx6ull上,
将原版uboot发送到ubuntu下,使用命令:
tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
进行解压,解压完成后创建VSCode工程。创建自己的uboot。创建shell脚本文件,对uboot进行配置,然后编译:
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_sqh_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- V=1 -j16
完成编译:
将imxdownload软件拷贝到uboot源码根目录下,使用imxdownload软件将u-boot.bin烧写到SD卡中:
df -h //查找插入SD卡的设备
chmod 777 imxdownload
./imxdownload u-boot.bin /dev/sdb
一定要下载到sdb
而不是sdb1
,sdb1
是sd卡的第一个分区。
将开发板拨码开关拨到 10000010(设置为SD启动),打开SecureCRT,设置好开发板所使用的串口并且打开,复位开发板,接收到:
LCD由于就是4.3寸大小的,和uboot中的驱动匹配,所以不用修改。
但是提一下,LCD驱动主要是在board/freescale/mx6ull_sqh_emmc/mx6ull_sqh_emmc.c
文件和include/configs/mx6ull_sqh_emmc.h
中修改。
此时网络驱动有问题:
原因是正点原子开发板的网络芯片复位引脚和NXP官方开发板不一样,所以需要修改驱动。
IMX6ULL开发板上的ENET1连接的SR8210F器件地址为0x0,修改ENET1网络驱动的话,需要:
1.ENET1复位引脚初始化
2.SR8210F的器件ID
3.SR8210F驱动
修改ENET2网络驱动:
1.复位引脚接到了SNVS_TAMPER8上
2.PHY器件地址为0x1
3.SR8210F驱动
网络PHY地址修改:
删除uboot中74LV595的驱动代码:
uboot中网络PHY芯片地址修改完成以后,就是网络复位引脚的驱动修改了。
mx6ull_sqh_emmc.c
:
以IOX开头的宏定义是74LV595相关的GPIO,因为NXP官方使用74LV595来扩展IO,而我们没有使用74LV595,所以删除这段。用这段替换:
ENET1的复位引脚连接到SNVS_TAMPER7上,对应GPIO5_IO07,ENET2的复位引脚连接到SNVS_TAMPER8上,对应GPIO5_IO08。
这段也是74LV595相关的,删除:
找到iox74lv_init()
和iox74lv_set()
两个函数删除。
找到board_init()
函数,board_init函数会被board_init_r调用:
删除729、731两行。
接下来添加复位引脚驱动:
在这两个数组结构中分别添加复位IO配置参数:
//fec1
MX6_PAD_SNVS_TAMPER7_GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
//fec2
MX6_PAD_SNVS_TAMPER8_GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
找到setup_iomux_fec
函数
该函数是根据fec1_pads和fec2_pads两个数组来初始化网络用到的IO,添加初始化复位IO的代码,并且复位一下PHY芯片:(两个io设置为输出并且硬件复位一下SR8210F,否则可能导致uboot无法识别SR8210F)
到这里网络驱动已经修改完成,重新编译uboot,然后将u-boot.bin烧写到SD卡中并启动。我电脑配置网络环境是参照网络环境搭建的。我还在macbook上搭建了网络环境:嘻嘻
完成以后
这里使用nfs将zImage下载到开发板的SDRAM中。
一开始出现了这样的问题:
原因是uboot中使用的nfs版本为V2,而ubuntu中的NFS版本为V3 V4,解决办法
解决以后是这样的:
为了方便,将环境变量设置为以上命令:
此时在命令行输入boot,会自动执行bootcmd:
Linux内核移植
linux内核一直过程没有出现什么问题,就不写了。
开启了tftp后,直接使用tftp进行linux的启动,对环境变量bootcmd
进行更改
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 xxx.dtb(设备树文件名); bootz 80800000 - 83000000;'
saveenv
根文件系统:
使用busybox按照正点原子的配置,配置完根文件系统,进行编译以后,将uboot的环境变量设置为:
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.111:/home/xxx/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.37:192.168.1.111:192.168.1.1:255.255.255.0::eth0:off'
saveenv
刚开始启动时,一直加载根文件系统失败:
在网上了解到,可能跟nfs协议不匹配有关系,我使用的是ubuntu22.04,因此将bootargs
更加:
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.111:/home/xxx/linux/nfs/rootfs,v3,proto=tcp ip=192.168.1.37:192.168.1.111:192.168.1.1:255.255.255.0::eth0:off'
saveenv
重新启动开发板,移植成功。