设备树和pinctrl粗解
上次文章中 我以DS18b20為例,在設(shè)備樹(shù)中定義了ds18b20的資源(device),當(dāng)時(shí)是依葫蘆畫(huà)瓢,沒(méi)有深入探究,本文主要探討下pin在設(shè)備樹(shù)中的描述
參考文章:Linux內(nèi)核中的GPIO系統(tǒng)之(3):pin controller driver代碼分析 、fsl,imx6q-pinctrl.txt、fsl,imx-pinctrl.txt
先看我上一篇文章對(duì)ds18b20的描述
my-ds18b20 {compatible = "ds18b20";gpios = <&gpio2 3 1>; //有更改,以這里為準(zhǔn)};其實(shí)這是不完整的描述,因?yàn)槲覀儍H僅指定了哪個(gè)引腳,而作為GPIO是這個(gè)引腳的功能之一,也許他還可以作為UART1_TX_DATA等等。那為何我們這個(gè)驅(qū)動(dòng)可以成功呢?因?yàn)檫@個(gè)引腳在其他地方進(jìn)行了初始化配置為了普通GPIO。
所以完整的描述應(yīng)該這樣:
//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>; 對(duì)應(yīng)了MX6QDL_PAD_NANDF_D3__GPIO2_IO03 (宏定義) 的pin configuration,我們具體來(lái)看看這個(gè)宏定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這個(gè)宏定義由5個(gè)數(shù)組成,我們主要關(guān)心第四個(gè),mux_mode 0x5,這決定了這個(gè)引腳配置為什么功能,我們現(xiàn)在查詢下芯片手冊(cè),在芯片手冊(cè)中搜索關(guān)鍵詞“GPIO2_IO03”
我們配置他為GPIO模式,不開(kāi)啟SION,那么后應(yīng)該配置為0101 = 0x5,與我們宏定義相對(duì)應(yīng),其實(shí)從從這個(gè)宏定義的名字我們也能看出來(lái)他配置為了GPIO模式,MX6QDL_PAD_NANDF_D3__GPIO2_IO03 這個(gè)引腳原本功能為nand的data3引腳,我們復(fù)用為了GPIO2_3,我們?cè)诳纯催@個(gè)宏定義的源文件
這里可以看出,NANDF_D3 還可以復(fù)用為SD1_DATA7、NAND_DATA3。
我們?cè)賮?lái)說(shuō)說(shuō)pinctrl-names 和pinctrl-x。(以下兩段摘自WOWO科技)
(1)pinctrl-names定義了一個(gè)state列表。那么什么是state呢?具體說(shuō)應(yīng)該是pin state,對(duì)于一個(gè)client device,它使用了一組pin,這一組pin應(yīng)該同時(shí)處于某種狀態(tài),畢竟這些pin是屬于一個(gè)具體的設(shè)備功能。state的定義和電源管理關(guān)系比較緊密,例如當(dāng)設(shè)備active的時(shí)候,我們需要pin controller將相關(guān)的一組pin設(shè)定為具體的設(shè)備功能,而當(dāng)設(shè)備進(jìn)入sleep狀態(tài)的時(shí)候,需要pin controller將相關(guān)的一組pin設(shè)定為普通GPIO,并精確的控制GPIO狀態(tài)以便節(jié)省系統(tǒng)的功耗。state有兩種,標(biāo)識(shí),一種就是pinctrl-names定義的字符串列表,另外一種就是ID。ID從0開(kāi)始,依次加一。根據(jù)例子中的定義,state ID等于0(名字是active)的state對(duì)應(yīng)pinctrl-0屬性,state ID等于1(名字是idle)的state對(duì)應(yīng)pinctrl-1屬性。具體設(shè)備state的定義和各個(gè)設(shè)備相關(guān),具體參考在自己的device bind。
(2)pinctrl-x的定義。pinctrl-x是一個(gè)句柄(phandle)列表,每個(gè)句柄指向一個(gè)pin configuration。有時(shí)候,一個(gè)state對(duì)應(yīng)多個(gè)pin configure。例如在active的時(shí)候,I2C功能有兩種配置,一種是從pin ID{7,8}引出,另外一個(gè)是從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
總結(jié)
以上是生活随笔為你收集整理的设备树和pinctrl粗解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JavaMail--发送html邮件
- 下一篇: [工具] 知网(CNKI)文献下载工具