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:GPIO PIN_OUTPUT_PULLUP 的 pinctrl

Guru**** 2668255 points

Other Parts Discussed in Thread: AM67A

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1590357/am67a-pinctrl-for-gpio-pin_output_pullup

器件型号: AM67A

我目前正在尝试将一个引脚配置为 GPIO、默认情况下该引脚为高电平、因为它用于器件复位。
我为相应的 padconfig 使用了 PIN_OUTPUT_PULLUP、希望看到该引脚在默认情况下为高电平、但情况并非如此。  

我在 k3-pinctrl.h 中看到了定义

#define PIN_OUTPUT_PULLUP	(INPUT_DISABLE | PULL_UP

我在 DT 中做了以下相关定义。

&main_gpio1 {
	pinctrl-names = "default";
	pinctrl-0 = <&main_gpio1_pins>;
	gpio-line-names =
	//00  01  02  03  04  05  06  07  08  09
	"", "", "", "", "", "", "", "", "", "",  // 00 - 09
	"", "", "", "", "", "", "", "", "", "",  // 10 - 19
	"", "", "", "", "", "DEV_NRST", "", "", "", "",  // 20 - 29
	"", "", "", "", "", "", "", "", "", "",  // 30 - 39
	"", "", "", "", "", "", "", "", "", "",  // 40 - 49
	"", "", "";            // 50 - 52
};
//...
&main_pmx0 {
   main_gpio1_pins: main-gpio1-pins {
	pinctrl-single,pins = <
		J722S_IOPAD(0x0194, PIN_INPUT, 7) /* (A25) MCASP0_AXR3.GPIO1_7 */
		J722S_IOPAD(0x0198, PIN_INPUT, 7) /* (A26) MCASP0_AXR2.GPIO1_8 */
		J722S_IOPAD(0x019c, PIN_INPUT, 7) /* (B25) MCASP0_AXR1.GPIO1_9 */
		J722S_IOPAD(0x01a0, PIN_INPUT, 7) /* (F23) MCASP0_AXR0.GPIO1_10 */
		J722S_IOPAD(0x01a4, PIN_INPUT, 7) /* (D25) MCASP0_ACLKX.GPIO1_11 */
		J722S_IOPAD(0x01a8, PIN_INPUT, 7) /* (C26) MCASP0_AFSX.GPIO1_12 */
		J722S_IOPAD(0x01ac, PIN_INPUT, 7) /* (C27) MCASP0_AFSR.GPIO1_13 */
		J722S_IOPAD(0x01b0, PIN_INPUT, 7) /* (F24) MCASP0_ACLKR.GPIO1_14 */
		J722S_IOPAD(0x01d4, PIN_OUTPUT, 7) /* (B21) UART0_RTSn.GPIO1_23 */
		J722S_IOPAD(0x01d8, PIN_INPUT, 7) /* (D22) MCAN0_TX.GPIO1_24 */
		J722S_IOPAD(0x01dc, PIN_OUTPUT_PULLUP, 7) /* (C22) MCAN0_RX.GPIO1_25 => DEV_NRST*/
		J722S_IOPAD(0x0240, PIN_INPUT, 7) /* (B24) MMC1_SDCD.GPIO1_48 */
		J722S_IOPAD(0x0244, PIN_INPUT, 7) /* (A24) MMC1_SDWP.GPIO1_49 */
		J722S_IOPAD(0x0254, PIN_OUTPUT_PULLUP, 7) /* (E25) USB0_DRVVBUS.GPIO1_50 */
	>;
  };
//...

我检查了 pinctrl 寄存器 (0x000F41DC)、从中可以看到两者之间的区别  PIN_OUTPUT_PULLUP PIN_OUTPUT

一方 PIN_OUTPUT_PULLUP
0x00020007.

一方 PIN_OUTPUT
0x00010007

GPIO 挂起是可以工作的、但会阻止进一步的使用。

dev_nrst-hog {
    gpio-hog;
    gpios = <25 0>;
    output-high;
};

pinctrl 寄存器具有以下不同的值。
0x00054007.

这可能意味着 pinctrl 寄存器中之前的值不正确。 是这样吗?

有趣的是、当我在 U-Boot DTS 中同时更改 pinctrl 时、我会获得所需的结果。
但是、Linux 启动后、相同的值会再次出现在 pinctrl 寄存器中。

是否有人知道我在哪里犯了错误或可能发生了什么故障?

 

我还创建了一个(可能?)   一段时间前、我发现输入的上拉定义在请求带有 gpiod 的线路后被覆盖。

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

    您好:

    我将 PIN_OUTPUT_PULLUP 用于相应的 padconfig、希望在默认情况下看到该引脚为高电平、但情况并非如此。  [/报价]

    完成此操作后、您可以检查 GPIO 上的电压吗? 如果其处于~0.7V 范围内、则会处于不确定状态。 如果其~0V、则它将为逻辑 0。

    谢谢、

    Anshu

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

    您好 Martin Höhn ör,

    Padconfigs 设置:

    最低电流限制 寄存器值 含义
    GPIO-HOG 0x00054007.
    • GPIO
    • 施密特触发
    • 接收器被启用
    PIN_OUTPUT_PULLUP 0x00020007.
    • GPIO
    • 启用上拉/下拉
    • 选择了上拉电阻
    PIN_OUTPUT 0x00010007
    • GPIO
    •  禁用上拉/下拉

    您可以尝试的一些操作:

    • 将该引脚设置为具有上拉电阻的输入、然后您可以稍后使用 gpioset 来覆盖它。
    • 为您的器件编写内核驱动程序并在驱动程序中更改/设置 GPIO。
    • 在 U-Boot 中设置 GPIO、并从 Linux 器件树中删除 GPIO(不过,这将使您无法在 Linux 中控制 GPIO)

    此致、
    Jared

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

    我刚意识到我犯了一个愚蠢的错误。
    我不知道我的 U-Boot DT 具有将引脚拉至低电平的 GPIO-HOG 定义。
    当我使用不同的 U-Boot DT 进行测试以更改 pinctrl 时、我还在没有意识到的情况下删除了 HOG 定义。

    在我看来、Linux 中的 pinctrl 驱动程序确实更改了寄存器、但由于引脚之前是在 U-Boot 中通过 gpio-hog 控制的、因此没有预期的结果。
    因此、尽管 Linux pinctl 驱动器将 pinctrl 寄存器设置为 0x00020007 (PIN_output_pullup)、但电平仍由 gpiochip(我想)下拉。
    只有在 Linux DT 中使用 gpiod 调用或手动 gpiod 调用、我才能修复物理级别。

    从 U-Boot DT 中删除 HOG 后、会出现我想要的行为。
    因此、我想使用未同步 DTS 是一个很糟糕的主意、尤其是在 gpio-hog 和 pinctrl 等情况下。

    有一件事我不明白、可能是因为我不了解 pinctrl 和 GPIO 控制之间的连接。

    每当我通过 gpiod 设置或读取 GPIO 时、pinctrl 寄存器值都会发生变化(在我的测试中,它始终独立于操作和给定偏置变为 0x00054007)、并在释放线路后保持在该值。

    例如、当我将引脚定义为通过 pinctrl 进行内部上拉的输入时、引脚在引导后的电平为高电平。 但是、当我通过 gpiod 读取该引脚的值时、上拉电阻器就会消失。
    在 gpiod 调用中定义偏置不起作用。

    我头上有两个问题:

    1.为什么在 gpiod 调用中设置偏差似乎没有效果? 这可能是 gpiod 或 gpiochip 驱动程序中的错误吗?
    2.为什么请求更改 pinctrl 值,但在释放后不恢复它? 根据问题 1 的答案、这可能无关紧要。

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

    尊敬的 Martin:

    AM67A 是我们组织的一款全新器件、因此我需要一些时间来研究一下、然后再联系您。

    谢谢、

    Anshu

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

    尊敬的 Martin:

    为什么在 gpiod 调用中设置偏差似乎没有效果? 这可能是 gpiod 或 gpiochip 驱动程序中的错误吗?

    因此、AM67A 使用 GPIO-DaVinci 驱动程序: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/gpio/gpio-davinci.c?h=ti-linux-6.12.y

    此驱动程序不会解释 gpiod 会通过的任何偏置参数。  

    为什么请求会更改 pinctrl 值、但在发布后不会恢复它? [/报价]

    我目前对此没有任何答案。 我已在此项目上提交了一个错误、供开发团队查看。

    此致、

    Anshu