原理圖
假設有如下原理圖,比如說我們要控制
USB_H1_EN
管腳,該管腳與
GPIO_0
的pad連接配接,是以後面所有的關于該引腳的配置都要圍繞pad
GPIO_0
展開。
在這裡,我們将
GPIO_0
做為一個普通的GPIO口使用。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQ3chVEa0V3bT9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVP9EVT4FkaNxGZXlVeWNjYqVzVaZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zM3kzN0YTM1EzMxgDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
i.MX6 的pad
在i.MX6上,pad是唯一存在的,一個pad可以通過複用為多個功能。
如下是i.MX6晶片上的管腳圖,藍色框框裡面的就是pad的名稱。
檢視pad的複用
我們可以在“iMX6DQPRM.pdf”文檔中的”External Signals and Pin Multiplexing ”章節都能夠索引到GPIO_0可複用的情況如下:
在
<Kernel_Dir>/arch/arm/boot/dts/imx6q-pinfunc.h
中可以看到關于 GPIO_0 的如下宏定義:
i.MX6 Linux Kernel中
pinfunc.h
中宏定義的格式如下:
#define MX6QDL_PAD_GPIO_0__GPIO1_IO00 0x220 0x5f0 0x000 0x5 0x0
名稱 | 意義 |
---|---|
MX6QDL | 每個i.MX6的核命名不同 |
PAD | 固定為PAD |
GPIO_0 | pad的名稱,唯一 |
GPIO1_IO00 | 該pad複用出來的功能,最多複用8個 |
關于後面的值的意思,可以參照i.MX6 pinctrl解析文章。
檢查pad功能的唯一性
雖說pad可以複用多個功能,但是在實際使用中得根據情況隻能使用其中的某一種功能。因為我們将pad
GPIO_0
當成普通的GPIO使用,是以我們可以知道我們要将這個pad配置為
MX6QDL_PAD_GPIO_0__GPIO1_IO00
,即使用第1組第0号的GPIO。
在使用該GPIO之前,我們需要在
<Kernel_Dir>/arch/arm/boot/dts/xxx.dts
中查找關鍵字 MX6QDL_PAD_GPIO_0 看GPIO_0 的pad是否有配置另做他用。如果有,需要将相關的配置屏蔽掉(在移植Kernel的過程中也許會将某些不必要的功能添加進去,此時做這一步很有必要)。
配置 GPIO1_IO00 功能
在dts中配置pad為普通的GPIO功能,隻需在 pinctrl_hog 的節點進行添加。
因為這個GPIO是屬于USB子產品控制的,可以加入到USB的節點中去。
控制 GPIO1_IO00
在dts中配置完GPIO1_IO00 後,就可以在代碼中控制該GPIO。
#define USB_H1_EN IMX_GPIO_NR(, )
gpio_request(USB_H1_EN, "USB_H1_EN");
gpio_direction_output(USB_H1_EN, );
gpio_export(USB_H1_EN, true);
GPIO的轉換關系
參考資料
https://www.kosagi.com/w/index.php?title=Definitive_GPIO_guide#i.MX6Q_GPIO_bit.2Fbank_to_Pad_name_Table