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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

设备树和pinctrl粗解

發布時間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设备树和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粗解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。