Pinctrl的配置與使用

2021-10-10 06:16:15 字數 2553 閱讀 5340

soc內部管腳眾多,而多數管腳又可以配置成不同的功能,我們稱之為管腳復用;linux引入pinctrl子系統,是為了統一各晶元廠商對這些管腳的管理跟配置。

通過調整pinctrl暫存器,我們可以配置乙個或一組管教,配置項包括function、上拉下拉、驅動強度等,下面僅從使用者的角度介紹pinctrl在實踐中的應用。

以高通平台為例,在dts資料夾中我們會找到名為pinctrl的dtsi,裡面配置了幾乎所有用到的管腳,個別裡面沒有配置的管腳預設用作gpio,以下面一組管腳為例

/* interrupt active */

pmx_ts_int_active ;

config ;

};};

/* interrupt suspend */

pmx_ts_int_suspend ;

config ;

};};

裡面定義了乙個管腳的兩種狀態,分別是active狀態管腳gpio65,function gpio內建上拉,強度為8;suspend狀態管腳gpio65,function gpio內建下拉,強度為2;

為裝置新增自己的管腳定義,這個過程我們稱之為pinctrl state定義;

pinctrl-names = "cyttsp_ts_active",

"cyttsp_ts_suspend","cyttsp_ts_release";

pinctrl-0 = <&ts_int_active &ts_reset_active>;

pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>;

pinctrl-2 = <&ts_release>;

在dts中某個裝置的節點中新增如上引用,三個pinctrl name分別對應下面三個pinctrl-x,每個pinctrl-x我們稱之為乙個pinctrl state,後續我們將在**中通過name來找到相應的pinctrl state;

每組pinctrl state可以引用多個管腳定義。

在完成管腳定義及pinctrl state定義之後,我們將在**中獲取pinctrl state,並使用他們;

#define pinctrl_state_active	"cyttsp_ts_active"

#define pinctrl_state_suspend "cyttsp_ts_suspend"

#define pinctrl_state_release "cyttsp_ts_release"

struct pinctrl *ts_pinctrl;

struct pinctrl_state *pinctrl_state;

/* get pinctrl handle */

ts_pinctrl = devm_pinctrl_get(dev);

if (is_err_or_null(ts_pinctrl))

/* find pinctrl state by name */

pinctrl_state = pinctrl_lookup_state(ts_pinctrl, pinctrl_state_active);

if (is_err_or_null(pinctrl_state))

/* select the pinctrl state */

rc = pinctrl_select_state(ts_pinctrl, pinctrl_state);

if (rc < 0)

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()

參考鏈結:

6 3在裝置樹中pinctrl的簡單使用

文件 核心 documentation devicetree bindings pinctrl samsung pinctrl.txt 幾個概念 bank 以引腳名為依據,這些引腳分為若干組,每組稱為乙個bank 比如s3c2440裡有gpa gpb gpc等bank,每個bank中有若干個引腳,比...

cocoaPods的配置與使用

一 配置 1.更新ruby環境 聯網更新,需要等待 gem update system 2.借助 把ruby映象指向taobao,避免被牆 1 移除rubygems gem sources remove 2 換成taobao gem sources a 3 驗證 gem sources l 用來檢查...

Sitemesh的配置與使用

1 web inf web.xml中加入filter定義與sitemesh的taglib定義 sitemeshfilter sitemeshfilter ps 需要放在struts下面 struts cleanup org.apache.struts2.dispatcher.actioncontex...