Linux系统移植(学习过程)

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而不是sdb1sdb1是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

重新启动开发板,移植成功。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值