Linux设备驱动开发-Pinctrl子系统使用详解

Pinctrl 就是用来控制引脚的

一般引脚前面会有 IOMUX 连接各种功能,通过IOMUX 来指定引脚具体连接什么功能

pinctl 通过状态来控制引脚

以这个段设备树代码为例,这里有normal 和idle 两种模式,normal 对应pinctrl-0,idle 对应pinctrl-1

这段设备树片段称为 client

复制代码
&sdmmc {
	max-frequency = <200000000>;
	no-sdio;
	no-mmc;
	bus-width = <4>;
	cap-mmc-highspeed;
	cap-sd-highspeed;
	disable-wp;
	pinctrl-names = "normal", "idle";
	pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_det &sdmmc0_bus4>;
	pinctrl-1 = <&sdmmc0_idle_pins &sdmmc0_det>;
	sd-uhs-sdr12;
	sd-uhs-sdr25;
	sd-uhs-sdr50;
	sd-uhs-sdr104;
	vmmc-supply = <&vcc3v3_sd>;
	vqmmc-supply = <&vccio_sd>;
	status = "okay";
};

来看一个引脚控制,可以看到这里配置了引脚功能为 gpio,并且进行了下拉

这段设备树片段称为 controller

复制代码
sdmmc0 {
    /omit-if-no-ref/
    sdmmc0_idle_pins: sdmmc0-idle-pins {
        rockchip,pins =
            <3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_down>,
            <3 RK_PA3 RK_FUNC_GPIO &pcfg_pull_down>,
            <3 RK_PA4 RK_FUNC_GPIO &pcfg_pull_down>,
            <3 RK_PA5 RK_FUNC_GPIO &pcfg_pull_down>,
            <3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_down>,
            <3 RK_PA7 RK_FUNC_GPIO &pcfg_pull_down>;
    };
}

当设备切换状态时系统就会根据设备树去切换引脚状态

写代码时可以通过这些函数来控制状态

/ include / linux / pinctrl / consumer.h

这里时选择 default 状态

复制代码
static inline struct pinctrl * __must_check devm_pinctrl_get_select_default(
					struct device *dev)
{
	return devm_pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
}

这个是根据名字来选择状态

复制代码
static inline struct pinctrl * __must_check pinctrl_get_select(
					struct device *dev, const char *name)
{
	struct pinctrl *p;
	struct pinctrl_state *s;
	int ret;

	p = pinctrl_get(dev);
	if (IS_ERR(p))
		return p;

	s = pinctrl_lookup_state(p, name);
	if (IS_ERR(s)) {
		pinctrl_put(p);
		return ERR_CAST(s);
	}

	ret = pinctrl_select_state(p, s);
	if (ret < 0) {
		pinctrl_put(p);
		return ERR_PTR(ret);
	}

	return p;
}
相关推荐
木子欢儿10 分钟前
国内 macOS/Linux 安装 rust
linux·运维·服务器·macos·rust
say_fall20 分钟前
【Linux网络编程】计算机网络基础:局域网与广域网、OSI七层模型与TCP/IP五层模型、封装解包与MAC/IP地址、端口号与socket编程接口
linux·网络·tcp/ip·计算机网络·信息与通信
进击的荆棘27 分钟前
Linux系统——线程同步与互斥
linux·运维·服务器·策略模式·同步·互斥·posix
橙橙笔记43 分钟前
QT的学习第四部分
linux·qt·学习·音视频
.道阻且长.44 分钟前
Linux基本开发工具:gdb和cgdb的使用
linux·运维·服务器·开发语言
叼烟扛炮1 小时前
Linux 学习笔记(五十四):内网穿透实战——用 frp 让外网访问你的私人电脑
linux·服务器·网络·笔记·学习
Android系统攻城狮1 小时前
Linux FFmpeg深度解析之av_guess_format调用流程与实战(三十六)
linux·运维·服务器·ffmpeg·ffmpeg音视频进阶
进击的荆棘2 小时前
Linux系统——线程概念与控制之线程封装
linux·运维·服务器·线程
叼烟扛炮2 小时前
[LangChain] 学习笔记(05):提示词模板(Prompt)与少样本注入(Few-Shot)实战
linux·人工智能·笔记·学习·langchain·prompt
CodeYp20192 小时前
第5讲:Socket 编程 TCP
linux·socket·tcp