如何在线刷写boot.img

  • peterwillcn wrote: 2024-05-23 4:01

    Code: Select all

    mtdinfo -a
    cat /proc/mtd
    dev:    size   erasesize  name
    mtd0: 00040000 00020000 "env"
    mtd1: 00040000 00020000 "idblock"
    mtd2: 00080000 00020000 "uboot"
    mtd3: 00400000 00020000 "boot"
    mtd4: 0fa00000 00020000 "rootfs"
    
    scp IMAGE/SPI_NAND_RV1106G-LUCKFOX-PICO-PRO-MAX.DTS_20240523.0838_RELEASE_TEST/IMAGES/boot.img root@192.168.1.200:/mnt
    flashcp -v /mnt/boot.img /dev/mtd3
    这样刷写后无法启动,请问如何可以在线刷写编译的新boot呢?

    您好,目前还没有测试过在线刷写新boot的功能,如果您需要进行OTA升级,可以参考文档
    Downloaded 142 times
    中的方式,通过新建一个Recovery分区来存放升级镜像,让板端进入recovery模式进行升级。

    直接使用指令去给boot.img进行读写操作是比较危险,硬件层面可能在操作过程中由于没有设置正确的块大小导致存储介质出现坏块,如果损坏到关键位置还会导致后续无法正常进入系统,软件层面存在烧写过程中出现错误导致最终的镜像与镜像头包含的哈希值不匹配而在bootloder阶段验证不过而无法进入系统的情况。

    所以如果在内核上作了修改或者添加功能还是使用Rockchip提供的方式进行更新,如果仅打算更新设备树的话这里有一个验证过的方法,您可以进行参考,后续我们会尝试简化该操作。
    boot.img 的构成是 header + dtb + kernel,其中的dtb 头包含了 dtb 和 kernel 的偏移量、大小和哈希值信息,如果要替换dtb就需要修改dtbheader和 dtb。
    这里的测试环境是 spi-nand 系统的 Luckfox Pico Plus
    需要dtc和fdt工具(在buildroot menuconfig中开启)
    0 uboot的 config 需要关闭 CONFIG_FIT_IMAGE_POST_PROCESS 选项(必须,不让会让修改无效)
    1 使用dd命令获取header

    Code: Select all

    dd if=/dev/mtdblock3  of=header.dtb bs=1 skip=0 count=2048
    
    2 修改header.dtb 的信息,用dtc将header.dtb 转成 header.dts 并进行修改

    Code: Select all

    dtc -I dtb -O dts header.dtb -o header.dts
    
    Pasted image 20240517142354.png
    主要修改data-size 和 hash的value 部分,根据准备写入的dtb文件进行修改(ls -l 获取字节数的十进制后转成十六进制 sha256sum 获取哈希值)
    3 将header.dts重新转换为header.dtb写回/dev/mtdblock3中

    Code: Select all

    dtc -I dts -O dtb header.dts -o header.dtb
    dd if=header.dtb of=/dev/mtdblock3  bs=1 seek=0 count=2048
    
    4 将准备写入的 dtb文件写入到指定位置

    Code: Select all

    dd if=xxxx.dtb of=/dev/mtdblock3  bs=1 seek=2048 count=xxxx
    
    然后重启即可,请注意各步骤的准确性,不然在uboot阶段会提示 bad hash,可以通过重新烧写boot.img解决。
    注意的是这种方式不适合用来读写较大的数据量也是比较危险的操作,请谨慎进行测试。

    这种方式目前还有很多的优化空间,也欢迎您提出意见,这对我很有帮助。