gpio接口是用于和硬件進(jìn)行數(shù)據(jù)交互;gpio是“General Purpose I/O Ports”的簡(jiǎn)寫(xiě),是通用輸入輸出端口的意思,其接腳可以供使用者由程控自由使用,可以通過(guò)接口輸出高低電平或者讀出引腳的狀態(tài)是高電平還是低電平。
本教程操作環(huán)境:windows10系統(tǒng)、DELL G3電腦。
gpio接口是干什么的
GPIO,通用型之輸入輸出的簡(jiǎn)稱,功能類(lèi)似8051的P0-P3,其接腳可以供使用者由程控自由使用,PIN腳依現(xiàn)實(shí)考量可作為通用輸入(GPI)或通用輸出(GPO)或通用輸入與輸出(GPIO),如當(dāng)clk generator, chip select等
GPIO(General Purpose I/O Ports)意思為通用輸入/輸出端口,通俗地說(shuō),就是一些引腳,可以通過(guò)它們輸出高低電平或者通過(guò)它們讀入引腳的狀態(tài)-是高電平或是低電平。
GPIO口一是個(gè)比較重要的概念,用戶可以通過(guò)GPIO口和硬件進(jìn)行數(shù)據(jù)交互(如UART),控制硬件工作(如LED、蜂鳴器等),讀取硬件的工作狀態(tài)信號(hào)(如中斷信號(hào))等。GPIO口的使用非常廣泛。
gpio接口怎么用
要使用GPIO,系統(tǒng)首先要分配一個(gè)GPIO,使用gpio_request() 為系統(tǒng)分配一個(gè)GPIO。
接下來(lái)要做的一件事是標(biāo)示GPIO的方向,通常在使用GPIO建立一個(gè)platform_device時(shí)(位于單板的setup代碼中):
/* set as input or output, returning 0 or negative errno */ int gpio_direction_input(unsigned gpio); int gpio_direction_output(unsigned gpio, int value);
返回0標(biāo)示成功,或是一個(gè)負(fù)的errno錯(cuò)誤碼。它應(yīng)該被檢查,因?yàn)間et/set調(diào)用沒(méi)有錯(cuò)誤返回,且可能會(huì)有錯(cuò)誤配置。你通常應(yīng)該在線程上下文中使用這些調(diào)用。雖然如此,對(duì)于spinlock-safe的GPIO,在tasking使能之前使用也是可以的,作為一個(gè)早期的單板建立。
對(duì)于輸出GPIO,value參數(shù)提供了初始輸出值。這有助于避免系統(tǒng)啟動(dòng)過(guò)程中的信號(hào)干擾。
為了與GPIO早期的接口兼容,設(shè)置一個(gè)GPIO的方向,隱性要求申請(qǐng)GPIO。這個(gè)兼容性從可選的gpiolib架構(gòu)中移除了。
如果GPIO號(hào)碼無(wú)效或是指定的GPIO不能使用對(duì)應(yīng)模式操作的話,設(shè)置方向會(huì)失敗。依靠boot固件設(shè)置好GPIO的方向通常不是一個(gè)好主意,因?yàn)閎oot的功能可能沒(méi)有通過(guò)驗(yàn)證(除了boot linux)。(類(lèi)似的,單板setup代碼可能需要將管腳復(fù)用為一個(gè)GPIO,和配置為合適的上拉/下拉。)
Spinlock-Safe GPIO訪問(wèn)
大多數(shù)GPIO控制器可以使用內(nèi)存讀寫(xiě)指令訪問(wèn)。它們不需要休眠,且可以從內(nèi)部硬件中斷處理(非線程)和類(lèi)似的上下文環(huán)境安全完成。
使用下列調(diào)用訪問(wèn)這些GPIO,此時(shí)gpio_cansleep將總是返回錯(cuò)誤
/* GPIO INPUT: return zero or nonzero */ int gpio_get_value(unsigned gpio); /* GPIO OUTPUT */ void gpio_set_value(unsigned gpio, int value);
其中,value是一個(gè)布爾型參數(shù),零表示低,非零表示高。當(dāng)讀一個(gè)輸出管腳的值時(shí),返回的值應(yīng)該是在管腳上看到的值。。。這并不總是與指定輸出值相匹配的,因?yàn)榇嬖陂_(kāi)漏信號(hào)和輸出延遲問(wèn)題。
get/set調(diào)用沒(méi)有錯(cuò)誤返回,因?yàn)椤盁o(wú)效GPIO”應(yīng)該已經(jīng)由gpio_direction_*()提早報(bào)告了。雖然如此,并非所有的平臺(tái)都可以讀取輸出管腳的值,那些不能讀的應(yīng)該總是返回零。同時(shí),對(duì)那些可能導(dǎo)致睡眠的GPIO使用這些接口是一個(gè)錯(cuò)誤。
平臺(tái)的特定實(shí)現(xiàn)被鼓勵(lì)優(yōu)化這兩個(gè)調(diào)用以獲取GPIO值。在那些GPIO號(hào)碼是常量的情況下,它們通常只需一對(duì)指令(讀或?qū)懸粋€(gè)硬件寄存器)訪問(wèn),且不需要spinlock。這樣的優(yōu)化可以使位拆分應(yīng)用更有效率(在時(shí)間和空間上)(相比較于花費(fèi)一堆指令在子例程調(diào)用來(lái)說(shuō))。
gpio接口是干什么的
輸出值可寫(xiě)(高=1,低=0)。一些芯片也可以選擇驅(qū)動(dòng)這些值的方式,以便支持“線-或”或類(lèi)似方案(開(kāi)漏信號(hào)線)。
輸入值可讀(1,0)。一些芯片支持輸出管腳回讀,這在線或的情況下非常有用(以支持雙向信號(hào)線)。GPIO控制器可能具有一個(gè)輸入防故障/防反跳邏輯,有時(shí)還會(huì)有軟件控制。
輸入經(jīng)常被用作中斷信號(hào),通常是邊沿觸發(fā),但也有可能是電平觸發(fā)。這些中斷可以配置為系統(tǒng)喚醒事件,從而將系統(tǒng)從低功耗模式喚醒。
一個(gè)GPIO經(jīng)常被配置為輸入/輸出雙向,根據(jù)不同的產(chǎn)品單板需求,但也存在單向的情況。
大多是GPIO可以在獲取到spinlock自旋鎖時(shí)訪問(wèn),但那些通過(guò)串行總線訪問(wèn)的通常不能如此操作(休眠的原因)。一些系統(tǒng)中會(huì)同時(shí)存在這兩種形式的GPIO。
在一個(gè)給定單板上,每個(gè)GPIO用于一個(gè)特定的目的,如監(jiān)控MMC/SD卡的插入/移除,檢查卡寫(xiě)保護(hù)狀態(tài),驅(qū)動(dòng)LED,配置發(fā)送器,串行總線位拆,觸發(fā)一個(gè)硬件看門(mén)狗,觸發(fā)一個(gè)開(kāi)關(guān)之類(lèi)的。