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:a72使用 wkup_GPIO 中断问题

Guru**** 2392095 points
Other Parts Discussed in Thread: TDA4VM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1495987/tda4vm-a72-use-wkup_gpio-interrupt-problem

器件型号:TDA4VM

工具/软件:

你(们)好

在 SDK 10中、我们希望使用 E27作为中断端口。

所以我修改了代码  

From 967005c5ab27b8a757fd713f4d6462495314ef83 Mon Sep 17 00:00:00 2001
From: Keerthy <j-keerthy@ti.com>
Date: Thu, 11 Nov 2021 20:39:59 +0530
Subject: [PATCH] davinci_gpio: Test interrupts

This specifically tries out wkup_gpio52

Signed-off-by: Keerthy <j-keerthy@ti.com>
---
 .../dts/ti/k3-j721e-common-proc-board.dts     | 17 ++++++++
 drivers/gpio/gpio-davinci.c                   | 41 +++++++++++++++++++
 2 files changed, 58 insertions(+)

diff --git a/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts b/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
index c0d32b806..9079f82e3 100644
--- a/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
+++ b/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
@@ -93,6 +93,12 @@
 			 <3300000 0x1>;
 	};
 
+	gpio_test: gpio_test {
+		compatible = "ti,gpio_test";
+		interrupt-parent = <&wkup_gpio0>;
+		interrupts = <52 IRQ_TYPE_EDGE_BOTH>;
+	};
+
 	sound0: sound@0 {
 		compatible = "ti,j721e-cpb-audio";
 		model = "j721e-cpb";
@@ -301,6 +307,12 @@
 		>;
 	};
 
+	test_key_pins_default: test-key-pins-default {
+		pinctrl-single,pins = <
+			J721E_WKUP_IOPAD(0x90, PIN_INPUT, 7) /* (E27) WKUP_GPIO0_52 */
+		>;
+	};
+
 	mcu_fss0_ospi1_pins_default: mcu-fss0-ospi1-pins-default {
 		pinctrl-single,pins = <
 			J721E_WKUP_IOPAD(0x34, PIN_OUTPUT, 0) /* (F22) MCU_OSPI1_CLK */
@@ -433,6 +445,11 @@
 	status = "disabled";
 };
 
+&wkup_gpio0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&test_key_pins_default>;
+};
+
 &main_sdhci0 {
 	/* eMMC */
 	non-removable;
diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c
index 6f2138503..9c71df4fa 100644
--- a/drivers/gpio/gpio-davinci.c
+++ b/drivers/gpio/gpio-davinci.c
@@ -23,8 +23,15 @@
 #include <linux/irqchip/chained_irq.h>
 #include <linux/spinlock.h>
 
+
 #include <asm-generic/gpio.h>
 
+#include <linux/interrupt.h>
+#include <linux/of_irq.h>
+#include <linux/of_gpio.h>
+
+int gpio_test_init(void);
+ 
 #define MAX_REGS_BANKS 5
 #define MAX_INT_PER_BANK 32
 
@@ -187,6 +194,35 @@ davinci_gpio_get_pdata(struct platform_device *pdev)
 	return NULL;
 }
 
+static irqreturn_t test_irq(int irq, void *data)
+{
+	pr_info("%s: irq %d, val=%d\n", __func__, irq,
+		gpio_get_value(432));
+	return IRQ_HANDLED;
+}
+
+int gpio_test_init(void)
+{
+	struct device_node *np;
+	int irq;
+	int ret = 0;
+
+	np = of_find_node_by_name(NULL, "gpio_test");
+
+	if (np) {
+		pr_info("Initializing gpio test\n");
+		irq = irq_of_parse_and_map(np, 0);
+		printk("irq number is %d\n", irq);
+		ret = request_irq(irq, test_irq, //IRQF_TRIGGER_RISING,
+				  IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
+				  "key-gpio", NULL);
+		if (ret)
+			pr_err("request_irq returns %d\n", ret);
+	}
+
+	return ret;
+}
+
 static int davinci_gpio_probe(struct platform_device *pdev)
 {
 	int bank, i, ret = 0;
@@ -195,6 +231,7 @@ static int davinci_gpio_probe(struct platform_device *pdev)
 	struct davinci_gpio_platform_data *pdata;
 	struct device *dev = &pdev->dev;
 
+	printk("Name of gpio dev is %s\n", pdev->name);
 	pdata = davinci_gpio_get_pdata(pdev);
 	if (!pdata) {
 		dev_err(dev, "No platform data found\n");
@@ -273,6 +310,10 @@ static int davinci_gpio_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
+	if (!strcmp("42110000.gpio", pdev->name)) {
+		gpio_test_init();
+	}
+
 	return 0;
 }
 
-- 
2.17.1

但这是不起作用的

日志为:

[1.399969]##### GPIO DEV 的名称是42110000.gpio
[ 1.404119] mmc0:使用 ADMA 64位的4f80000.mmc [4f80000.mmc]上的 SDHCI 控制器
[ 1.404865] mmc1:使用 ADMA 64位的4fb0000.mmc [4fb0000.MMC]上的 SDHCI 控制器
[ 1.419787] DaVinci _GPIO 42110000。GPIO:错误-ENXIO:未找到 IRQ 索引0

BR

中断

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

    您好、

    您能否分享您移植的确切补丁、而不是常见问题解答中的补丁。 GPIO 框架发生了更改、并删除了这些更改
    默认情况下支持 sysfs。 因此、此常见问题解答将无法按最新 SDK 中的原样使用。

    - Keerthy

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

    你(们)好

    这是我们修改的所有修补程序。 请您帮助分析一下

    BR

    zhangbo

    e2e.ti.com/.../7701.gpio.txt

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

    谢谢。 我将尝试在 EVM 上重现相同内容。 我将在下周一早回来。

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

    您好:

    我现在正在 TDA4VM 上使用 SDK 10.1。 我尚未移植上述补丁、但在 EVM 上有2个用户按钮按键。

    Root@j721e-EVM:~# cat /proc/interrupts | grep gpio

    225:6 0 GPIO 7 Edge -DaVinci GPIO GPIO Key User2
    310:12 0 GPIO 0 Edge -DaVinci GPIO GPIO Key User1

    我能够看到在按下 GPIO 中断时 GPIO 中断很好地触发。

    文件: arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts

            gpio_keys: gpio-keys {
                    compatible = "gpio-keys";
                    autorepeat;
                    pinctrl-names = "default";
                    pinctrl-0 = <&sw10_button_pins_default>, <&sw11_button_pins_default>;
    
                    sw10: switch-10 {
                            label = "GPIO Key USER1";
                            linux,code = <BTN_0>;
                            gpios = <&main_gpio0 0 GPIO_ACTIVE_LOW>;
                    };
    
                    sw11: switch-11 {
                            label = "GPIO Key USER2";
                            linux,code = <BTN_1>;
                            gpios = <&wkup_gpio0 7 GPIO_ACTIVE_LOW>;
                    };
            };
            
    sw10_button_pins_default: sw10-button-default-pins {
                    pinctrl-single,pins = <
                            J721E_IOPAD(0x0, PIN_INPUT, 7) /* (AC18) EXTINTn.GPIO0_0 */
                    >;
    };

    因此 GPIO 中断没有问题。

    - Keerthy

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

    此外:

    https://e2e.ti.com/support/processors-group/processors/f/791/t/1493427

    以上是重复的。 我能否结束讨论并在此处继续讨论?

    - Keerthy

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

    你(们)好

    好的、我们可以在这里继续讨论。 谢谢你

    BR

    zhangbo

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

    你(们)好

    根据此 DTS、您的配置似乎是针对 wkup 引脚的、而不是针对正在使用的 wkup 中断

    BR

    zhangbo

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

    您好、

    我将补丁移植到10.1 SDK、我看到中断已正确注册:

    Cat /proc/interrupts | grep GPIO                                                                                                               
    225:         0         0     GPIO  7 Edge   -DaVinci GPIO GPIO Key User2
    227:                  0 0     GPIO  9 Edge   -DaVinci _GPIO tps6594-0-0x48 、tps6594-0-0x4c
    270:                  0     GPIO 52 Edge   -DaVinci _GPIO Key-GPIO  
    310:                  0 0     GPIO  0 Edge   -DaVinci GPIO GPIO Key User1

    270中断

    [   1.417500]初始化 GPIO 测试
    [   1.422822] IRQ 编号为270

    补丁:

    e2e.ti.com/.../0001_2D00_Test_2D00_GPIO_2D00_Interrupts_2D00_10.1_2D00_SDK.patch

    - Keerthy

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

    你(们)好

    非常感谢您的回答、但我们的 dts 文件修改了一些代码。 这是我们修改后的 dts 文件、对于您提供的补丁、它仍然会报告错误"davinci_GPIO 42110000。 GPIO:错误- ENXIO:未找到 IRQ 索引0 "。 您能帮助我们检查我们修改的代码导致此问题的位置吗? 下面是我们修改后的 DTS 文件和启动日志。

    BR

    zhangbo

    e2e.ti.com/.../start.txt

    e2e.ti.com/.../5531.k3_2D00_j721e_2D00_common_2D00_proc_2D00_board.dts.txt

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

    您好、Zhang、

    您能否仔细检查 dtb/dts 中是否存在 wkup_gpio_intr 节点? 这是 wkup_GPIO 节点的中断父级。

    - Keerthy

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

    你(们)好

    我在 k3-j721e-mcu-wakeup.dtsi 上搜索并找到了此配置。 我不知道这里是否配置正确

    BR

    zhangbo

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

    您好、

    请附加用于启动的 DTB、我将反向编译以获得 dts 并检查。

    - Keerthy

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

    你(们)好

    非常感谢您的支持。 附件是 dtb 文件

    BR

    zhangbo

    e2e.ti.com/.../8468.k3_2D00_j721e_2D00_common_2D00_proc_2D00_board.zip

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

    您好、

                            interrupt-controller@42200000 {
                                    compatible = "ti,sci-intr";
                                    reg = <0x00 0x42200000 0x00 0x400>;
                                    ti,intr-trigger-type = <0x01>;
                                    interrupt-controller;
                                    interrupt-parent = <0x01>;
                                    #interrupt-cells = <0x01>;
                                    ti,sci = <0x09>;
                                    ti,sci-dev-id = <0x89>;
                                    ti,interrupt-ranges = <0x10 0x3c0 0x10>;
                                    phandle = <0x0a>;
                            };
    
    

    wkup_GPIO_intr 在您的 DTB 中启用。 您能否分享用于在 Linux 存储库上创建 dtb 的完整 diff?

    - Keerthy

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

    你(们)好

    感谢您的回答。 先给我几天时间进行调查

    BR

    zhangbo