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;
}