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...