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

Rockchip rk3588 U-Boot详解 (三)的更多相关文章

  1. .NET DLL 保护措施详解(三)最终效果

    针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...

  2. Android 之窗口小部件详解(三)  部分转载

    原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...

  3. WebSocket安卓客户端实现详解(三)–服务端主动通知

    WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 We ...

  4. logback -- 配置详解 -- 三 -- <encoder>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  5. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  6. Python操作redis字符串(String)详解 (三)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...

  7. pika详解(三)SelectConnection及其他Connection

    pika详解(三)SelectConnection及其他Connection   本文链接:https://blog.csdn.net/comprel/article/details/94661147 ...

  8. View绘制详解(三),扒一扒View的测量过程

    所有东西都是难者不会,会者不难,Android开发中有很多小伙伴觉得自定义View和事件分发或者Binder机制等是难点,其实不然,如果静下心来花点时间把这几个技术点都研究一遍,你会发现其实这些东西都 ...

  9. Android WebView 开发详解(三)

    转载请注明出处   http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao 概览 Android ...

  10. KeilC51使用详解 (三)

    C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统. 第一节 本征库函数(intrinsic rou ...

随机推荐

  1. React学习时,自己拟定的一则小案例(table表格组件,含编辑)

    某次在Uniapp群看到有人问uniapp如何操作dom元素. 他想对这张表标红的区域,做dom元素获取,因为产品想让红色色块点击时,成为可编辑,渲染1~4月份之间的行程安排. 于是,有小伙伴说让他用 ...

  2. Spring Boot 日志文件

    Spring Boot 日志文件 日志文件是用于记录系统操作事件的记录文件或文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要作用. 事件日志记录系统的执行中 ...

  3. 一个C#跨平台的机器视觉和机器学习的开源库

    大家都知道OpenCV是一个跨平台的机器视觉和机器学习的开源库,可以运行在Linux.Windows.Android和Mac OS操作系统上,由C++开发. 今天给大家介绍一个用C#对OpenCV封装 ...

  4. 力扣 (LeetCode)算法入门——Day1

    704. 二分查找 题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. ...

  5. 简约版八股文(day2)

    Redis(内存中->非关系型数据库) redis是什么,为什么要用redis redis是基于键值对的NoSQL数据库,经常用来做缓存用户直接读取数据库中的数据效率是相对比较慢的,如果把数据读 ...

  6. 当cmd运行python无法显示中文报错 SyntaxError: Non-UTF-8 code starting with 时

    报错图片: 解决方法: 在python的脚本开头加上 再运行后

  7. 移动端APP组件化架构实践

    前言 对于中大型移动端APP开发来讲,组件化是一种常用的项目架构方式.个人最近几年在工作项目中也一直使用组件化的方式来开发,在这过程中也积累了一些经验和思考.主要是来自在日常开发中使用组件化开发遇到的 ...

  8. 跟着 GPT-4 从0到1学习 Golang 并发机制(三)

    目录 一.前言 二.开聊 2.1 关于 goroutine 泄露问题 2.2 内存模型 2.3 Race Detector 检测数据竞争 三.总结 一.前言 话接上回<跟着 GPT-4 从0到1 ...

  9. 从零实现的Chrome扩展

    从零实现的Chrome扩展 Chrome扩展是一种可以在Chrome浏览器中添加新功能和修改浏览器行为的软件程序,例如我们常用的TamperMonkey.Proxy SwitchyOmega.AdGu ...

  10. postgresql + timescaledb离线安装笔记(zabbix数据库准备工作)

    实验环境 操作系统:centos 7.6 PostgreSQL:14.6 timescaledb:2.8.1 网络:本地无网络 1 编译源码安装 1.1 准备工作 useradd postgres m ...