[Happy Hacking Nezha Board] 小孩子才做选择,我全都要 BOOT



  • 乘胜追击

    前面完成引导 rt-smart 后, 开始继续其他功能的研究.

    常规我们使用 raspberry pi 以及其他 Linux 系统的时候, 一般我们的 kernel 等信息都是放在 /boot 目录下的,大多数会格式化成独立的一个分区.

    那么我们就照着这个方向去改造哪吒板子, 目前已经初见成效了, 我做了一个 demo 的 image , 供大家测试, 后续 RVBoards 会发布正式的 Debian 版本.

    说明

    镜像前面几个 1-3 分区是全志的预留的几个分区,占用空间很间,这里不去动他.

    第 4 分区是 vfat 格式的 boot 分区, kernel 和 dtbo 等文件存放在这里面

    demo 镜像 boot 分区文件说明

    • overlay : 存放 dtb overlay 文件
    • boot_debian.img debian 内核
    • boot_tina.img tina 内核
    • config.txt 引导配置文件
    • rt-smart rt-smart 执行程序

    config.txt 配置说明

    配置示例

    # mode 
    # 0 boot bare metal bin
    # 1 boot linux kernel
    mode=1
    bin=rt-smart
    kernel=boot_debian.img
    
    # dtb overlay
    # load overlay/${dtoverlay}.dtbo
    dtoverlay=test-overlay
    
    # uboot vars
    # for debian
    mmc_root=/dev/mmcblk0p6
    # for tina
    #mmc_root=/dev/mmcblk0p5
    

    详细说明

    • mode:

      配置引导模式 0 为引导二进制程序 1 为引导linux 内核 (目前这个版本的 内核文件需要使用 mkbootimage 打包生成,就是 tina sdk 中 pack 命令生成的 boot.img 文化)

    • bin

      mode=0 的时候引导的文件

    • kernel

      mode=1 的时候引导的文件

    • dtoverlay

      dtb overlay 配置, 将会加载 overlay/${dtoverlay}.dtbo 这个文件,后续将会支持多个文件加载

    • mmc_root

      这个是作为 bootargs 中 root 参数传递给内核的,告诉内核 root 在什么分区,默认是 /dev/mmcblk0p5 , demo 镜像中有多个内核,多个 rootfs ,所以需要配置一下.

    • 注意

      • 配置项"="两边不能有空格
      • config.txt 是作为 uboot 的环境变量加载的,可以配置其他变量覆盖 uboot 内部的变量

    原理

    主要就是利用 uboot 的 fatload 这个指令,从 mmc 中 vfat 文件系统中加载指定文件到内存中使用.

    用到相关的指令 fatload, env import ,fdt

    核心配置

    # demo 镜像中的 
    bootcmd=run boot_check setargs_mmc boot_mmc
    # 其中 setargs_mmc 是全志默认的,设置 mmc 加载的 bootrags 的指令
    
    # boot_check 检测 mmc 是否启用,然后加载 config.txt 文件,再加载 dtbo 文件
    boot_check=run card_init;mmcinfo;mmc part;fatload mmc ${mmc_dev}:${mmc_boot_part} 47000000 config.txt;env import -t 47000000 ${filesize}; test -n "$dtoverlay" && fatload mmc ${mmc_dev}:${mmc_boot_part} 48000000 overlay/${dtoverlay}.dtbo; fdt apply 48000000
    
    # boot_mmc 就是根据 mode 引导不同系统了
    boot_mmc=if test ${mode} -eq 0; then fatload mmc ${mmc_dev}:${mmc_boot_part} 45000000 ${bin}; go 45000000; else fatload mmc ${mmc_dev}:${mmc_boot_part} 45000000 ${kernel}; bootm 45000000; fi
    
    

    原理和实现其实很简单, 后续还可以继续改进,支持多个 dtbo 加载, tftp 加载(方便快速调试) 等等.

    后记

    完成多系统引导就这么简单了, 后续文章我会再写一个 dtb overlay 的 demo.
    注意事项: demo 镜像中, debain 的 rootfs 大小太小,更大空间,需要自行处理一下.


Log in to reply