【 E-Lock NXP LPC55 】 如何在 TrustZone 使用 IRQ 功能

一、介紹
Arm TrustZone 技術是透過 CPU 中的硬體來達到強制隔離,簡單分為兩個區塊,分別為 Secure world / Non-secure world.
兩個區塊是透過硬體來達強制隔離,開發者可以將較為敏感的資料放在 Secure world 中運行,外部 Non-secure world 所運行的程式無權存取 secure world 中敏感或安全性的資料。

Crotex-M 的 TrustZone's feature.


二、中斷 IRQ 與 TrustZone

對於LPC55S6X系列的CM33,信任區域模塊集成在一起,內存空間和外圍設備被分類為安全性和非安全空間。
為了在非安全模式下產生中斷,在 Secure Project 執行的程式,主要是Set Interrupt Target State 的 function NVIC_SetTargetState( )可以決定 interrupt is assigned to Non Secure.
尤其是 NVIC 模塊必須在安全模式下初始化 NVIC_ITNSX 暫存器,以便中斷模塊可以在非安全模式下生成中斷。

三、範例
透過修改 Secure project, 新增 CTIMER2 IRQ in the secure project.
…\trustzone_examples\hello_world\cm33_core0\hello_world_s\hello_world_s.c
 NVIC_SetTargetState(CTIMER2_IRQn); // 新增 CTIMER2 IRQ

/* Enable at the NVIC */
EnableIRQ(MRT0_IRQn);
NVIC_SetTargetState(MRT0_IRQn);

INPUTMUX_Init(INPUTMUX);
INPUTMUX_AttachSignal(INPUTMUX, 0, kINPUTMUX_GpioPort1Pin15ToPintsel);
INPUTMUX_AttachSignal(INPUTMUX, 1, kINPUTMUX_GpioPort0Pin5ToPintsel);
INPUTMUX_AttachSignal(INPUTMUX, 2, kINPUTMUX_GpioPort1Pin5ToPintsel);
INPUTMUX_AttachSignal(INPUTMUX, 3, kINPUTMUX_GpioPort1Pin9ToPintsel);
INPUTMUX_Deinit(INPUTMUX);

NVIC_SetTargetState(PIN_INT0_IRQn);
NVIC_SetTargetState(PIN_INT1_IRQn);
NVIC_SetTargetState(PIN_INT1_IRQn);
NVIC_SetTargetState(PIN_INT2_IRQn);
NVIC_SetTargetState(PIN_INT3_IRQn);
NVIC_SetTargetState(FLEXCOMM3_IRQn);
NVIC_SetTargetState(FLEXCOMM1_IRQn);
NVIC_SetTargetState(FLEXCOMM4_IRQn);
NVIC_SetTargetState(GINT0_IRQn);
NVIC_SetTargetState(GINT1_IRQn); ​

在 Non-secure project 新增 CTIMER2 的 NVIC config.
…\trustzone_examples\hello_world\cm33_core0\hello_world_ns\hello_world_ns.c
/* 新增 CTIMER2 的 interrupt config in the non-secure project */
TZ_NVIC_SetPriority_NS(CTIMER2_IRQn,0);
TZ_NVIC_EnableIRQ_NS(CTIMER2_IRQn);
TZ_NVIC_ClearPendingIRQ_NS(CTIMER2_IRQn);

TZ_NVIC_SetPriority_NS(MRT0_IRQn,0);

TZ_NVIC_EnableIRQ_NS(MRT0_IRQn);
TZ_NVIC_ClearPendingIRQ_NS(MRT0_IRQn);

TZ_NVIC_SetPriority_NS(PIN_INT0_IRQn,0);
TZ_NVIC_EnableIRQ_NS(PIN_INT0_IRQn);
TZ_NVIC_ClearPendingIRQ_NS(PIN_INT0_IRQn);

TZ_NVIC_SetPriority_NS(PIN_INT1_IRQn,0);
TZ_NVIC_EnableIRQ_NS(PIN_INT1_IRQn);
TZ_NVIC_ClearPendingIRQ_NS(PIN_INT1_IRQn);

TZ_NVIC_SetPriority_NS(PIN_INT1_IRQn,0);
TZ_NVIC_EnableIRQ_NS(PIN_INT1_IRQn);
TZ_NVIC_ClearPendingIRQ_NS(PIN_INT1_IRQn);

TZ_NVIC_SetPriority_NS(PIN_INT2_IRQn,0);
TZ_NVIC_EnableIRQ_NS(PIN_INT2_IRQn);
TZ_NVIC_ClearPendingIRQ_NS(PIN_INT2_IRQn);

TZ_NVIC_SetPriority_NS(PIN_INT3_IRQn,0);
TZ_NVIC_EnableIRQ_NS(PIN_INT3_IRQn);
TZ_NVIC_ClearPendingIRQ_NS(PIN_INT3_IRQn);

TZ_NVIC_SetPriority_NS(FLEXCOMM3_IRQn,0);
TZ_NVIC_EnableIRQ_NS(FLEXCOMM3_IRQn);
TZ_NVIC_ClearPendingIRQ_NS(FLEXCOMM3_IRQn);

TZ_NVIC_SetPriority_NS(FLEXCOMM1_IRQn,0);
TZ_NVIC_EnableIRQ_NS(FLEXCOMM1_IRQn);
TZ_NVIC_ClearPendingIRQ_NS(FLEXCOMM1_IRQn);

TZ_NVIC_SetPriority_NS(FLEXCOMM4_IRQn,0);
TZ_NVIC_EnableIRQ_NS(FLEXCOMM4_IRQn);
TZ_NVIC_ClearPendingIRQ_NS(FLEXCOMM4_IRQn);

TZ_NVIC_SetPriority_NS(GINT0_IRQn,0);
TZ_NVIC_EnableIRQ_NS(GINT0_IRQn);
TZ_NVIC_ClearPendingIRQ_NS(GINT0_IRQn);

TZ_NVIC_SetPriority_NS(GINT1_IRQn,0);
TZ_NVIC_EnableIRQ_NS(GINT1_IRQn);
TZ_NVIC_ClearPendingIRQ_NS(GINT1_IRQn); ​

原先 CTIMER 的 initialization module 需要再 Secure project 呼叫才成完成中斷任務,
不過透過以上修改可以達到在 Non-secure project 執行中斷。
…\trustzone_examples\hello_world\cm33_core0\hello_world_ns\source\appTimer.c
void Timer_Init(void)   //MRT 
{
uint32_t mrt_clock;
/* Structure of initialize MRT */
mrt_config_t mrtConfig;

/* mrtConfig.enableMultiTask = false; */
MRT_GetDefaultConfig(&mrtConfig);

/* Init mrt module */
MRT_Init(MRT0, &mrtConfig); ​


四、結論
如果要在 Non-secure project 呼叫 secure project 的中斷,需要先在 secure project 呼叫 " NVIC_SetTargetState( ) "
再來透過 Non-secure project 完成中斷的設定,即可在 Non-secure world 呼叫 secure world 的中斷功能。

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★博文作者未開放評論功能