跳到主要内容

BOOT0 - 启动引导功能配置

BOOT0 使用

本章节主要介绍一级bootloader使用。

目录结构

源码位于brandy/brandy-2.0/spl目录下,结构如下:

├── arch	#芯片arch相关文件
├── board
│   └── sun300iw1p1 #存放各个板级的boot0配置
├── common #存放通用组件,如:GPT和env
├── drivers
├── fes #烧录阶段才执行,用于初始化dram。镜像只打包到固件中
├── include
├── Makefile
├── mk
├── nboot #常规启动阶段执行代码
├── pmboot #休眠唤醒阶段执行代码
├── sboot #安全启动阶段执行代码
├── simpleboot #特殊启动阶段执行的代码,用于初始化dram
├── solution #快启相关功能代码
└── tools

编译烧录使用

编译boot0的快捷命令是:

mboot0

根据spl/board/sun300iw1p1/目录下不同的mk文件,对应不同boot0的编译产物,根据不同阶段划分。

启动阶段编译产物如下,根据方案配置选择一下其中一个烧录到设备端flash

boot0_spinor_sun300iw1p1.bin	#nor介质启动boot0,对应spinor.mk
boot0_nand_sun300iw1p1.bin #nand介质启动boot0,对应nand.mk
boot0_sdcard_sun300iw1p1.bin #emmc介质启动boot0,对应mmc.mk

boot0_spinorfastboot_sun300iw1p1.bin #nor介质快启boot0,对应spinorfastboot.mk
boot0_mmcfastboot_sun300iw1p1.bin #emmc介质快启boot0,对应mmcfastboot.mk

sboot_nor_sun300iw1p1.bin #nor介质安全启动boot0,对应sboot_nor.mk

烧录阶段编译产物如下,所有方案都是使用以下镜像。文件保留在固件中,不会烧录到设备端flash

fes1_sun300iw1p1.bin	#对应fes.mk

休眠唤醒阶段编译产物如下,对应pmboot.mk,如:nor方案则使用pmboot_spinor_sun300iw1p1.bin

pmboot_spinor_sun300iw1p1.bin
pmboot_nand_sun300iw1p1.bin
pmboot_sdcard_sun300iw1p1.bin

配置说明

串口配置

boot0的串口配置位于 device/config/chips/{IC}/configs/{BOARD}/sys_config.fex文件。

串口输出配置

通过修改sys_config.fex文件platform节点下的debug_mode来控制串口输出。

debug_mode为0时,boot0 printf函数打印不输出。需要使用pr_emerg函数才能打印。

debug_mode为1时,boot0打印放开,方便调试开发。

[platform]
debug_mode = 1

更换串口

通过修改sys_config.fex文件uart_para节点来修改烧录和启动阶段的boot0打印。

uart_debug_port代表使用uart控制器编号,如:使用uart2就配置成2。

uart_debug_tx代表tx引脚GPIO配置,uart_debug_rx代表rx引脚GPIO配置。

[uart_para]
uart_debug_port = 0
uart_debug_tx = port:PD22<3><1><default><default>
uart_debug_rx = port:PD23<3><1><default><default>

常用功能

添加新的宏

通常情况下,新增一段自定义代码,添加一个新的宏去管控比较方便调试开发。

新的宏以 CFG_ 开头,在 spl/board/sun300iw1p1 目录下的mk文件中添加。

比如:只想在 spinor 常电启动过程中添加一段代码,使用 CFG_TEST 的宏管控;则在 spinor.mk 文件中添加

CFG_TEST=y

方案使用自定义boot0 bin文件

按照以下几步操作执行即可:

  • 确定新方案是快启还是常电,基于已有mk文件复制一份新的mk文件,并重命名。 如:新方案是快启nor介质,指定新的boot0文件为test,则
cp board/sun300iw1p1/spinorfastboot.mk board/sun300iw1p1/test.mk
  • 在board/sun300iw1p1/common.mk文件BOARD_BUILD_NBOOT添加新的mk名称,如添加一个test.mk
BOARD_BUILD_NBOOT=spinorfastboot mmcfastboot test
  • 执行 mboot0 编译,即可看到cout快捷命令对应目录有 boot0_test_sun300iw1p1.bin

  • 修改device/config/chips/{IC}/configs/{BOARD}/BoardConfig_nor.mk,添加 LICHEE_BOOT0_BIN_NAME 指定方案使用的 boot0

LICHEE_BOOT0_BIN_NAME:=test
  1. 重新source,lunch打包烧录验证。

U-Boot 使用

目录结构

源码位于brandy/brandy-2.0/u-boot-2018目录,挑选常用的目录说明,结构如下:

├── arch	#芯片arch相关文件
├── board
│   └──sunxi #板级公共功能实现
├── cmd #通用命令
├── common #社区通用功能
├── configs #defconfig配置
├── drivers #驱动目录
├── env #启动变量
├── include #通用头文件
├── lib #通用函数实现
├── sprite #量产烧写相关功能

编译烧录使用

编译uboot的快捷命令是:

muboot

编译产物有3个,如下:

u-boot-efex.bin	#烧录阶段使用,只存在于固件中。对应sun300iw1p1_efex_defconfig

u-boot-spinor-sun300iw1p1.bin #nor介质常电启动使用,快启不使用

u-boot-sun300iw1p1.bin #nand和emmc介质常电启动使用

配置说明

方案通过 device/config/chips/{IC}/configs/{BOARD}/BoardConfig_nor.mkBoardConfig.mk 文件的 LICHEE_BRANDY_DEFCONF 变量指定 uboot 的使用的 defconfig 文件。如:

LICHEE_BRANDY_DEFCONF:=sun300iw1p1_v821_defconfig

则此文件对应编译产物u-boot-sun300iw1p1.bin;编译时nor方案会自动指定配置为sun300iw1p1_v821_nor_defconfig,对应编译产物为u-boot-spinor-sun300iw1p1.bin

常用功能

添加新的宏配置

操作步骤如下:

  1. 修改 Kconfig。不同目录下都有 Kconfig 文件,找一个合适的添加。如:添加 mytest 配置
config mytest
bool "this is mytest" #配置描述
default n #默认不使能
help
xxx #详细描述
  1. 在对应的 defconfig 文件使能新建的配置
CONFIG_MYTEST=y
  1. c 代码中使用CONFIG_MYTEST宏去管控代码

命令行调试

按住键盘的 s 字母,然后上电,uboot串口检测到则会进入命令行。

执行help,则可以看到支持的命令。列举几个命令使用方法:

cmp 内存比较命令,比较两段内存,以一个 word 进行比较 count=X,表示比较 X 个 word 字节的内存数据。

cmp addr1 addr2 count

fdt修改设备树命令;用法较多,参考:

fdt set    <path> <prop> [<val>]    - Set <property> [to <val>]
fdt mknode <path> <node> - Create a new node after <path>
fdt rm <path> [<prop>] - Delete the node or <property>

env相关命令

printenv	#打印所有env变量
setenv name value #设置变量名name的值为value
saveenv #保存env变量到flash