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.

[参考译文] Linux/AM3352:在器件树中设置 GPIO

Guru**** 2609955 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/580424/linux-am3352-setting-up-gpio-in-the-device-tree

器件型号:AM3352

工具/软件:Linux

我在为正在开发的定制板设置 GPIO 时遇到问题。 我们在 AM335x EVM 之后对电路板进行了松散建模、但我们没有在尽可能多的外设附近使用这些器件。 我一直在尝试通过在 DTS 文件中创建一个新节点来利用 GPIO、但它似乎不像我认为的那样工作。 GPIO 未设置、对寄存器的访问甚至未设置。 与 GPIO 相关的 CM_PER 寄存器和 CM_WKUP 寄存器似乎从 Uboot 中的正确设置变为 Linux 中的错误设置。

在包含 am33xx.dtsi 文件的.dts 文件中、我尝试添加的节点示例包括在&am33xx_pinmux 部分中:

GPIO0_Pins:GPIO0_Pins{
pinctrl-single、pins =<
0x164 (PIN_INPUT | MUX_MODE7)/*(C18) eCAP0_IN_PWM0_OUT.GPIO0[7]*/
0xd0 (PIN_INPUT | MUX_MODE7)/*(V2) LCD_data12.GPIO0[8]*/
0xD4 (PIN_INPUT | MUX_MODE7)/*(V3) LCD_data13.GPIO0[9]*/
0xd8 (PIN_OUTPUT PULLUP | MUX_MODE7)/*(V4) LCD_data14.GPIO0[10]*/
0xdc (PIN_OUTPUT 上拉| MUX_MODE7)/*(T5) LCD_data15.GPIO0[11]*/
0x1b0 (PIN_INPUT | MUX_MODE7)/*(A15) xdma_event_in0.GPIO0[19]*/
0x1b4 (PIN_INPUT | MUX_MODE7)/*(D14) xdma_event_intr1.gpio0[20]*/
0x20 (PIN_INPUT | MUX_MODE7)/*(U10) GPMC_AD8.GPIO0[22]*/
0x24 (PIN_INPUT | MUX_MODE7)/*(T10) GPMC_AD9.GPIO0[23]*/
0x28 (PIN_INPUT | MUX_MODE7)/*(T11) GPMC_ad10.GPIO0[26]*/
0x2C (PIN_INPUT | MUX_MODE7)/*(U12) GPMC_AD11.GPIO0[27]*/
0x144 (PIN_INPUT | MUX_MODE7)/*(H18) rmii1_REFCLK.GPIO0[29]*/
>;
};

在下面的部分中:

GPIO0{&gpio0}
TI、no-reset-on-init;
};

我真的不熟悉器件树结构、因此我们希望获得任何帮助。

谢谢、

达拉斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、达 如果要定义新段、则需要"兼容"字段才能将其绑定到驱动程序。 例如、如果您有一个按钮:

    GPIO_keys{

    兼容="GPIO-keys";
    #address-cells =<1>;
    #size-cells =<0>;
    自动执行;

    键@0{
    标签="上锁";
    linux、code =<103>;
    GPIO =<&GPIO1 20 GPIO_ACTIVE_LOW>;
    去抖间隔=<8>;
    GPIO 密钥、唤醒;
    };


    当内核启动时、会探测到行"compatible ="GPIO-keys;"、它将连接这些嵌套的 GPIO。 另一个示例是:

    兼容="GPIO-LED";

    它将 GPIO 连接到 Linux LED 驱动器。 您的 GPIO 打算做什么? 那么、下面有一个级别、即引脚多路复用。 引脚多路复用(或在 Linux 中被调用的引脚控制)是它自己的'Device (设备)'。 标记为&am33xx_pinmux 的部分必须在其中进行任何引脚初始化。 如果您查看 am33xx.dtsi (在同一目录中),则有一个名为 am33xx_pinmux 的部分(实际上是同一个部分-&也是一个引用...)。 它有自己的“兼容=...” 条目。 对于每种类型的器件树条目、"Documentation / devicetree/bindings"下有一整组文档。 非常有帮助。 希望这有助于清除问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Chris、

    感谢您的回答。 我已经离开了城市、否则我会更早地回应。 您的描述很有帮助。 实际上、我未能包含代码段、我在其中调用了"兼容="GPIO-keys"行。

    我已经浏览过您所介绍的 section 目录中的一些绑定文档、但在某些方面、我没有发现任何文档特别清晰。 例如、各种 Linux、代码意味着什么? 在您的示例中、它<103>、但是否有相对无限数量的代码选项、或者是否有上限?

    我很难确定的一个更重要的问题也与您关于 GPIO 的目的的问题有关。 我使 GPIO 在器件树中正常工作的唯一方法是、如果它们是输出、则将它们设置为 LED;如果它们是输入、则将它们设置为按键。 我无法将它们设置为通用 GPIO。 我的大多数 GPIO 都不是 LED 或按键。 它们要么是进入 FET 以打开或关闭器件的控制信号、要么是来自 PMIC 的电源正常信号等输入信号。  

    我已经尝试使用兼容的="ti、OMAP4-GPIO";绑定、但是这个调用看起来不能正确设置 PRCM 以允许访问 GPIO 寄存器。 如果我使用其他 LED 和键绑定、我只能访问寄存器。

    再次感谢您的帮助、我期待您能就如何进行下一步工作提出任何其他建议。

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

    您好、达拉斯、

    关键代码是 Linux 为特定输入定义的值。 因此、如果您希望自定义 GPIO 发送"向上箭头"、则将该键码设置为103。 关键代码全部位于 include/linux/input.h 中

    至于仅使用原始 GPIO、您应该只需要按照我之前所述设置引脚多路复用、然后您的 GPIO 应该可以通过 sysfs 在用户空间中使用(有关 更多详细信息、请参阅此处)。 GPIO 始终必须连接一些驱动程序、才能在用户空间中使用。 sysfs 是一种简单的访问方式、无需任何其他驱动程序。 但是、如果您只打算通过另一个器件驱动程序访问 GPIO、则应将该 GPIO 定义为该器件的一部分。