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