SD卡自动烧录固件

背景

在生产的过程中SD卡自动烧录很方便,那要怎么做呢?
主要有分以下2种情况:

  • 芯片可以从SD卡启动
  • 芯片不能从SD卡启动

芯片可以从SD卡启动

类似M5502S.
这种情况有2种方式:

  • 使用Uboot的Auto-burn烧录
  • 使用Linux系统烧录

    使用Uboot的Auto-burn烧录

    Auto-burn就是在uboot的cmdline运行烧录脚本来烧录固件。
  1. 准备SD卡
    每个平台可能有所不一样,以M5S为例,分区并格式化SD卡,并将其volume name改成特定的“BOOTEXT”
    将SD卡的loader拷贝进SD卡
  2. 准备uboot
    准备可支持自动运行烧录脚本的uboot
    auto-burn功能模式在uboot的配置中默认是关闭的,需要将其打开。
    修改默认的环境变量bootargsbootcmd,让其默认就执行SD里面的自动烧录脚本镜像
    类似于:

    1
    #define CONFIG_BOOTCMD_UPGRADE    "fatload mmc 0:1 0xa00000 ${auto_script}; source 0xa00000"

    将编译好的uboot拷贝进SD卡

  3. 准备自动烧录脚本
    烧录的固件可从TFTP server或者SD卡里获取,这里以SD卡来烧录boot loader和dtb为例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    echo ==============================
    echo
    led all off
    echo
    echo ========= Bootloader =========
    echo ==>reading Bootloader...
    fatload mmc 0:1 0xa00000 xxxxx.bin
    echo ==>erasing org-Bootloader+Env...
    sf probe
    sf erase 0x0 0x60000
    echo ==>writing new-Bootloader...
    sf write 0xa00000 0x0 0x50000
    echo ==>reading dtb...
    fatload mmc 0:1 0xa00000 m5s-sf.dtb
    echo ==>erasing org-dtb...
    sf erase 0x60000 0x10000
    echo ==>writing new-dtb...
    sf write 0xa00000 0x60000 0x10000
    echo ==============================
    echo
    led all on
    echo
    echo === Please Unplug TF card! ===
    echo ==============================
    check_sd
  4. 生成自动烧录脚本镜像
    使用mkimage工具(/uboot源码/tools/)可将一个脚本文本文件转化成可以在uboot的cmdline种自动运行的二进制脚本镜像。
    命令类似于:

    1
    ./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Autorun" -d autorun-${FlashType}.sh autorun-${FlashType}.img

    其中autorun-${FlashType}.sh即为上面准备的自动烧录脚本。
    将生成的autorun-${FlashType}.img拷贝进SD卡
    注意:autorun-${FlashType}.img的名字要和第2点中的${auto_script}对应

  5. 准备要烧录的固件
    将要烧录的固件拷贝进SD卡
  6. 启动
    将启动模式配置成SD卡启动,有些硬件平台可自动识别,或需修改启动顺序。
    插卡,上电启动

使用Linux系统烧录

这里不做过多的讨论,大致原理就是从SD卡启动一个精简的Linux系统,然后在该Linux系统中完成烧录

芯片不能从SD卡启动

类似Hi3516DV100,Uboot只能通过串口烧录进去。
流程:

  1. 串口烧录Uboot
  2. 然后通过Uboot去烧录
    Uboot上电启动时首先去判断有无插上TF卡,有插上TF卡,就去读取里面的是否有升级的固件(内核和文件系统),这里可以做些校验和判断。一切都可以之后,就可以按照分区配置开始擦除和烧写。
  3. 拔卡重启
    烧写完成之后,拔卡重启,可做成自动的
Donate comment here