设备驱动-【转载】Pinctrl的配置与使用

版权声明:本文为CSDN博主「spongebob1912」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/spongebob1912/article/details/109496964

 

 

简述

soc内部管脚众多,而多数管脚又可以配置成不同的功能,我们称之为管脚复用;Linux引入pinctrl子系统,是为了统一各芯片厂商对这些管脚的管理跟配置。

通过调整pinctrl寄存器,我们可以配置一个或一组管教,配置项包括function、上拉下拉、驱动强度等,下面仅从使用者的角度介绍pinctrl在实践中的应用。

应用实例

1.管脚定义

以高通平台为例,在dts文件夹中我们会找到名为pinctrl的dtsi,里面配置了几乎所有用到的管脚,个别里面没有配置的管脚默认用作gpio,以下面一组管脚为例

  1.  
    /* interrupt active */
  2.  
    pmx_ts_int_active {
  3.  
    ts_int_active: ts_int_active {
  4.  
    mux {
  5.  
    pins = "gpio65";
  6.  
    function = "gpio";
  7.  
    };
  8.  
     
  9.  
    config {
  10.  
    pins = "gpio65";
  11.  
    drive-strength = <8>;
  12.  
    bias-pull-up;
  13.  
    };
  14.  
    };
  15.  
    };
  16.  
    /* interrupt suspend */
  17.  
    pmx_ts_int_suspend {
  18.  
    ts_int_suspend: ts_int_suspend {
  19.  
    mux {
  20.  
    pins = "gpio65";
  21.  
    function = "gpio";
  22.  
    };
  23.  
     
  24.  
    config {
  25.  
    pins = "gpio65";
  26.  
    drive-strength = <2>;
  27.  
    bias-pull-down;
  28.  
    };
  29.  
    };
  30.  
    };

里面定义了一个管脚的两种状态,分别是active状态管脚gpio65,function gpio内置上拉,强度为8;suspend状态管脚gpio65,function gpio内置下拉,强度为2;

2.pinctrl state定义

为设备添加自己的管脚定义,这个过程我们称之为pinctrl state定义;

  1.  
    pinctrl-names = "cyttsp_ts_active",
  2.  
    "cyttsp_ts_suspend","cyttsp_ts_release";
  3.  
    pinctrl-0 = <&ts_int_active &ts_reset_active>;
  4.  
    pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>;
  5.  
    pinctrl-2 = <&ts_release>;

在dts中某个设备的节点中添加如上引用,三个pinctrl name分别对应下面三个pinctrl-x,每个pinctrl-x我们称之为一个pinctrl state,后续我们将在代码中通过name来找到相应的pinctrl state;

每组pinctrl state可以引用多个管脚定义。

3.pinctrl state切换

在完成管脚定义及pinctrl state定义之后,我们将在代码中获取pinctrl state,并使用他们;

  1.  
    #define PINCTRL_STATE_ACTIVE "cyttsp_ts_active"
  2.  
    #define PINCTRL_STATE_SUSPEND "cyttsp_ts_suspend"
  3.  
    #define PINCTRL_STATE_RELEASE "cyttsp_ts_release"
  4.  
     
  5.  
    struct pinctrl *ts_pinctrl;
  6.  
    struct pinctrl_state *pinctrl_state;
  7.  
     
  8.  
    /* get pinctrl handle */
  9.  
    ts_pinctrl = devm_pinctrl_get(dev);
  10.  
    if (IS_ERR_OR_NULL(ts_pinctrl)) {
  11.  
    rc = PTR_ERR(ts_pinctrl);
  12.  
    dev_err(dev, "%s: Target does not use pinctrl %d\n", __func__, rc);
  13.  
    return rc;
  14.  
    }
  15.  
     
  16.  
    /* find pinctrl state by name */
  17.  
    pinctrl_state = pinctrl_lookup_state(ts_pinctrl, PINCTRL_STATE_ACTIVE);
  18.  
    if (IS_ERR_OR_NULL(pinctrl_state)) {
  19.  
    rc = PTR_ERR(pinctrl_state);
  20.  
    dev_err(dev, "%s: Can not lookup cyttsp_ts_active pinstate %d\n", __func__, rc);
  21.  
    return rc;
  22.  
    }
  23.  
     
  24.  
    /* select the pinctrl state */
  25.  
    rc = pinctrl_select_state(ts_pinctrl, pinctrl_state);
  26.  
    if (rc < 0)
  27.  
    dev_err(dev, "%s: Cannot get active pinctrl state\n", __func__);

1.获取pinctrl handler,每个设备都会有自己的pinctrl handler,如果没有,调用接口时将为它创建一个

源码参考/kernel/msm-3.18/drivers/pinctrl/core.c create_pinctrl();

2.得到pinctrl handler后,我们通过dts里配置的pinctrl-name,找到相应的pinctrl state;

示例中找的是cyttsp_ts_active,对应dts里的state为pinctrl-0,该state包含两个管脚定义,分别是ts_int_active,ts_reset_active,具体定义到pinctrl dtsi里面查看;

3.找到相应的pinctrl state,只需调用pinctrl接口切换至该state即可,相应管脚即可切换为pinctrl dtsi中定义的状态;

示例中将切换至ts_int_active状态,相应的管脚gpio65将被配置为gpio,内置上拉,强度为8,其他管脚同理。

补充说明

在驱动跟设备成功匹配后,驱动探测时将获取该设备名为default的pinctrl state,并切换至该state,这个过程中就会调用devm_pinctrl_get,获取或创建pinctrl handler;

若相应dts节点没有定义名为default的pinctrl state,则输出日志后返回,执行driver probe;

具体源码请参考/kernel/msm-3.18/drivers/base/dd.c really_probe()

 

参考链接:https://blog.csdn.net/u012830148/article/details/80609337?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160448812319724839240545%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160448812319724839240545&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v28-1-80609337.pc_first_rank_v2_rank_v28&utm_term=devm_pinctrl_get&spm=1018.2118.3001.4449

 

posted @ 2022-04-17 19:26  张志伟122  阅读(489)  评论(0编辑  收藏  举报