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;
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |