首页 > 其他分享 >Rockchip rk3588 U-Boot详解 (三)

Rockchip rk3588 U-Boot详解 (三)

时间:2023-06-12 20:00:46浏览次数:53  
标签:devnum rk3588 Rockchip Boot devtype setenv ENV CONFIG

Rockchip rk3588 U-Boot详解 (三)

1.1 Environment-Variables

ENV(Environment-Variables)是U-Boot支持的一种全局数据管理和传递方式,原理是构建一张HASH映射表,把用户的数据以"键值-数据"作为表项进行管理。
EVN通常用于定义平台配置参数:固件加载地址、网络配置(ipaddr、serverip)、boootcmd、bootargs等,用户可以在命令行下使用printenv命令打印出来。

  • 用户可选择是否把ENV数据保存到本地存储上
  • ENV数据仅限于U-Boot使用,无法直接传递给内核,内核也无法直接解析。
  • 用户层可以通过U-Boot提供的fw_printenv工具访问EVN数据

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

1.2 U-Boot DTS

U-Boot有自己的DTS文件,编译时会自动生成相应的DTB文件,被添加到u-boot.bin末尾。文件目录

arch/arm/dts

各平台具体使用哪个DTS文件,通过defconfig中的 CONFIG_DEFAULT_DEVICE_TREE指定。

1.3 Relocation

通常在开机阶段,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
......

2.1 RK架构

本章主要向用户介绍RK平台上一些重要的基础情况,feature等。
全文所有章节中只要提到开启关闭CONFIG_配置项,均是指通过make menuconfig的方式开启/关闭。

除非是一些特殊的,直接诶定义在.h文件中的CONFIG_配置项

请勿直接再defconfig中开启/关闭CONFIG_配置项,避免因为Kconfig中定义的配置依赖关系而导致.config不生效

更新defconfig时请使用make savedefconfig的方式

2.2 平台文件

平台目录:

./arch/arm/include/asm/arch-rockchip/
./arch/arm/mach-rockchip/
./board/rockchip/
./include/configs/

defconfig目录:

./configs/

核心板公共级文件!

./arch/arm/mach-rockchip/board.c

2.3 平台配置

配置文件
各个平台的配置选项、参数通常位于如下几个位置:

// 各平台公共文件(开发者通常不需要修改)
./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定义的重要配置给出说明。

  • RKIMG_DET_BOOTDEV: 存储类型探测命令,以逐个扫描的方式探测当前的存储设备类型;
  • RKIMG_BOOTCOMMAND: kernel 启动命令;
  • ENV_MEM_LAYOUT_SETTINGS: 固件加载地址,包括ramdisk/fdt/kernel;
  • PARTS_DEFAULT:默认的 GPT 分区表,在某些情况下,当存储中没有发现有效的 GPT 分区表时被使⽤;
  • ROCKCHIP_DEVICE_SETTINGS:外设相关命令,主要是指定 stdio(⼀般会包含显⽰模块启动命令);
  • BOOTENV:distro ⽅式启动 linux 时的启动设备探测命令;
  • CONFIG_SYS_MALLOC_LEN:malloc 内存池⼤小;
  • CONFIG_SYS_TEXT_BASE:U-Boot 运⾏的起始地址;
  • CONFIG_BOOTCOMMAND:启动命令,⼀般定义为 RKIMG_BOOTCOMMAND;
  • CONFIG_PREBOOT:预启动命令,在 CONFIG_BOOTCOMMAND 前被执⾏;
  • CONFIG_SYS_MMC_ENV_DEV:MMC 作为 ENV 存储介质时的 dev num,⼀般是 0;

如下以 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启动流程,存储布局

标签:devnum,rk3588,Rockchip,Boot,devtype,setenv,ENV,CONFIG
From: https://www.cnblogs.com/armsom/p/17475992.html

相关文章

  • nohub命令和java -jar启动Spring Boot
    1.nohub命令启动SpringBoot项目nohupjava-Xms1024m-Xmx2048m-jardemo-0.0.1-SNAPSHOT.jar1>start.out2>&1&2.java-jar启动SpringBoot项目java-Xms800m-Xmx800m-XX:PermSize=256m-XX:MaxPermSize=512m-XX:MaxNewSize=512m-jardemo-0.0.1-SNAPSHOT.jar&g......
  • Springboot读取不到yml文件的问题(转载)
    Springboot工程分为两个大文件夹,/src/main和/src/test,main和test下面分别由java和resource,如图所示: 规则:main的java里面的代码,只能读取main的resource的配置文件;test的java里面的代码,既可以读取main的resource的配置文件,也可以读取test的resource的配置文件。test......
  • 随笔(十八)『SpringBoot 整合 Swagger2』
    1、添加Swagger2依赖<!--swagger2--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version>......
  • gradle 构建springboot 项目两种方式
    第一种直接用插件spring-boot-gradle-plugin无需写入版本buildscript{repositories{maven{url'https://maven.aliyun.com/repository/public'}}dependencies{classpath'org.springframework.boot:spring-boot-gradle-plugin......
  • boot+mp搭建版本踩坑记录
    最近项目搭建中遇到的一些问题,涉及到mp版本swagger集成等文章目录前言一、引入mp启动报错1相关配置2报错如下3解决方案二、引入swagger1引入的pom2报错如下:3解决方案三.项目启动自动打开swagger页面总结前言由于使用高版本springboot导致集成遇到的一些问题一、引......
  • springboot日期格式化,时差问题
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、mysql中日期字段的正确设置二、日期格式化,时差1.日期字段返回格式不正确--方案一2.日期字段返回格式不正确--方案二二、日期无法自动填充1.mybatis-plus2.mybatis只能靠自己了总结前言随着mysql8......
  • 自定义SpringBoot的starter
    1.自定义starter名为my-starter-spring-boot-starter1.1idea中创建一个maven模块groupId为com.exampleartifactId为my-starter-spring-boot-starter起名规范:1.官方starter是spring-boot-starter-xxxx2.自定义starter是xxx-spring-boot-starter依赖如下<?xmlversion="1.0......
  • SpringBoot多模块项目搭建以及搭建基础模板
    多模块项目搭建目录多模块项目搭建1.父项目pom文件编辑2.创建子模块1.父项目pom文件编辑<!--1.父工程添加pom格式--><packaging>pom</packaging><!--定义子模块--><modules><module>walker-service</module><module>walker-utils&......
  • springboot使用swagger2以及遇到的一些问题
    1.导入依赖<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId>......
  • springboot kettle gralde dockerfile 多阶段构建
    dockerfileFROMopenjdk:8-jdk-alpineASTEMP_BUILD_IMAGEENVENVREFRESH_DATE2023-06-1215:00RUNset-eux&&sed-i's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g'/etc/apk/repositoriesRUNapkupdate&&apkadd--no-cacheb......