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.

[参考译文] Linux/processor-SDK-AM437X:在器件树中启用 GPIO 中断

Guru**** 2600495 points
Other Parts Discussed in Thread: TCA8418, AM4372

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/647546/linux-processor-sdk-am437x-enabling-gpio-interrupt-in-device-tree

器件型号:PROCESSOR-SDK-AM437X
主题中讨论的其他器件:TCA8418AM4372

工具/软件:Linux

您好!

我尝试将 GPIO 连接为中断线路。 相关器件树部件如下所示:

GPIO0_PINS_DEFAULT:GPIO0_PINS_DEFAULT{
      pinctrl-single、pins =<
         0x1a8 (PIN_INPUT_PULLUP | MUX_MODE9)/*(M25) McASP0_axr1.GPIO0[2]*
         0x1ac (PIN_INPUT_PULLUP | MUX_MODE9)/*(L24) McASP0_ahclkx.GPIO0[3]*/
         0x158 (PIN_INPUT_PULLUP | MUX_MODE7)/*(T21) spi0_D1.GPIO0[4]*/
         0x15c (PIN_INPUT_PULLUP | MUX_MODE7)/*(T20) spi0_cs0.GPIO0[5]*/
         0x1a0 (PIN_INPUT_PULLUP | MUX_MODE9)/*(L23) McASP0_aclkr.GPIO0[18]*/
         0x1a4 (PIN_INPUT_PULLUP | MUX_MODE9)/*(K23) McASP0_fsr.GPIO0[19]*/
         0x264 (PIN_INPUT_PULLUP | MUX_MODE9)/*(P22) SPI2_d0.GPIO0[20]*/
         0x268 (PIN_INPUT_PULLUP | MUX_MODE9)/*(P20) SPI2_D1.GPIO0[21]*/
      >;
   };

TCA8418:TCA8418@34{
    兼容="ti、TCA8418";  
    reg =<0x34>;
    interrupt-parent =<&GPIO0>;
    中断=<21 0x01>;    //GPIO0_21被配置为中断
    键盘、num-rows =<5>;
    键盘、num 列=<4>;
    linux、keymap =<
        0x0306003b
        0x06000111>;
    状态="正常";
    };

GPIO0{&gpio0}
   pinctrl-names ="default";
   pinctrl-0 =<&GPIO0_PINS_DEFAULT>;
   状态="正常";
};

该驱动程序配置无任何错误(使用 printk 进行检查)。 中断会添加到/proc/interrupt 中

95:         0 48320.GPIO 24边缘     TCA8418

但是、永远不会调用中断。

在/sys/kernel/debug/pinctrl/44e10800.pinmux/pinmux-pins 中、我们看到了这一点

引脚154 (PIN154):(MUX 未声明)(GPIO 未声明)

引脚154对应于 GPIO0_21、但显示 MUX 未声明。

为了纠正这一问题、我在 GPIO0中添加了以下内容

   P21{
      GPIO-hog;
      GPIO =<21 GPIO_ACTIVE_HIGH_>;
      输入;
      线路名称="GPIO0_21";
   };

添加上述行后、从未调用驱动程序的探测器函数。

我出了什么问题?

谢谢、

Rajat Rao

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    更新:
    引脚154 (PIN154):44e07000.GPIO (未声明 GPIO)功能 GPIO0_PINS_DEFAULT 组 GPIO0_PINS_DEFAULT
    该引脚确实配置为 GPIO。 所以这不是问题。
    但是、中断不会被触发。

    如果我尝试从/sys/class/gpio 读取该值、我始终读取0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    第一步、应将配置为 GPIO。

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

    尊敬的 Tsvetolin:

    我不知道你的意思是什么。 如果您提到的是未声明的 GPIO 消息、那么在 GP-EVM 中、我们也会看到:

    引脚85 (PIN85):Matrix_keypad0 (未声明的 GPIO)功能 matrix 键盘默认值
    引脚105 (PIN105):Matrix_keypad0 (未声明的 GPIO)功能 matrix-keycad_default
    引脚106 (PIN106):Matrix_keypad0 (未声明的 GPIO)功能 matrix 键盘默认值
    引脚107 (PIN107):Matrix_keypad0 (未声明的 GPIO)功能 matrix-keycad_default

    我可以看到的一个问题是 GPIO 中断未正确配置。 在我的情况下、cat /proc/interrupts 的输出应该显示一个 GPIO0中断、但它显示了

    95:         0 48320.GPIO 24边缘     TCA8418

    应为44e07000.GPIO。

    我看到这在 EVM 中得到了正确配置。

    195:         0 44e07000.GPIO  3边缘     矩阵键盘

    我在驱动程序中添加 printk、如下所示:

    IRQ =客户机->IRQ;
    printk (Kern_alert "IRQ 编号%d\n"、IRQ);
    IRQ = GPIO_TO_IRQ (IRQ);
    printk (Kern_alert "IRQ 编号%d\n"、IRQ);

    这将打印:

    [9.374763]   [TCA8418]:IRQ 编号56                                         
    [9.374770]   [TCA8418]:IRQ 编号95

    如何验证这些数字是否正确? 哪个头文件具有将中断映射到 Linux 空间的定义?

    谢谢、

    Rajat Rao

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

    我发现 EVM 和定制板上的 GPIO 映射不同。 在 EVM 上、gpiochip96控制 GPIO0、而 gpiochip0控制电路板上的 GPIO0。 我通过比较 am4372.dtsi 中的地址找到了这一点。

    我已验证 matrix-keypad 驱动程序是否将引脚99 (对于 GPIO0[3]为96+3)配置为中断引脚。 然后、如果我尝试"echo 99 >/sys/class/gpio/export "、则会收到消息"Resource is busy"。 由于 matrial_keypad 驱动程序正在保持此状态、因此预计会出现此行为。

    在我们的电路板上、即使器件树条目包含 GPIO0[21]、TCA8418驱动器也不会将正确的引脚(GPIO0[21]的引脚21)配置为中断。 因此、我强制驱动器将引脚21配置为中断。 之后、cat /proc/nterrupt 会给出
    114: 0 44e07000.GPIO 21边沿 TCA8418
    它对应于 GPIO0。

    不幸的是、仍然缺少一些东西。 如果我执行"echo 21 >/sys/class/gpio/export "、它不会说 Resource is busy、这意味着缺少一些配置。

    有人能帮我解决这个问题吗? 我在这里呆了一个多星期!

    谢谢、
    Rajat Rao
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我终于解决了这个问题。
    1) 1)如果使用器件树中的"interrupt"属性传递中断、则 TCA8418驱动程序无法正确读取/配置中断。 我必须使用 O_GET_NAMED_GPIO 单独读取、然后配置为中断。
    2) 2)驱动程序没有调用 GPIO_request、GPIO_DIRECTION _INPUT、ENABLE_IRQ。 添加这些功能可以正常工作。

    这个论坛可能是这个问题的错误位置、因为问题在驱动程序中、而不在器件树中。

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

    您好、Rajat、

    我认为我在 TCA8418驱动程序方面遇到了相同的问题。

    我对  Linux 驱动程序不是很熟悉、所以您可以与我分享您所做的更改吗?

    此致、

    Andreas Lechner

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

    尊敬的 Andreas:

    我无法将更改作为您可以应用的补丁进行共享、但下面是我更改的行-

       struct device_node *np = dev->of _node;
       如果(!np){
          DEV_ERR (dev、"[TCA8418]:器件缺少 DT 数据\n");
          返回 ERR_PTR (-ENODEV);
       }
       IRQ = of _get_named_GPIO (NP、"IRQ-GPIO"、0);         //添加类似 IRQ-GPIO 的内容= ;
       printk (Kern_debug "[TCA8418]:GPIO 编号%d\n"、IRQ);
       错误= GPIO_REQUEST (IRQ、"i2c_keypad_IRQ");
       如果(错误){
          DEV_ERR (DEV、
             "[TCA8418]:无法为 IRQ\n"、
             IRQ);
          返回错误;
       }
       GPIO_DIRECT_INPUT (IRQ);
       printk (Kern_debug "[TCA8418]:GPIO 被设定为输入\n");
       IRQ = GPIO_TO_IRQ (IRQ);
       printk (Kern_debug "[TCA8418]:IRQ 编号%d\n"、IRQ);
       
       ENABLE_IRQ (IRQ);
       错误= devm_request_threaded_IRQ (dev、IRQ、NULL、TCA8418_IRQ_handler、
                    IRQF_TRIGGER_RISING |
                      IRQF_SHARED |
                      IRQF_OneShot、
                    client->name、keypad_data);

    请注意、中断可能是为您触发的下降沿。

    Rajat Rao

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

    您好、Rajat、

    感谢您的快速响应!
     
    Andreas