Radxa 学习摘录1

简介: Radxa 学习摘录

1、主板概览

    Radxa 3B 主板概览

2、参考资料

☆ 瑞莎源码

☆ 技术论坛

官方资料下载

wiki资料

radxa-repo

radxa-build

radxa-pkg

radxa-docs

原理图

瑞莎3B主板

u-boot build 参考

u-boot rockchip

3、分区信息

README.rockchip

u-boot/scripts/README.rockchip

[scripts]
  # pack_resource.sh
    ./scripts/pack_resource.sh resource.img

  # unpack_resource.sh
    ./scripts/unpack_resource.sh resource.img  out/

  # mkbootimg
    ./scripts/mkbootimg --kernel zImage --second resource.img --ramdisk ramdisk.img --out boot.img

  # unpack_bootimg
    ./scripts/unpack_bootimg --boot_img boot.img --out out/

  # repack-bootimg
    ./scripts/repack-bootimg --boot_img boot.img --kernel zImage -o boot_repack.img

  # stacktrace.sh
    ./scripts/stacktrace.sh dump.txt
    ./scripts/stacktrace.sh dump.txt spl
    ./scripts/stacktrace.sh dump.txt tpl

[tools]
  # resource_tool
    ./tools/resource_tool rk-kernel.dtb logo_kernel.bmp logo.bmp
    ./tools/resource_tool --unpack --image=resource.img out/

  # trust_merger
    ./tools/trust_merger ./RKTRUST/RK3399TRUST.ini
    ./tools/trust_merger --unpack trust.img

  # boot_merger
    ./tools/boot_merger ./RKBOOT/RK3399MINIALL.ini
    ./tools/boot_merger --unpack rk3399_loader_v1.17.115.bin

  # loaderimage
    ./tools/loaderimage --pack --uboot ./u-boot.bin uboot.img 0x60000000 --size 1024 2
    ./tools/loaderimage --unpack --uboot uboot.img uboot.bin

    ./tools/loaderimage --pack --trustos ./bin/rk32/rk322x_tee_v2.00.bin trust.img 0x80000000  --size 1024 2
    ./tools/loaderimage --unpack --trustos trust.img tee.bin
  # bmp2gray16
    ./tools/bmp2gray16 --uboot-logo uboot.bmp --charge-logo charging.bmp --lowpower-logo lowpower.bmp --kernel-logo kernel.bmp --output ./logo.img

4、u-boot

u-boot 参考文档

u-boot 源码

https://docs.radxa.com/zero/zero3/low-level-dev/u-boot

(1)bsp 环境配置

以下为 bsp 推荐使用环境:

硬件:推荐使用 x86_64 PC

系统:Ubuntu 或者 Debian

安装依赖

sudo apt update
sudo apt install -y git qemu-user-static binfmt-support

# Podman (推荐)
sudo apt install -y podman podman-docker
sudo touch /etc/containers/nodocker
# Docker
#sudo apt install docker.io

# 次要功能的可选依赖
sudo apt install -y systemd-container

获取代码

    bsp 使用了 git 子模块。因此,请使用以下命令获取代码:

git clone --recurse-submodules https://github.com/radxa-repo/bsp.git

(2)构建 U-Boot

bsp [options] <linux|u-boot> <profile> [product]
./bsp -d u-boot latest rock-3b
./bsp -d --no-prepare-source u-boot latest rock-3b
./bsp -d --dirty u-boot latest rock-3b
./bsp u-boot latest rock-3b

./bsp u-boot latest rock-3b
./bsp --no-prepare-source u-boot latest rock-3b
    参数说明:
    --no-prepare-source   
    # 使用本地修改进行编译,如果不加这个参数将会从 Radxa U-Boot 仓库同步最新代码并覆盖本地修改

# rock-3b-rk3568_defconfig
  1. 编译完成后会在当前目录生成许多 deb 包, 只需要安装下面的 deb 即可

u-boot-latest_2023.10-1_arm64.deb

  1. 将上面两个 deb 包复制到板子上使用 dpkg 指令安装即可完成 U-Boot 安装

sudo dpkg -i u-boot-latest_2023.10-1_arm64.deb

  1. 安装完成后需要将 U-Boot 刷到启动介质中
    cd /usr/lib/u-boot/rock-3b/
    sudo ./setup.sh update_bootloader /dev/mmcblk1   
    #/dev/mmcblk1 为你当前使用的启动介质,需要根据实际使用的设备来选择
    sudo ./setup.sh update_bootloader /dev/mmcblk1 rockchip
    sudo reboot

bsp => [utils]build => [utils]load_profile => [u-boot]component_build

(3)RK3568 u-boot 基础介绍

u-boot 脚本说明

u-boot 脚本说明

Boot-order

Rockchip RK3399 - 引导流程和准备工作

    RK 平台根据前级 Loader 代码是否开源,⽬前有两套启动⽅式:

TPL/SPL 加载:使用 Rockchip 官方提供的 TPL/SPL U-boot(就是我们上面说的小的 uboot ),该方式完全开源;

官方固件加载:使用 Rockchip idbLoader,它由 Rockchip rkbin project 的 Rockchip ddr init bin 和 miniloader bin 组合而成,该方式不开源;

   需要注意的是:并不是所有平台都支持这两种启动加载程序方法。


   上面我们介绍了 SPL ,那什么是 TPL? 实际上将我们上面所说的 SPL 初始化 SDRAM 等硬件工作的部分独立出去,就是 TPL 。那么我们总结一下:


TPL 是 Targer Program Loader,就是芯片级的初始化过程,这个时候的代码都是基于芯片平台的部分,它在启动过程中进行 DDR 初始化和一些其他的系统配置,以便后续的 SPL 能够正确地运行;

SPL 是 Secondary Program Loader ,它从存储设备中读取 trust(如 ATF/OP-TEE)和 uboot 二进制文件,将它们加载到系统内存中并运行它们,进而启动完整的操作系统;

   TPL 和 SPL 的区别在于它们的职责不同。TPL 主要负责初始化系统硬件,而 SPL 负责加载和运行其它软件组件,如 trust 和 uboot 。此外,在一些特殊情况下,如加密启动或安全启动模式下,TPL 还可能执行其他额外的任务。

+--------+----------------+----------+-------------+---------+
| Boot   | Terminology #1 | Actual   | Rockchip    | Image   |
| stage  |                | program  |  Image      | Location|
| number |                | name     |   Name      | (sector)|
+--------+----------------+----------+-------------+---------+
| 1      |  Primary       | ROM code | BootROM     |         |
|        |  Program       |          |             |         |
|        |  Loader        |          |             |         |
|        |                |          |             |         |
| 2      |  Secondary     | U-Boot   |idbloader.img| 0x40    | pre-loader
|        |  Program       | TPL/SPL  |             |         |
|        |  Loader (SPL)  |          |             |         |
|        |                |          |             |         |
| 3      |  -             | U-Boot   | u-boot.itb  | 0x4000  | including u-boot and atf
|        |                |          | uboot.img   |         | only used with miniloader
|        |                |          |             |         |
|        |                | ATF/TEE  | trust.img   | 0x6000  | only used with miniloader
|        |                |          |             |         |
| 4      |  -             | kernel   | boot.img    | 0x8000  |
|        |                |          |             |         |
| 5      |  -             | rootfs   | rootfs.img  | 0x40000 |
+--------+----------------+----------+-------------+---------+

// 前级loader闭源

BOOTROM => ddr bin => Miniloader => TRUST => U-BOOT => KERNEL

// 前级loader开源

BOOTROM => TPL => SPL => TRUST => U-BOOT => KERNEL


  TPL 相当于 ddr bin,SPL 相当于 miniloader。TPL+SPL 的组合实现了跟 RK 闭源 ddr.bin+miniloader ⼀致的功能,可相互替换。

TPL/SPL/U-Boot-proper

  U-Boot 通过使⽤ 不同的编译条件 可以⽤同⼀套代码获取三种不同功能的 Loader:TPL/SPL/U-Boot-proper 。


  TPL (Tiny Program Loader) 和 SPL(Secondary Program Loader) 是⽐ U-Boot 更早阶段的 Loader:


TPL:运⾏在 sram 中,负责完成 ddr 初始化;

SPL:运⾏在 ddr 中,负责完成系统的 lowlevel 初始化、后级固件加载(trust.img 和 uboot.img);

U-Boot proper:运⾏在 ddr 中,即我们通常所说的 “U-Boot” ,它负责引导 kernel ;

启动流程:


BOOTROM => TPL(ddr bin) => SPL(miniloader) => TRUST => U-BOOT => KERNEL


  更多参考:doc/README.TPL 和 doc/README.SPL


Build-Output

  U-Boot 编译成功后会在根⽬录下⽣成⼀些重要⽂件(⽀持 TPL/SPL 编译时才有 TPL/SPL 的⽣成⽂件):


// U-Boot阶段

./u-boot.map // MAP表⽂件

./u-boot.sym // SYMBOL表⽂件

./u-boot // ELF⽂件,类同内核的vmlinux(重要!)

./u-boot.dtb // u-boot⾃⼰的dtb⽂件

./u-boot.bin // 可执⾏⼆进制⽂件,会被打包成 uboot.img ⽤于烧写

// SPL阶段

./spl/u-boot-spl.map // MAP表⽂件

./spl/u-boot-spl.sym // SYMBOL表⽂件

./spl/u-boot-spl // ELF⽂件,类同内核的vmlinux(重要!)

./spl/u-boot-spl.dtb // spl⾃⼰的dtb⽂件

./spl/u-boot-spl.bin // 可执⾏⼆进制⽂件,会被打包成loader⽤于烧写

// TPL阶段

./tpl/u-boot-tpl.map // MAP表⽂件

./tpl/u-boot-tpl.sym // SYMBOL表⽂件

./tpl/u-boot-tpl // ELF⽂件,类同内核的vmlinux(重要!)

./tpl/u-boot-tpl.dtb // tpl⾃⼰的dtb⽂件

./tpl/u-boot-tpl.bin // 可执⾏⼆进制⽂件,会被打包成loader⽤于烧写

Environment-Variables

   ENV (Environment-Variables) 是 U-Boot ⽀持的⼀种全局数据管理和传递⽅式,原理是构建⼀张 HASH 映射表,把⽤⼾的数据以 “键值-数据” 作为表项进⾏管理。


  EVN 通常⽤于定义平台配置参数:固件加载地址、⽹络配置(ipaddr、serverip)、bootcmd、bootargs 等,⽤⼾可以在命令⾏下使⽤ printenv 命令打印出来。


⽤⼾可选择是否把 ENV 数据保存到本地存储上

ENV 数据仅限于 U-Boot 使⽤,⽆法直接传递给内核、内核也⽆法直接解析

⽤⼾层可以通过 U-Boot 提供的 fw_printenv⼯ 具访问 ENV 数据

uboot DTS

  U-Boot 有⾃⼰的 DTS ⽂件,编译时会⾃动⽣成相应的 DTB ⽂件,被添加在 u-boot.bin 末尾。


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


Uboot 大全 | uboot 启动流程(二)


如何为目标板添加一个dts文件

在 arch/*/dts 目录下,添加一个 xxx.dts 文件,该文件可以从内核拷贝,或者在 uboot dts 目录下选择一个其它目标板的 dts 为基础,再根据实际需求进行修改。修改完成后,在 arch/arm/dts/Makefile 中为其添加编译选项:

dtb-$(CONFIG_yyy) += xxx.dtb


  其中 yyy 为使用该 dts 的目标板


如何为目标板选择 dts 文件

uboot 的设备树文件位于 arch/*/dts 目录下,可通过以下选项为目标板选择一个默认的 dts 文件:

CONFIG_DEFAULT_DEVICE_TREE="xxx”


   这是因为与内核不一样,uboot最终的镜像会和dtb打包在一个镜像文件中,因此在编译流程中就需要知道最终被使用的dtb。关于uboot镜像与dtb之间的关系后续在分析,先梳理流程。


uboot与dtb可以有以下几种打包组合方式:


若定义了 CONFIG_OF_EMBED 选项,则在链接时会为 dtb 指定一个以 __dtb_dt_begin 开头的单独的段,dtb 的内容将被直接链接到 uboot.bin 镜像中。官方建议这种方式只在开发和调试阶段使用,而不要用于生产阶段

若定义了 CONFIG_OF_SEPARATE 选项,dtb 将会被编译为 u-boot.dtb 文件,而 uboot 原始镜像被编译为 u-boot-nodtb.bin 文件,并通过以下命令将它们连接为最终的 uboot.bin 文件:

cat u-boot-nodtb.bin u-boot.dtb >uboot.bin

Radxa 学习摘录2:https://developer.aliyun.com/article/1598563

目录
相关文章
|
存储 算法 决策智能
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(下)
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(下)
91 0
|
算法 C++ 容器
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(上)
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(上)
57 0
|
4月前
|
传感器 SQL 开发框架
Radxa 学习摘录2
Radxa 学习摘录
61 1
|
SQL 存储 自然语言处理
数据库原理第三章课后题答案(第四版)
数据库原理第三章课后题答案(第四版)
250 0
|
Python
1轻松学python第一节到第五节
1轻松学python第一节到第五节
49 0
|
供应链 JavaScript 前端开发
【论文指导】计算机毕业设计,摘要如何写?15篇案例把你安排明白
【论文指导】计算机毕业设计,摘要如何写?15篇案例把你安排明白
333 1
|
存储 SQL 安全
数据库原理第一章课后题答案(第四版)
数据库原理第一章课后题答案(第四版)
85 0
|
机器学习/深度学习 人工智能 自然语言处理
图与代码不一致,Transformer论文被发现错误,网友:早该被指出1000次
图与代码不一致,Transformer论文被发现错误,网友:早该被指出1000次
131 0
|
SQL 机器学习/深度学习 人工智能
每一个人都应该明白的ChatGPT所带来的意义
ChatGPT的横空问世,因其更高的智能程度、更宽泛的领域知识、更灵活的响应能力、更自然的对话语境使整个互联网都受到极大的冲击。 我本人试用了一段时间后,并结合在网上看到的文章、评论、观点,想说说我对ChatGPT的看法,以及它应该带给我们的革命。 因本人是互联网行业从业者,本文更多叙述ChatGPT+编程开发从业相关。
每一个人都应该明白的ChatGPT所带来的意义
|
机器学习/深度学习 自然语言处理 文字识别
写论文和平时学习时有用的网站
写论文和平时学习时有用的网站
108 0

热门文章

最新文章

相关实验场景

更多