對於全部的處理器,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 對應的名字,這個名字是惟一的;linux
Type 表示 IO 的類型,S 表示是信號管腳,P 表示電源管腳,G 表示接地管腳;
alternate function[0-4],表示這個 pad 能夠被設置的功能,下表中的每一個管腳彷佛都是
只能設置爲一種功能。vim
以下圖所示,紅色框中的是 GPIOB18(這個管腳是後面咱們要分析 IO),能夠看到這個
IO 能夠被設置爲三種功能,若是咱們要將其配置爲 GPIO,那麼這個管腳要在這裏要被設置爲
alternate function3。函數
1.2 GPIO 的寄存器分析
datasheet 上的 15.4 小節目錄,以下圖所示。
彷佛 4418 和 6818 的 GPIO 設計的比較整齊劃一,每個 bank 都是 32 個 GPIO,因此
datasheet 上的介紹很籠統,不過並不影響 datasheet 的使用。工具
如今咱們來分析,每一類寄存器的做用。
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」,以下圖所示。設計
這部分 source insight 下查看,以下圖所示。做者的 source insight 中的代碼比較舊,
和上面一張截圖有一點區別,不過並不影響使用。3d
如上圖所示,4412 的 BSP 文件 cfg_gpio.h 中,PAD_GPIOB18 使用了 5 個宏經過或運
算來實現初始化配置。
咱們先來分析這 5 個宏分別對應什麼參數,在 cfg_gpio.h 文件靠前位置,能夠看到如
下。blog
如上圖所示,這 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」,以下圖
所示。文檔
如上圖可知,若是設置爲 PAD_MODE_ALT,那麼要結合第二個宏來設置管腳功能,不過
這樣彷佛還要結合 datasheet 來對照。
做者發現 4418 和 6818 全部的 GPIOXXX 均可以做爲 OUT、IN 和 INT 這三種模式,可
以直接將其設置爲輸出模式,不用管第二個宏定義,若是要嚴謹一點應該也沒問題,用戶能夠
本身測試。
PAD_MODE_ALT:IO 的功能設置,結合第二個宏來使用
PAD_MODE_IN:直接設置爲輸入模式;
PAD_MODE_OUT:直接設置爲輸出模式;
PAD_MODE_INT:至二級設置爲中斷模式。
第二個宏介紹:
以下圖所示,能夠有如下選擇。
這個宏要結合 datasheet 來使用,不是很建議在 GPIO 設置中使用,以下圖所示,例如
要設置 GPIOB18 功能,那麼第一個宏要設置爲 PAD_MODE_ALT,第二個宏設置爲
PAD_FUNC_ALT2,而後在驅動中設置是輸入、輸出仍是中斷模式。固然若是要簡單,能夠直
接將第一個宏設置爲 PAD_MODE_IN,這樣就是輸入模式了。
PAD_FUNC_ALT[0:3],表示將 IO 設置爲 datasheet 上對應的功能。
第三個宏介紹:
以下圖所示,能夠有如下選擇。
上圖中的介紹,主要是中斷部分,表示中斷觸發模式,分別對應高電平觸發、低電平觸
發,降低沿觸發等等,這不能夠參考獨立中斷的例程。
不過這部分在驅動中經過內核函數接口都是能夠設置的,初始化的狀態能夠修改。
第四個宏介紹:
以下圖所示,能夠有如下選擇。
這個比較好理解,在輸入模式下有上拉和下拉,懸空狀態下能夠經過讀取 GPIO 的值來實
現。
第五個宏介紹:
以下圖所示,能夠有如下選擇。
這裏用於設置 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)。
若是將上圖中的 PAD_PULL_UP 修改成 PAD_PULL_DN,其它參數不用修改,則能夠實 現,在 GPIOB18 懸空狀態,讀到的值是 0。 具體操做和驅動代碼請參考「iTOP-4418 和 6818-驅動-GPIO 輸入輸出和例程_V1.0」文 檔。 至此,GPIO 寄存器配置和初始化配置分析完畢。