GPIO(通用輸入/輸出)和 PINCTRL(引腳控制器)是在嵌入式系統中用于管理和控制硬件引腳的關鍵概念。它們在硬件層面上起著不同的作用。
GPIO配置:
GPIO 是一種通用的硬件接口,用于控制和讀取數字信號。每個 GPIO 引腳都可以被配置為輸入(讀取信號)或輸出(控制信號)。GPIO 的配置指的是定義和設置特定引腳的輸入或輸出功能。配置 GPIO 包括以下方面:
- 設置引腳的輸入或輸出模式
- 配置引腳的電平(高或低)
- 配置引腳的中斷
在設備樹中,可以使用類似 gpioX
這樣的表示法來描述 GPIO 引腳,其中 X
是引腳的編號。
PINCTRL:
PINCTRL 是一種用于配置和控制引腳的子系統或驅動程序。它負責管理硬件引腳的復用和功能選擇。PINCTRL 允許將引腳分配給不同的功能(如 GPIO、I2C、SPI 等),并且可以在運行時動態配置引腳功能。使用 PINCTRL,可以將相同的硬件引腳用于不同的用途。
在設備樹中,PINCTRL 可以通過定義 pinctrl
節點和相關屬性來進行配置,并指定引腳的不同功能配置。這些屬性可能包括引腳編號、輸入輸出模式、電氣特性等。
區別:
GPIO 是用于控制和讀取數字信號的通用接口,而 PINCTRL 是管理和配置硬件引腳的子系統。GPIO 配置是指定義和設置引腳的輸入或輸出功能,而 PINCTRL 可以動態配置引腳的不同功能。GPIO 配置是配置引腳本身的特性,而 PINCTRL 配置是管理引腳的復用和功能選擇。兩者在硬件層面上起到不同的作用,但通常在設備樹中一起使用以定義引腳和功能的配置。
讓我們通過一個例子更詳細地說明 GPIO 的配置和 PINCTRL 的使用:
假設我們的嵌入式系統有一個具備 GPIO 功能的引腳,我們希望將其配置為輸入模式,讀取來自外部設備的信號,并在特定條件下觸發中斷。
GPIO 配置:
在設備樹中,我們可以定義以下內容來配置 GPIO 引腳:
gpio_example {compatible = "gpio_example";pinctrl-names = "default";pinctrl-0 = <&pinctrl_gpio>;gpio_pin: gpio-pin {gpio-hog;gpios = <&gpio_controller 0 GPIO_ACTIVE_HIGH>;input;interrupts = <IRQ_NUM IRQ_TYPE_EDGE_BOTH>;};
};
compatible
:指定與該 GPIO 相關的設備或驅動程序的兼容性。pinctrl-names
和pinctrl-0
:指定使用的 PINCTRL 配置集。gpio_pin
:定義 GPIO 引腳的節點。gpio-hog
:表示將該 GPIO 引腳設置為永久控制模式,以確保其在系統運行時一直被控制。gpios
:指定 GPIO 控制器的引用和引腳編號,以及引腳的激活電平。input
:將引腳配置為輸入模式。interrupts
:指定觸發中斷的相關設置(如中斷線號、中斷觸發類型等)。
以上配置實際上是在設備樹中定義了一個 GPIO 控制器 gpio_controller
,將其第0號引腳配置為輸入,啟用中斷,以便該引腳可以讀取傳感器信號并觸發中斷事件。
PINCTRL 配置:
將 GPIO 引腳配置為特定功能通常需要 PINCTRL 的參與。以下是一個示例 PINCTRL 的設備樹配置:
pinctrl_gpio: gpio-pinctrl {gpio-controller;gpios = <&gpio_controller 0 GPIO_ACTIVE_HIGH>;pinctrl_gpio_example: gpio-example-pins {pingroups = <&gpio_example_pins>;};
};gpio_example_pins: gpio_example_pins {pinctrl-0 = <&pinctrl_gpio_example_mode>;
};pinctrl_gpio_example_mode: gpio_example_mode {rockchip,pins = <RK_GPIO4 RK_FUNC_GPIO>;
};
上面的設備樹片段定義了一個名為 gpio_controller
的 GPIO 控制器,并將其第0號引腳配置為 GPIO 功能。然后,定義了一個名為 gpio_example_pins
的 PINCTRL 配置集,用于將 GPIO 引腳配置為具體的功能模式。在此示例中,我們將 GPIO 引腳 RK_GPIO4
(在 Rockchip 平臺上的GPIO編號)配置為 GPIO 功能。
綜上所述,以上設備樹配置演示了如何通過 GPIO 配置和 PINCTRL 來定義和配置一個 GPIO 引腳,并將其設置為輸入模式以讀取信號,并通過 PINCTRL 指定其特定功能模式。實際的設備樹配置可能因具體的硬件平臺和需求而有所不同。