首页 > 解决方案 > 处理从设备树到模块的引脚模式

问题描述

我正在尝试使用 Atmels SAMA5d35 MPU 为 SPI 设备编写 linux 设备驱动程序。Linux 版本为 4.19.30。

我已经在设备树中配置了引脚并将状态设置为“okay”。之后,引脚按预期改变了模式。那么我的问题是,如何在运行时操作 pinmode?我的 SPI 设备并不总是打开,我的驱动程序也不总是加载。在这种情况下,我希望配置的 SPI 引脚将模式更改为普通 GPIO(用于功耗)。

是驱动程序的任务,还是可以在设备树中定义的东西,例如当驱动程序没有加载时?

我尝试实现一个 pinctrl-0 将引脚设置为 SPI 模式,然后实现一个 pinctrl-1 将相同的引脚设置为普通 GPIO。我的想法是在设备驱动程序中的这些引脚配置之间切换,但不幸的是,设备树抱怨对 pinctrl-0 和 pinctrl-1 使用相同的引脚(编译正常,但系统无法启动)。虽然这只是我的逻辑想法。我确信有一种更正确的方法来做我上面所说的事情。

        spi0: spi@f0004000 {
            status = "okay";

            ext_adc: ads1258@1 {
                compatible = "ti,ads1258";
                pinctrl-names = "default", "sleep";
                pinctrl-0 = <&pinctrl_spi0_default>;
                pinctrl-1 = <&pinctrl_spi0_sleep>;
                reg = <1>;                                  /* Hardware chipselect SPI0_NPCS1 */
                spi-max-frequency = <16000000>;             /* According to datasheet */
                start-gpios = <&pioD 5 GPIO_ACTIVE_HIGH>;
                drdy-gpios = <&pioD 22 GPIO_ACTIVE_LOW>;
                enaadc-gpios = <&pioA 26 GPIO_ACTIVE_HIGH>; 
            };
        };

标签: linuxkernel-moduledevice-tree

解决方案


那么我的问题是,如何在运行时操作 pinmode?

这称为“运行时 pinmuxing”,在Documentation/pinctrl.txt中有描述。
但您可能不必这样做。

在这种情况下,我希望配置的 SPI 引脚将模式更改为普通 GPIO(用于功耗)。

是驱动程序的任务,还是可以在设备树中定义的东西,例如驱动程序未加载时?

(Atmel/Microchip SoC 的)引脚的默认模式未分配给任何外设模式,并可用作 GPIO。
所有未分配给外设或由驱动程序作为 GPIO 获取的引脚最终都位于可用 GPIO 池中。

因此,当您的 SPI 驱动程序未成功安装时,它将使用的那些引脚将位于可用 GPIO 池中。

我尝试实现一个 pinctrl-0 将引脚设置为 SPI 模式,然后实现一个 pinctrl-1 将相同的引脚设置为普通 GPIO。

分配引脚供 SPI 控制器使用是正确的,但是没有机制 AFAIK 可以将引脚分配为可用的 GPIO。

您只能在 DT 中为设备(例如 SPI 控制器)需要的属性定义属性。
没有“替代”分配机制。

我确信有一种更正确的方法来做我上面所说的事情。

如果您的驱动程序未安装,则不应分配其资源(例如其引脚)。SPI 将使用的引脚将保持未使用状态,并最终出现在可用 GPIO 池中(除非其他东西声称/请求这些引脚之一)。
因此,您的 DT 需要简单地定义您的设备使用什么,然后将其保留。

如果您仍然希望您的驱动程序修改其引脚的状态,请研究Documentation/pinctrl.txt中标题为“来自驱动程序的引脚控制请求”的部分。


推荐阅读