概览

Realtek 的 Linux SDK 架构如下所示。

  • Linux 软件: 在应用处理器(AP)上运行。它包含多个组件层,提供不同级别的接口,以帮助用户运行自己的应用程序。

  • OPTEE OS: 在 Arm TrustZone 上运行以提供安全功能。

  • Firmware: 在 KM4 上运行,可提供任务卸载和低功耗操作。

../../rst_linux/0_sdk_architecture/figures/sdk_arch.svg

SDK 路径

下面展示了 Realtek 的 Linux SDK 目录架构。

../../rst_linux/0_sdk_architecture/figures/sdk_directory.svg

路径

组件

描述

sources/boot

Bootloader

引导加载程序包含了 arm-trusted-firmware、OPTEE OS 和 u-boot

sources/development

Development tools

用于调试的开发工具

sources/kernel

Linux kernel

Linux 内核 5.4

sources/firmware

KM4 firmware

运行在 KM4 的 firmware

sources/yocto

Yocto

Yocto 4.0 Kirkstone

sources/tests

Test cases

驱动的测试样例

Tools

Tools

Flash 下载与测试工具

BSP

该 SDK 提供了一系列 BSP 源代码包。

路径

组件

描述

sources/<linux>

Linux Kernel

Linux 内核源代码

sources/boot/arm-trusted-firmware

Trusted Firmware

Arm trusted firmware

sources/boot/uboot

U-Boot

应用处理器的第二引导加载程序

sources/boot/optee

Trusted OS

OPTEE OS 作为可信操作系统运行,以提供安全功能。

其中 <linux> 表示 sdk 中的内核 linux 目录,对于内核 5.4.x 而言是 kernel/linux-5.4 ,而对于内核 6.6.x 则是 kernel/linux-6.6

闪存布局

NAND 闪存布局

在 SDK 中提供了两种默认的 NAND 闪存布局。

  • 下表展示了 128MB NAND 闪存的布局。SlotA KM4 引导加载程序的起始地址固定为 0x0800_0000 ,其他起始地址可由用户配置。

    子项

    地址

    大小(字节)

    描述

    KM0/KM4/AP BOOT SlotA

    KM4 Bootloader

    0x0800_0000

    24K

    KM4 引导加载程序代码/数据

    System Data

    0x0801_F000

    4K

    系统数据

    Key Certificate, KM0 & KM4 IMG2

    0x0802_0000

    1152K

    该固件结合了密钥证书、KM0 固件和 KM4 固件2。

    • 密钥证书:其他固件的公钥哈希信息

    • KM0_IMG: 包含 KM0 固件代码/数据,映射到虚拟地址0x0C00_0000。

    • KM4_IMG2: 包含 KM4 非安全固件代码/数据,映射到虚拟地址0x0E00_0000。

    AP BL1 & FIP

    0x0814_0000

    1536K

    AP BL1 和 FIP 固件,包含 BL1,BL2,BL32 (OPTEE) 与 BL33 (U-Boot)

    KM0/KM4/AP BOOT SlotB[1]

    KM4 Bootloader

    0x082C_0000

    256K

    与 SlotA 一样。

    Key Certificate, KM0 & KM4 IMG2

    0x0830_0000

    1152K

    与 SlotA 一样。

    AP BL1 & FIP

    0x0842_0000

    1536K

    与 SlotA 一样。

    A: AP Misc

    0x0862_0000

    256K

    SlotA: 用户恢复的 AP 杂项信息

    B: AP Misc Backup

    0x0866_0000

    256K

    SlotB: 用户恢复的 AP 杂项信息的备份

    A: AP VBMeta

    0x086A_0000

    256K

    SlotA: 用于安全启动的 AP VBMeta 信息

    B: AP VBMeta

    0x086E_0000

    256K

    SlotB: AP VBMeta 当前用于恢复安全启动

    A: AP DTB

    0x0872_0000

    384K

    SlotA: AP 设备树二进制文件

    B: AP DTB

    0x0878_0000

    384K

    SlotB: 目前用于 AP 恢复的设备树 Blob

    A: AP Kernel

    0x087E_0000

    10M

    SlotA: AP Linux 内核固件

    B: AP Kernel

    0x091E_0000

    10M

    SlotB: 目前用于 AP 恢复的内核和 initramfs

    AP Rootfs

    0x09BE_0000

    60M

    AP 根文件系统二进制文件

    AP Userdata

    0x0D7E_0000

    40.125M

    AP UBIFS 用户数据二进制文件

    备注

    [1] SlotB 是给 OTA 在线升级使用的。

  • 下表展示了 256MB NAND 闪存的布局。SlotA KM4 引导加载程序的起始地址固定为 0x0800_0000 ,其他起始地址可由用户配置。

    子项

    地址

    大小(字节)

    描述

    KM0/KM4/AP BOOT SlotA

    KM4 Bootloader

    0x0800_0000

    24K

    KM4 引导加载程序代码/数据

    System Data

    0x0801_F000

    4K

    系统数据

    Key Certificate, KM0 & KM4 IMG2

    0x0802_0000

    1152K

    该固件结合了密钥证书、KM0 固件和 KM4 固件2。

    • 密钥证书:其他固件的公钥哈希信息

    • KM0_IMG: 包含 KM0 固件代码/数据,映射到虚拟地址0x0C00_0000。

    • KM4_IMG2: 包含 KM4 非安全固件代码/数据,映射到虚拟地址0x0E00_0000。

    AP BL1 & FIP

    0x0814_0000

    1536K

    AP BL1 和 FIP 固件,包含 BL1,BL2,BL32 (OPTEE) 与 BL33 (U-Boot)

    KM0/KM4/AP BOOT SlotB

    KM4 Bootloader

    0x082C_0000

    256K

    与 SlotA 一样。

    Key Certificate, KM0 & KM4 IMG2

    0x0830_0000

    1152K

    与 SlotA 一样。

    AP BL1 & FIP

    0x0842_0000

    1536K

    与 SlotA 一样。

    A: AP Misc

    0x0862_0000

    256K

    SlotA: 用户恢复的 AP 杂项信息

    B: AP Misc Backup

    0x0866_0000

    256K

    SlotB: 用户恢复的 AP 杂项信息的备份

    A: AP VBMeta

    0x086A_0000

    256K

    SlotA: 用于安全启动的 AP Meta 信息

    B: AP VBMeta

    0x086E_0000

    256K

    SlotB: AP Meta 当前用于恢复安全启动

    A: AP DTB

    0x0872_0000

    384K

    SlotA: AP 设备树二进制文件

    B: AP DTB

    0x0878_0000

    384K

    SlotB: 目前用于 AP 恢复的设备树 Blob

    A: AP Kernel

    0x087E_0000

    15M

    SlotA: AP Linux 内核固件

    B: AP Kernel

    0x096E_0000

    15M

    SlotB: 目前用于 AP 恢复的内核和 initramfs

    AP Rootfs

    0x0A5E_0000

    120M

    AP 根文件系统二进制文件

    AP Userdata

    0x11DE_0000

    98.125M

    AP UBIFS 用户数据二进制文件

自定义的 NAND 闪存布局

根据需要更改特定 Linux 设备树文件中的闪存布局。

  • 128MB NAND 闪存: <linux>/arch/arm/boot/dts/rtl8730e-spi-nand-128m.dtsi

  • 256MB NAND 闪存: <linux>/arch/arm/boot/dts/rtl8730e-spi-nand-256m.dtsi

根据需要更改分区节点的 reg 和/或 label 属性:

partitions {
    compatible = "fixed-partitions";
    #address-cells = <1>;
    #size-cells = <1>;
    partition@0 {
        label = "Miscellaneous Information";      # Partition name
        reg = <0x620000 0x40000>;            # <offset size>
    };
    # More partitions
};
chosen {
    bootargs = "console=ttyS0,1500000 earlycon psci=enable ubi.mtd=8 ubi.block=0,0 root=/dev/ubiblock0_0 rootfstype=squashfs,ubifs ubi.mtd=9";
    stdout-path = &loguart;
};

备注

  • 分区偏移应与其地址相对应: offset | 0x0800_0000 = address

  • NAND 闪存的分区偏移和大小应与 NAND 块大小对齐,例如,对于大多数 SPI NAND 闪存型号通常为 128KB,并且每个分区应至少保留一个块大小用于坏块管理。

  • 如果没有必要,请不要更改默认分区的顺序;否则,bootargs 中的 rootfs 和 userdata 路径也应相应更改。

根据需要更改 U-Boot 配置。

<sdk>/sources/boot/uboot/configs 下找到特定板卡的默认 U-Boot 配置文件,例如, rtl8730elh-va7 板卡对应的配置文件为 rtl8730elh-va7_defconfig 。可用的闪存布局配置如下所示。

U-Boot 配置

AP 内核起始地址

CONFIG_IMG_FLASH_ADDR

AP 内核大小

CONFIG_IMG_FLASH_SIZE

AP DTB 起始地址(仅适用于 NOR Flash)

CONFIG_FDT_FLASH_ADDR

AP DTB 大小

CONFIG_FDT_FLASH_SIZE

AP Misc 起始地址 (仅适用于 NOR Flash)

CONFIG_BOOT_OPTION_MISC_FLASH_ADDR

AP Misc 大小 (仅适用于 NOR Flash)

CONFIG_BOOT_OPTION_MISC_FLASH_SIZE

用于恢复的 AP DTB 起始地址(仅适用于 NOR Flash)

CONFIG_RECOVERY_FDT_FLASH_ADDR

用于恢复的 AP DTB 大小

CONFIG_RECOVERY_FDT_FLASH_SIZE

用于恢复的 AP 内核 + 根文件系统的起始地址(仅适用于 NOR Flash)

CONFIG_RECOVERY_IMG_FLASH_ADDR

用于恢复的 AP 内核 + 根文件系统大小

CONFIG_RECOVERY_IMG_FLASH_SIZE

由 mtdparts 定义的分区信息(仅适用于 NAND Flash)

CONFIG_MTDPARTS_DEFAULT

小心

请勿重命名在 CONFIG_MTDPARTS_DEFAULT 中定义的分区。

重新编译固件。

请通过设备配置文件编辑器相应地更改设备配置文件中的闪存布局。

DRAM 布局

以 16MB DRAM 为例,其布局如下面的图所示。

../../rst_linux/0_sdk_architecture/figures/dram_layout.svg

子项

物理地址

大小(字节)

描述

KM4 IMG2

KM4_IMG2_RAM_NS

0x6000_0000

1.5M

KM4 固件2 SRAM,包括CODE、DATA、BSS和HEAP。

AP IMG

BL1_RO

0x6018_0000

128K

AP BL1 代码与 RO 数据

BL1_RW

0x601A_0000

64K

AP BL1 栈和 BSS

SHARED_RAM

0x601B_0000

64K

用于多核的 AP 共享内存

BL2

0x601C_0000

256K

AP BL2 代码,数据,栈,BSS

BL32

0x6020_0000

1M

AP BL32 代码,数据,栈,BSS

对于 Linux SDK,BL32 是 OPTEE,它包含了 TEE_RAM、TA_RAM 和共享内存。

BL33

0x6030_0000

448K

AP BL33 代码,数据,栈,BSS

对于 Linux SDK, BL33 是 U-Boot

DTB

0x6037_0000

64K

AP 设备树二进制文件

Kernel

0x6038_0000

-

AP Linux 内核固件

U-Boot

目录

U-Boot 代码路径: <sdk>/sources/boot/uboot

在接下来的章节中, <uboot> 将被用作上述路径的简写。

路径

Platform-specific 代码

<uboot>/board/realtek/amebasmart/

默认配置文件

<uboot>/configs/

设备树文件

<uboot>/arch/arm/dts/

外设驱动程序

<uboot>/drivers/rtkdrivers/

设备树-bindings

<uboot>/include/dt-bindings/realtek/

自定义命令

<uboot>/cmd/

设备树

U-Boot 的设备树文件与不同的开发板相对应,差异仅在于芯片和闪存布局等方面。

板级设备树文件的命名规则是:

<SoC>-uboot-<Flash>.dts

其中:

SoC:

SoC 的 RTL 编号,例如 rtl8730e。

Flash:

闪存类型,例如 NAND 或 NOR。

例如,使用 NAND 闪存的所有 RTL8730E 开发板对应的文件命名为 rtl8730e-uboot-nand.dts

与 Linux 内核的设备树文件不同,U-Boot 的设备树文件经过精简,仅提供用于启动 Linux 内核的最低限度的平台特定支持。

U-Boot 的设备树

Linux 内核设备树

DTB 存在性

与 U-Boot 固件组合

独立固件

运行时间配置(可选)

标准输出路径

bootargs,标准输出路径

CPU (cpus)

否(仅限Core 0,已在默认配置文件中指定)

是 (Core 0 + Core 1)

内存 (memory)

固定到 64MB

64/128/256MB (不同的板子不同设置)

闪存分区 (partitions)

否 (在默认配置文件中指定)

是(不同的板子不同设置)

外设

最小支持 (LOGUART/SPIC/Flash/USB/OTP)

全部支持

驱动

U-Boot 提供了用于最小外设的驱动程序,其唯一目的就是引导 Linux 内核。

驱动

源代码

描述

LOGUART

drivers/rtkdrivers/serial/

用于记录日志和 USB 启动操作的控制台

OTP

drivers/rtkdrivers/otp/

OTP 驱动程序用于在安全启动期间访问防回滚索引。

SPIC

drivers/rtkdrivers/spi/

SPIC 驱动程序用于访问 SPI NAND/NOR 闪存。

USB

drivers/rtkdrivers/phy/

drivers/usb/

用于 USB 启动的 USB PHY 和 HCD 驱动程序。

NAND Flash

drivers/mtd/nand/spi/

SPI NAND 闪存驱动

NOR Flash

drivers/mtd/spi-nor/

SPI NOR 闪存驱动

Linux 内核

目录

Linux 内核代码路径: <sdk>/sources/kernel/linux-<version>

在接下来的章节中, <linux> 将被用作上述路径的简写。

路径

Platform-specific 代码

<linux>/arch/arm/mach-amebasmart/

默认配置文件

<linux>/arch/arm/configs/

设备树文件

<linux>/arch/arm/boot/dts/

外设驱动

<linux>/drivers/rtkdrivers/

音频驱动

<linux>/sound/soc/realtek/

<linux>/sound/soc/codecs/

设备树-bindings

<linux>/include/dt-bindings/realtek/

备注

在下面的章节中, <dts> 会用来表示 Linux 设备树文件的路径。

设备树

Linux 内核的设备树文件分为三个层级进行组织:

  • 板级

    与不同的板对应,可能在芯片、DRAM、闪存布局、启动参数、引脚复用等方面有所不同。

    板级设备树文件的命名规则是:

    <SoC>-<Feature>.dts
    

    其中:

    • SoC: SoC 模组名,例如 rtl8730elh-va7, rtl8730elh-va8

    • 特性:

      • full: 最多功能用于开发和演示。

      • generic:最少功能用于客户设计参考

      • recovery:用于恢复的最低功能

      • tests-xxx:用于质量控制测试的功能

    例如, rtl8730elh-va8-generic.dts 是用于 rtl8730elh-va8 板子的,提供最少功能用于客户设计。

    板级设备树可以覆盖芯片级设备树配置。

  • 芯片级

    对应不同的芯片,在 CPU 和外设上有所不同。

    例如, rtl8730e.dts 是用于 RTL8730E SoC 的。

  • IP 级

    对应通用的片上模块,例如:

    • rtl8730e-a32.dtsi :Cortex-A32 的 CPU 配置。

    • rtl8730e-spi-nand-128m.dtsi :SPI 闪存控制器、128MB NAND 闪存默认布局和运行时配置。

    • rtl8730e-spi-nand-256m.dtsi :SPI 闪存控制器、256MB NAND 闪存默认布局和运行时配置。

    • rtl8730e-audio.dtsi :音频配置。

    • rtl8730e-captouch.dtsi :电容触控配置。

    • rtl8730e-drm.dtsi :DRM 配置。

    • rtl8730e-ocp.dtsi :片上外设配置,包括 rtl8730e-audio.dtsirtl8730e-rcc.dtsirtl8730e-pinctrl.dtsi

    • rtl8730e-pinctrl.dtsi :Pinmux 配置。

    • rtl8730e-rcc.dtsi :时钟配置。

驱动

Linux 内核为片上外设的驱动程序提供全面支持。

驱动

源代码

描述

ADC

drivers/rtkdrivers/adc/

用于 ADC 的 IIO 驱动程序

音频

sound/soc/realtek/

sound/soc/codecs/ameba*.c

音频编解码器/平台/机器驱动程序

蓝牙

drivers/bluetooth/

drivers/rtkdrivers/misc/

蓝牙控制器电源驱动程序和 HCI 驱动程序

电容触控

drivers/rtkdrivers/touchscreen/

电容触控控制器驱动程序

时钟

drivers/rtkdrivers/clk/

RCC(复位和时钟控制)模块的驱动程序

CPUFREQ

drivers/rtkdrivers/cpufreq/

CPU 频率和电压调节驱动程序

Crypto

drivers/rtkdrivers/crypto/

硬件加密引擎驱动程序

DMAC

drivers/rtkdrivers/dma/

DMA 控制器驱动程序

DM-Verity

drivers/md/

用于安全启动的 DM 验证驱动程序

DRM

drivers/rtkdrivers/drm/

LCDC 和 MIPI-DSI 驱动程序

GIC

drivers/irqchip/

GIC 驱动程序

GPIO

drivers/rtkdrivers/gpio/

GPIO 驱动程序

I2C

drivers/rtkdrivers/i2c/

I2C 主机/从机驱动程序

IPC

drivers/rtkdrivers/ipc/

IPC 驱动程序

IR

drivers/rtkdrivers/ir/

IR 远程控制驱动程序

LEDC

drivers/rtkdrivers/ledc/

特定于 WS28XXX 的 LEDC 驱动程序

LOGUART

drivers/rtkdrivers/tty_serial/

用于控制台的 LOGUART 驱动程序

NAND 闪存

drivers/mtd/nand/spi/

SPI NAND 闪存驱动程序

NOR 闪存

drivers/mtd/spi-nor/

SPI NOR 闪存驱动程序

OTP

drivers/rtkdrivers/otp/

OTP 驱动程序

PINCTRL

drivers/rtkdrivers/pinctrl/

PIN 控制器驱动程序

RTC

drivers/rtkdrivers/rtc/

RTC 驱动程序

SDIOH

drivers/rtkdrivers/mmc/

SDIO 主机驱动程序

SPI

drivers/rtkdrivers/spi/

通用 SPI 控制器驱动程序

SPIC

drivers/rtkdrivers/spic/

SPI 闪存控制器驱动程序

系统定时器

drivers/clocksource/arm_arch_timer.c

系统定时器驱动程序

Thermal

drivers/rtkdrivers/thermal/

温控驱动程序

定时器

drivers/rtkdrivers/clocksource/

drivers/rtkdrivers/mfd_timer/

drivers/rtkdrivers/pwm/

用于定时器模块的时钟源/ MFD / PWM 驱动程序

UART

drivers/rtkdrivers/tty_serial/

通用 UART 驱动程序

USB

drivers/rtkdrivers/usb_phy/

drivers/usb/

USB PHY /控制器/类驱动程序

看门狗

drivers/rtkdrivers/watchdog/

看门狗驱动程序

Wi-Fi

drivers/rtkdrivers/net/

Wi-Fi 驱动程序

配置

要更改内核配置,请执行以下命令:

bitbake virtual/kernel -c menuconfig

以下是更改外围设备驱动程序配置的示例:

  1. 选择 Device Drivers > Drivers for Realtek

    ../../rst_linux/0_sdk_architecture/figures/sdk_arch_configuration_1.png
    ../../rst_linux/0_sdk_architecture/figures/sdk_arch_configuration_2.png
  2. 根据需要配置外围设备驱动程序。

    ../../rst_linux/0_sdk_architecture/figures/sdk_arch_configuration_3.png

后面的章节将详细说明 Realtek 外围设备驱动程序的配置。