DTS中如何配置設備相關的pinctrl

進行嵌入式Linux驅動開發時,不可避免的會涉及到DTS相關的編寫工作,而其中,最爲重要的一項工作就是pinctrl相關的配置,這包括pins的功能選擇(作爲普通IO,還是作爲外圍控制器的pins)以及pins的配置(pull-up/pull-down、驅動能力、三態等)。
內核中的pinctrl子系統抽象了不同SoC中關於pins的管理方式,Linux內核之pinctrl子系統對於pinctrl子系統進行了簡要的概述,如果想要了解pinctrl子系統,可以參考這篇博文。

本文主要講解對於一個具體的設備驅動,如何在DTS中基於pinctrl實現關於pins的管理,這包括:

  • 如何定義pin功能
  • 驅動程序如何引用pin

如何定義pin功能

利用內核文檔

市面上存在很多的SoC,一般情況下,不同的SoC在DTS中關於pin的管理方式會有一些不同。SoC廠商在發佈時,會編寫相關的pinctrl驅動程序,同時,會在內核目錄Documentation/devicetree/bindings/pinctrl下,編寫相關的配置說明,比如,fsl,imx-pinctrl.txt
裏面說明了 Freescale IOMUX Controller (IOMUXC) for I.MX相關的配置說明;rockchipi, pinctrl.txt裏面說面了Rockchip Pinmux Controller相關的配置說明。

所以,當我們拿到一塊電路板時,首先,需要確定其使用的SoC,然後,去Documentation/devicetree/bindings/pinctrl目錄下,找到關於該款SoC相關的pinctrl的配置說明。這裏需要注意的時,某個廠商的SoC一般遵循相同的pinctrl配置方式,所以,在未找到具體SoC的
pinctrl使用說明時,可以直接查看這個SoC廠商的說明文檔,比如,我們如果使用的是s3c6410,可以看到該目錄下,沒有s3c6410相關的說明,但是,我們可以找到samsung-pinctrl.txt,參照這個文檔,同樣可以在DTS中配置pinctrl。

pin配置舉例

下面拿一個例子,說明一下如何在DTS中定義pin的功能。

Freescale IOMUX

關於Freescale SoC的pinctrl配置,主要完成一下兩項內容:

  • 確定SoC的pinctrl控制器的兼容性: compatible: “fsl,-iomuxc”,關於SoC的IOMUX的兼容性,需要到fsl,-pinctrl.txt中獲得。
  • 配置具體的pins: fsl,pins/</>,該字段定義了pin的功能,其一般定義一組pins的功能,這一組pins服務於同一function,比如spi控制器。每個配置項包括6字段分別是:前5個字段分別是<mux_reg conf_reg input_reg mux_val input_val>,可以到/arch/arm/boot/dts的imx*-pinfunc.h中找到他們的定義,
    比如,imx6ul-pinfunc.h定義imx6ul這款SoC的所有pins。6個字段是pin的配置參數,比如:pull-up/pull-down等。

下面是sd卡所用到的pin的功能配置定義:

usdhc@219c000 { /* uSDHC4 */
    non-removable;
    vmmc-supply = <&reg_3p3v>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_usdhc4_1>;
};         
           
iomuxc@20e0000 {
    compatible = "fsl,imx6q-iomuxc";
    reg = <0x020e0000 0x4000>;
           
    /* shared pinctrl settings */
    usdhc4 {
        pinctrl_usdhc4_1: usdhc4grp-1 {
            fsl,pins = <
                MX6QDL_PAD_SD4_CMD__SD4_CMD    0x17059
                MX6QDL_PAD_SD4_CLK__SD4_CLK    0x10059
                MX6QDL_PAD_SD4_DAT0__SD4_DATA0 0x17059
                MX6QDL_PAD_SD4_DAT1__SD4_DATA1 0x17059
                MX6QDL_PAD_SD4_DAT2__SD4_DATA2 0x17059
                MX6QDL_PAD_SD4_DAT3__SD4_DATA3 0x17059
                MX6QDL_PAD_SD4_DAT4__SD4_DATA4 0x17059                                                                                                                                                                                                                                    
                MX6QDL_PAD_SD4_DAT5__SD4_DATA5 0x17059
                MX6QDL_PAD_SD4_DAT6__SD4_DATA6 0x17059
                MX6QDL_PAD_SD4_DAT7__SD4_DATA7 0x17059
            >;
    };  
    ....
};       
  • iomuxc的兼容性爲"fsl,imx6q-iomuxc";
  • 節點pinctrl_usdhc4_1定義了設備uSDHC4所使用的pins功能。

驅動程序如何使用pins

對於普通的設備,如何定義其使用到的pin呢?上面關於Freescale IOMUX的舉例,說明了uSDHC4這個設備如何定義pins的功能。文檔pinctrl-bindings.txt中說明了一般情況下如何在DTS中定義一個設備驅動的pins功能。

如果一個設備使用到某些pins,那麼,在其DTS節點中至少包含下面兩項內容:

  • pinctrl-names:定義設備不同的工作狀態,一般包括下面幾個:default、init、sleep、idle。其中,sleep、idle用於系統的電源管理,以達到控制系統功耗的目的。
  • pinctrl-0:定義了一個phandles的列表,每個phandle指向一個pinctrl的節點。該配置項定義了該設備的一種工作狀態,其對應於pinctrl-names中首個工作狀態。

下面舉例說明一下:
deviceA {
pinctrl-names = “defalut”, “idle”;
pinctrl-0 = <&state_0_node_a>;
pinctrl-1 = <&state_1_node_a &state_1_node_b>;
};

deviceA節點,定義了"default","idle"兩種工作狀態,所以,下面依次定義了pinctrl-0和pinctrl-1兩個pins列表,分別對應於上面兩個狀態。

上面內容,說明了一個設備如何在DTS中配置其所用到的pins,後面文章還具體分析pinctrl子系統在DTS中的配置方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章