對于所有的處理器,pad 一般可以分為兩大類:IO(輸入輸出)、Power(VDD 和GDD)。
類似攝像頭 IO、以太網 IO、PWM 的 IO 等等,都可以統稱為 IO。一個 IO,有可能能夠被配置為多種功能。
GPIO 是 IO 的一種,GPIO 就是普通輸入輸出的意思,當需要實現高低電平輸入輸出、中斷功能的時候,都需要將其設置為 GPIO 模式。
本文檔以 GPIO 為例,介紹如何配置 iTOP-4418 和 iTOP-6818 的 IO。iTOP-4418 和
iTOP-6818 的完全兼容,適用于 Android、Ubuntu 和 QtE 等各種文件系統。
1 IO 和 GPIO 部分 datasheet 閱讀指導
本小節帶大家閱讀 datasheet 的相關內容,如果要分析 GPIO 的 datasheet,6818 的
datasheet 主要理解 datasheet 的 2.4 小節和 16.5 小節;4418 的 datasheet 主要理解 2.3.2小節,15.4 小節。
通過 2.3.2 或者 2.4 小節了解 IO 復用也就是 alternate function 功能,通過 15.4 或者16.5 了解 GPIO 各種寄存器。當然,這些寄存器不需要我們一個一個配置,在接下來的一節中所有寄存器都有對應的內核代碼以及對一個的宏,可以通過配置內核代碼中的宏來實現 IO的初始化。
本文檔以 4418 為例來分析,6818 的分析類似。
1.1 IO 的 alternate function 功能
datasheet 的 2.3.2 小節,如下圖所示,。
表格中的 Ball 對應個每一個 pad(類似 BGA 封裝的芯片,有些會用 Ball 來表示 pad),pad 是編號是唯一;
Name 表示每一個 pad 對應的名字,這個名字是唯一的; Type 表示 IO 的類型,S 表示是信號管腳,P 表示電源管腳,G 表示接地管腳;
alternate function[0-4],表示這個 pad 可以被設置的功能,下表中的每個管腳似乎都是只能設置為一種功能。
01.jpg (21.08 KB, 下載次數: 57)
下載附件
2018-9-26 10:16 上傳
如下圖所示,紅色框中的是 GPIOB18(這個管腳是后面我們要分析 IO),可以看到這個IO 可以被設置為三種功能,如果我們要將其配置為 GPIO,那么這個管腳要在這里要被設置為alternate function3。
02.jpg (22.98 KB, 下載次數: 48)
下載附件
2018-9-26 10:16 上傳
1.2 GPIO 的寄存器分析
datasheet 上的 15.4 小節目錄,如下圖所示。
似乎 4418 和 6818 的 GPIO 設計的比較整齊劃一,每一個 bank 都是 32 個 GPIO,所以
datasheet 上的介紹很籠統,不過并不影響 datasheet 的使用。
03.jpg (28.46 KB, 下載次數: 46)
下載附件
2018-9-26 10:16 上傳
現在我們來分析,每一類寄存器的作用。
GPIOxOUT:在 GPIO 被設置為輸出模式的時候,寄存器被設置為 1,則輸出高電平,設
置為 0,則輸出低電平;
GPIOxOUTEND:輸入和輸出模式的使能,輸出和輸入要二選一;
GPIOxDETMODE[0:1]:設置 GPIO 的中斷模式,3 個比特設置一個 IO,其中兩個 bit 在
這兩個寄存器中,剩余的 1 個 bit 位在 GPIOxDETMODEEX 寄存器中;
GPIOxINTENB:中斷使能寄存器;
GPIOxDET:中斷觸發之后,可用于清除中斷;
GPIOxPAD:在 GPIO 被設置為輸入模式的時候,讀取這個寄存器就是對應 GPIO 輸入的
電平值;
GPIOxALTFN[0:1]:用于設置 IO 的 alternate function,前面介紹的 IO 管腳多功能配
置,這個是對應的寄存器;
GPIOxDETMODEEX:用于中斷模式,結合 GPIOxDETMODE[0:1]寄存器來設置中斷 IO
輸入模式,是高電平觸發、低電平觸發等等; GPIOxDETENB:在輸入模式下,寄存器用于設置使能;
GPIOx_SLEW:設置 GPIO 檢測速度,也就是 GPIO 翻轉速度;
GPIOx_SLEW_DISABLE_DEFAULT:用于配置 GPIO 的翻轉速度是否使用默認的設置;
GPIOx_DRV0 和 GPIOx_DRV1:設置 GPIO 的驅動能力;
GPIOx_DRV0_DISABLE_DEFAULT 和 GPIOx_DRV1_DISABLE_DEFAULT:用于配置
GPIO 的驅動能力是否使用默認的設置;
GPIOx_PULLSEL_DISABLE_DEFAULT:用于設置 GPIO 輸出能力使用默認配置還是使用
GPIOx_PULLSEL 寄存器配置的值;
GPIOx_PULLSEL:用于設置 GPIO 內部上拉和下拉;
GPIOx_PULLSELENB:GPIO 內部上來和下拉的使能;
GPIOx_PULLSELENB_DISABLE_DEFAULT:GPIO 內部上拉和下拉的使能的配置寄存
器。
2 內核 IO 初始化配置分析
本小節介紹 IO 初始化宏定義和配置文件,并和 datasheet 結合來理解。
2.1 初始化文件分析
內核代碼最好 Windows 上的 source insight 和 Ubuntu 上的 vim 工具結合起來閱讀。
4418 的內核 IO 配置文件是“arch/arm/plat-s5p4418/topeet/include/cfg_gpio.h”;
6818 的內核 IO 配置文件是“arch/arm/plat-s5p6818/topeet/include/cfg_gpio.h”。
所有的 IO 都是在這個文件下配置基本功能的。
這里以 GPIOB18 為例,在內核 IO 文件 cfg_gpio.h 中搜索“GPIOB18”,如下圖所示。
04.jpg (16.57 KB, 下載次數: 50)
下載附件
2018-9-26 10:16 上傳
這部分 source insight 下查看,如下圖所示。作者的 source insight 中的代碼比較舊,
和上面一張截圖有一點區別,不過并不影響使用。
05.jpg (32.56 KB, 下載次數: 52)
下載附件
2018-9-26 10:16 上傳
如上圖所示,4412 的 BSP 文件 cfg_gpio.h 中,PAD_GPIOB18 使用了 5 個宏通過或運
算來實現初始化配置。
我們先來分析這 5 個宏分別對應什么參數,在 cfg_gpio.h 文件靠前位置,可以看到如
下。
06.jpg (19.53 KB, 下載次數: 46)
下載附件
2018-9-26 10:16 上傳
如上圖所示,這 5 個宏對應配置如下:
第一個:PAD_MOD_XXX,用于設置 GPIO 被配置為對應模式;
第二個:PAD_FUNC_ALT[0:3],用于設置 GPIO 被配置為對應模式,PAD_FUNC_ALT
可以和 PAD_MOD_XXX 結合起來使用;
第三個:PAD_LEVEL_XXX,用于 GPIO 電平輸出或者輸出,對應輸出高電平或者低電平或
者中斷模式下的中斷模式設置;
第四個:PAD_PULL_XX,用于輸入模式的內部上拉或者下拉。例如 GPIO 被設置為輸入
模式,這里設置為上拉模式,那么 GPIO 在懸空狀態下檢測到的就是高電平;
第五個:PAD_STRENGTH_0,1,2,3,用于設置 GPIO 輸出能力設置。
這里對應前一小節中,GPIO 寄存器,不過在軟件上純粹的設置,就比較容易了。
另外在 linux 內核驅動中,還提供了一部分函數接口,例如:設置輸入模式和輸出模式、
讀取輸入值,設置輸出值,設置中斷口,設置獨立中斷 IO 的中斷模式等等。 作者在 4418 和 6818 的 GPIO 函數接口中,沒有找到輸入模式下的上拉和下拉函數,后
面我們就在這個文件中設置一下,然后讓 GPIO 懸空,通過讀取輸入值就可以判斷設置是否生
效。如果 pull up 模式下,GPIO 懸空狀態讀取的值應該 1;pull down 模式下,GPIO 懸空狀
態讀取的值就是 0。
2.2 常用 GPIO 宏介紹
第一個宏介紹:
通過 source insight 可以找到宏定義,定義的位置。例如“PAD_MODE_ALT”,如下圖
所示。
07.jpg (13.65 KB, 下載次數: 47)
下載附件
2018-9-26 10:16 上傳
如上圖可知,如果設置為 PAD_MODE_ALT,那么要結合第二個宏來設置管腳功能,不過
這樣似乎還要結合 datasheet 來對照。
作者發現 4418 和 6818 所有的 GPIOXXX 都可以作為 OUT、IN 和 INT 這三種模式,可
以直接將其設置為輸出模式,不用管第二個宏定義,如果要嚴謹一點應該也沒問題,用戶可以
自己測試。
PAD_MODE_ALT:IO 的功能設置,結合第二個宏來使用
PAD_MODE_IN:直接設置為輸入模式;
PAD_MODE_OUT:直接設置為輸出模式;
PAD_MODE_INT:至二級設置為中斷模式。
第二個宏介紹:
如下圖所示,可以有以下選擇。
08.jpg (14.67 KB, 下載次數: 47)
下載附件
2018-9-26 10:16 上傳
這個宏要結合 datasheet 來使用,不是很建議在 GPIO 設置中使用,如下圖所示,例如
要設置 GPIOB18 功能,那么第一個宏要設置為 PAD_MODE_ALT,第二個宏設置為
PAD_FUNC_ALT2,然后在驅動中設置是輸入、輸出還是中斷模式。當然如果要簡單,可以直
接將第一個宏設置為 PAD_MODE_IN,這樣就是輸入模式了。
09.jpg (27.65 KB, 下載次數: 54)
下載附件
2018-9-26 10:16 上傳
PAD_FUNC_ALT[0:3],表示將 IO 設置為 datasheet 上對應的功能。
第三個宏介紹:
如下圖所示,可以有以下選擇。
10.jpg (20.77 KB, 下載次數: 52)
下載附件
2018-9-26 10:16 上傳
上圖中的介紹,主要是中斷部分,表示中斷觸發模式,分別對應高電平觸發、低電平觸
發,下降沿觸發等等,這不可以參考獨立中斷的例程。
不過這部分在驅動中通過內核函數接口都是可以設置的,初始化的狀態可以修改。
第四個宏介紹: 如下圖所示,可以有以下選擇。
11.jpg (10.43 KB, 下載次數: 46)
下載附件
2018-9-26 10:16 上傳
這個比較好理解,在輸入模式下有上拉和下拉,懸空狀態下可以通過讀取 GPIO 的值來實
現。
第五個宏介紹:
如下圖所示,可以有以下選擇。
12.jpg (15.97 KB, 下載次數: 51)
下載附件
2018-9-26 10:16 上傳
這里用于設置 GPIO 驅動能力,0-3 和第二個宏的 0-3 對應。
至此,GPIO 部分所有配置的宏都分析完畢,另外還有其它宏定義,用于設置特殊的功
能,這部分用戶可以自行去理解,分析方法和思路都是一樣的。
2.3 GPIOB18 的配置
這里回到 GPIOB18 這個管腳,我們在初始狀態中,可以將其設置為輸入模式或者 GPIO
模式,這樣在內核中,我們可以有以下兩種配置,如下圖所示。
#define PAD_GPIOB18 (PAD_MODE_IN | PAD_FUNC_ALT0 | PAD_LEVEL_HIGH | PAD_PULL_DN |
PAD_STRENGTH_0)
或者
#define PAD_GPIOB18 (PAD_MODE_ALT | PAD_FUNC_ALT2 | PAD_LEVEL_HIGH | PAD_PULL_DN
| PAD_STRENGTH_0)
如上配置代碼,PAD_PULL_DN 這第四個宏可以將其設置為下拉模式,這樣在管腳懸空
狀態下,就可以讀取的管腳值為 0; 如果將其替換為 PAD_PULL_UP,則將其設置為上拉模式,在管腳懸空狀態下,讀取的管
腳值為 1;
3 GPIO 例程-pull up 和 pull down 測試
這里的例程在獨立文檔“iTOP-4418 和 6818-驅動-GPIO 輸入輸出和例程_V1.0”基礎上
做,所以不做重復分析,直接用這個例程即可。
如下圖所示,在內核“arch/arm/plat-s5p4418/topeet/include/cfg_gpio.h”文件下,
默認是設置為輸出模式(輸入輸出模式是可以在內核中修改的,這里也可以不用修改第一個
宏,直接設置為 PAD_MODE_OUT 也是一樣的)。默認狀態下是 PAD_PULL_UP,那么懸空
狀態下讀取出的值是 1(在獨立文檔“iTOP-4418 和 6818-驅動-GPIO 輸入輸出和例程
_V1.0”測試中將 GPIOB18 懸空,讀到的值是 1,就是因為這里設置為 PAD_PULL_UP)。
13.jpg (10.28 KB, 下載次數: 53)
下載附件
2018-9-26 10:16 上傳
如果將上圖中的 PAD_PULL_UP 修改為 PAD_PULL_DN,其它參數不用修改,則可以實
現,在 GPIOB18 懸空狀態,讀到的值是 0。
具體操作和驅動代碼請參考“iTOP-4418 和 6818-驅動-GPIO 輸入輸出和例程_V1.0”文
檔。
至此,GPIO 寄存器配置和初始化配置分析完畢。
|