赞
踩
ENV(Environment-Variables)是U-Boot支持的一种全局数据管理和传递方式,原理是构建一张HASH映射表,把用户的数据以"键值-数据"作为表项进行管理。
EVN通常用于定义平台配置参数:固件加载地址、网络配置(ipaddr、serverip)、boootcmd、bootargs等,用户可以在命令行下使用printenv命令打印出来。
RK 平台上ENV数据的存储地址和大小定义如下(单位:字节):
if ARCH_ROCKCHIP
config ENV_OFFSET
hex
depends on !ENV_IS_IN_UBI
depends on !ENV_IS_NOWHERE
default 0x3f8000
help
Offset from the start of the device (or partition)
config ENV_SIZE
hex
default 0x8000
help
Size of the environment storage area
endif
U-Boot有自己的DTS文件,编译时会自动生成相应的DTB文件,被添加到u-boot.bin末尾。文件目录
arch/arm/dts
各平台具体使用哪个DTS文件,通过defconfig中的 CONFIG_DEFAULT_DEVICE_TREE指定。
通常在开机阶段,U-Boot由前一级的bootloader加载到DRAM的低地址。U-Boot完成board_f.c的流程后会把自己重定向到内存末尾某个预留的地址上(称为relocation,这个地址根据U-Boot内存布局而定),完成relocation再继续完成board_r.c流程,可以通过开机信息识别:
U-Boot 2017.09-gabfd1c5e3d-210202-dirty #cjh (Mar 08 2021 - 16:57:31 +0800)
Model: Rockchip RK3568 Evaluation Board
PreSerial: 2, raw, 0xfe660000
DRAM: 2 GiB
Sysmem: init
// relocate到ddr⾸地址偏移0x7d304000的地址。如果为0,则没有做relocation。
Relocation Offset: 7d304000, fdt: 7b9f8ed8
Using default environment
......
本章主要向用户介绍RK平台上一些重要的基础情况,feature等。
全文所有章节中只要提到开启关闭CONFIG_配置项,均是指通过make menuconfig的方式开启/关闭。
除非是一些特殊的,直接诶定义在.h文件中的CONFIG_配置项
请勿直接再defconfig中开启/关闭CONFIG_配置项,避免因为Kconfig中定义的配置依赖关系而导致.config不生效
更新defconfig时请使用make savedefconfig的方式
平台目录:
./arch/arm/include/asm/arch-rockchip/
./arch/arm/mach-rockchip/
./board/rockchip/
./include/configs/
defconfig目录:
./configs/
核心板公共级文件!
./arch/arm/mach-rockchip/board.c
配置文件
各个平台的配置选项、参数通常位于如下几个位置:
// 各平台公共文件(开发者通常不需要修改)
./arch/arm/mach-rockchip/Kconfig
./include/configs/rockchip-common.h
// 各平台独有,以RK3399为例
./include/configs/rk3588_common.h
./include/configs/evb_rk3588.h
./configs/rk3399_defconfig
配置说明:
如下针对rockchip-common.h、rkxxx_common.h、evb_rkxxxx.h定义的重要配置给出说明。
如下以 RK3588 为例进⾏说明:
#define RKIMG_DET_BOOTDEV \ // 动态探测当前的存储类型
"rkimg_bootdev=" \
"if mmc dev 1 && rkimgtest mmc 1; then " \
"setenv devtype mmc; setenv devnum 1; echo Boot from SDcard;" \
"elif mmc dev 0; then " \
"setenv devtype mmc; setenv devnum 0;" \
"elif mtd_blk dev 0; then " \
"setenv devtype mtd; setenv devnum 0;" \
"elif mtd_blk dev 1; then " \
"setenv devtype mtd; setenv devnum 1;" \
"elif mtd_blk dev 2; then " \
"setenv devtype mtd; setenv devnum 2;" \
"elif rknand dev 0; then " \
"setenv devtype rknand; setenv devnum 0;" \
"elif rksfc dev 0; then " \
"setenv devtype spinand; setenv devnum 0;" \
"elif rksfc dev 1; then " \
"setenv devtype spinor; setenv devnum 1;" \
"else;" \
"setenv devtype ramdisk; setenv devnum 0;" \
"fi; \0"
#if defined(CONFIG_AVB_VBMETA_PUBLIC_KEY_VALIDATE)
#define RKIMG_BOOTCOMMAND \
"boot_android ${devtype} ${devnum};" // 启动android格式固件
#elif defined(CONFIG_FIT_SIGNATURE)
#define RKIMG_BOOTCOMMAND \
"boot_fit;"
#else
#define RKIMG_BOOTCOMMAND \
"boot_android ${devtype} ${devnum};" \
"boot_fit;" \
"bootrkp;" \ // 启动RK格式固件
"run distro_bootcmd;" // 启动linux固件
#endif
./include/configs/rk3588_common.h:
/*
* decompressed kernel: 4M ~ 84M
* Why not start from 2M ? if kernel < 5.10 in Android image,
* the image header will use the 0x180000~0x200000, which is
* overlap with share memory region 0x100000~0x200000.
*
* compressed kernel: 84M ~ 130M
*/
#define ENV_MEM_LAYOUT_SETTINGS \ // 固件的加载地址
"scriptaddr=0x00500000\0" \
"pxefile_addr_r=0x00600000\0" \
"fdt_addr_r=0x08300000\0" \
"kernel_addr_r=0x00400000\0" \
"kernel_addr_c=0x05480000\0" \
"ramdisk_addr_r=0x0a200000\0"
#include <config_distro_bootcmd.h>
#define CONFIG_EXTRA_ENV_SETTINGS \
BOOTENV_SHARED_MTD \
ENV_MEM_LAYOUT_SETTINGS \
"partitions=" PARTS_RKIMG \ // 默认的GPT分区表
ROCKCHIP_DEVICE_SETTINGS \
RKIMG_DET_BOOTDEV \
BOOTENV // 启动linux时的启动设备探测命令
#endif
#define CONFIG_PREBOOT // 在CONFIG_BOOTCOMMAND之前被执⾏的预启动命
./include/configs/evb_rk3588.h:
#define ROCKCHIP_DEVICE_SETTINGS \ // 使能显⽰模块
"stdout=serial,vidconsole\0" \
"stderr=serial,vidconsole\0"
下一篇文章将讲解RK平台的U-Boot启动流程,存储布局
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。