日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

设备树和pinctrl粗解

發(fā)布時(shí)間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设备树和pinctrl粗解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

上次文章中 我以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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。