外设分配
Arm dual core Cortex-A7 secure (Trustzone),运行在安全环境或安全OS,比如OP-TEE
Arm dual core Cortex-A7 non secure,运行Linux系统
Arm Cortex-M4 (non-secure), 运行STM32Cube固件
STM32MP1的外设可以被分配至不同的运行环境,但有些是只能在指定的环境下运行,有些可以在不同的环境下运行,如下图:
上图中的颜色和文字解释,用来标识对应的外设功能是否可以指定还是共享。
下图是STM32MP157中全部外设在不同环境下的可配置情况。
分配方法
STM32CubeMX自动分配
左侧选中的是I2C2 外设
右边的I2C2 mode and configuration面板显示,可以将这个I2C实例分配给不安全的Cortex-A7或选择的Cortex-M4运行时上下文
在下拉菜单中启用I2C模式
右上角的GENERATE CODE 按钮,包含一下功能流程:
带有ETZPC配置的TF-A设备树,它隔离了Cortex-M4上下文的I2C2实例(在示例中)。如果启用,OP-TEE可以使用相同的设备树
U-Boot设备树广泛继承自Linux,就在下面
为Linux禁用I2C节点并为协处理器启用I2C节点的Linux内核设备树
带有I2C2 HAL初始化代码的STM32Cube项目
手动配置
TF-A
The assignment follows the ETZPC device tree configuration, with below possible values:
该赋值遵循ETZPC设备树配置,可能的值如下:
DECPROT_S_RW :可以用于Cortex-A7 secure 模式下运行 (例如 OP-TEE)
DECPROT_NS_RW :可以用于在Cortex-A7 non-secure 模式下运行(Linux)- 如本文前面所述,对于不安全的Cortex-A7没有硬件隔离,因此这个值允许从任何上下文进行访问
DECPROT_MCU_ISOLATION :可以用于Cortex-M4下使用(STM32Cube)
@etzpc: etzpc@5C007000 {
st,decprot = <
DECPROT(STM32MP1_ETZPC_I2C2_ID, DECPROT_MCU_ISOLATION, DECPROT_UNLOCK)
>;
};
U-boot
无需特别的修改。
Linux kernel
每个可分配的外围设备在Linux内核设备树中声明两次:
第一次:"arch/arm/boot/dts/stm32mp157c.dtsi"的soc节点中,对应于Linux分配的外围设备。例如i2c2
第二次:"arch/arm/boot/dts/stm32mp157c-m4-srm.dtsi"的m4_rproc节点中,对应于Cortex-M4上下文。 默认情况下,那些节点是禁用的。例如m4_i2c2
在board设备树文件(*.dts)中,每个可分配的外设必须仅针对其被分配的上下文启用,这符合TF-A配置。
因此,分配给Cortex-A7 secure的外设在Linux设备树中禁用了这两个节点。
&i2c2 {
status = "disabled";
};
...
&m4_i2c2 {
status = "okay";
};
CM4的STM32CubeMP1固件包
关于分配和隔离,在STM32Cube端不需要进行任何配置。然而,依赖于ETZPC配置的资源管理器实用程序可以用于在使用之前检查相应的外设是否正确地分配给了Cortex-M4。
int main(void)
{
...
/* Initialize I2C2------------------------------------------------------ */
/* Ask the resource manager for the I2C2 resource */
ResMgr_Init(NULL, NULL);
if (ResMgr_Request(RESMGR_ID_I2C2, RESMGR_FLAGS_ACCESS_NORMAL | \
RESMGR_FLAGS_CPU1, 0, NULL) != RESMGR_OK)
{
Error_Handler();
}
...
if (HAL_I2C_Init(&I2C2) != HAL_OK)
{
Error_Handler();
}
}
OP-TEE
无需特殊修改。
最后编辑:SteveChen 更新时间:2024-09-18 14:34