【Linux驅動開發】pinctrl 子系統 與 gpio 子系統

一、pinctrl 子系統

(1)pinctrl 子系統簡介

pinctrl 子系統源碼目錄爲 drivers/pinctrl 

pinctrl 子系統重點是設置 PIN( PAD )的複用和電氣屬性。

pinctrl 子系統主要工作內容如下:

  • 獲取設備樹中 pin 信息。
  • 根據獲取到的 pin 信息來設置 pin 的複用功能
  • 根據獲取到的 pin 信息來設置 pin 的電氣特性,比如上/下拉、速度、驅動能力等。
  • 在設備樹裏面設置好某個 pin 的相關屬性即可,其他的初始化工作均由 pinctrl 子系統來完成。

(2)設備樹中添加 pinctrl 節點

  • 設備樹中的 iomuxc 節點就是 I.MX6ULL IOMUXC 外設對應的節點
  • iomuxc”節點下引用了 pinctrl_hog_1 節點, Linux 內核中的 iomuxc 驅動自動初始化 pinctrl_hog_1 節點下的所有 PIN
在設備樹(imx6ull-iot-emmc.dts)創建一個節點來描述 PIN 的配置信息
1、創建對應節點
2、添加“fsl,pins”屬性
3、在“fsl,pins”屬性中添加 PIN 配置信息
例:
iomuxc 節點中的“imx6ul-evk”子節點下添加“pinctrl_test”節點。
pinctrl_test: testgrp { 
    fsl,pins = < 
    MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 config /*config 是具體設置值*/
    >;
};

(3)Linux 內核的 pinctrl 子系統實現原理

imx6ul_pinctrl_probe 函數就是 I.MX6ULL 這個 SOC PIN 配置入口函數
函數調用路徑:

 

二、gpio 子系統

(1)gpio 子系統簡介

  • gpio 子系統用於初始化 GPIO 並且提供相應的 API 函數,比如設置 GPIO 爲輸入輸出,讀取 GPIO 的值等。
  • 在設備樹中添加 gpio 相關信息,在驅動程序中使用 gpio 子系統提供的 API 函數來操作 GPIO。

 

(2)gpio 子系統 API 函數

申請 GPIO 管腳
int gpio_request(unsigned gpio, const char *label)
gpio:要申請的 gpio 標號,使用 of_get_named_gpio 函數從設備樹獲取指定 GPIO 屬性信
息,此函數會返回這個 GPIO 的標號。
label:給 gpio 設置個名字。
返回值0:申請成功;其他值:申請失敗
釋放 GPIO 管腳
void gpio_free(unsigned gpio)
gpio:要釋放的 gpio 標號
設置 GPIO 爲輸入
int gpio_direction_input(unsigned gpio)
gpio:要設置爲輸入的 GPIO 標號。
返回值0:設置成功;負值:設置失敗
設置 GPIO 爲輸出
int gpio_direction_output(unsigned gpio, int value)
gpio:要設置爲輸出的 GPIO 標號。
valueGPIO 默認輸出值。
返回值0:設置成功;負值:設置失敗
獲取 GPIO 的值(0 1)
#define gpio_get_value __gpio_get_value
int __gpio_get_value(unsigned gpio)
gpio:要獲取的 GPIO 標號。
返回值非負值:得到的 GPIO 值;負值:獲取失敗
設置 GPIO 的值
#define gpio_set_value __gpio_set_value
void __gpio_set_value(unsigned gpio, int value)
gpio:要設置的 GPIO 標號。
value要設置的值。

 

(3)設備樹中添加 gpio 節點

1、創建 test 設備節點

2、添加 pinctrl 信息

3、添加 GPIO 屬性信息

例:

test { 
    pinctrl-names = "default"; 
    pinctrl-0 = <&pinctrl_test>;
    gpio = <&gpio1 0 GPIO_ACTIVE_LOW>;
};

 

(4)gpio 相關的 OF 函數

獲取設備樹某個屬性裏面的 GPIO 數量
(統計任意屬性的 GPIO 信息)
int of_gpio_named_count(struct device_node *np, const char *propname)
np:設備節點。
propname:要統計的 GPIO 屬性。
返回值正值:統計到的 GPIO 數量;負值:失敗
獲取設備樹某個屬性裏面的 GPIO 數量
統計“gpios”屬性的 GPIO 數量
int of_gpio_count(struct device_node *np)
np:設備節點。
返回值正值:統計到的 GPIO 數量;負值:失敗
獲取 GPIO 編號
int of_get_named_gpio(struct device_node *np, const char *propname, int index)
np:設備節點。
propname:包含要獲取 GPIO 信息的屬性名。
indexGPIO 索引,因爲一個屬性裏面可能包含多個 GPIO,此參數指定要獲取哪個 GPIO 的編號,如果只有一個 GPIO 信息的話此參數爲 0
返回值正值:獲取到的 GPIO 編號;負值:失敗

 

 

 

 

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