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.

[参考译文] AM67A:通过 gpiod 请求线路时、PD 的 pinctrl (PU/GPIO) 似乎被覆盖

Guru**** 2538930 points
Other Parts Discussed in Thread: AM67A

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1559669/am67a-pinctrl-of-gpio-pu-pd-seems-overwritten-when-requesting-the-line-via-gpiod

器件型号:AM67A


工具/软件:

我发现了一种有趣的行为、PD 在基于 AM67A 的电路板 (BeaglY-AI) 上、GPIO 辅助控制与内部 PU/GPIO。

我一开始想通过 GPIO 密钥驱动程序将 GPIO 用作输入。

为方便起见、我将引脚配置为具有内部上拉电阻器的 GPIO。

gpio-keys {
	compatible = "gpio-keys";
	pinctrl-names = "default";
	pinctrl-0 = <&hat_36_gpio_pu>;
	
	key {
		label = "S1-BTN";
		/* HAT 36 (GPIO 16) */
		gpios = <&main_gpio1 7 GPIO_ACTIVE_LOW>;
		linux,code = <30>;
	};
};

pinctrl 定义如下所示:

hat_36_gpio_pu: hat-36-gpio-pu-pins {
	pinctrl-single,pins = <
		J722S_IOPAD(0x194, PIN_INPUT_PULLUP, 7) /* (A25) MCASP0_AXR3.GPIO1_7 */
	>;
};

但 我发现、当探测 GPIO 密钥驱动器时、上拉电阻器会丢失、因此引脚悬空。

然后我尝试研究一个位、似乎每当我通过 gpiod 请求行(内核或用户空间)时、上拉定义就会丢失、引脚悬空。

pinctrl 寄存器时、也可以看到这一点。

在请求带有 gpiod 的行之前:

引脚状态 pinctrl 寄存器 输出 gpioinfo
上拉 0x00060007. 第 7 行:“GPIO16"未“未使用输入高电平有效

当请求行时:

请注意、我已测试请求具有和不具有既定偏差的线路、但这对结果没有任何影响。

引脚状态 pinctrl 寄存器 输出 gpioinfo
悬空 0x00050007. 第 7 行:“GPIO16"btn-python-example"输入“输入高“高电平有效【使用的上拉电阻器】

当行被释放时:

引脚状态 pinctrl 寄存器 输出 gpioinfo
悬空 0x00050007. 第 7 行:“GPIO16"未“未使用输入高电平有效

由于我没有 AM67A 的参考板、因此我无法检查是否存在这种行为。

但是、我在 AM64x EVM(相同的内核树和版本)上进行了检查、没有发生。

此处通过 pinctrl 实现的内部上拉/下拉定义仍在线路请求后保留。

通过 gpiod 请求线时偏倚的定义也没有任何效果。

对于测试、我使用了 ti-linux-6.12.y(标签 11.00.12)。

有人可以在参考设计电路板上重现该情况吗、有人是否知道为什么会出现这种情况?

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

    您好:

    让我来研究一下、然后在星期一上联系您。

    谢谢、

    Anshu

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

    您好:

    我没有 AM67A 电路板进行测试。

    我们尝试直接写入 GPIO 寄存器、而不是使用 gpiod API。 我想这应该表明该行为是由 API 本身引起的还是由更改 GPIO 的行为引起的。

    您能否运行这些命令、然后检查 PADCONFIG 寄存器:

    devmem2 0x00601018 w 0x80
    devmem2 0x00601010 w 0x0
    devmem2 0x00601014 w 0x80

    谢谢、

    Anshu

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

    大家好、感谢您的答复。

    我不确定 GPIO 寄存器、因为 找不到它的 说明。

    但是、我只需在每次写入后运行命令并检查 PADCONFIG 寄存器。

    我可以说、当写入 GPIO 寄存器时、PADCONFIG 寄存器不会改变。

    但是、引脚的物理电平确实会发生变化。

    在执行第一个写命令后、物理级别不会改变。

    因此、当 已经请求线路时、引脚仍然悬空、并且在尚未请求线路时仍被上拉。

    在第二条写入命令之后、电平会发生变化、并且引脚会被下拉。

    第三个写入命令不会影响物理级别。

    如果您需要更多信息或希望我执行其他检查、请告知我。

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

    您好:

    感谢您的更新。

    我对此做了更多的研究。 有一个引脚控制驱动器用于管理 PADCONFIG 寄存器: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/pinctrl/pinctrl-single.c?h=ti-linux-6.12.y。

    有一个函数可以处理该驱动程序内的 GPIO 交互: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/pinctrl/pinctrl-single.c?h=ti-linux-6.12.y#n404

    代码序列似乎会执行此“else"块“块、该块会更改以下位: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/pinctrl/pinctrl-single.c?h=ti-linux-6.12.y#n433

    根据我的理解、这可能是位发生变化的可能原因。  根据我的测试、这个相同的“其他“块似乎在 AM62x 上不执行。

    我向软件开发团队提交了一个错误、因为这是意外行为。 我目前没有理由执行这些按位运算、因此我需要进行一些讨论。

    谢谢、

    Anshu