Linux装备驱动开发-Pinctrl子系统使用详解

打印 上一主题 下一主题

主题 861|帖子 861|积分 2593

Pinctrl 就是用来控制引脚的
一般引脚前面会有 IOMUX 毗连各种功能,通过IOMUX 来指定引脚具体毗连什么功能
pinctl 通过状态来控制引脚
以这个段装备树代码为例,这里有normal 和idle 两种模式,normal 对应pinctrl-0,idle 对应pinctrl-1
这段装备树片段称为 client
  1. &sdmmc {
  2.         max-frequency = <200000000>;
  3.         no-sdio;
  4.         no-mmc;
  5.         bus-width = <4>;
  6.         cap-mmc-highspeed;
  7.         cap-sd-highspeed;
  8.         disable-wp;
  9.         pinctrl-names = "normal", "idle";
  10.         pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_det &sdmmc0_bus4>;
  11.         pinctrl-1 = <&sdmmc0_idle_pins &sdmmc0_det>;
  12.         sd-uhs-sdr12;
  13.         sd-uhs-sdr25;
  14.         sd-uhs-sdr50;
  15.         sd-uhs-sdr104;
  16.         vmmc-supply = <&vcc3v3_sd>;
  17.         vqmmc-supply = <&vccio_sd>;
  18.         status = "okay";
  19. };
复制代码
来看一个引脚控制,可以看到这里配置了引脚功能为 gpio,而且进行了下拉
这段装备树片段称为 controller
  1. sdmmc0 {
  2.     /omit-if-no-ref/
  3.     sdmmc0_idle_pins: sdmmc0-idle-pins {
  4.         rockchip,pins =
  5.             <3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_down>,
  6.             <3 RK_PA3 RK_FUNC_GPIO &pcfg_pull_down>,
  7.             <3 RK_PA4 RK_FUNC_GPIO &pcfg_pull_down>,
  8.             <3 RK_PA5 RK_FUNC_GPIO &pcfg_pull_down>,
  9.             <3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_down>,
  10.             <3 RK_PA7 RK_FUNC_GPIO &pcfg_pull_down>;
  11.     };
  12. }
复制代码
当装备切换状态时系统就会根据装备树去切换引脚状态

写代码时可以通过这些函数来控制状态
/ include / linux / pinctrl / consumer.h
这里时选择 default 状态
  1. static inline struct pinctrl * __must_check devm_pinctrl_get_select_default(
  2.                                         struct device *dev)
  3. {
  4.         return devm_pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
  5. }
复制代码
这个是根据名字来选择状态
  1. static inline struct pinctrl * __must_check pinctrl_get_select(
  2.                                         struct device *dev, const char *name)
  3. {
  4.         struct pinctrl *p;
  5.         struct pinctrl_state *s;
  6.         int ret;
  7.         p = pinctrl_get(dev);
  8.         if (IS_ERR(p))
  9.                 return p;
  10.         s = pinctrl_lookup_state(p, name);
  11.         if (IS_ERR(s)) {
  12.                 pinctrl_put(p);
  13.                 return ERR_CAST(s);
  14.         }
  15.         ret = pinctrl_select_state(p, s);
  16.         if (ret < 0) {
  17.                 pinctrl_put(p);
  18.                 return ERR_PTR(ret);
  19.         }
  20.         return p;
  21. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表