This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4VM:使用 IPC 裸机+ CSL 进行 CPU 复位后、邮箱中断不会触发#39;

Guru**** 2425220 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1538885/tda4vm-mailbox-interrupt-doesn-t-trigger-after-cpu-reset-using-ipc-baremetal-csl

器件型号:TDA4VM


工具/软件:

您好:

我正在为 Cortex-R5(MAIN 域)处理裸机项目。

我仅使用 IPC 驱动程序、特别是邮箱支持来自:

ti/drv/ipc/src/mailbox/csl_mailbox.h

我在这个设置中没有使用 MCAL 或 AUTOSAR。

为了配置中断、我将使用 CSL(芯片支持库)、用于 VIM(矢量中断管理器)和中断路由器 (INTRTR)。 我已验证中断路由是否正常工作(当我从接收器内核本身在本地发送消息时,中断会成功触发)。

工作原理:

  • 当消息由也接收该消息的同一 R5 内核发送(环回测试)时、邮箱中断会正确触发。

  • VIM 中断设置和 NAVSS INTR 路由器配置完全通过 CSL 处理并确认有效。

问题:

当我复位 CPU(通过 CCS 中的 CPU 复位或重新启动)时、或者当我运行发送器内核 (R5FSS1-0) 以向接收器内核 (R5FSS0-0) 发送消息时、不会触发中断。

更具体地说:

  • 发送方发送消息时不会触发中断。

  • 我没有使用  MailboxReset()(因为它仅在 MCAL 中可用)、IPC BareMetal 邮箱驱动程序似乎不提供类似的 API。

  • 相同的代码在首次引导时工作正常、但在仅 CPU 复位后会失败。

我的问题:

  1. 由于我不使用 MCAL、因此在 CPU 复位后、我需要对邮箱外设执行什么正确的初始化或复位序列?

  2. 我是否需要手动清除任何寄存器 才能重新启用中断功能?

  3. 在复位之间如何保留邮箱状态、是否预计会出现此行为?

  4. 是否有任何干净的最小设置或权变措施来可靠地重新初始化邮箱以在不使用完整 MCAL 层的情况下使用中断?

我的代码:

发送方:

#include <stdint.h>
#include <ti/csl/soc.h>
#include <stdio.h>
#include <ti/drv/ipc/src/mailbox/csl_mailbox.h>

#define MAILBOX0_BASE_ADDR     (CSL_NAVSS0_MAILBOX_REGS0_BASE)
#define QUEUE_ID               MAILBOX_QUEUE_0
#define USER_ID                1U
#define MENSAGEM               (0xDEADBEEF)

int main(void)
{
    uint32_t status;
    while (1)
    {
        status = Mailbox_sendMessage(MAILBOX0_BASE_ADDR, QUEUE_ID, MENSAGEM);
    }
    return 0;
}


接收器:

#include <stdint.h>
#include <stdio.h>
#include <ti/csl/soc.h>
#include <mwfal/mwfintc/interrupt_config.h>
#include <ti/drv/ipc/src/mailbox/csl_mailbox.h>

#define MAILBOX0_BASE_ADDR     (CSL_NAVSS0_MAILBOX_REGS0_BASE)
#define QUEUE_ID               MAILBOX_QUEUE_0
#define USER_ID                0U
#define VIM_CHANNEL_MAILBOX    224

void mailbox_isr(void *arg)
{
    uint32_t mensagem = 0;
    if (Mailbox_getRawNewMsgStatus(MAILBOX0_BASE_ADDR, USER_ID, QUEUE_ID))
    {
        Mailbox_getMessage(MAILBOX0_BASE_ADDR, QUEUE_ID, &mensagem);
        printf("Received via IRQ: %u (0x%08X)\n", mensagem, mensagem);
        Mailbox_clrNewMsgStatus(MAILBOX0_BASE_ADDR, USER_ID, QUEUE_ID);
        HW_WR_REG32(MAILBOX0_BASE_ADDR + CSL_MAILBOX_IRQ_EOI, USER_ID);
    }
}

void init_interrupts(void)
{
    Mailbox_disableNewMsgInt(MAILBOX0_BASE_ADDR, USER_ID, QUEUE_ID);
    Mailbox_enableNewMsgInt(MAILBOX0_BASE_ADDR, USER_ID, QUEUE_ID);
    Mailbox_clrNewMsgStatus(MAILBOX0_BASE_ADDR, USER_ID, QUEUE_ID);

    InterruptConfig mboxIntCfg = {
        .channel = VIM_CHANNEL_MAILBOX,
        .priority = 0,
        .mapType = INTR_MAP_IRQ,
        .triggerType = INTR_TYPE_LEVEL,
        .callback = mailbox_isr,
        .callbackArg = NULL
    };
    interrupt_init(&mboxIntCfg);
}

int main(void)
{
    init_interrupts();

    uint32_t msg = 0;
    Mailbox_getMessage(MAILBOX0_BASE_ADDR, QUEUE_ID, &msg);

    while (1)
    {
        // waiting for interrupt
    }
    return 0;
}


中断路由器配置 (CSL):

#include <stdint.h>
#include <ti/csl/csl_intr_router.h>
#include <ti/csl/soc.h>

#define R5FSS0_0_OUTL_INDEX   192U
#define R5FSS1_0_OUTL_INDEX   256U
#define MAILBOX0_R5FSS0_0_IN  436U
#define MAILBOX0_R5FSS1_0_IN  437U

void configure_navss_intr_router(void)
{
    CSL_IntrRouterCfg NAVSS0 = {
        .pIntrRouterRegs = (CSL_intr_router_cfgRegs *)CSL_NAVSS0_INTR0_INTR_ROUTER_CFG_BASE,
        .pIntdRegs       = NULL,
        .numInputIntrs   = 447,
        .numOutputIntrs  = 407
    };

    CSL_intrRouterCfgMux(&NAVSS0, MAILBOX0_R5FSS0_0_IN, R5FSS0_0_OUTL_INDEX);
    CSL_intrRouterCfgMux(&NAVSS0, MAILBOX0_R5FSS1_0_IN, R5FSS1_0_OUTL_INDEX);
}

VIM 中断配置(基于 CSL):

// interrupt_config.c
#include "interrupt_config.h"

void interrupt_init(const InterruptConfig *config)
{
    Intc_Init();
    Intc_IntEnable(config->channel);
    Intc_IntSetSrcType(config->channel, (uint32_t)config->triggerType);
    Intc_IntPrioritySet(config->channel, config->priority, (uint32_t)config->mapType);
    Intc_IntRegister(config->channel, config->callback, config->callbackArg);
    Intc_SystemEnable();
}

非常感谢您能深入了解如何在此设置中完全重新初始化邮箱外设。

此致、

Heverton

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    [引用 userid=“619458" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1538885/tda4vm-mailbox-interrupt-doesn-t-trigger-after-cpu-reset-using-ipc-baremetal-csl

    我正在为 Cortex-R5(MAIN 域)处理裸机项目。

    我仅使用 IPC 驱动程序、特别是邮箱支持来自:

    ti/drv/ipc/src/mailbox/csl_mailbox.h

    我在这个设置中没有使用 MCAL 或 AUTOSAR。

    为了配置中断、我将使用 CSL(芯片支持库)、用于 VIM(矢量中断管理器)和中断路由器 (INTRTR)。 我已验证中断路由是否正常工作(当我从接收器内核本身在本地发送消息时,中断会成功触发)。

    [/报价]

    请问您的意图是什么? 您为什么不使用 RPMessage? 如果要使用 PDK IPC 驱动程序、这种方法不正确。

    您可以参阅  ti/drv/ipc/examples 中的 ipc_echo_test 示例  

    [引用 userid=“619458" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1538885/tda4vm-mailbox-interrupt-doesn-t-trigger-after-cpu-reset-using-ipc-baremetal-csl
    • 由于我不使用 MCAL、因此在 CPU 复位后、我需要对邮箱外设执行什么正确的初始化或复位序列?

    • 我是否需要手动清除任何寄存器 才能重新启用中断功能?

    • 在复位之间如何保留邮箱状态、是否预计会出现此行为?

    • 是否有任何干净的最小设置或权变措施来可靠地重新初始化邮箱以在不使用完整 MCAL 层的情况下使用中断?

    [/报价]

    我们有 PDK 驱动程序、它不基于 AUTOSAR。您可以与裸机、FreeRTOS、SAFERTOS 一起使用  

    此致

    Tarun Mukesh