Jetson Xavier NX 系列和 Jetson AGX Xavier 系列 MB1 平台配置
适用于:仅 NVIDIA Jetson Xavier NX 系列和 Jetson AGX Xavier 系列设备。
在本主题中,NVIDIA® Jetson Xavier™ NX 和 Jetson AGX Xavier™ 系列设备统称为“Jetson Xavier 设备”。术语“Jetson Xavier 设备”应理解为仅指这两种类型的设备。
在 Jetson Xavier 设备的启动序列中,MB1 和 MB2 都使用 MB1 BCT 来配置平台特定的静态设置。MB1 在启用任何其他 CPU 之前执行;MB2 在 MB1 之后立即执行。两者都归 NVIDIA 所有,并由 NVIDIA 和 OEM 签名。
关于 MB1 BCT
MB1 BCT 指定平台特定的数据。当调用 TegraFlash 来刷写平台时,它会调用 tegrabct_v2 工具来创建 MB1 BCT。它使用以下数据
• 平台配置文件
• tegrabl_mb1_bct.h 头文件
此阶段所需的 BCT 由 OEM 签名。MB1 阶段提供执行平台特定初始化的功能。它还设置安全控制寄存器 (SCR)。
平台特定的配置文件指定
• 引脚复用和 GPIO 配置
• Prod 设置
• 焊盘电压设置
• PMIC 设置
• 安全寄存器配置
这些配置文件位于
Linux_for_Tegra/bootloader/t186ref/BCT/
引脚复用和 GPIO 配置
Jetson Xavier 设备的引脚复用配置文件提供引脚复用和 GPIO 配置信息。此数据的典型格式是寄存器地址和数据,成对出现。MB1 仅允许从此表写入引脚复用和 GPIO 地址范围。
引脚复用配置文件位于
Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-mb1-bct-pinmux-gpio-P2972<board>-<revision>.cfg
其中
• <board> 是设备的板名称:Jetson Xavier NX 系列为 p3668,Jetson AGX Xavier 系列为 p2888。
• <revision> 是板修订号,例如 a01。
用法
pinmux.<address> = <value>;
其中
• pinmux 是 GPIO 和引脚复用配置数据的域名。
• <address> 是绝对 PADCTL_A<N>。GPIO_CTL<N> 或 AON_GPIO 寄存器地址。
• <value> 是 32 位数据值。
设备端实现
write(value, address);
示例
#### 用于引脚的引脚复用 ####
pinmux.0x02434060 = <value1>; # gen1_i2c_scl_pc5.PADCTL_CONN_GEN1_I2C_SCL_0
pinmux.0x02434064 = <value2>; # gen1_i2c_scl_pc5.PADCTL_CONN_CFG2TMC_GEN1_I2C_SCL_0
pinmux.0x02434068 = <value1>; # gen1_i2c_sda_pc6.PADCTL_CONN_GEN1_I2C_SDA_0
pinmux.0x0243406C = <value2>; # gen1_i2c_sda_pc6.PADCTL_CONN_CFG2TMC_GEN1_I2C_DA_0
::::
#### 用于低功耗配置的未用引脚的引脚复用 ####
pinmux.0x02434040 = <value1>; # gpio_wan4_ph0.PADCTL_CONN_GPIO_WAN4_0
pinmux.0x02434044 = <value2>; # gpio_wan4_ph0.PADCTL_CONN_CFG2TMC_GPIO_WAN4_0
pinmux.0x02434048 = <value1>; # gpio_wan3_ph1.PADCTL_CONN_GPIO_WAN3_0
pinmux.0x0243404C = <value2>; # gpio_wan3_ph1.PADCTL_CONN_CFG2TMC_GPIO_WAN3_0
通用 Prod 配置
Jetson Xavier 设备的 prod 属性配置系统特性、接口和控制器设置。必须正确设置这组属性,接口才能在给定平台上可靠地工作。prod 属性在控制器级别设置,并在引脚复用级别单独设置。
这些属性配置为寄存器地址、掩码和数据值的元组。MB1 从地址读取数据,根据掩码和值修改数据,然后将其写回地址。
prod 配置文件位于
Linux_for_Tegra/bootloader/t186ref/BCT/tegra186-mb1-bct-prod-<board>-<revision>.cfg
其中
• <board> 是设备的板名称:Jetson Xavier NX 系列为 p3668,Jetson AGX Xavier 系列为 p2888。
• <revision> 是板修订号,例如 a01。
用法
prod.<address>.<mask> = <value>;
其中
• prod 是设置的域名前缀。
• <address> 是焊盘控制寄存器地址。
• <mask> 是掩码值(4 字节,无符号)。
• <value> 是数据值(4 字节,无符号)。
设备端实现
val = read(address)
val = (val & ~mask) | (value & mask);
write(val, address);
示例
#I2C
prod.0x02434064.0x01f1f000 = 0x0001f000; # PADCTL_CONN_CFG2TMC_GEN1_I2C_SCL_0 驱动设置
prod.0x0243406c.0x01f1f000 = 0x0001f000; # PADCTL_CONN_CFG2TMC_GEN1_I2C_SDA_0 驱动设置
控制器 Prod 配置
控制器 prod 配置是接口和控制器设置的系统特性值,这些值是给定接口在平台上可靠工作所必需的。prod 配置属性在控制器和引脚复用/焊盘级别分别设置。此文件包含控制器级别的 prod 设置。
配置文件位于
hardware/nvidia/platform/t19x/<platform>/bct/
用法
deviceprod.<controller-name>.<controller-id>.<mode>.<address>.<mask> = <value>;
其中
• <controller-name> 是模块的名称:sdmmc、qspi、se 或 i2c。
• <controller-id> 是模块的 origin-0 实例编号,例如 SDMMC4 为 3。
• <mode> 是 prod 设置应用到的控制器模式,例如 default、hs400 等。
• <address> 是控制器和实例内的绝对寄存器地址。
• <mask> 是掩码值(四个字节无符号)。
• <value> 是数据值(四个字节无符号)。
对于 prod 配置文件中的每个条目,MB1 从给定的 address 读取数据,根据 mask 和 value 修改数据,然后将其写回 address。
设备端实现
val = read(address);
val = (val & ~mask) | (value & mask);
write(val, address);
示例
#Qspi0
deviceprod.qspi.0.default.0x03270004.0x7C00 = 0x0 #TX 微调器
deviceprod.qspi.0.default.0x03270004.0xFF = 0x10 #RX 微调器
#Qspi1
deviceprod.qspi.1.default.0x03300004.0x7C00 = 0x0 #TX 微调器
deviceprod.qspi.1.default.0x03300004.0xFF = 0x10 #RX 微调器
#SDMMC
deviceprod.sdmmc.3.default.0x034601e4.0x00003FFF = 0x0 # 自动校准 pd 和 pu 偏移量
deviceprod.sdmmc.3.hs400.0x03460100.0x1FFF0000 = 0x14080000 # tap 和 trim 值
deviceprod.sdmmc.3.hs400.0x0346010c.0x00003F00 = 0x00000028 # DQS trim 值
deviceprod.sdmmc.3.ddr52.0x03460100.0x1FFF0000 = 0x14080000 # tap 和 trim 值
焊盘电压配置
Jetson Xavier 设备的引脚和焊盘设计为支持给定接口的多个电压电平。它们可以在 1.2 伏 (V)、1.8 V 或 3.3 V 下工作。根据给定平台的接口和电源树,软件必须写入这些焊盘的正确电压才能启用接口。如果焊盘电压高于 I/O 电源轨,则引脚在该电平下不起作用。如果焊盘电压低于 I/O 电源轨,则可能会损坏 SoC 焊盘。因此,需要根据电源树配置正确的焊盘电压。
焊盘配置文件位于:
Linux_for_Tegra/bootloader/t186ref/BCT/t194-mb1-bct-pad-padvoltage-<board>-<revision>.cfg
用法
pad-voltage.<address> = <value>;
其中
• <address> 是绝对寄存器地址。
• <value> 是 32 位数据值。
对于 PAD 配置中的每个条目,MB1 将指定的 <value> 写入指定的 <address>。
设备端实现
write(value, address);
示例
pmc.0x0c36003c = 0x0000003e; # PMC_IMPL_E_18V_PWR_0
pmc.0x0c360040 = 0x00000079; # PMC_IMPL_E_33V_PWR_0
PMIC 配置
在系统启动期间,MB1 启用系统电源轨,例如 CPU、SRAM 和 CORE,以及一些系统 PMIC 配置。典型的配置是
• 启用电源轨
• 设置电源轨电压
• FPS 配置
启用和设置电源轨电压可能需要某些平台特定的配置
• 发送到设备的 I2C 命令
• 发送到设备的 PWM 命令
• MMIO 访问 Jetson 寄存器,可以是读-修改-写或仅写
• 命令后的延迟
PMIC 配置文件中的条目可以是通用条目,也可以是特定于电源轨的条目。特定于电源轨的配置(例如 I2C 命令、MMIO 访问和延迟)是平台特定的。MB1 BCT 配置文件必须提供配置信息。
MB1-CFG 格式支持
• 任何序列上的 I2C、脉冲宽度调制 (PWM) 命令和 MMIO 命令。
• 任何 I2C/PWM 控制器实例。
• 设备的任何 7 位从设备地址。
• 读-修改-写格式的 MMIO 命令,以支持只读和读-修改-写格式。
• 读-修改-写格式的 I2C 命令,以支持只读和读-修改-写格式。
• 用于启用和配置 PWM 的 PWM 命令。
• 命令之间的任何延迟量。
• 用于 PWM/I2C/MMIO 的仅写命令。
• i2c 命令的任何大小的设备寄存器地址和数据大小。
• 400KHz 的 I2c 命令。
• 序列可以是
• 1 个 MMIO,1 个 I2C
• 1 个 I2C,1 个 MMIO
• 2 个 MMIO,1 个 I2C
• 1 个 MMIO,2 个 I2C
典型的电源轨/配置分为以下 PMIC 命令域
• 通用:通用 PMIC 配置。
• CPU:与 CPU 电源轨相关的命令。
• GPU:与 GPU 相关的命令。
• SRAM:与 SRAM 相关的命令。
• CORE:与 CORE 相关的命令。
• MEM:与内存相关的命令。
• THERMAL:用于散热配置的命令。
• SHUTDOWN:用于关机相关配置的命令。
如果未为给定电源轨标识配置,则不需要该电源轨的命令序列,因为 MB1 设备端代码会忽略该电源轨的配置。
每个电源轨都使用唯一的 ID 进行定义,以简化解析和 BCT 二进制文件。唯一的 ID 如下所示
电源轨名称 | ID |
通用 | 1 |
CPU | 2 |
CORE | 3 |
SRAM | 4 |
GPU | 5 |
MEM | 6 |
THERMAL | 7 |
SHUTDOWN | 8 |
PMIC 配置文件为
Linux_for_Tegra/bootloader/t186ref/BCT/<device>-tegra194-mb1-bct-pmic-<partnumber>-<revision>.cfg
其中
• <device> 是设备类型,Jetson-NX 或 Jetson-AGX。
• <partnumber> 是设备的完整部件号
• p3668-0000 用于 Jetson Xavier NX 开发模块,与 Jetson Xavier NX 开发者套件一起分发
• p3668-0001 用于原始 Jetson Xavier NX 生产模块
• p3668-0003 用于 Jetson Xavier NX 16GB 生产模块
• p2888-0001 用于原始 Jetson AGX Xavier 模块(具有 16 GB 内存)
• p2888-0004 用于具有 32 GB 内存的 Jetson AGX Xavier 模块
• p2888-0005 用于具有 64 GB 内存的 Jetson AGX Xavier 模块
• <revision> 是模块的修订号,例如 A01。
通用参数的用法
pmic.<cparameter> = <value>;
其中 <cparameter> 是以下之一
• command-retries-count:允许的命令尝试次数。
• wait-before-start-bus-clear-us:确定发出总线清除命令之前的等待超时时间。等待超时时间为 1<<n 微秒,其中 n 是此参数的值。
• rail-count:配置文件中电源轨的数量。
示例
pmic.command-retries-count = <value>;
pmic.wait-before-start-bus-clear-us = <value>;
pmic.rail-count = <value>;
特定于电源轨的参数的用法
<pmic>.<railname>.<rparameter> = <value>;
其中
• <railname> 标识电源轨,是以下之一
• generic 或 system:通用 PMIC 配置。
• cpu 或 cpu0:CPU 0 电源轨配置。
• cpu1:CPU 1 电源轨配置。
• core:Core/SoC 电源轨配置。
• memio:内存电源轨配置。
• thermal:外部热传感器配置。
• platform:其他平台 I2C 配置。
• <rparameter> 是以下之一
• block-count:电源轨的块数。
• block[<bindex>].type:指定块中命令的类型。有效值为 0 (MMIO)、1 (I2C) 和 2 (PWM)。
<bindex> 是块的索引,从 0 开始计数。
• block[<bindex>].count:指定块中命令的数量。
• block[<bindex>].delay:块中每个命令后的延迟,以微秒为单位。
• block[<bindex>].commands[<cindex>].<address>.<mask>:指定块中的命令。
如果 block[<bindex>].type 为 0,则指定 MMIO 命令。如果为 1,则指定 I2C 命令。
• <cindex> 是命令索引,从 0 开始计数。要写入多个命令,请在参数中指定它们,并使用连续的 <cindex> 值。
• <address> 是 MMIO 寄存器的绝对地址或 I2C 从设备寄存器的地址。
• <mask> 是 32 位 MMIO 掩码或 I2C 从设备掩码。它应用于从 MMIO 寄存器或 I2C 从设备寄存器读取的值,以方便读-修改-写操作。
• block[<index>].<i2c-parameter>:指定 I2C 参数。仅当 block[<index>].type = 1 时有效。
<i2c-parameter> 必须是以下之一
• i2c-controller-id:I2C 控制器实例。
• slave-add:7 位 I2C 从设备地址。
• reg-data-size:寄存器大小(以位为单位)。有效值为 0(一字节)、8(一字节)和 16(两字节)。
• reg-add-size:寄存器地址大小(以位为单位)。有效值为 0(一字节)、8(一字节)和 16(两字节)。
• block[<index>].<pwm-command>:指定 PWM 参数。仅当 block[<index>].type = 2 时有效。
<pwm-parameter> 必须是以下之一
• controller-id:PWM 控制器实例 (0-7)。
• source-frq-hz:PWM 时钟源频率,以赫兹为单位。
• period-ns:PWM 时间周期,以纳秒为单位。
• min-microvolts:如果占空比为 0,则 PWM 稳压器的 Vout。
• max-microvolts:如果占空比为 100,则 PWM 稳压器的 Vout。
• init-microvolts:初始化后 PWM 稳压器的 Vout。
• Enable:1(配置后启用 PWM)或 0(配置但不启用)。
示例
######################## 系统配置 ####
# PMIC FPS 在时隙 0 中打开 SD4 (VDD_DDR_1V1)
# PMIC FPS 在时隙 1 中将 GPIO2 (EN_DDR_VDDQ) 设置为高电平
# 在 POR 复位时设置 SLPEN = 1 和 CLRSE
pmic.system.block[0].type = 1; #I2C
pmic.system.block[0].controller-id = 4;
pmic.system.block[0].slave-add = 0x78; # 7BIt:0x3c
pmic.system.block[0].reg-data-size = 8;
pmic.system.block[0].reg-add-size = 8;
pmic.system.block[0].block-delay = 10;
pmic.system.block[0].commands[0].0x53.0x38 = 0x00; # SD4 FPS UP 时隙 0
pmic.system.block[0].commands[1].0x55.0x38 = 0x10; # GPIO2 FPS UP 时隙 2
pmic.system.block[0].commands[2].0x41.0x1C = 0x1C; # SLPEN=1, CLRSE = 11
# PMIC FPS 编程将 SD1、SD2、LDO4 和 LDO5 重新分配到
# FPS0,以便在 SC7 中保持这些电源轨开启
pmic.system.block[1].type = 1; #I2C
pmic.system.block[1].controller-id = 4;
pmic.system.block[1].slave-add = 0x78; # 7BIt:0x3c
pmic.system.block[1].reg-data-size = 8;
pmic.system.block[1].reg-add-size = 8;
pmic.system.block[1].block-delay = 10;
pmic.system.block[1].commands[0].0x50.0xC0 = 0x00; # SD1 FPS 到 FPS0
pmic.system.block[1].commands[1].0x51.0xC0 = 0x00; # SD2 FPS 到 FPS0
pmic.system.block[1].commands[2].0x4A.0xC0 = 0x00; # LDO4 FPS 到 FPS0
pmic.system.block[1].commands[3].0x4B.0xC0 = 0x00; # LDO5 FPS 到 FPS0
pmic.system.block[1].commands[4].0x4C.0xC0 = 0x00; # LDO6 FPS 到 FPS0
# VDDIO_DDR 到 1.1V,SD4 到 1.1V
pmic.system.block[2].type = 1; #I2C
pmic.system.block[2].controller-id = 4;
pmic.system.block[2].slave-add = 0x78; # 7BIt:0x3c
pmic.system.block[2].reg-data-size = 8;
pmic.system.block[2].reg-add-size = 8;
pmic.system.block[2].block-delay = 10;
pmic.system.block[2].commands[0].0x1A.0xFF = 0x28; # SD4 到 1.1V
######################## #CORE(SOC) 电源轨配置 ###############
# 1. 设置 850mV 电压。
pmic.core.block[0].type = 2; # PWM 类型
pmic.core.block[0].controller-id = 6; #SOC_GPIO10: PWM7
pmic.core.block[0].source-frq-hz = 204000000; #204MHz
pmic.core.block[0].period-ns = 1255; # 800KHz。
pmic.core.block[0].min-microvolts = 400000;
pmic.core.block[0].max-microvolts = 1200000;
pmic.core.block[0].init-microvolts = 850000;
pmic.core.block[0].enable = 1;
# 2. 使 soc_gpio10 引脚处于非三态
pmic.core.block[1].type = 0; # MMIO 类型
pmic.core.block[1].block-delay = 3000;
pmic.core.block[1].commands[0].0x02434080.0x10 = 0x0; # soc_gpio10: 三态 (b4) = 0
######################## #CPU0 电源轨配置 ###############
# 1. 设置 800mV 电压。
pmic.cpu0.block[0].type = 2; # PWM 类型
pmic.cpu0.block[0].controller-id = 5; #soc_gpio13; PWM6
pmic.cpu0.block[0].source-frq-hz = 204000000; #204MHz
pmic.cpu0.block[0].period-ns = 1255; # 800KHz。
pmic.cpu0.block[0].min-microvolts = 400000;
pmic.cpu0.block[0].max-microvolts = 1200000;
pmic.cpu0.block[0].init-microvolts = 800000;
pmic.cpu0.block[0].enable = 1;
# 2. CPU PWR_REQ cpu_pwr_req_0_pb0 为 1
pmic.cpu0.block[1].type = 0; # MMIO 类型
pmic.cpu0.block[1].block-delay = 3;
pmic.cpu0.block[1].commands[0].0x02214e00.0x3 = 0x00000003; # CONFIG B0
pmic.cpu0.block[1].commands[1].0x02214e0c.0x1 = 0x00000000; # CONTROL B0
pmic.cpu0.block[1].commands[2].0x02214e10.0x1 = 0x00000001; # OUTPUT B0
pmic.cpu0.block[1].commands[3].0x02446008.0x400 = 0x00000000; # cpu_pwr_req_0_pb0 到 GPIO 模式
pmic.cpu0.block[1].commands[4].0x02446008.0x10 = 0x00000000; # cpu_pwr_req_0_pb0 三态(b4)=0
# 3. 将 soc_gpio13 设置为非三态
pmic.cpu0.block[2].type = 0; # MMIO 类型
pmic.cpu0.block[2].commands[4].0x02434098.0x10 = 0x00; # soc_gpio13 设置为非三态
######################## 平台配置 ###############
# 将引脚 4/引脚 5 配置为 gpio 扩展器 (0x40) 的输出
# 将 gpio 扩展器 (0x40) 的引脚 4 配置为低电平,引脚 5 配置为高电平
pmic.platform.block[0].type = 1; #I2C
pmic.platform.block[0].controller-id = 1; #gen2
pmic.platform.block[0].slave-add = 0x40; # 7BIt:0x20
pmic.platform.block[0].reg-data-size = 8;
pmic.platform.block[0].reg-add-size = 8;
pmic.platform.block[0].block-delay = 10;
pmic.platform.block[0].commands[0].0x03.0x30 = 0x00; # 将引脚 4/引脚 5 配置为输出
pmic.platform.block[0].commands[1].0x01.0x30 = 0x20; # 将引脚 4 配置为低电平,引脚 5 配置为高电平
• 特定于电源轨的命令分为多个块。
• 每个电源轨可以有一个或多个块。给定电源轨的每个块都从 0 开始索引。
• 每个块包含 MMIO 或 I2C 命令。如果同时需要 MMIO 和 I2C 命令,则命令将分解为多个块。
• 如果一个块包含 I2C 类型的命令,则所有命令都将发送到同一设备。如果多个设备需要 I2C 命令,则必须将其拆分为多个块。
• 如果给定块上的命令是 I2C 类型,则 MMIO 命令不需要设备地址、寄存器地址大小和寄存器数据大小参数。
• 给定块可以包含多个命令,但所有命令必须是同一类型。
• 在给定块的每个命令之后提供延迟。所有命令的延迟都相同。如果需要不同的延迟,则必须将其拆分为多个块。
特定于电源轨的参数以以下内容为前缀
pmic.<rail-name>.<rail-id>
参数 | 描述 |
block-count | 指定块计数。 pmic.<rail-name>.<rail-id>.block-count = <value>; 其中 <value>(对于 block-count)是给定电源轨的命令块数。 |
block | 指定块标识参数。所有块都从 0 开始索引。 pmic.<rail-name>.<rail-id>.block[index] |
type | 指定命令类型,MMIO (0) 或 I2C (1)。 |
delay | 指定给定块中每个命令后的延迟,以微秒为单位。 |
count | 指定块中命令的数量。 |
I2C 类型特定参数
I2C 类型特定参数如下
参数 | 描述 |
I2c-controller-id | I2C 的控制器 ID。 |
slave-add | 7 位从设备地址。 |
reg-data-size | 寄存器大小(以位为单位) 0 或 8:1 字节 16:2 字节 |
reg-add-size | 寄存器地址大小(以位为单位) 0 或 8:1 字节 16:2 字节 |
命令
命令可以是 MMIO 或 I2C。<address>.<mask> = <data> 格式的信息,用于支持读-修改-写序列。所有命令都已索引,以方便在给定块中使用多个命令。命令按顺序发送到设备,从索引 0 开始,格式如下
commands[command-index].<addr>.<mask> = <data>;
PWM 特定命令
PWM 特定命令如下
命令 | 值 |
type | 2(对于 PWM = 2) |
controller-id | <0 到 7> /* 基于平台 */ |
source-frq-hz | <PWM 时钟源频率> /* 以 Hz 为单位 */ |
period-ns | <周期(纳秒)> /* PWM 周期 */ |
min-microvolts | <如果占空比为 0,则 PWM 稳压器的 Vout> |
max-microvolts | <如果占空比为 100,则 PWM 稳压器的 Vout> |
init-microvolts | <初始化后 PWM 稳压器的 Vout。 |
enable | <1/0> /* 启用 PWM 或仅配置 */ |
例如
# 1. 设置 950mV 电压。
pmic.core.3.block[0].type = 2; # PWM 类型
pmic.core.3.block[0].controller-id = 5; #GP_PWM6
pmic.core.3.block[0].source-frq-hz = 102000000; #102MHz
pmic.core.3.block[0].period-ns = 2600; # 384K 是周期。
pmic.core.3.block[0].min-microvolts = 600000;
pmic.core.3.block[0].max-microvolts = 1200000;
pmic.core.3.block[0].init-microvolts = 950000;
pmic.core.3.block[0].enable = 1;
通用格式
以下代码片段显示了通用格式的通用参数和特定于电源轨的参数。
通用参数为
pmic.command-retries-count = <u32>;
pmic.wait-before-start-bus-clear-us = <u32>;
pmic.rail-count = <u32>;
特定于电源轨的参数为
pmic.<rail-name>.block-count
通用格式如下
##### 块 0 ####
pmic.<rail-name>.<rail-id>.block[0].type = <0 表示 MMIO,1 表示 I2C>
pmic.<rail-name>.<rail-id>.block[0].delay = <u32>
pmic.<rail-name>.<rail-id>.block[0].count = <calculated>;
#对于 I2C 特定参数
pmic.<rail-name>.<rail-id>.block[0].I2c-controller-id = <u32>;
pmic.<rail-name>.<rail-id>.block[0].slave-add = <u32>;
pmic.<rail-name>.<rail-id>.block[0].reg-data-size = <u32>;
pmic.<rail-name>.<rail-id>.block[0].reg-add-size = <u32>;
#I2C 和 MMIO
pmic.<rail-name>.<rail-id>.block[0].commands[0].<addr>.<mask> = <data>;
pmic.<rail-name>.<rail-id>.block[0].commands[1].<addr>.<mask> = <data>;
pmic.<rail-name>.<rail-id>.block[0].commands[2].<addr>.<mask> = <data>;
pmic.<rail-name>.<rail-id>.block[0].commands[3].<addr>.<mask> = <data0>;
::::
##### 块 1 ####
pmic.<rail-name>.<rail-id>.block[1].type = <0 表示 MMIO,1 表示 I2C>
pmic.<rail-name>.<rail-id>.block[1].delay = <u32>
pmic.<rail-name>.<rail-id>.block[1].count = <Calculated>
#对于 I2C
pmic.<rail-name>.<rail-id>.block[1].I2c-controller-id
pmic.<rail-name>.<rail-id>.block[1].slave-add
pmic.<rail-name>.<rail-id>.block[1].reg-data-size
pmic.<rail-name>.<rail-id>.block[1].reg-add-size
#I2C 和 MMIO
pmic.<rail-name>.<rail-id>.block[1].commands[0].<addr>.<mask> = <data>;
pmic.<rail-name>.<rail-id>.block[1].commands[1].<addr>.<mask> = <data>;
pmic.<rail-name>.<rail-id>.block[1].commands[2].<addr>.<mask> = <data>;
pmic.<rail-name>.<rail-id>.block[1].commands[3].<addr>.<mask> = <data0>;
::::
例如,在用法中
pmic.command-retries-count = 1;
pmic.wait-before-start-bus-clear-us = 0;
pmic.rail-count = 6;
###############通用电源轨 (ID = 1) 数据 ###############
pmic.generic.1.block-count = 1;
# 1. 设置 PMIC MBLDP = 1,CNFGGLBL1 位 6 = 1
pmic.generic.1.block[0].type = 1; # I2C 类型
pmic.generic.1.block[0].i2c-controller-id = 4;
pmic.generic.1.block[0].slave-add = 0x78; # 7BIt:0x3c
pmic.generic.1.block[0].reg-data-size = 8;
pmic.generic.1.block[0].reg-add-size = 8;
pmic.generic.1.block[0].delay = 10;
pmic.generic.1.block[0].count = 1;
pmic.generic.1.block[0].commands[0].0x00.0x40 = 0x40;
######################## #CORE 电源轨 (ID = 3) 数据 ###############
pmic.core.3.block-count = 2;
# 1. 设置 950mV 电压。
pmic.core.3.block[0].type = 1; # I2C 类型
pmic.core.3.block[0].i2c-controller-id = 4;
pmic.core.3.block[0].slave-add = 0x70; # 7BIt:0x38
pmic.core.3.block[0].reg-data-size = 8;
pmic.core.3.block[0].reg-add-size = 8;
pmic.core.3.block[0].delay = 1000;
pmic.core.3.block[0].count = 1;
pmic.core.3.block[0].commands[0].0x07.0xFF = 0x2E;
# 2. 将 GPIO3 掉电时隙设置为 6。
pmic.core.3.block[1].type = 1; # I2C 类型
pmic.core.3.block[1].i2c-controller-id = 4;
pmic.core.3.block[1].slave-add = 0x78; # 7BIt:0x3c
pmic.core.3.block[1].reg-data-size = 8;
pmic.core.3.block[1].reg-add-size = 8;
pmic.core.3.block[1].delay = 10;
PWM 特定示例
pmic.core.3.block-count = 1;
# 1. 设置 950mV 电压。
pmic.core.3.block[0].type = 2; # PWM 类型
pmic.core.3.block[0].controller-id = 5; #GP_PWM6
pmic.core.3.block[0].source-frq-hz = 102000000; #102MHz
pmic.core.3.block[0].period-ns = 2600; # 384K 是周期。
pmic.core.3.block[0].min-microvolts = 600000;
pmic.core.3.block[0].max-microvolts = 1200000;
pmic.core.3.block[0].init-microvolts = 950000;
pmic.core.3.block[0].enable = 1;
::::
安全配置
Jetson Xavier 设备具有单独的寄存器,用于配置桥客户端安全性和桥防火墙,称为安全配置寄存器 (SCR)。SCR 由 NVIDIA 为 Jetson Xavier 平台配置,或由客户为自定义平台配置。
MB1 和 MB2 对 T19x 中的大多数 SCR 和防火墙进行编程。它们从 SCR 配置文件中获取配置值。
SCR 和防火墙的列表及其顺序和地址是预先确定的。
SCR 的值按配置文件属性索引的顺序进行编程,而不是按它们在配置文件中出现的顺序进行编程。未在配置文件中指定的 SCR 和防火墙将被锁定,而不会限制对它们保护的寄存器的访问。
安全配置文件保存在
• 对于 Jetson Xavier NX 系列:./hardware/nvidia/platform/t19x/common/bct/scr/bct-scr-cbb-mini.cfg
• 对于 Jetson AGX Xavier 系列:./hardware/nvidia/platform/t19x/common/bct/scr/bct-scr-cbb-mini-p3668.cfg
用法
scr.<reg_index\>.<exclusion-info> = <32-bit value>;
其中
• <reg_index> 是预定义列表中 SCR 或防火墙的索引。
• <exclusion-info> 是一个位字段
• 位 0 = 1:请勿在冷启动或 SC7 退出时编程。
• 位 1 = 1:在冷启动时编程,但在 SC7 退出时跳过。
• 位 2 = 1:在 MB2 结束时而不是 MB1 时编程。
• 位 3-7:未使用。
示例
scr.161.7 = 0x3f008080; # TKE_AON_SCR_WDTSCR0_0
scr.162.4 = 0x18000303; # DMAAPB_1_SCR_BR_INTR_SCR_0
scr.163.4 = 0x18000303; # DMAAPB_1_SCR_BR_SCR_0
GPIO 中断映射配置
为了减少来自单个 ISR 的 GPIO 引脚的中断查找时间,T19x 上的每个 GPIO 控制器都有八条连接到 LIC 的中断线。这使您可以将 GPIO 引脚映射到八个中断中的任何一个。中断映射在 GPIO 中断配置文件中定义。
用法
gpio-intmap.port.<port-name>.pin.<pin-id> = <interrupt-id>;
其中
• <port-name> 是端口名称,例如 A、B、C、… Z、AA 或 BB
• <pin-id> 是端口中的引脚 ID。有效值为 0-7。
• <interrupt-id> 是该引脚的中断路由。有效值为 0-7。
GPIO 中断映射配置文件保存在
./hardware/nvidia/platform/t19x/<platform>/bct/
示例
gpio-intmap.port.B.pin.1 = 0; # GPIO B1 to INT0
gpio-intmap.port.AA.pin.0 = 0; # GPIO AA0 to INT0
gpio-intmap.port.AA.pin.1 = 0; # GPIO AA1 to INT0
gpio-intmap.port.AA.pin.2 = 0; # GPIO AA2 to INT0
存储设备配置
存储设备配置文件包含 MB1 和 MB2 中存储设备的平台特定设置。
存储设备配置文件保存在
./hardware/nvidia/platform/t19x/<platform>/bct/
用法
device.<storage-device>.<instance>.<parameter> = <value>;
其中
• <storage-device> 标识存储设备控制器:qspiflash、ufs、sdmmc 或 sata。
• <instance> 是存储控制器的实例。
• <parameter> 是控制器特定的参数,如下所示。
QSPI Flash 参数
如果 <storage-device>=qspi,则 <parameter> 可以是
• clock-source-id:标识时钟源。 <value> 可以是
• 1:CLK_M
• 3:PLLP_OUT0
• 4:PLLM_OUT0
• 5:PLLC_OUT0
• 6:PLLC4_MUXED
• clock-source-frequency:时钟源频率,以赫兹为单位。
• interface-frequency:QSPI 控制器频率,以赫兹为单位。
• enable-ddr-mode:指定 QSPI 数据速率。 <value> 可以是
• 0:QSPI SDR 模式
• 1:QSPI DDR 模式
• maximum-bus-width:最大 QSPI 总线宽度。 <value> 可以是
• 0:QSPI x1 通道
• 2:QSPI x4 通道
• fifo-access-mode:指定 FIFO 访问模式。 <value> 可以是
• 0:PIO 模式
• 1:DMA 模式
• ready-dummy-cycle:每个 QSPI flash 的空闲周期数。
• trimmer1-val:TX 微调器值。
• trimmer2-val:RV 微调器值。
SDMMC 参数
如果 <storage-device>=sdmmc,则 <parameter> 可以是
• clock-source-id:SDMMC 控制器时钟源。 <value> 可以是
• 0:PLLP_OUT0
• 1:PLLC4_OUT2_LJ
• 2:PLLC4_OUT0_LJ
• 3:PLLC4_OUT2
• 4:PLLC4_OUT1
• 5:PLLC4_OUT1_LJ
• 6:CLK_M
• 7:PLLC4_VCO
• clock-source-frequency:时钟源频率(单位:Hz)/
• best-mode:支持的最高运行模式。 <value> 可以是
• 0:SDR26
• 1:DDR52
• 2:HS200
• 3:HS400
• pd-offset:下拉偏移。
• pu-offset:上拉偏移。
• enable-strobe-hs400:启用 HS400 选通。
• dqs-trim-hs400:HS400 DQS 微调值。
UFS 参数
如果 <storage-device>=ufs,则 <parameter> 可以是
• max-hs-mode:UFS 设备支持的最高 HS 模式。 <value> 可以是
• 1:HS GEAR1
• 2:HS GEAR2
• 3:HS GEAR3
• max-pwm-mode:UFS 设备支持的最高 PWM 模式。 <value> 可以是
• 1:PWM GEAR1
• 2:PWM GEAR2
• 3:PWM GEAR3
• 4:PWM GEAR4
• max-active-lanes:最大 UFS 通道数 <value> 可以是 1 或 2。
• page-align-size:用于 UFS 数据结构的页面对齐大小(以字节为单位)。
• enable-hs-mode:指定是否启用 UFS HS 模式。 <value> 可以是
• 0:禁用
• 1:启用
• enable-fast-auto-mode:指定是否启用快速自动模式。 <value> 可以是
• 0:禁用
• 1:启用
• enable-hs-rate-a:指定是否启用 HS rate A。 <value> 可以是
• 0:禁用
• 1:启用
• enable-hs-rate-b:指定是否启用 HS rate B。 <value> 可以是
• 0:禁用
• 1:启用
• init-state:MB1 进入时 UFS 设备的初始状态。 <value> 可以是
• 0:UFS 未由 BootROM 初始化
• 1:UFS 由 BootROM 初始化(MB1 可以跳过某些步骤)
SATA 参数
如果 <storage-device>=sata,则 <parameter> 可以是
• transfer-speed:指定传输速度。 <value> 可以是
• 0:GEN1
• 1:GEN2
示例
# QSPI flash 0
device.qspiflash.0.clock-source-id = 6;
device.qspiflash.0.clock-source-frequency = 13000000;
device.qspiflash.0.interface-frequency = 13000000;
device.qspiflash.0.enable-ddr-mode = 0;
device.qspiflash.0.maximum-bus-width = 2;
device.qspiflash.0.fifo-access-mode = 1;
device.qspiflash.0.read-dummy-cycle = 8;
device.qspiflash.0.trimmer1-val = 0;
device.qspiflash.0.trimmer2-val = 0;
# Sdmmc 3
device.sdmmc.3.clock-source-id = 3; #PLLP_OUT0
device.sdmmc.3.clock-source-frequency = 52000000;
device.sdmmc.3.best-mode = 3; #1=DDR52, 3=HS400
device.sdmmc.3.pd-offset = 0;
device.sdmmc.3.pu-offset = 0;
device.sdmmc.3.enable-strobe-hs400 = 0;
device.sdmmc.3.dqs-trim-hs400 = 0;
# Ufs 0
device.ufs.0.max-hs-mode = 3;
device.ufs.0.max-pwm-mode = 4;
device.ufs.0.max-active-lanes = 2;
device.ufs.0.page-align-size = 4096;
device.ufs.0.enable-hs-mode = 1;
device.ufs.0.enable-fast-auto-mode = 0;
device.ufs.0.enable-hs-rate-b = 1;
device.ufs.0.enable-hs-rate-a = 0;
device.ufs.0.init-state = 0;
UPHY 通道配置
UPHY 通道可以配置为由各种 IP 拥有,例如 XUSB、SATA、MPHY、PCIE、NVLINK 等。MB1 支持 SATA 和 UFS 作为启动设备,为此必须配置 UPHY 通道以在 MB1 和 MB2 中访问存储。此文件定义了 MB1 的 UPHY 通道配置。
在 MB2 之后,引导加载程序加载 BPMP 固件 (BPMP-FW),它可以保留 MB1 编程的配置,并执行额外的通道配置以支持其他客户端。此文件中定义的通道配置不适用于 BPMP-FW。
UPHY 通道配置保存在
./hardware/nvidia/platform/t19x/<platform>/bct/
用法
uphy-lane.<instance-type>.<uphy-component>.<id> = <owner-id>
其中
• <instance-type> 是需要配置的 UPHY 的类型。它可以是 hsio 或 nvhs。
• <uphy-component> 指定此设置是配置通道还是 PLL。它可以是 lane 或 pll。
• <id> 是要配置的通道或 PLL 编号。
• <owner-id> 是分配通道或 PLL 的所有者的唯一 ID。
示例
#UPHY
uphy-lane.hsio.lane.10 = 2;
uphy-lane.hsio.lane.11 = 1;
OEM-FW 棘齿配置
棘齿效应是一种防止加载旧版本固件的机制。它由 OEM-FW 棘齿版本控制,该版本保存在引导配置表 (BCT) 中。
固件组件的棘齿版本在安全漏洞修复后递增。在 MB1 加载组件之前,它会将组件的棘齿版本与软件的引导组件标头 (BCH) 中存储的版本进行比较。如果 BCH 中的版本低于 BCT 中的棘齿版本号,MB1 将不会加载固件。
棘齿配置文件保存在
./hardware/nvidia/platform/t19x/<platform>/bct/ratchet
用法
ratchet.<fw_index>.<loader_name>.<fw_name> = <ratchet_value>
其中
• <fw_index> 是 OEM-FW 组件的唯一索引。
• <loader_name> 是引导阶段二进制文件的名称,该文件加载与 <fw_index> 对应的固件。
• <fw_name> 是固件的名称。
• <ratchet_value> 是固件的棘齿版本号。
示例
#ratchet
ratchet.1.mb1.mb1bct = 3;
ratchet.2.mb1.spefw = 0;
ratchet.11.mb2.cpubl = 5;
BootROM 复位 PMIC 配置
某些 T194 平台可能需要在 L1 和 L2 复位引导路径中,BootROM 将 PMIC 电源轨设置为 OTP 值。这是通过发出 I2C 命令来完成的,这些命令由 MB1 基于 MB1 BCT 中的 BootROM 复位配置编码到 AO 暂存器中。
BootROM 发出这些命令的复位情况包括
• 看门狗 5 超时
• 看门狗 4 超时
• SC7 退出
• SC8 退出
• 软件复位
• AO-Tag/传感器复位
• VF 传感器复位
• HSM 复位
每个复位情况可以有三组 AO 命令块。每个 AO 块可以有多个块,每个块可以有多个命令。
在配置文件中,首先指定 AO 块,然后使用 AO 块的 ID 初始化所有复位条件。
指定 AO 块的用法
bootrom.<parameter> = <value>;
其中 <parameter> 是以下之一
• aoblock-count:文件中提到的 AO 块的数量。
• aoblock[<aoblock-index>].command-retries-count:指定允许指定 AO 块的命令尝试次数。
<aoblock-index> 标识指定的 AO 块,从零开始计数。
• aoblock[<aoblock-index>].delay-between-command-us:指定命令之间的延迟,以微秒为单位。延迟为 1<<n 微秒,其中 n 是此参数的值。
• aoblock[<aoblock-index>].wait-before-start-bus-clear-us:指定在为给定 AO 块发出总线清除命令之前的等待超时时间,以微秒为单位。等待时间为 1<<n 微秒,其中 n 是此参数的值。
• aoblock[<aoblock-index>].block-count:指定 AO 块中的块数。
• aoblock[<aoblock-index>].block[<block-index>].type:必须为 −1,表示 I2C 命令块,
• aoblock[<aoblock-index>].block[<block-index>].count:指定块中的命令数。
• aoblock[<aoblock-index>].block[<block-index>].i2c-controller-id:标识 I2C 控制器实例。
• aoblock[<aoblock-index>].block[<block-index>].slave-add:7 位 I2C 从设备地址。
• aoblock[<aoblock-index>].block[<block-index>].reg-data-size:寄存器大小(以位为单位)。有效值为 0(一字节)、8(一字节)和 16(两字节)。
• aoblock[<aoblock-index>].block[<block-index>].reg-add-size:寄存器地址大小(以位为单位)。有效值为 0(一字节)、8(一字节)和 16(两字节)。
• aoblock[<aoblock-index>].block[<block-index>].commands[<command-index>].<reg-addr>:要写入到 I2c 从设备寄存器地址 <reg-addr> 的值,用于由 <command-index> 索引的命令。
指定复位类型到 AO 块映射的用法
复位类型使用以下形式的行映射到先前声明的 AO 块
bootrom.<reset-name>.aocommand[<AO-command-index>] = <AO-block-ID>;
其中
• <reset-name> 指定复位类型。它必须具有以下值之一:watchdog5、watchdog4、sc7、sc8、soft-reset、sensor-aotag、vfsensor 或 hsm。
• <AO-command-index> 是 AO 命令的索引。它必须是 0、1 或 2。
• <AO-block-ID> 是 AO 块规范(如上所述)中定义的 <aoblock-index> 值之一。
示例
bootrom.aoblock-count = 2;
# 自动电源循环:设置 MAX77620
# 寄存器 ONOFFCNFG2,位 SFT_RST_WK = 1(冷启动后默认值为“0”),
# 寄存器 ONOFFCNFG1,位 SFT_RST = 1
bootrom.aoblock[0].command-retries-count = 1;
bootrom.aoblock[0].delay-between-commands-us = 1;
bootrom.aoblock[0].wait-before-start-bus-clear-us = 1;
bootrom.aoblock[0].block-count = 1;
bootrom.aoblock[0].block[0].type = 1; # I2C 类型
bootrom.aoblock[0].block[0].slave-add = 0x3c; # 7BIt:0x3c
bootrom.aoblock[0].block[0].reg-data-size = 8;
bootrom.aoblock[0].block[0].reg-add-size = 8;
bootrom.aoblock[0].block[0].count = 2;
bootrom.aoblock[0].block[0].commands[0].0x42 = 0xda;
bootrom.aoblock[0].block[0].commands[1].0x41 = 0xf8;
# 关机:设置 MAX77620
# 寄存器 ONOFFCNFG2,位 SFT_RST_WK = 0
# 寄存器 ONOFFCNFG1,位 SFT_RST = 1
bootrom.aoblock[1].command-retries-count = 1;
bootrom.aoblock[1].delay-between-commands-us = 1;
bootrom.aoblock[1].wait-before-start-bus-clear-us = 1;
bootrom.aoblock[1].block-count = 1;
bootrom.aoblock[1].block[0].type = 1; # I2C 类型
bootrom.aoblock[1].block[0].slave-add = 0x3c; # 7BIt:0x3c
bootrom.aoblock[1].block[0].reg-data-size = 8;
bootrom.aoblock[1].block[0].reg-add-size = 8;
bootrom.aoblock[1].block[0].count = 2;
bootrom.aoblock[1].block[0].commands[0].0x42 = 0x5a;
bootrom.aoblock[1].block[0].commands[1].0x41 = 0xf8;
# 传感器/ao-tag 中的关机
#在软复位中复位。
# 其他情况没有命令
bootrom.sensor-aotag.aocommand[0] = 1;
bootrom.soft-reset.aocommand[0] = 0;
其他配置
不属于其他类别的设置在杂项配置文件中指定。
杂项配置文件保存在
./bct/t194/misc/
用法
大多数属性组都通过以下形式的参数设置
<feature> = <value>;
大多数属性设置布尔标志,用于启用或禁用 MB1 中的某些功能。这些属性按类别描述如下。
MB1 功能属性
• disable_spe:布尔值;启用或禁用 MB1 加载 SPE-FW。
• enable_dram_page_blacklisting:布尔值;启用或禁用 DRAM ECC 页面拒绝列表功能。
• disable_sc7:布尔值;启用或禁用 SC7 进入/退出支持。
• disable_fuse_visibility:布尔值;启用或禁用熔丝可见性。禁用熔丝可见性后,某些熔丝不可见,因此无法读取或写入。某些熔丝默认启用,其他熔丝默认禁用。
• enable_vpr_resize:布尔值;启用或禁用视频保护区域 (VPR) 调整大小功能。
• 0:禁用;VPR 划定区域根据 SDRAM 配置文件中的 McVideoProtectSizeMb 和 McVideoProtectWriteAccess 属性分配。
• 1:启用;VPR 划定区域由 MB1 分配,并且启用对 VPR 划定区域的 TZ 写入访问。
• l2_mss_encrypt_regeneration:指定哪些 MSS 加密密钥将为 L2 RAMDUMP 复位时的划定区域重新生成。
• 位 1:1 = 重新生成 TZDRAM 密钥
• 位 2:1 = 重新生成 VPR 密钥
• 位 3:1 = 重新生成 GSC 密钥
• disable_mb2_glitch_protection:布尔值;启用或禁用对 DCLS 故障、TCM 奇偶校验错误、TCM 和缓存 ECC 的检查。可能的值为
• 0:启用检查
• 1:禁用检查
请注意,值 0 启用检查,而 1 禁用检查。这就是属性名称以“disable”开头的原因。
• enable_dram_error_injection:布尔值;启用或禁用 DRAM 错误注入测试。
• enable_dram_staged_scrubbing:布尔值;启用或禁用分阶段 DRAM 擦洗。
• 0:禁用;如果启用 DRAM ECC,则擦洗整个 DRAM。
• 1:启用;如果启用 DRAM ECC,则分阶段擦洗 DRAM。每个 BL 负责其使用的 DRAM 部分。
• wait_for_debugger_connection:布尔值;启用或禁用等待调试器连接。
• 0:禁用;在 MB1 结束时不等待调试器连接。
• 1:启用;在 MB1 结束时在 while(1) 循环中旋转,直到发生调试器连接。
• pmc_rst_req_cfg:
MB2 功能属性
这些属性配置 MB2 的某些功能。虽然它们适用于 MB2 而不是 MB1,但在此处记录它们是因为它们与多个 MB1 属性组一起在杂项配置文件中定义。
• disable_cpu_l2ecc:布尔值;启用或禁用 CPU L2-ECC。
• enable_sce:布尔值;启用或禁用 MB2 加载 SCE-FW。
• enable_rce:布尔值;启用或禁用 MB2 加载 RCE-FW。
• enable_ape:布尔值;启用或禁用 MB2 加载 APE-FW。
• enable_combined_uart:布尔值;启用或禁用 MB2 中的组合 UART 功能。
• enable_emmc_send_cmd0_cmd1:布尔值;控制是否在 MB2 中向 SDMMC4 控制器发送 CMD0 和 CMD1。此功能可用于优化 CPU-BL 中的 SDMMC4 初始化。
• 0:不发送 SDMMC4 CMD0/CMD1。
• 1:发送 SDMMC4 CMD0/CMD1。
AOTAG 属性
MB1 使用 AOTAG(常时开启热报警发生器)在启动期间进行热保护。这些属性控制 AOTAG 的旋钮。
• aotag.boot_temp_threshold:启动温度阈值,单位为 0.001° C。如果 AOTAG 传感器测量的 SoC 温度高于此字段中指定的温度,则 MB1 会等待或关闭设备。
• aotag.enable_shutdown:布尔值;指定如果启动温度超过 aotag.boot_temp_threshold 时要采取的措施。
• 0:在启动中等待。
• 1:启用使用 AOTAG 关闭。
• aotag.cooldown_temp_threshold:冷却温度阈值,单位为 0.001° C。当设备冷却到此温度时,MB1 恢复启动。
时钟属性
• clock.bpmp_cpu_nic_divider:通过 CLK_SOURCE_BPMP_CPU_NIC[BPMP_CPU_NIC_CLK_DIVISOR] 控制 BPMP CPU 频率的编程。
• 0:不编程。
• 非零值:编程为此值减 1。
• clock.bpmp_apb_divider:通过 CLK_SOURCE_BPMP_APB[BPMP_APB_CLK_DIVISOR] 控制 BPMP APB 频率的编程。
• 0:不编程。
• 非零值:编程为此值减 1。
• clock.axi_cbb_divider:通过 CLK_SOURCE_AXI_CBB[AXI_CBB_CLK_DIVISOR] 控制控制骨干 (CBB) 频率的编程。
• 0:不编程。
• 非零值:编程为此值减 1。
• clock.se_divider:控制通过 CLK_SOURCE_SE[SE_CLK_DIVISOR] 对安全引擎 (SE) 频率进行编程。
• 0:不编程。
• 非零值:编程为此值减 1。
• clock.aon_cpu_nic_divider:控制通过 CLK_SOURCE_AON_CPU_NIC[AON_CPU_NIC_CLK_DIVISOR] 对 AON/SPE CPU 频率进行编程。
• 0:不编程。
• 非零值:编程为此值减 1。
• clock.aon_apb_divider:控制通过 CLK_SOURCE_AON_CPU_NIC[AON_CPU_NIC_CLK_DIVISOR] 对 AON APB 频率进行编程。
• 0:不编程。
• 非零值:编程为此值减 1。
• clock.aon_can0_divider:控制通过 CLK_SOURCE_CAN1[CAN1_CLK_DIVISOR] 对 AON CAN1 频率进行编程。
• 0:不编程。
• 非零值:编程为此值减 1。
• clock.aon_can1_divider:控制 AON CAN2 频率,通过 CLK_SOURCE_CAN2[CAN2_CLK_DIVISOR]。
• 0:不编程。
• 非零值:编程为此值减 1。
• clock.osc_drive_strength:振荡器驱动强度。
• clock.pllaon_divn:指定 PLLAON 的 DIVN 值。
• 0:使用 PLLAON_DIVN = 30、PLLAON_DIVM = 1 和 PLLAON_DIVP = 2。
• 非零值:将 PLLAON_BASE[PLLAON_DIVN] 编程为该值减 1。
• clock.pllaon_divm:通过 PLLAON_BASE[PLLAON_DIVM] 控制 PLLAON 的 DIVM 值。
将 PLLAON_BASE[PLLAON_DIVM] 设置为该值减 1。
当 clock.pllaon_divn = 0 时忽略。
• clock.pllaon_divp:通过 PLLAON_BASE[PLLAON_DIVP] 控制 PLLAON 的 DIVP 值。
将 PLLAON_BASE[PLLAON_DIVP] 设置为该值减 1。
当 clock.pllaon_divn = 0 时忽略。
• clock.pllaon_divn_frac:要编程到 PLLAON_MISC_1[PLLAON_DIVN_FRAC] 中的值。
MB1/MB2 AST 属性
MB1 和 MB2 使用地址转换 (AST) 模块将不同固件组件的 DRAM 划分区域映射到各种辅助处理器集群的 32 位虚拟地址空间中。
这些属性由 MB1 读取,并配置 MB1 和 MB2 对 AST 的使用。
• ast.mb2_va:BPMP-R5 地址空间中 MB2 划分区域的虚拟地址。
• ast.spe_fw_va:AON-R5 地址空间中 SPE-FW 划分区域的虚拟地址。
• ast.misc_carveout_va:SCE-R5 地址空间中 MISC 划分区域的虚拟地址。
• ast.rcm_blob_carveout_va:SCE-R5 地址空间中 RCM-blob 划分区域的虚拟地址。
• ast.temp_map_a_carveout_va:加载二进制文件时使用的临时映射 A 的虚拟地址。
• ast.temp_map_a_carveout_size:加载二进制文件时使用的临时映射 A 的大小。
• ast.temp_map_a_carveout_va:加载二进制文件时使用的临时映射 B 的虚拟地址。
• ast.temp_map_a_carveout_size:加载二进制文件时使用的临时映射 B 的大小。
注意 | 上述虚拟地址空间均不得与 MMIO 区域或彼此重叠。 所有大小属性都必须是 2 的幂。 所有虚拟地址属性都必须与其映射/划分区域对齐。 |
MB2 AST 属性
MB1 和 MB2 使用地址转换 (AST) 模块将不同固件组件的 DRAM 划分区域映射到各种辅助处理器集群的 32 位虚拟地址空间中。这些属性配置 MB2 对 AST 的使用。
• carveout.ape_ast_va:BPMP-R5 地址空间中 APE 划分区域的虚拟地址。
• carveout.apr_ast_va:BPMP-R5 地址空间中 APR 划分区域的虚拟地址。
• carveout.bpmp_ast_va:BPMP-R5 地址空间中 BPMP 划分区域的虚拟地址。
• carveout.sce_ast_va:BPMP-R5 地址空间中 SCE 划分区域的虚拟地址。
• carveout.rce_ast_va:BPMP-R5 地址空间中 RCE 划分区域的虚拟地址。
• carveout.camera_task_ast_va:BPMP-R5 地址空间中 Camera Task 划分区域的虚拟地址。
内存控制器 (MC) 划分区域属性
尽管 SDRAM 配置文件指定了 MC 划分区域的首选基址、大小和权限,但它并未提供 MB1 分配划分区域所需的所有信息。杂项配置文件指定了所需的其他信息。
对于不受 MC 保护的划分区域,所有信息(包括大小和首选基址)均由杂项配置文件指定。
MC 划分区域属性通过以下形式的参数设置
carveout.<carveout-type>.<parameter> = <value>;
其中
• <carveout-type> 标识划分区域,并且必须是以下之一
• gsc[1-31]:用于各种用途的 GSC 划分区域。
• mts:MTS/CPU-uCode 划分区域。
• vpr:VPR 划分区域。
• tzdram:用于 SecureOS 的 TZDRAM 划分区域。
• mb2:用于执行 MB2 的 MB2 划分区域(临时引导划分区域)。
• cpubl:用于执行 MB2 的 CPU-BL 划分区域(临时引导划分区域)。
• misc:用于跨引导阶段共享的各种数据结构的杂项划分区域。
• os:用于加载 OS 内核的 OS 划分区域。
• rcm:用于在 RCM 模式期间加载 RCM-blob 的 RCM 划分区域(临时引导划分区域)。
• <parameter> 是以下参数之一
• pref_base:划分区域的首选基址。
• size:划分区域的大小(以字节为单位)。
• alignment:划分区域基址的对齐方式(以字节为单位)。
• ecc_protected:当启用基于 DRAM 区域的 ECC 并且存在非 ECC 保护的 DRAM 区域时,指定是否从 ECC 保护区域分配划分区域。
• 0:从非 ECC 保护区域分配。
• 1:从 ECC 保护区域分配。
• bad_page_tolerant:当启用 DRAM 页面 DenyListing 时,指定是否允许划分区域中存在坏页。这仅适用于非常大的划分区域,这些划分区域完全由可以使用 SMMU/MMU 避免坏页的组件处理。
• 0:划分区域不允许坏页。
• 1:划分区域允许坏页。(可以在不筛选坏页的情况下完成分配。)
下表显示了划分区域及其参数的有效组合。
<carveout-type> | pref_base | size | alignment | ecc_protected | bad_page_tolerant |
gsc[1-31], mts, vpr | N/A | N/A | 是 | 是 | 是 |
tzdram, mb2, cpubl, misc, os, rcm | 是 | 是 | 是 | 是 | 是 |
Coresight 属性
• coresight.cfg_system_ctl:使用该值编程 CORESIGHT_CFG_SYSTEM_CTL。
• coresight.cfg_csite_mc_wr_ctrl:使用该值编程 CORESIGHT_CFG_CSITE_MC_WR_CTRL。
• coresight.cfg_csite_mc_rd_ctrl:使用该值编程 CORESIGHT_CFG_CSITE_MC_RD_CTRL。
• coresight.cfg_etr_mc_wr_ctrl:使用该值编程 CORESIGHT_CFG_ETR_MC_WR_CTRL。
• coresight.cfg_etr_mc_rd_ctrl:使用该值编程 CORESIGHT_CFG_ETR_MC_RD_CTRL。
• coresight.cfg_csite_cbb_wr_ctrl:使用该值编程 CORESIGHT_CFG_CSITE_CBB_WR_CTRL。
• coresight.cfg_csite_cbb_rd_ctrl:使用该值编程 CORESIGHT_CFG_CSITE_CBB_RD_CTRL。
固件加载和入口属性
• mb2_load_offset:MB2 二进制文件加载到 MB2 划分区域中的偏移量。
• mb2_entry_offset:MB2 入口点在 MB2 划分区域中的偏移量。
• tzram_el3_load_offset:EL3 二进制文件加载到 TZRAM 划分区域中的偏移量。
• tzram_el3_entry_offset:EL3 二进制文件入口点在 TZRAM 划分区域中的偏移量。
• cpubl_load_offset:CPUBL 二进制文件加载到 CPUBL 划分区域中的偏移量。
• cpubl_entry_offset:CPUBL 入口点在 CPUBL 划分区域中的偏移量。
• ape_fw_load_offset:APE-FW 二进制文件加载到 APE 划分区域中的偏移量。
• ape_fw_entry_offset:APE-FW 入口点在 APE 划分区域中的偏移量。
• bpmp_fw_load_offset:BPMP-FW 二进制文件加载到 BPMP 划分区域中的偏移量。
• bpmp_fw_entry_offset:BPMP-FW 入口点在 BPMP 划分区域中的偏移量。
• sce_fw_load_offset:SCE-FW 二进制文件加载到 SCE 划分区域中的偏移量。
• sce_fw_entry_offset:SCE-FW 入口点在 SCE 划分区域中的偏移量。
• rce_fw_load_offset:RCE-FW 二进制文件加载到 RCE 划分区域中的偏移量。
• rce_fw_entry_offset:RCE-FW 入口点在 RCE 划分区域中的偏移量。
CPU 属性
• cpu.ccplex_platform_features:CPU 平台特性;必须为 0。
• cpu.clock_mode.clock_burst_policy:CCPLEX 时钟突发策略。
• cpu.clock_mode.max_avfs_mode:最高 CCPLEX AVFS 模式。
• nafll_cfg2.fll_init:CCPLEX NAFLL CFG2 [Fll Init]。
• nafll_cfg2.fll_ldmem:CCPLEX NAFLL CFG2 [Fll Ldmem]。
• nafll_cfg2.fll_switch_ldmem:CCPLEX NAFLL CFG2 [Fll Switch Ldmem]。
• nafll_cfg3:CCPLEX NAFLL CFG3。
• nafll_ctrl1:CCPLEX NAFLL CTRL1。
• nafll_ctrl2:CCPLEX NAFLL CTRL2。
• cpu.lut_sw_freq_req.sw_override_ndiv:CCPLEX LUT 频率请求的 SW 覆盖。
• cpu.lut_sw_freq_req.ndiv:CCPLEX LUT 频率请求的 NDIV。
• cpu.lut_sw_freq_req.vfgain:CCPLEX LUT 频率请求的 VFGAIN。
• cpu.lut_sw_freq_req.sw_override_vfgain:CCPLEX LUT 频率请求的 VFGAIN 覆盖。
• cpu.nafll_coeff.mdiv:NAFLL 系数的 MDIV。
• cpu.nafll_coeff.pdiv:NAFLL 系数的 PDIV。
• cpu.nafll_coeff.fll_frug_main:NAFLL 系数的 FLL frug main。
• cpu.nafll_coeff.fll_frug_fast:NAFLL 系数的 FLL frug fast。
• cpu.adc_vmon.enable:启用 CCPLEX ADC 电压监视器。
• cpu.min_adc_fuse_rev:最低 ADC 保险丝版本。
• cpu.pllx_base.divm:PLLX DIVM。
• cpu.pllx_base.divn:PLLX DIVN。
• cpu.pllx_base.divp:PLLX DIVP。
• cpu.pllx_base.enable:启用 PLLX。
• cpu.pllx_base.bypass:PLLX 旁路启用。
其他属性
• spe_uart_instance:SPE 用于组合 UART 的 UART 控制器。
• aocluster.evp_reset_addr:AON/SPE 复位向量(在 SPE BTCM 中)。
• carveout_alloc_direction:划分区域分配方向。
• 0:从 DRAM 末尾开始
• 1:从 2GB DRAM 末尾(32 位地址空间)开始
• 2:从 DRAM 开头开始
• se_oem_group:要编程到 SE0_OEM_GROUP_0 和 SE_RNG1_RNG1_OEM_GROUP_0 的值(强制设置 NVHS / NVLS / Lock 位)。
• i2c.<N>:I2C 控制器实例的频率(以千赫兹为单位),其中 <N> 是 I2C 控制器实例,范围为 [0, 8] 的数字。
• pmc_rst_req_cfg:配置看门狗到期时 WDT_RESET_OUT 信号的生成
• 位 0:1 = 在 WDT 到期时切换 WDT_RESET_OUT。
• 位 1:1 = 在 AOWDT 到期时切换 WDT_RESET_OUT。
• 位 3:1 = 在软件启动的复位时切换 WDT_RESET_OUT。
示例
disable_spe = 0;
enable_vpr_resize = 0;
disable_sc7 = 1;
disable_fuse_visibility = 0;
disable_mb2_glitch_protection = 0;
carveout_alloc_direction = 2;
##### cpu 变量 #####
cpu.ccplex_platform_features = 0x00000;
cpu.clock_mode.clock_burst_policy = 15;
cpu.clock_mode.max_avfs_mode = 0x2E;
cpu.lut_sw_freq_req.sw_override_ndiv = 3;
cpu.lut_sw_freq_req.ndiv = 102;
cpu.lut_sw_freq_req.vfgain = 2;
cpu.lut_sw_freq_req.sw_override_vfgain = 3;
cpu.nafll_coeff.mdiv = 3;
cpu.nafll_coeff.pdiv = 0x1;
cpu.nafll_coeff.fll_frug_main = 0x9;
cpu.nafll_coeff.fll_frug_fast = 0xb;
cpu.nafll_cfg2.fll_init = 0xd;
cpu.nafll_cfg2.fll_ldmem = 0xc;
cpu.nafll_cfg2.fll_switch_ldmem = 0xa;
cpu.nafll_cfg3 = 0x38000000;
cpu.nafll_ctrl1 = 0x0000000C;
cpu.nafll_ctrl2 = 0x22250000;
cpu.adc_vmon.enable = 0x0;
cpu.pllx_base.divm = 2;
cpu.pllx_base.divn = 104;
cpu.pllx_base.divp = 2;
cpu.pllx_base.enable = 1;
cpu.pllx_base.bypass = 0;
cpu.min_adc_fuse_rev = 1;
wp.waypoint0.rails_shorted = 1;
wp.waypoint0.vsense0_cg0 = 1;
##### sw_carveout 变量 #####
carveout.misc.size = 0x800000; # 8MB
carveout.misc.alignment = 0x800000; # 8MB
carveout.os.size = 0x08000000; #128MB
carveout.os.pref_base = 0x80000000;
carveout.os.alignment = 0x200000;
carveout.cpubl.alignment = 0x200000;
firmware.cpubl_load_offset = 0x600000;
carveout.cpubl.size = 0x04000000; # 64MB
carveout.rcm.size = 0x0;
carveout.rcm.alignment = 0;
carveout.mb2.size = 0x01000000; #16MB
carveout.mb2.alignment = 0x01000000; #16MB
carveout.tzdram.size = 0x01000000; #16MB
carveout.tzdram.alignment = 0x00100000; #1MB
##### mc carveout 对齐 #####
carveout.vpr.alignment = 0x100000;
carveout.gsc[6].alignment = 0x400000;
carveout.gsc[7].alignment = 0x800000;
carveout.gsc[8].alignment = 0x100000;
carveout.gsc[9].alignment = 0x100000;
carveout.gsc[10].alignment = 0x800000;
carveout.gsc[12].alignment = 0x100000;
carveout.gsc[17].alignment = 0x100000;
carveout.gsc[19].alignment = 0x200000;
carveout.gsc[24].alignment = 0x2000000;
carveout.gsc[27].alignment = 0x200000;
carveout.gsc[28].alignment = 0x200000;
carveout.gsc[29].alignment = 0x200000;
##### mb1 ast va #####
ast.mb2_va = 0x52000000;
ast.misc_carveout_va = 0x70000000;
ast.rcm_blob_carveout_va = 0x60000000;
ast.temp_map_a_carveout_va = 0x80000000;
ast.temp_map_a_carveout_size = 0x40000000;
ast.temp_map_b_carveout_va = 0xc0000000;
ast.temp_map_b_carveout_size = 0x20000000;
##### MB2 AST VA #####
carveout.bpmp_ast_va = 0x50000000;
carveout.ape_ast_va = 0x80000000;
carveout.apr_ast_va = 0xC0000000;
carveout.sce_ast_va = 0x70000000;
carveout.rce_ast_va = 0x70000000;
carveout.camera_task_ast_va = 0x78000000;
##### 时钟变量 #####
clock.pllaon_divp = 0x3;
clock.pllaon_divn = 0x1F;
clock.pllaon_divm = 0x1;
clock.pllaon_divn_frac = 0x03E84000;
# 对于 bpmp_cpu_nic、bpmp_apb、axi_cbb 和 se,
# 使用 PLLP_OUT0 (408MHz) 作为源指定分频器。
# 对于 aon_cpu_nic、aon_can0 和 aon_can1,
# 使用 PLLAON_OUT 作为源指定分频器。
# 在这两种情况下,BCT 指定值 = (1 + 预期分频器值)。
clock.bpmp_cpu_nic_divider = 1;
clock.bpmp_apb_divider = 1;
clock.axi_cbb_divider = 1;
clock.se_divider = 1;
##### aotag 变量 #####
aotag.boot_temp_threshold = 97000;
aotag.cooldown_temp_threshold = 87000;
aotag.cooldown_temp_timeout = 30000;
aotag.enable_shutdown = 1;
#以 KHz 为单位指定 i2c 总线速度
i2c.4 = 918;
#### aocluster 数据 ####
aocluster.evp_reset_addr = 0xc480000;
#### mb2 功能标志 ####
enable_sce = 1;
enable_rce = 1;
enable_ape = 1;
enable_combined_uart = 1;
spe_uart_instance = 2;