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:通过主 I/O 菊花链从深度睡眠模式唤醒

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1332743/am625-wake-from-deep-sleep-via-main-i-o-daisy-chain

器件型号:AM625
主题中讨论的其他器件:PCA9534TCA6424

您好!

按照 TI wiki 指南以及 本论坛其他主题中的一些指导、我已经能够设置 GPIO 线路以将系统从深度睡眠模式唤醒。 但是、我在配置 第二个 IO 时发现、我无法使用该 IO 唤醒系统。 具体来说、此 IO 为 GPIO1_30、而工作唤醒 IO 为 GPIO1_16。 在 devicetree 中、我已经以类似的方式配置了这两个器件在 padconfig 中断路由方面的用法。

https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/09_01_00_08/exports/docs/linux/Foundational_Components /内核/ Kernel_Drivers / Power_Management / PM _WAKEUP_Sources.html#main-i-o-daisy-chain

https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/arch/arm64/boot/dts/ti/k3-am62x-sk-lpm-wkup-sources.dtso?h=ti-linux-6.1.y-cicd#n329

在无法正常工作的情况下、我使用的是 PCA9534 IO 扩展器、其 线路由 GPIO 密钥绑定。 中断配置如下以允许 padconfig 唤醒:

# IO expander
pca9534: gpio@20 {
	compatible = "nxp,pca9534";
	reg = <0x20>;
	gpio-controller;
	pinctrl-names = "default";
	pinctrl-0 = <&pca9534_irq_default>;
	interrupts-extended = <&main_gpio1 30 IRQ_TYPE_EDGE_FALLING>,
						  <&main_pmx0 0x1F0>;
	interrupt-names = "irq", "wakeup";
	#gpio-cells = <2>;
	wakeup-source;
	status = "okay";
};

# gpio-keys
gpio-keys {
	compatible = "gpio-keys";
	status = "okay";
	back {
		label = "Back";
		linux,code = <KEY_BACK>;
		gpios = <&pca9534 1 GPIO_ACTIVE_LOW>;
		wakeup-source;
	};
};

我确认发送到 GPIO1_30的信号正在进行物理切换、即使处于深度睡眠状态也是如此。 此 IO 在 Linux 中确实可以正常运行、但问题是它无法唤醒系统。  我还尝试将  MAIN_pmx0中断从0x1F0 (GPIO1_30)交换为0x1b8 (GPIO1_16、我工作的唤醒 IO)、即使 未物理连接到 IO 扩展器、它也允许我验证中断的配置、因为1_16仍在此配置中唤醒系统。  

 当进入暂停模式和使用工作输入唤醒时、我甚至在 pinctrl 驱动程序中删除了一些 trace_printks 来验证配置:

      # Sleep
      pm-suspend-1021    [001] d..2.    36.869436: pcs_irq_unmask: write: 0x20050007 @ 0x9b4b1b8
      pm-suspend-1021    [001] d..2.    36.869449: pcs_irq_set_wake: write: 0x20050007 @ 0x9b4b1b8
      pm-suspend-1021    [001] d..2.    36.869455: pcs_irq_unmask: write: 0x20050007 @ 0x9b4b1f0
      pm-suspend-1021    [001] d..2.    36.869458: pcs_irq_set_wake: write: 0x20050007 @ 0x9b4b1f0
      
      # Wake
      pm-suspend-1021    [000] d..2.    36.892252: pcs_irq_set_wake: write: 0x50007 @ 0x9b4b1b8
      pm-suspend-1021    [000] d..2.    36.892264: pcs_irq_mask: write: 0x50007 @ 0x9b4b1b8
      pm-suspend-1021    [000] d..2.    36.892269: pcs_irq_set_wake: write: 0x50007 @ 0x9b4b1f0
      pm-suspend-1021    [000] d..2.    36.892272: pcs_irq_mask: write: 0x50007 @ 0x9b4b1f0

跟踪会打印出将一个值写入 pinctrl 基址的虚拟地址、在本例中、基址为0x9b4b000、外加 一个 表示硬件 IRQ 行/焊盘的偏移量。 如您所见、GPIO1_30 (0x1f0)和 GPIO1_16 (0x1b8)设置的配置相同、pinctrl 设置的29位(WKUP_EN)在暂停时被唤醒、在恢复时被清除。 但是、只有 GPIO1_16才会实际唤醒系统。

是否需要将系统中的其他部分配置为 使用 GPIO 1_30? 我认为是由系统控制器在深度睡眠中处理中断、但不知道如何配置它。

谢谢

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

    您好!

    您能否确认您使用的是定制硬件还是 TI EVM?

    我不知道通过 IO 菊花链使用多个 GPIO 有任何限制。 我将尝试复制该行为、并在该线程上做出返回响应。

    此致、

    安舒

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

    Anshu、您好!

    这在定制硬件上。

    谢谢

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

    感谢您的确认。

    您能否与在器件树中启用的两个 GPIO 共享"cat /proc/interrupts "输出?

    存在"Linux, code = "这是值得一试的。

    我不熟悉 PCA9534、因此我们可能不得不邀请其他人来评论中断如何处理此器件。

    此致、
    安舒

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

    Anshu、您好!

    请参见下面的输出:

    # cat /proc/interrupts 
               CPU0       CPU1       CPU2       CPU3       
     11:      13013      12954      13029      12689     GICv3  30 Level     arch_timer
     14:          8          0          0          0     GICv3 108 Level     mbox-m4-0, mbox-r5-0
     15:          0          0          0          0     GICv3  23 Level     arm-pmu
     16:          0          0          0          0     GICv3 130 Level     pinctrl
     17:       1894          0          0          0     GICv3  66 Level     4d000000.mailbox thr_012
     26:        747          0          0          0     GICv3 193 Level     20000000.i2c
     27:         46          0          0          0     GICv3 194 Level     20010000.i2c
     28:         35          0          0          0     GICv3 195 Level     20020000.i2c
     29:          3          0          0          0     GICv3 196 Level     20030000.i2c
     48:          0          0          0          0  MSI-INTA 1714176 Edge      485c0100.dma-controller chan0
     60:          0          0          0          0  MSI-INTA 1714688 Level     485c0100.dma-controller chan0
     79:          0          0          0          0  MSI-INTA 1715719 Edge      485c0100.dma-controller chan2
     97:          0          0          0          0  MSI-INTA 1716231 Level     485c0100.dma-controller chan2
    118:         81          0          0          0  MSI-INTA 1970707 Level     8000000.ethernet-tx0
    190:          0          0          0          0  MSI-INTA 1970779 Level     485c0000.dma-controller chan2
    208:         50          0          0          0  MSI-INTA 1971731 Level     8000000.ethernet
    232:          0          0          0          0  MSI-INTA 1971755 Level     485c0000.dma-controller chan0
    233:          0          0          0          0  MSI-INTA 1971756 Level     485c0000.dma-controller chan1
    240:        730          0          0          0     GICv3 210 Level     2800000.serial
    242:       2411          0          0          0     GICv3 215 Level     2850000.serial
    244:          0          0          0          0     GICv3 134 Level     8000000.ethernet
    247:       1089          0          0          0     GICv3 165 Level     mmc0
    250:      13307          0          0          0     GICv3 114 Level     mmc2
    303:          0          0          0          0      GPIO  48 Edge    -davinci_gpio  ads7846
    363:          0          0          0          0      GPIO  12 Edge    -davinci_gpio  f900000.dwc3-usb:connector
    367:          0          0          0          0      GPIO  16 Edge    -davinci_gpio  edt-ft5206
    381:          0          0          0          0      GPIO  30 Edge    -davinci_gpio  0-0020
    403:          0          0          0          0   pinctrl 496 Edge      0-0020:wakeup
    404:      10520          0          0          0     GICv3 115 Level     mmc1
    405:          0          0          0          0 0-0020   1 Edge      Back
    406:          0          0          0          0 0-0020   2 Edge      Home
    407:          0          0          0          0 0-0020   3 Edge      Menu
    408:          0          0          0          0     GICv3 204 Level     20100000.spi
    409:          0          0          0          0     GICv3 206 Level     20120000.spi
    410:          0          0          0          0   pinctrl 440 Edge      1-0038:wakeup
    415:          0          0          0          0     GICv3 269 Level     2b10000.audio-controller_rx
    416:          0          0          0          0     GICv3 270 Level     2b10000.audio-controller_tx
    419:        808          0          0          0     GICv3 116 Level     tidss
    420:        109          0          0          0     GICv3 118 Level     pvrsrvkm
    432:       1803          0          0          0     GICv3 258 Level     xhci-hcd:usb1
    IPI0:       758       3104       3377      12836       Rescheduling interrupts
    IPI1:      1391       1813       1310       2324       Function call interrupts
    IPI2:         0          0          0          0       CPU stop interrupts
    IPI3:         0          0          0          0       CPU stop (for crash dump) interrupts
    IPI4:         0          0          0          0       Timer broadcast interrupts
    IPI5:        77         79         39         59       IRQ work interrupts
    IPI6:         0          0          0          0       CPU wake-up interrupts
    Err:          0

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

    您好!

    我能够确认可以使用多个 IO 菊花链唤醒源、因此可以排除这种情况。

    当器件处于深度睡眠模式时、PCA9534是否在您的定制硬件上供电?

    根据我的理解、当其中一个输入发生变化时、INT 信号将拉低。 在这种情况下、我假设 INT 引脚连接到 GPIO1_30。 如有需要、请更正。

    稍微类似于 tca6424的示例: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/arch/arm64/boot/dts/ti/k3-am625-sk.dts?h=ti-linux-6.1.y#n206

    这是 PCA95xx 的器件树绑定: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/Documentation/devicetree/bindings/gpio/gpio-pca95xx.yaml?h=ti-linux-6.1.y


    没有向节点添加唤醒功能的明显示例、因此我不知道所需的确切语法。 我目前没有测试 IO 扩展器的正确方法、因此可能需要调试。

    此致、

    安舒

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

    Anshu、您好!

    感谢您的确认。 请注意、使用 KEY_WAKEUP 也不起作用。 是的、IO 扩展器在挂起期间仍然通电。

    为了尝试从公式中提取 PCA9534驱动程序、我从器件树中删除了 GPIO1_30的 IRQ 分配。 这样做的实际上是允许 PCA9534 驱动程序在轮询模式下运行、并释放 GPIO/IRQ 以用于其他地方。 如前所述、连接到 GPIO 的扩展器的输出在输入发生变化时将变为低电平。 由于我可以使用输入端的按钮轻松更改扩展器的输入、因此我实际上可以使用这些按钮来驱动 GPIO1_30变为低电平和高电平。 我使用 IO 上的电压表确认了这一点、包括在暂停模式下。

    然后、我将 GPIO1_30声明为 GPIO 密钥的 IRQ -因此这看起来与 TI 的示例非常相似:

    # IO expander
    pca9534: gpio@20 {
    	compatible = "nxp,pca9534";
    	reg = <0x20>;
    	gpio-controller;
    	pinctrl-names = "default";
    	pinctrl-0 = <&pca9534_irq_default>;
    	#gpio-cells = <2>;
    	status = "okay";
    };
    
    # gpio-keys
    gpio-keys {
        compatible = "gpio keys";
    	status = "okay";  
    	switch {
          label = "WKUP";
          linux,code = <KEY_WAKEUP>;
          interrupts-extended = <&main_gpio1 30 IRQ_TYPE_EDGE_FALLING>,
    	                                        <&main_pmx0 0x1f0>;
          interrupt-names = "irq", "wakeup";
    	};
    };

    使用 evtest、我可以看到它在切换。

    # evtest /dev/input/event0 
    Input driver version is 1.0.1
    Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
    Input device name: "gpio-keys"
    Supported events:
      Event type 0 (EV_SYN)
      Event type 1 (EV_KEY)
        Event code 143 (KEY_WAKEUP)
    Properties:
    Testing ... (interrupt to exit)
    Event: time 1709843683.818967, type 1 (EV_KEY), code 143 (KEY_WAKEUP), value 1
    Event: time 1709843683.818967, -------------- SYN_REPORT ------------
    Event: time 1709843683.824091, type 1 (EV_KEY), code 143 (KEY_WAKEUP), value 0
    Event: time 1709843683.824091, -------------- SYN_REPORT ------------
    Event: time 1709843684.867107, type 1 (EV_KEY), code 143 (KEY_WAKEUP), value 1
    Event: time 1709843684.867107, -------------- SYN_REPORT ------------
    Event: time 1709843684.872175, type 1 (EV_KEY), code 143 (KEY_WAKEUP), value 0
    Event: time 1709843684.872175, -------------- SYN_REPORT ------------

    但是、它仍将不会唤醒系统、但会在系统唤醒时生成中断:

    # cat /proc/interrupts | grep WKUP
    381:         11          0          0          0      GPIO  30 Edge    -davinci_gpio  WKUP
    404:          0          0          0          0   pinctrl 496 Edge      WKUP:wakeup

    此外、我可以使用 gpioget 来查看物理输入正在切换、如 GPIO 控制器所读:

    # gpiodetect
    gpiochip0 [0-0020] (8 lines)
    gpiochip1 [600000.gpio] (92 lines)
    gpiochip2 [601000.gpio] (52 lines)
    root@am62x-var-som:~# gpioget 2 30
    1
    root@am62x-var-som:~# gpioget 2 30
    0
    root@am62x-var-som:~# gpioget 2 30
    1
    root@am62x-var-som:~# gpioget 2 30
    0
    root@am62x-var-som:~# gpioget 2 30
    1

    如果您希望我在现有工具之外对其进行任何具体调试、请告诉我、我可以提供结果。

    谢谢

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

    您好!

    器件树节点仍需要 KEY_WAKEUP。

    我将在内部联系 PCA9534、看看他们是否对此有任何经验。 请等待几天时间进行回复。

    同时、您可以随时使用任何新信息更新该主题帖。

    谢谢。

    安舒

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

    您好!

    PCA 朋友向我指出了有关器件树节点的此 E2E 主题: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/562008/linux-pca9534a-how-to-include-pca9534a-and-its-connections-in-device-tree

    此致、

    安舒