主题中讨论的其他器件:PCA9534、 TCA6424
您好!
按照 TI wiki 指南以及 本论坛其他主题中的一些指导、我已经能够设置 GPIO 线路以将系统从深度睡眠模式唤醒。 但是、我在配置 第二个 IO 时发现、我无法使用该 IO 唤醒系统。 具体来说、此 IO 为 GPIO1_30、而工作唤醒 IO 为 GPIO1_16。 在 devicetree 中、我已经以类似的方式配置了这两个器件在 padconfig 中断路由方面的用法。
在无法正常工作的情况下、我使用的是 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? 我认为是由系统控制器在深度睡眠中处理中断、但不知道如何配置它。
谢谢