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;
}
相关推荐
aaaameliaaa32 分钟前
指针之总结
c语言·笔记·算法
ye1501277745533 分钟前
DC24V-100V转3.3V500mA隔离芯片WT5602
单片机·嵌入式硬件·其他·硬件工程
Lumos6fly36 分钟前
51单片机从零到实战(15)——数字时钟温度计
单片机·嵌入式硬件·51单片机
gwf2161 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
agathakuan1 小时前
Wireshark 解密並導出TLS 1.2 / TLS 1.3 明文的方法(可控制 Client 端)
c语言·wireshark·ssl·openwrt
撩得Android一次心动1 小时前
Linux编程笔记3【个人用】
linux·笔记
noipp1 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
OpenPomeloxCommunity1 小时前
3. Linux 同步机制之 spinlock 设计与实现(一):通用层
linux
c238561 小时前
C/C++每日一练6
c语言·c++·算法
wdfk_prog2 小时前
嵌入式面试真题第 13 题:单硬件 Timer 下的高精度多路软件定时器架构设计
c语言·开发语言·面试·职场和发展·嵌入式