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.

[参考译文] AM6548:使用中断路由器将 UART1中断路由到 R50 MCU

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1390622/am6548-routing-uart1-interrupt-to-r50-mcu-using-interrupt-router

器件型号:AM6548

工具与软件:

您好!

我正在尝试使用 Cortex-R5F 上的 UART1外设触发中断。 我可以使用 TI 的 DRV 功能来使用 UART、但使用 A53特定中断(CSL_GIC0_INTR_USART1_BUS_USART_IRQ)不起作用。  

因此、我们研究了如何使用类似于本文所述的中断路由方法: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/779597/am6526-creating-an-interrupt-from-pru-to-r5f。但遇到了问题。  

我们将使用 SR2.0并尝试使用 CSL 库配置中断路由、执行此操作的代码如下所示:

/* Configure MAIN2MCU_LVL_INTRTR0 interrupt router */
int32_t configureIntrRouter(
    uint32_t intrRtrInIntNum, 
    uint32_t intrRtrOutIntNum
)
{
    CSL_IntrRouterCfg intrRouterMain2MCUCfg;
    int32_t retVal;

    /* Initialize Main to MCU Interrupt Router config structure */
    intrRouterMain2MCUCfg.pIntrRouterRegs = (CSL_intr_router_cfgRegs *)(uintptr_t)(CSL_MAIN2MCU_LVL_INTRTR0_CFG_BASE);
    intrRouterMain2MCUCfg.pIntdRegs       = (CSL_intr_router_intd_cfgRegs *)(uintptr_t)NULL;
    intrRouterMain2MCUCfg.numInputIntrs   = 192;
    intrRouterMain2MCUCfg.numOutputIntrs  = 64;

    retVal = CSL_intrRouterCfgMux(&intrRouterMain2MCUCfg, intrRtrInIntNum, intrRtrOutIntNum);
    if (retVal < 0) 
    {
        return -1;
    }
    
    return 0;
}

我们这样称呼它:

configureIntrRouter(CSLR_MAIN2MCU_LVL_INTRTR0_IN_UART1_USART_IRQ_0, 2);

根据我们可以看到的情况、我们正在尝试将中断 CSLR_MAIN2MCU_LVL_INTR0_IN_UART1_USART_IRQ_0路由到中断2、以便 TI UART 驱动程序可以向其附加 OSAL 中断。  

问题是、我们的代码正在遇到函数 CSL_intrRouterCfgMux 中的数据中止处理程序、特别是在我们尝试禁用中断输出的行:

regVal &= ~INTR_ROUTER_CFG_MUXCNTL_INT_ENABLE;
CSL_REG32_WR( &pCfg->pIntrRouterRegs->MUXCNTL[outputIntrNum], regVal );

TI 是否知道出现这种情况的原因? 我们从 UART1在 R5F 中触发中断的方法是否正确?

谢谢!

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

    尊敬的 Ben:

    请允许我稍后研究这一点、因为我需要了解和通读 AM65x 的 TRM 规范。 我主要找一个介绍中断和中断路由的部分。

    此致、

    Vaibhav

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

    我们也尝试使用 sciclient、使用以下代码:

    int32_t configureIntrRouter(uint32_t armss0cpu0InIrqNum)
    {
        struct tisci_msg_rm_irq_set_req rmIrqReq;
        struct tisci_msg_rm_irq_set_resp rmIrqResp;
        int32_t status;
    
        rmIrqReq.src_id = TISCI_DEV_UART1;
        rmIrqReq.src_index = CSLR_MAIN2MCU_LVL_INTRTR0_IN_UART1_USART_IRQ_0;
        rmIrqReq.dst_id = TISCI_DEV_MAIN2MCU_LVL_INTRTR0;
        rmIrqReq.dst_host_irq = armss0cpu0InIrqNum;
        rmIrqReq.valid_params = 0x3;    /* bit mask for dst_id & dst_host_irq */
        status = Sciclient_rmIrqSet(&rmIrqReq, &rmIrqResp, 0xFFFFFFFFU);
        if (status != CSL_PASS)
        {
            return -1;
        }
    
        return 0;    
    }
    
    configureIntrRouter(2);

    但也失败了。 但是、它没有导致数据中止。 一种方法优于另一种方法吗? 根据我的理解、我认为这两种方法都可行。  

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

    似乎我已经找到了这一个实际上, sciclient 是正确的方法来做这个。 下面是我用于完成此操作的代码:

    int32_t configureIntrRouter(uint32_t armss0cpu0InIrqNum)
    {
        struct tisci_msg_rm_irq_set_req rmIrqReq;
        struct tisci_msg_rm_irq_set_resp rmIrqResp;
        int32_t status;
    
        rmIrqReq.secondary_host         = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
        rmIrqReq.src_id = TISCI_DEV_UART1; 
        rmIrqReq.src_index = 0;
        rmIrqReq.dst_id = TISCI_DEV_MCU_ARMSS0_CPU0;
        rmIrqReq.valid_params = 0x3;    /* bit mask for dst_id & dst_host_irq */
        status = Sciclient_rmIrqSet(&rmIrqReq, &rmIrqResp, 0xFFFFFFFFU);
        if (status != CSL_PASS)
        {
            return -1;
        }
    
        return 0;    
    }

    然后、我将值 CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_18传递给该函数、我还必须进入 UART 驱动程序代码并将中断号更新为 CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_18。 不过这可能可以通过 UART 驱动程序 API 来完成。  

    我现在能够触发读写回调。  

    sciclient 文档在以下位置很有帮助: software-dl.ti.com/.../interrupt_cfg.html