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;
}
相关推荐
Xena_Networks10 分钟前
SierraNet协议分析使用指导[RDMA]| 如何设置 NVMe QP 端口以进行正确解码
linux·服务器·网络
Star Curry1 小时前
【读书笔记】《编码:隐匿在计算机软硬件背后的语言》01 逻辑与开关
stm32·单片机·嵌入式硬件·职场和发展·51单片机·学习方法
滴水之功1 小时前
Ubuntu22.04怎么退出Emergency Mode(紧急模式)
linux·运维·服务器
小馬佩德罗2 小时前
Linux/AndroidOS中进程间的通信&线程间的同步 - 信号量
linux·信号量
CN.LG2 小时前
tmpfs和普通文件系统相比有哪些优缺点
arm开发
(未雨绸缪)2 小时前
STM32F103单片机在不需要使用 JTAG 调试接口的情况下,释放引脚给其他功能使用。
stm32·单片机·嵌入式硬件
keepDXRcuriosity2 小时前
动态规划详解及 C/C++ 示例
c语言·c++·动态规划
wqqqianqian2 小时前
国产linux系统(银河麒麟,统信uos)使用 PageOffice 在线打开Word文件,并用前端对话框实现填空填表
linux·前端·word·pageoffice
清风来点灯3 小时前
Ubuntu22.04安装显卡驱动/卸载显卡驱动
linux·笔记·ubuntu
不脱发的程序猿3 小时前
STM32实现九轴IMU的卡尔曼滤波
stm32·嵌入式硬件