设备树和pinctrl粗解
上次文章中 我以DS18b20為例,在設備樹中定義了ds18b20的資源(device),當時是依葫蘆畫瓢,沒有深入探究,本文主要探討下pin在設備樹中的描述
參考文章:Linux內核中的GPIO系統之(3):pin controller driver代碼分析 、fsl,imx6q-pinctrl.txt、fsl,imx-pinctrl.txt
先看我上一篇文章對ds18b20的描述
my-ds18b20 {compatible = "ds18b20";gpios = <&gpio2 3 1>; //有更改,以這里為準};其實這是不完整的描述,因為我們僅僅指定了哪個引腳,而作為GPIO是這個引腳的功能之一,也許他還可以作為UART1_TX_DATA等等。那為何我們這個驅動可以成功呢?因為這個引腳在其他地方進行了初始化配置為了普通GPIO。
所以完整的描述應該這樣:
//myimx6ek314-iomux.dtsipinctrl_nandf_pad: nandfpadgrp {fsl,pins = </* All in U14 */MX6QDL_PAD_NANDF_CS0__GPIO6_IO11 0x80000000MX6QDL_PAD_NANDF_CS3__GPIO6_IO16 0x80000000MX6QDL_PAD_NANDF_WP_B__GPIO6_IO09 0x80000000MX6QDL_PAD_NANDF_D0__GPIO2_IO00 0x80000000MX6QDL_PAD_NANDF_D2__GPIO2_IO02 0x80000000MX6QDL_PAD_NANDF_D3__GPIO2_IO03 0x40000000MX6QDL_PAD_NANDF_D4__GPIO2_IO04 0x80000000MX6QDL_PAD_NANDF_D5__GPIO2_IO05 0x80000000MX6QDL_PAD_NANDF_D6__GPIO2_IO06 0x80000000MX6QDL_PAD_NANDF_D7__GPIO2_IO07 0x80000000>;};//myimx6ek314.dtsimy-ds18b20 {compatible = "ds18b20"; pinctrl-names = "default";pinctrl-0 = <&pinctrl_nandf_pad>;gpios = <&gpio2 3 1>; status = "okay";};gpios = <&gpio2 3 1>; 對應了MX6QDL_PAD_NANDF_D3__GPIO2_IO03 (宏定義) 的pin configuration,我們具體來看看這個宏定arch\arm\boot\dts\imx6dl-pinfunc.h
//<mux_reg conf_reg input_reg mux_mode input_val> #define MX6QDL_PAD_NANDF_D3__GPIO2_IO03 0x290 0x678 0x000 0x5 0x0這個宏定義由5個數組成,我們主要關心第四個,mux_mode 0x5,這決定了這個引腳配置為什么功能,我們現在查詢下芯片手冊,在芯片手冊中搜索關鍵詞“GPIO2_IO03”
我們配置他為GPIO模式,不開啟SION,那么后應該配置為0101 = 0x5,與我們宏定義相對應,其實從從這個宏定義的名字我們也能看出來他配置為了GPIO模式,MX6QDL_PAD_NANDF_D3__GPIO2_IO03 這個引腳原本功能為nand的data3引腳,我們復用為了GPIO2_3,我們在看看這個宏定義的源文件
這里可以看出,NANDF_D3 還可以復用為SD1_DATA7、NAND_DATA3。
我們再來說說pinctrl-names 和pinctrl-x。(以下兩段摘自WOWO科技)
(1)pinctrl-names定義了一個state列表。那么什么是state呢?具體說應該是pin state,對于一個client device,它使用了一組pin,這一組pin應該同時處于某種狀態,畢竟這些pin是屬于一個具體的設備功能。state的定義和電源管理關系比較緊密,例如當設備active的時候,我們需要pin controller將相關的一組pin設定為具體的設備功能,而當設備進入sleep狀態的時候,需要pin controller將相關的一組pin設定為普通GPIO,并精確的控制GPIO狀態以便節省系統的功耗。state有兩種,標識,一種就是pinctrl-names定義的字符串列表,另外一種就是ID。ID從0開始,依次加一。根據例子中的定義,state ID等于0(名字是active)的state對應pinctrl-0屬性,state ID等于1(名字是idle)的state對應pinctrl-1屬性。具體設備state的定義和各個設備相關,具體參考在自己的device bind。
(2)pinctrl-x的定義。pinctrl-x是一個句柄(phandle)列表,每個句柄指向一個pin configuration。有時候,一個state對應多個pin configure。例如在active的時候,I2C功能有兩種配置,一種是從pin ID{7,8}引出,另外一個是從pin ID{69,103}引出。
下面我再給一段,供大家分析練手
//myimx6ek314-iomux.dtsi pinctrl_nandf_keys: nandfkeysgrp {fsl,pins = <MX6QDL_PAD_NANDF_CS2__GPIO6_IO15 0x80000000 /* KEY_VOLUMEUP */MX6QDL_PAD_NANDF_RB0__GPIO6_IO10 0x80000000 /* KEY_VOLUMEDOWN */>;}; pinctrl_gpio_keys: gpiokeysgrp {fsl,pins = <MX6QDL_PAD_GPIO_4__GPIO1_IO04 0x80000000 /* KEY_POWER */>;};//myimx6ek314.dtsigpio-keys {compatible = "gpio-keys";pinctrl-names = "default";pinctrl-0 = <&pinctrl_nandf_keys &pinctrl_gpio_keys>; //配置pin 為gpiopower {label = "Power Button";gpios = <&gpio1 4 1>;gpio-key,wakeup;linux,code = <KEY_POWER>;};volume-up {label = "Volume Up";gpios = <&gpio6 15 1>;gpio-key,wakeup;linux,code = <KEY_VOLUMEUP>;};volume-down {label = "Volume Down";gpios = <&gpio6 10 1>;gpio-key,wakeup;linux,code = <KEY_VOLUMEDOWN>;};};2017-11-09
總結
以上是生活随笔為你收集整理的设备树和pinctrl粗解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaMail--发送html邮件
- 下一篇: [工具] 知网(CNKI)文献下载工具