一、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
pinctrl_test: testgrp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 config /*config 是具體設置值*/
>;
};
(3)Linux 內核的 pinctrl 子系統實現原理
二、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 標號。
value:GPIO 默認輸出值。
返回值: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 信息的屬性名。
index:GPIO 索引,因爲一個屬性裏面可能包含多個 GPIO,此參數指定要獲取哪個 GPIO 的編號,如果只有一個 GPIO 信息的話此參數爲 0。
返回值:正值:獲取到的 GPIO 編號;負值:失敗
|