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.

[参考译文] AM625:AM62X GPIO 中断配置问题:无法设置触发模式

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1428637/am625-am62x-gpio-interrupt-configuration-issue-failed-to-set-trigger-mode

器件型号:AM625

工具与软件:

我当前处理的项目涉及 AM62X 平台、在尝试配置 GPIO 中断时会遇到问题。 非常感谢您提供指导、帮助我们理解和解决这个问题。

尝试为 GPIO 引脚请求 IRQ 时出现问题。 下面是我将使用的相关代码片段:

============================================================================================

data->ph1_near_irqnumber =-1;
data->ph1_near_empty = devm_gpiod_get (&pdev->dev、"ph1_near_empty"、gpod_in);
if (IS_ERR (DATA->PH1_NEAR_EMPTY)){
printk ("gpio_printpetn_driver:请使用 gpio"ph1_near_empty-gpios"\n"检查设备节点
返回 ptr_ERR (data->ph1_near_empty);

}

pDrv->IRQ_nearempty = gpiod_to_irq (data->ph1_near_empty);
printk ("gpio_printpetp_driver:ph1_near_empty 的 IRQ 号为%d\n"、pDrv->irq_nearempty);


Result = Request_IRQ(pDrv->IRQ_nearempty、
(IRQ_handler_t) near_irq_handler、
IRQF_TRIGGER_HIGH、
"接近为空"、
pDrv);

但是、当我运行此代码时、内核日志中会显示以下错误消息:

[ 905.474809] genirq: Setting trigger mode 4 for irq 387 failed (gpio_irq_type+0x0/0x20)
[ 905.482782] ========================pDrv->request_irq = -22

似乎问题在于如何为请求的 IRQ 设置触发模式。 具体而言:

  • 错误指示。 Setting trigger mode 4 (IRQF_TRIGGER_HIGH) for irq 387 failed
  • 该调用返回错误代码、表示参数()无效。 request_irq()-22EINVAL

如果您能提供任何帮助解决此问题的建议或指导、我将不胜感激。 如果您有需要参考的具体文档或资源、请告诉我。

非常感谢您的时间和支持。

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

    您好!

    我们可以为定制应用提供的支持有限、因为这不是 TI 提供的代码、并且超出了我们的支持范围。

    首先、您可以检查 gpiolib.c 驱动程序中 gpiod_to_irq 函数: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/gpio/gpiolib.c?h=ti-linux-6.6.y#n3396

    正如您所提到的,输出是无效参数,它看起来是由此行: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/gpio/gpiolib.c?h=ti-linux-6.6.y#n3414引起的

    可以添加 debug 语句以查看 if 语句中满足哪个条件、从而导致错误。

    第二、从搜索错误信息中、可以找到显示错误信息的 Linux 驱动程序: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/kernel/irq/manage.c?h=ti-linux-6.6.y#n954

    看起来第979行设置了 switch 语句使用的"ret"变量、但不输入导致默认情况的任何案例块。 您可以尝试在该函数中添加一些调试语句、以查看变量是如何设置的。

    "irq_set_trigger"函数本身由同一驱动程序中的其他函数调用、因此您也可以检查这些函数。

    旧版 API 中有一个关于 IRQ 的部分可能会有所帮助: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/Documentation/driver-api/gpio/legacy.rst?h=ti-linux-6.6.y#n351

    只是为了明确期望、TI 不能为定制应用提供 E2E 支持。

    此致、

    Anshu

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

    在 AM62x SDK 的以下位置跟踪代码后:

    ti-processor-sdk-linux-am62xx-evm-09.00.00.03\board-support\ti-linux-kernel\drivers\gpio\gpio-davinci.c

    我遇到了以下函数:


    静态 int GPIO_IRQ_TYPE_UNBANKED (结构 IRQ_DATA *数据、无符号触发器)

    结构 davinci_gpio_controller * d;
    结构 davinci_gpio_REGS _iomem * g;
    U32掩码、I;

    D =(结构 davinci_gpio_controller *) IRQ_data_get_IRQ_handler_data (data);
    G =(结构 davinci_gpio_REGS __iomem *) d->regs[0];
    对于(I = 0;I < MAX_INT_PER_BANK;I++)
    如果(data->IRQ == d->IRQs[i])
    休息;

    如果(I = MAX_INT_PER_BANK)
    返回-EINVAL;

    MASK =__GPIO_MASK (i);

    如果(TRIGGER &~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
    返回-EINVAL;

    writel_relaxed (mask、(TRIGGER & IRQ_TYPE_EDGE_FALLING)
    ? &G -> SET_FALLING:&G -> CLR_FALLING);
    writel_relaxed (mask、(TRIGGER & IRQ_TYPE_EDGE_RISING)
    ? &G -> SET_Rising:&G -> CLR_Rising);

    返回0;
    }
    根据我的理解、该函数仅支持边沿触发中断:

    IRQ_TYPE_EDGE_FALLING
    IRQ_TYPE_EDGE_RISING

    但是、似乎不支持电平触发中断(例如 IRQ_TYPE_LEVEL_HIGH 和 IRQ_TYPE_LEVEL_LOW)。 鉴于 AM62x 平台的硬件功能、我希望它能够同时支持边沿和电平触发的中断。

    支持电平触发的中断对于某些用例至关重要、例如监控长时间保持活动状态的 GPIO 输入、这种情况下必须检测高级或低电平状态。 这将大大增强 GPIO 控制器的灵活性和功能性。

    您能否确认这是否是有意的限制? 如果不能、您能否提供有关如何启用 IRQ_TYPE_LEVEL_HIGH 和 IRQ_TYPE_LEVEL_LOW 触发条件的指导?

    非常感谢您对此事的帮助和见解。

    此致、
    Oliver

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

    尊敬的 Oliver:

    我将在内部进行检查。 如果您在下周星期三之前尚未收到回复、请 ping 此主题。

    谢谢!

    Anshu

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

    尊敬的 Anshu:

    感谢您的帮助。 因为已经过了星期三,我想跟进这件事,看看是否有任何更新从你的一方。

    再次感谢您的帮助!

    此致、
    Oliver

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

    尊敬的 Oliver:

    本周 TI 印度有个假期、因此开发人员没有回复。 当他们返回时、我会在下周再次询问他们。

    谢谢!

    Anshu

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

    尊敬的 Anshu:

        感谢您的帮助、我期待收到您的回复。

    此致、
    Oliver

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

    尊敬的 Oliver:

    我再次要求回复。 我会在得到回复时更新主题帖。

    谢谢!

    Anshu

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

    尊敬的 Oliver:

    在查看 AM62x 的技术参考手册时、GPIO 不支持基于电平的中断、仅支持基于边沿的中断。

    有关更多详细信息、请参阅 AM62 TRM 中的第12.2.1.1.1节 GPIO 功能: https://www.ti.com/lit/ug/spruiv7b/spruiv7b.pdf

    由于处理器不支持基于电平的中断、因此 GPIO-Davinci 驱动器也不支持这种中断。



    此致、

    Anshu