修改uboot以实现自动更新linux

文章描述了如何在ARM芯片的主机上进行远程固件更新,主要涉及UBOOT的修改,包括检查MMC中的新FW版本并更新。UBOOT使用裁剪过的FAT文件系统,需要特殊逻辑判断和处理。更新过程仅针对kernel和rootfs,无需更新UBOOT,因为它更新的概率低于硬件变更。

arm芯片的主机,客户强烈要求实现远程更新。两步:在合适的时候由主app从远程服务器读取需要更新的固件文件保存起来,然后根据命令或者立刻reboot系统,进入uboot,uboot判断是否有新fw,执行update。

难搞的是uboot的修改,还好网络上有些参考。fw保存在mmc(sd)上,uboot本身实现了sd卡的fat文件系统,但最郁闷的是和常规的fat系统不一样,其文件操作裁剪过多,只有它自己需要的部分。uboot修改的部分是这样的逻辑:判断mmc中的fw版本是否比当前高,是则update,并更新当前fw版本号保存起来,保证每次新fw只更新一次。

涉及两个点:1 怎么读取mmc中更新的fw版本号?2 怎么保存更新后的版本号?费了点力,终于可以了。需要注意的是,uboot在自动update时不需要更新,在我看来,更新uboot的可能性远小于更新主板硬件的可能性,所以远程更新只需要kernel和rootfs即可。

记下这些,免得忘了。

<think>我们之前讨论的是如何从Linux退出进入U-Boot,现在用户的问题是:在修改U-Boot后如何重新进入Linux系统。根据引用内容,修改U-Boot后需要重新烧写U-Boot,然后重启,系统会自动进入Linux(如果U-Boot的引导参数正确设置)。 用户场景:在开发板上修改了U-Boot(比如移植了新的版本,或者修改了LCD、网络驱动等),现在需要让系统重新启动进入Linux。 步骤: 1. 编译修改后的U-Boot,生成u-boot.bin(或u-boot.imx)文件。 2. 将新生成的U-Boot烧写到开发板的启动设备(如SD卡或eMMC)的U-Boot所在位置。 3. 重启开发板,U-Boot会自动引导Linux(前提是bootcmd环境变量设置正确)。 详细步骤: 一、编译U-Boot 根据引用[1][^1]和引用[3][^3],在U-Boot源码目录下执行编译命令: ```bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig # 使用正点原子提供的默认配置(根据实际修改的配置) make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 ``` 编译完成后,在源码目录下会生成u-boot.bin(或u-boot.imx)文件。 二、烧写U-Boot 烧写方式取决于开发板的启动设备。常见的有SD卡和eMMC。 1. SD卡烧写(假设SD卡在PC上识别为/dev/sdb): ```bash sudo dd if=u-boot.bin of=/dev/sdb bs=512 seek=2 conv=fsync ``` 注意:这里的seek=2是跳过SD卡的前1KB(2个扇区,每扇区512字节),因为i.MX6ULL的ROM从SD卡启动时,会从第1KB位置加载U-Boot[^3]。 2. eMMC烧写(通过已有Linux系统): 将生成的u-boot.bin复制到开发板的文件系统中,然后通过dd命令烧写到eMMC的boot分区(通常为/dev/mmcblk1boot0): ```bash # 在开发板的Linux终端执行 echo 0 > /sys/block/mmcblk1boot0/force_ro # 解除写保护 dd if=u-boot.bin of=/dev/mmcblk1boot0 bs=512 seek=2 conv=fsync ``` 三、重启进入Linux 烧写完成后,重启开发板: ```bash reboot ``` 系统将从新的U-Boot启动,并自动加载Linux内核(前提是U-Boot的bootcmd环境变量设置正确,通常默认配置已经设置好从eMMC或SD卡加载内核和文件系统)。 四、验证 在启动过程中,通过串口观察启动日志,确认U-Boot版本和修改是否生效,以及Linux是否正常启动。 注意事项: - 如果修改了U-Boot的环境变量(如bootcmd),需要确保其指向正确的内核和设备树位置。 - 如果烧写后无法启动,请检查串口输出,根据错误信息排查。 根据引用[1][^1]和引用[3][^3],在移植U-Boot时可能会修改板级文件(如mx6ull_jarvis_emmc.c)和配置文件(如mx6ull_jarvis_emmc.h),这些修改会影响启动过程,因此烧写后需要验证。 相关问题: 1. 如何修改U-Boot的默认引导内核参数? 2. 在i.MX6ULL开发板上如何从网络启动Linux? 3. 如何调试U-Boot启动过程中的问题?</think>在 i.MX6ULL 开发板上修改 U-Boot 后重新进入 Linux 系统,需要确保 U-Boot 正确引导 Linux 内核。以下是具体步骤: --- ### 一、确认 U-Boot 引导配置 1. **检查环境变量** 在 U-Boot 命令行中执行: ```bash printenv ``` 关键参数: - **`bootcmd`**:定义自动引导命令(如 `run bootcmd_mmc`) - **`bootargs`**:内核启动参数(如根文件系统位置) - **`mmcdev`**:指定启动设备(如 eMMC 或 SD 卡) 2. **验证默认配置** 参考正点原子开发板的默认配置(位于 `include/configs/mx6ull_jarvis_emmc.h`)[^1]: ```c #define CONFIG_BOOTCOMMAND "run bootcmd_mmc" // 默认从 eMMC 启动 #define CONFIG_BOOTARGS "console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw" ``` --- ### 二、修改后重新启动 Linux 1. **正常启动流程** 如果 U-Boot 配置正确,**直接重启**即可自动进入 Linux: ```bash reset // 在 U-Boot 命令行执行 ``` 或物理复位开发板。 2. **手动引导内核** 若自动引导失败,手动执行: ```bash # 设置启动参数 setenv mmcdev 1 // 1 表示 eMMC,0 表示 SD 卡 setenv bootargs console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw # 加载内核和设备树 fatload mmc ${mmcdev}:1 80800000 zImage // 加载内核 fatload mmc ${mmcdev}:1 83000000 imx6ull.dtb // 加载设备树 # 启动内核 bootz 80800000 - 83000000 ``` --- ### 三、常见问题排查 1. **启动卡在 U-Boot** - 检查 `bootcmd` 是否被修改: ```bash setenv bootcmd "run bootcmd_mmc" // 恢复默认引导 saveenv ``` - 确认存储设备分区: Linux 根文件系统需在 **第二个分区**(如 `/dev/mmcblk1p2`) 2. **内核加载失败** - 验证文件路径: 确保 `zImage` 和 `.dtb` 文件在存储设备的 **FAT 分区**(第一个分区) - 检查文件名: 设备树文件名需与硬件匹配(如 `imx6ull-14x14-evk.dtb`) 3. **屏幕/网络驱动问题** 若修改了 LCD 或网络驱动(参考 `mx6ull_jarvis_emmc.c`[^1]): - 确认设备树已更新: 重新编译并替换 `.dtb` 文件 - 检查引脚配置: 比对 `board/freescale/mx6ull_jarvis_emmc/` 中的初始化代码[^1] --- ### 四、关键配置示例 **U-Boot 环境变量参考**(eMMC 启动): ```bash # 存储设备设置 mmcdev=1 # 1=eMMC, 0=SD卡 bootpart=1:1 # 第一个分区(FAT) # 自动引导命令 bootcmd_mmc=run mmcboot; # 默认引导入口 mmcboot=mmc dev ${mmcdev}; fatload mmc ${mmcdev}:${bootpart} 80800000 zImage; fatload mmc ${mmcdev}:${bootpart} 83000000 imx6ull.dtb; bootz 80800000 - 83000000; ``` > **提示**:修改后务必执行 `saveenv` 保存配置。若环境变量损坏,可通过 SD 卡重新烧写 U-Boot[^3]。 --- ### 五、操作流程图 ```mermaid graph TD A[修改U-Boot源码] --> B[编译生成u-boot.bin] B --> C[烧写到启动设备] C --> D{重启开发板} D -->|正常| E[自动进入Linux] D -->|异常| F[U-Boot命令行手动引导] F --> G[检查bootcmd/bootargs] G --> H[加载内核zImage] H --> I[加载设备树.dtb] I --> J[执行bootz启动] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值