由于 TI 的 RTOS SDK 没有提供单核复位的代码,经过仔细阅读 TDA4VM 芯片技术参考手册,发现可以通过触发 Local Reset 实现单核软复位。
该方法已验证,可以复位 MAIN 域的 A 核与 R 核,以及 MCU 域的 R5F1_1( mcu_r5f1_0 需要按照 SBL 启动 app 的方式实现复位,DSP 核未测试)
在 TDA4VM TRM 的第 5.2.2.2.1.4.3 章节,Local Reset 用于复位芯片上的某一单独模块,而不复位整个芯片。
同时该章节说明了 Local Reset 的触发方式,Local Reset 通过 WKUP_PSC0/PSC0
寄存器组触发:
WKUP_PSC0_MDCTL_y[8]
LRST or PSC0_MDCTL_y[8]
LRST to 0x0
to assert local reset.WKUP_PSC0_MDCTL_y[8]
LRST or PSC0_MDCTL_y[8]
LRST to 0x1
to de-assert local resety 对应于模块的 LPSC 索引,具体模块索引值请查看 TRM。
首先分别列出R核与 A 核对应的 WKUP_PSC0_MDCTL
/ PSC0_MDCTL
寄存器地址数组:
/* A/R 核所对应的 wkup_psc0_mdctl/psc0_mdctl 寄存器地址 */
static uint32_t g_uiPSC0_MDCTL_Addr[] =
{
0x400A00 + (80 * 4), /* MPU1_0 */
0x400A00 + (81 * 4), /* MPU1_1 */
0x400A00 + (108 * 4), /* MPU1_2 */
0x400A00 + (109 * 4), /* MPU1_3 */
0x400A00 + (84 * 4), /* MPU2_0 */
0x400A00 + (85 * 4), /* MPU2_1 */
0x400A00 + (110 * 4), /* MPU2_2 */
0x400A00 + (111 * 4), /* MPU2_3 */
0x42000A00 + (19 * 4), /* MCU1_0 */
0x42000A00 + (20 * 4), /* MCU1_1 */
0x400A00 + (93 * 4), /* MCU2_0 */
0x400A00 + (94 * 4), /* MCU2_1 */
0x400A00 + (96 * 4), /* MCU3_0 */
0x400A00 + (97 * 4), /* MCU3_1 */
0x400A00 + (122 * 4), /* MCU4_0 */
0x400A00 + (123 * 4), /* MCU4_1 */
};
然后按照 Local Reset 触发方式,触发 Local Reset:
/* 根据 uiCoreId 获取复位触发寄存器地址 */
uiBaseaddr = g_uiPSC0_MDCTL_Addr[uiCoreId];
/* 触发 Loacl reset */
uiVal = readw(uiBaseaddr);
uiVal &= ~(LRSTZ_MASK << LRSTZ_POS);
writew(uiVal, uiBaseaddr);
uiVal = readw(uiBaseaddr);
uiVal |= (LRSTZ_MASK << LRSTZ_POS);
writew(uiVal, uiBaseaddr);