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:在 MCU3_0上路由 GPIO1_11中断。

Guru**** 2535930 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1272003/tda4vm-routing-gpio1_11-interrupt-on-mcu3_0

器件型号:TDA4VM

大家好。

我想在 mcu3_0上的 Vision Apps 中使用 GPIO1_11作为输入 IO。

我想使用中断路由检测 GPIO1_11的下降沿。

我参考了一些 e2e。 我实现了以下代码。

void test_gpio_handler()
{
    cnt++;
    GPIO_clearInt(0);
}

static void SetRmIrqGPIO()
{
    struct tisci_msg_rm_irq_set_req rmIrqReq;
    struct tisci_msg_rm_irq_set_resp rmIrqResp;

    memset(&rmIrqReq, 0x0, sizeof(rmIrqReq));
    memset(&rmIrqResp, 0x0, sizeof(rmIrqResp));

    rmIrqReq.valid_params = 0U;
    rmIrqReq.global_event = 0U;
    rmIrqReq.src_id = 0U;
    rmIrqReq.src_index = 0U;
    rmIrqReq.dst_id = 0U;
    rmIrqReq.dst_host_irq = 0U;
    rmIrqReq.ia_id = 0U;
    rmIrqReq.vint = 0U;
    rmIrqReq.vint_status_bit_index = 0U;
    rmIrqReq.secondary_host = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;

    rmIrqReq.secondary_host = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;

   
    rmIrqReq.src_id = TISCI_DEV_GPIOMUX_INTRTR0;
    rmIrqReq.src_index = 11; //Need to add 128 for GPIO1

    /* Set the destination based on the core */
    rmIrqReq.dst_id = TISCI_DEV_GPIOMUX_INTRTR0;  //TISCI_DEV_R5FSS1_CORE0;
    rmIrqReq.dst_host_irq = 16;    //don't know how to set this

    /* Set the destination interrupt */
    rmIrqReq.valid_params |= TISCI_MSG_VALUE_RM_DST_ID_VALID;
    rmIrqReq.valid_params |= TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;

    Sciclient_rmIrqSet(
                (const struct tisci_msg_rm_irq_set_req *)&rmIrqReq,
                &rmIrqResp,
                SCICLIENT_SERVICE_WAIT_FOREVER);
    
}

static void GPIO_configIntRouter(uint32_t portNum, uint32_t pinNum, uint32_t gpioIntRtrOutIntNum, GPIO_v0_HwAttrs *cfg)
{
    GPIO_IntCfg       *intCfg;
    uint32_t           bankNum = 0U;

    intCfg = cfg->intCfg;

    cfg->baseAddr = 0x601000UL;

    bankNum = pinNum/16; /* Each GPIO bank has 16 pins */    

    intCfg[pinNum].intNum = 176 + bankNum;  //CSLR_R5FSS1_CORE0_INTR_GPIOMUX_INTRTR0_OUTP_16
    intCfg[pinNum].intcMuxNum = INVALID_INTC_MUX_NUM;
    intCfg[pinNum].intcMuxInEvent = 0;
    intCfg[pinNum].intcMuxOutEvent = 0;
}

void gpio_ecap_init(void)
{
    GPIO_v0_HwAttrs gpio_cfg;
    
    Board_moduleClockEnable(TISCI_DEV_GPIO1);
    
    GPIO_socGetInitCfg(0, &gpio_cfg);   //
    gpio_cfg.baseAddr = 0x601000UL;
    
    GPIO_configIntRouter(1, 11, 0, &gpio_cfg);
    
    CSL_REG32_WR(CSL_CTRL_MMR0_CFG0_BASE + CSL_MAIN_CTRL_MMR_CFG0_PADCONFIG140, 0x0050007);
    
    GPIO_socSetInitCfg(0, &gpio_cfg);

    GPIO_setCallback(0, test_gpio_handler);

    GPIO_init();
    SetRmIrqGPIO();
    
    GPIO_setCallback(0, test_gpio_handler);

    GPIO_enableInt(0);
    GPIO_clearInt(0);
}

完成 GPIO 设置后、我确认 GPIO 读取值在更改。

但 GPIO 中断处理程序不起作用。

DST_HOST_IRQ 是否正确?

如何处理 GPIO 处理程序?

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

    您好!

    根据 rm-cfg.c 文件中的以下条目、是的、16的 dst_host_IRQ 值似乎正确。 它在 rm-cfg.c 文件中分配给 mcu3_0。  

    {
    .start_resource = 16、
    .num_resource = 4、
    .type = RESASG_UTYPE (J721E_DEV_GPIOMUX_INTRTR0、
    RESG_SUBTYPE_IR_OUTPUT)、
    .host_id = host_ID_MAIN_1_R5_0、
    }、

    您是否可以检查 Sciclient_rmIrqSet API 的返回值并确认其 返回成功?  

    您还可以检查 GPIO_INT_STAT 寄存器中是否设置了位吗? 如果这里没有置位该位、那么 GPIO 不会生成中断。 我们需要先解决这个问题。

    此致、

    布里耶什

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

    您好!  

    感谢您的答复。

    在用 GPIO_INT_STAT 1清除 GPIO 中断后、我们确认 GPIO_INT_STAT 读取值发生了变化。

    但是、 Sciclient_rmIrqSet 的返回值 不为0。 结果失败。 我想这个。

    导致此问题的原因是什么?

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

    好的、如果这返回错误、则中断的路由确实不正确。  我看到您使用的是相同的 src_id 和 dst_id、但由于您 想将 GPIO 连接到 IRQ、请将 src_id 作为 GPIO ID、并将 dst_id 作为 R5F 主机、如下所示。  

    rmIrqREQ.src_id = TISCI_DEV_GPIO1
    rmIrqREQ.src_index = 0;//这是存储体 ID、sciclient API 仅支持存储体中断。  

    /*根据内核设置目标*/
    rmIrqREQ.dst_id = TISCI_DEV_R5FSS1_CORE0
    rmIrqREQ.DST_HOST_IRQ = 176 ;//这是主机 IRQ 号

    此致、

    布里耶什

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

    我根据您的回答编辑了代码。 结果通过了测试。

    但是、处理程序仍然无法正常工作。

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

    好的、您看到 GPIO_INT_STAT 寄存器已设置吗? 此外、GPIO 模块中的组中断被启用了吗?   

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

    可以。

    "0"组中断(GPIO_BINTEN)启用。

    设置 GPIO1_11的 GPIO_IN_STAT。

    使用 QNX cmd 检查

    // check the GPIO_INSTAT
    # in32 0x00601034    
    0x00601034 : 0x00000800
    
    // Clear the GPIO_INSTAT
    # out32 0x00601034 0x00000800
    # in32 0x00601034             
    0x00601034 : 0x00000000
    
    // after signal input
    
    # in32 0x00601034          
    0x00601034 : 0x00000800

    // check bank interrupt enable
    # in32 0x00601008 
    0x00601008 : 0x00000001

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

    您好

    我确认 GPIO 处理程序正在唤醒。

    我将 GPIO_setCallback 替换为 Osal_Register。

    void test_gpio_handler()
    {
        cnt++;
        GPIO_clearInt(0);
    }
    
    void AppGpioCallbackFxn(uintptr_t arg)
    {
        cnt++;
        GPIO_clearInt(0);
    }
    
    void reg_func(int intNum)
    {
        OsalRegisterIntrParams_t    intrPrms;
        HwiP_Handle hwiHandle;
        OsalInterruptRetCode_e      osalRetVal;
    
        Osal_RegisterInterrupt_initParams(&intrPrms);
        intrPrms.corepacConfig.arg          = (uintptr_t)NULL;
        intrPrms.corepacConfig.isrRoutine   = &AppGpioCallbackFxn;
        intrPrms.corepacConfig.priority     = 1U;
        intrPrms.corepacConfig.corepacEventNum = 0U; /* NOT USED ? */
        intrPrms.corepacConfig.intVecNum        = intNum;
    
        osalRetVal = Osal_RegisterInterrupt(&intrPrms, &hwiHandle);
        appLogPrintf("[%s:%d] Osal_RegisterInterrupt osalRetVal=%d\n",__func__, __LINE__,osalRetVal);
        if(OSAL_INT_SUCCESS != osalRetVal)
        {
             appLogPrintf ("Osal_RegisterInterrupt fail \n");
        }else{
             appLogPrintf ("Osal_RegisterInterrupt fine \n");
        }
    }
    
    static void SetRmIrqGPIO()
    {
        struct tisci_msg_rm_irq_set_req rmIrqReq;
        struct tisci_msg_rm_irq_set_resp rmIrqResp;
    
        memset(&rmIrqReq, 0x0, sizeof(rmIrqReq));
        memset(&rmIrqResp, 0x0, sizeof(rmIrqResp));
    
        rmIrqReq.valid_params = 0U;
        rmIrqReq.global_event = 0U;
        rmIrqReq.src_id = 0U;
        rmIrqReq.src_index = 0U;
        rmIrqReq.dst_id = 0U;
        rmIrqReq.dst_host_irq = 0U;
        rmIrqReq.ia_id = 0U;
        rmIrqReq.vint = 0U;
        rmIrqReq.vint_status_bit_index = 0U;
        rmIrqReq.secondary_host = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
    
        rmIrqReq.secondary_host = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
    
       
        rmIrqReq.src_id = TISCI_DEV_GPIO1;
        rmIrqReq.src_index = 0; //Need to add 128 for GPIO1
    
        /* Set the destination based on the core */
        rmIrqReq.dst_id = TISCI_DEV_R5FSS1_CORE0;
        rmIrqReq.dst_host_irq = 176;    //don't know how to set this
    
        /* Set the destination interrupt */
        rmIrqReq.valid_params |= TISCI_MSG_VALUE_RM_DST_ID_VALID;
        rmIrqReq.valid_params |= TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
    
        Sciclient_rmIrqSet(
                    (const struct tisci_msg_rm_irq_set_req *)&rmIrqReq,
                    &rmIrqResp,
                    SCICLIENT_SERVICE_WAIT_FOREVER);
        
    }
    
    static void GPIO_configIntRouter(uint32_t portNum, uint32_t pinNum, uint32_t gpioIntRtrOutIntNum, GPIO_v0_HwAttrs *cfg)
    {
        GPIO_IntCfg       *intCfg;
        uint32_t           bankNum = 0U;
    
        intCfg = cfg->intCfg;
    
        cfg->baseAddr = 0x601000UL;
    
        bankNum = pinNum/16; /* Each GPIO bank has 16 pins */    
    
        intCfg[pinNum].intNum = 176 + bankNum;  //CSLR_R5FSS1_CORE0_INTR_GPIOMUX_INTRTR0_OUTP_16
        intCfg[pinNum].intcMuxNum = INVALID_INTC_MUX_NUM;
        intCfg[pinNum].intcMuxInEvent = 0;
        intCfg[pinNum].intcMuxOutEvent = 0;
    }
    
    void gpio_ecap_init(void)
    {
        GPIO_v0_HwAttrs gpio_cfg;
        
        Board_moduleClockEnable(TISCI_DEV_GPIO1);
        
        GPIO_socGetInitCfg(1, &gpio_cfg);   //
        gpio_cfg.baseAddr = 0x601000UL;
        
        GPIO_configIntRouter(1, 11, 0, &gpio_cfg);
        
        CSL_REG32_WR(CSL_CTRL_MMR0_CFG0_BASE + CSL_MAIN_CTRL_MMR_CFG0_PADCONFIG140, 0x0050007);
        
        GPIO_socSetInitCfg(1, &gpio_cfg);
    
        GPIO_setCallback(0, test_gpio_handler);
    
        GPIO_init();
        //SetRmIrqGPIO();
        ref_fun(176);
        
        GPIO_setCallback(0, test_gpio_handler);
    
        GPIO_enableInt(0);
        GPIO_clearInt(0);
    }

    但是、为什么 GPIO setCallback 无法工作?

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

    确切地说还不清楚、但可能会受到驱动程序的限制。 它可能 不会调用回调。 您需要签入驱动程序。

    但我认为、既然您现在已经在进行回调、那么就不需要其他东西了、对吗? 在这种情况下、请关闭此 TT。