在哪里可以找到有关内核设备树 pinctrl 参数的文档?

Posted

技术标签:

【中文标题】在哪里可以找到有关内核设备树 pinctrl 参数的文档?【英文标题】:Where to find documentation about the kernel device tree pinctrl parameters? 【发布时间】:2020-11-08 09:54:43 【问题描述】:

我正在尝试将新的以太网设备添加到现有的 stm32mp1 板上,但我在设备树部分有点迷失了。

到目前为止我发现了什么:

board.dts 文件中,我可以找到连接到以太网 PHY 的引脚:

&pinctrl 
    ethernet0_rgmii_pins: rgmii-0 
        pins1 
            pinmux = <STM32_PINMUX('G', 4, AF11)>, /* ETH_RGMII_GTX_CLK */
                     <STM32_PINMUX('B', 12, AF11)>, /* ETH_RGMII_TXD0 */
                     <STM32_PINMUX('G', 14, AF11)>, /* ETH_RGMII_TXD1 */
                     <STM32_PINMUX('C', 2, AF11)>, /* ETH_RGMII_TXD2 */
                     <STM32_PINMUX('E', 2, AF11)>, /* ETH_RGMII_TXD3 */
                     <STM32_PINMUX('G', 11, AF11)>, /* ETH_RGMII_TX_CTL */
                     <STM32_PINMUX('C', 1, AF11)>; /* ETH_MDC */
            bias-disable;
            drive-push-pull;
            slew-rate = <2>;
        ;

        pins2 
            pinmux = <STM32_PINMUX('A', 2, AF11)>; /* ETH_MDIO */
            bias-disable;
            drive-push-pull;
            slew-rate = <0>;
        ;

        pins3 
            pinmux = <STM32_PINMUX('C', 4, AF11)>, /* ETH_RGMII_RXD0 */
                     <STM32_PINMUX('C', 5, AF11)>, /* ETH_RGMII_RXD1 */
                     <STM32_PINMUX('H', 6, AF11)>, /* ETH_RGMII_RXD2 */
                     <STM32_PINMUX('H', 7, AF11)>, /* ETH_RGMII_RXD3 */
                     <STM32_PINMUX('A', 1, AF11)>, /* ETH_RGMII_RX_CLK */
                     <STM32_PINMUX('A', 7, AF11)>; /* ETH_RGMII_RX_CTL */
            bias-disable;
        ;
    ;
;

&ethernet0 
    status = "okay";
    pinctrl-0 = <&ethernet0_rmii_pins>;
    pinctrl-names = "default";
    phy-mode = "rgmii";
    phy-handle = <&phy0>;
    st,eth_clk_sel = <1>;
    max-speed = <1000>;
    clock-names = "stmmaceth", "mac-clk-tx", "mac-clk-rx", "eth-ck", "syscfg-clk", "ethstp";
    clocks = <&rcc ETHMAC>, <&rcc ETHTX>, <&rcc ETHRX>, <&rcc ETHCK_K>, <&rcc SYSCFG>, <&rcc ETHSTP>;

    mdio0 
        #address-cells = <1>;
        #size-cells = <0>;
        compatible = "snps,dwmac-mdio";
        phy0: ethernet-phy@0 
            reg = <0>;
            ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_25_NS>;
            ti,tx-internal-delay = <DP83867_RGMIIDCTL_2_75_NS>;
            ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
            ti,dp83867-rxctrl-strap-quirk;
        ;
    ;
;

例如,在 pin1 部分中,连接了以下引脚:

pinmux = <STM32_PINMUX('G', 4, AF11)>, /* ETH_RGMII_GTX_CLK */
         <STM32_PINMUX('B', 12, AF11)>, /* ETH_RGMII_TXD0 */
         <STM32_PINMUX('G', 14, AF11)>, /* ETH_RGMII_TXD1 */
         <STM32_PINMUX('C', 2, AF11)>, /* ETH_RGMII_TXD2 */
         <STM32_PINMUX('E', 2, AF11)>, /* ETH_RGMII_TXD3 */
         <STM32_PINMUX('G', 11, AF11)>, /* ETH_RGMII_TX_CTL */
         <STM32_PINMUX('C', 1, AF11)>; /* ETH_MDC */

然后这里会用到pin-group:

pinctrl-0 = <&ethernet0_rgmii_pins>;
pinctrl-names = "default";

但是顺序是如何以及在哪里定义的?之后如何传递给 PHY 设备驱动程序?如果我将 PHY 从 RGMII 更改为 RMII 会怎样?那么管脚的数量减少了,但是我必须按什么顺序放置管脚呢?

遗憾的是我找不到任何文档,也许有人可以在这里帮助我。

谢谢。

【问题讨论】:

【参考方案1】:

顺序无关紧要。 pinctrl 所做的只是将物理引脚连接到正确的外围设备。作为 GMAC 外设的硅片并不关心使用的是哪个特定引脚。

如果这是您关心的问题,我怀疑是否可以交换引脚 B12 和 G14 的角色以充当 TXD1 和 TXD0。

【讨论】:

以上是关于在哪里可以找到有关内核设备树 pinctrl 参数的文档?的主要内容,如果未能解决你的问题,请参考以下文章

imx6设备树pinctrl解析

RK3588平台开发系列讲解(Pinctrl篇)Pinctrl设备树介绍

linux设备树-LCD驱动程序

设备树语言参考:在哪里找到它[关闭]

pinctl和gpio子系统-23

Linux驱动开发pinctrl子系统和gpio子系统