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;
}
相关推荐
卫生纸不够用23 分钟前
(三)Linux性能优化-CPU-CPU 使用率
linux·运维·服务器
CodeWithMe32 分钟前
【C/C++】不同防止头文件重复包含的措施
c语言·开发语言·c++
一只豌豆象1 小时前
【知识分享】DDR4 硬件架构基础知识
硬件工程·信号完整性·ddr4
whoarethenext1 小时前
使用 C/C++的OpenCV 实现模板匹配:从基础到优化
c语言·c++·opencv
Clownseven2 小时前
Ubuntu 24.04 LTS 长期支持版发布:对服务器用户意味着什么?新特性、升级建议与性能影响初探
linux·服务器·ubuntu
Xam_d_LM2 小时前
【Linux】服务器反向代理自动续签免费 Let‘s Encrypt 证书报错解决方法
linux·运维·服务器·反向代理·lets encrypt·http-01·证书续签
有时有晌2 小时前
linux arm系统烧录
linux·运维·arm开发
合方圆~小文2 小时前
架空线路图像视频监测装置
c语言·c++·人工智能·嵌入式硬件·硬件工程·模拟退火算法
卖猪肉的痴汉3 小时前
4.2 C/C++开发环境:VSCode+CMake+MSYS2
c语言·c++·vscode
ღ 噫吁嚱3 小时前
【C/C++】实现固定地址函数调用
c语言·开发语言·c++