TDA4VM/VH 单核软复位原理与实现实现

说明

由于 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 寄存器组触发:

  1. Set WKUP_PSC0_MDCTL_y[8] LRST or PSC0_MDCTL_y[8] LRST to 0x0 to assert local reset.
  2. Set WKUP_PSC0_MDCTL_y[8] LRST or PSC0_MDCTL_y[8] LRST to 0x1 to de-assert local reset

y 对应于模块的 LPSC 索引,具体模块索引值请查看 TRM。

TDA4VH 单核软复位部分代码实现

首先分别列出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);

你可能感兴趣的:(TDA4VM)