Page tree
Skip to end of metadata
Go to start of metadata

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

无需特殊修改。

  • No labels