linux - 处理从设备树到模块的引脚模式
问题描述
我正在尝试使用 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>;
};
};
解决方案
那么我的问题是,如何在运行时操作 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中标题为“来自驱动程序的引脚控制请求”的部分。
推荐阅读
- node.js - 纱线服务错误命令失败,退出代码为 1
- javascript - 如何将缩小的 js 文件合并到 ASP.NET MVC 应用程序
- mysql - 如何选择单元格为空的最后一行
- php - 如何在 OOP 单例中将参数传递给 add_feed
- python - 类架构:Python中内部类和外部类的循环依赖
- java - 关闭应用程序后,LocationUpdatesForegroundService 应用程序进程仍在运行
- colors - 在odoo10中为状态栏添加颜色
- regex - 使用 RegexBasedLocationExtractionStrategy 定位字符串并使用 iTextSharp 的 PDFstamper 标记图像。标记所有位置的问题
- android - api 一个接一个地调用第一个 Api 响应的基础
- database - Eloquent 模型 - 关系用户类别和帐户处理