作為一個(gè)工作多年的系統(tǒng)工程師,免不了做兩件事情:培訓(xùn)新員工和給新員工分配任務(wù)。對(duì)于那些剛剛從學(xué)校出來(lái)的學(xué)生,一般在開(kāi)始的時(shí)候總是分配一些非常簡(jiǎn)單的任務(wù),例如GPIO driver、LED driver。往往CPU datasheet的關(guān)于GPIO或者IO ports的章節(jié)都是比較簡(jiǎn)單的,非常適合剛?cè)胄械墓こ處?。雖然GPIO子系統(tǒng)相關(guān)的硬件比較簡(jiǎn)單,沒(méi)有復(fù)雜的協(xié)議,不過(guò),對(duì)于軟件抽象而言,其分層次的軟件思想是每個(gè)嵌入式軟件工程師需要掌握的內(nèi)容。
個(gè)人更傾向使用GPIO系統(tǒng)這個(gè)名字來(lái)代替GPIO driver這個(gè)名字,GPIO driver僅僅包含了pin signal狀態(tài)控制和讀取的內(nèi)容,而GPIO系統(tǒng)包括了pin multiplexing、pin configuration、GPIO control、GPIO interrupt control等內(nèi)容。
一、GPIO相關(guān)硬件有哪些差異
嵌入式工程師總是要處理各種各樣的target board,每個(gè)target board上的GPIO總是存在不同,例如:
1、和CPU的連接方式不同
對(duì)于ARM的嵌入式硬件平臺(tái),SOC本身可以提供大量的IO port,SOC上的GPIO controller是通過(guò)SOC的總線(AMBA)連接到CPU的。對(duì)于嵌入式系統(tǒng)而言,除了SOC的IO port,一些外設(shè)芯片也可能會(huì)提供IO port,例如:
(1)有些key controller芯片、codec或者PMU的芯片會(huì)提供I/O port
(2)有些專用的IO expander芯片可以擴(kuò)展16個(gè)或者32個(gè)GPIO
從硬件角度看,這些IO和SOC提供的那些IO完全不同,CPU和IO expander是通過(guò)I2C(也有可能是SPI等其他類型的bus)連接的,在這種情況下,訪問(wèn)這些SOC之外的GPIO需要I2C的操作,而控制SOC上的GPIO只需要寫(xiě)寄存器的操作。不要小看這個(gè)不同,寫(xiě)一個(gè)SOC memory map的寄存器非??欤峭ㄟ^(guò)I2C來(lái)操作IO就不是那么快了,甚至,如果總線繁忙有可能阻塞當(dāng)前進(jìn)程,這種情況下,內(nèi)核同步機(jī)制必須有所區(qū)別(如果操作GPIO可能導(dǎo)致sleep,那么同步機(jī)制不能采用spinlock)。
2、訪問(wèn)方式不同
SOC片內(nèi)的GPIO controller和SOC片外的IO expander的訪問(wèn)當(dāng)然不一樣,不過(guò),即便都是SOC片內(nèi)的GPIO controller,不同的ARM芯片,其訪問(wèn)方式也不完全相同,例如:有些SOC的GPIO controller會(huì)提供一個(gè)寄存器來(lái)控制輸出電平。向寄存器寫(xiě)1就是set high,向寄存器寫(xiě)0就是set low。但是有些SOC的GPIO controller會(huì)提供兩個(gè)寄存器來(lái)控制輸出電平。向其中一個(gè)寄存器寫(xiě)一就是set high,向另外一個(gè)寄存器寫(xiě)一就是set low。
3、配置方式不同
即便是使用了同樣的硬件(例如都使用同樣的某款SOC),不同硬件系統(tǒng)上GPIO的配置不同。在一個(gè)系統(tǒng)上配置為輸入,在另外的系統(tǒng)上可能配置為輸出。
4、GPIO特性不同。這些特性包括:
(1)是否能觸發(fā)中斷。對(duì)一個(gè)SOC而言,并非所有的IO port都支持中斷功能,可能某些處理器只有一兩組GPIO有中斷功能。
(2)如果能夠觸發(fā)中斷,那么該GPIO是否能夠?qū)PU從sleep狀態(tài)喚醒
(3)有些有軟件可控的上拉或者下拉電阻的特性,有的GPIO不支持這種特性。在設(shè)定為輸入的時(shí)候,有的GPIO可以設(shè)定debouce的算法,有的則不可以。
5、多功能復(fù)用
有的GPIO就是單純的作為一個(gè)GPIO出現(xiàn),有些GPIO有其他的復(fù)用的功能。例如IO expander上的GPIO只能是GPIO,但是SOC上的某個(gè)GPIO除了做普通的IO pin腳,還可以是SPI上clock信號(hào)線。
二、硬件功能分類
ARM based SOC的datasheet中總有一個(gè)章節(jié)叫做GPIO controller(或者I/O ports)的章節(jié)來(lái)描述如何配置、使用SOC的引腳。雖然GPIO controller的硬件描述中充滿了大量的寄存器的描述,但是這些寄存器的功能大概分成下面三個(gè)類別:
1、有些硬件邏輯是和IO port本身的功能設(shè)定相關(guān)的,我們稱這個(gè)HW block為pin controller。軟件通過(guò)設(shè)定pin controller這個(gè)硬件單元的寄存器可以實(shí)現(xiàn):
(1)引腳功能配置。例如該I/O pin是一個(gè)普通的GPIO還是一些特殊功能引腳(例如memeory bank上CS信號(hào))。
(2)引腳特性配置。例如pull-up/down電阻的設(shè)定,drive-strength的設(shè)定等。
2、如果一組GPIO被配置成SPI,那么這些pin腳被連接到了SPI controller,如果配置成GPIO,那么控制這些引腳的就是GPIO controller。通過(guò)訪問(wèn)GPIO controller的寄存器,軟件可以:
(1)配置GPIO的方向
(2)如果是輸出,可以配置high level或者low level
(3)如果是輸入,可以獲取GPIO引腳上的電平狀態(tài)
3、如果一組gpio有中斷控制器的功能,雖然控制寄存器在datasheet中的I/O ports章節(jié)描述,但是實(shí)際上這些GPIO已經(jīng)被組織成了一個(gè)interrupt controller的硬件block,它更像是一個(gè)GPIO type的中斷控制器,通過(guò)訪問(wèn)GPIO type的中斷控制器的寄存器,軟件可以:
(1)中斷的enable和disable(mask和unmask)
(2)觸發(fā)方式
(3)中斷狀態(tài)清除
三、如何通過(guò)軟件抽象來(lái)掩蓋硬件差異
傳統(tǒng)的GPIO driver是負(fù)責(zé)上面三大類的控制,而新的linux kernel中的GPIO subsystem則用三個(gè)軟件模塊來(lái)對(duì)應(yīng)上面三類硬件功能:
(1)pin control subsystem。驅(qū)動(dòng)pin controller硬件的軟件子系統(tǒng)。
(2)GPIO subsystem。驅(qū)動(dòng)GPIO controller硬件的軟件子系統(tǒng)。
(3)GPIO interrupt chip driver。這個(gè)模塊是作為一個(gè)interrupt subsystem中的一個(gè)底層硬件驅(qū)動(dòng)模塊存在的。本文主要描述前兩個(gè)軟件模塊,具體GPIO interrupt chip driver以及interrupt subsystem請(qǐng)參考本站其他相關(guān)文檔。
1、pin control subsystem block diagram
下圖描述了pin control subsystem的模塊圖:
底層的pin controller driver是硬件相關(guān)的模組,初始化的時(shí)候會(huì)向pin control core模塊注冊(cè)pin control設(shè)備(通過(guò)pinctrl_register這個(gè)bootom level interface)。pin control core模塊是一個(gè)硬件無(wú)關(guān)模塊,它抽象了所有pin controller的硬件特性,僅僅從用戶(各個(gè)driver就是pin control subsystem的用戶)角度給出了top level的接口函數(shù),這樣,各個(gè)driver不需要關(guān)注pin controller的底層硬件相關(guān)的內(nèi)容。
2、GPIO subsystem block diagram
下圖描述了GPIO subsystem的模塊圖:
基本上這個(gè)軟件框架圖和pin control subsystem是一樣的,其軟件抽象的思想也是一樣的,當(dāng)然其內(nèi)部具體的實(shí)現(xiàn)不一樣,我們會(huì)在后續(xù)的文章中描述。
-
嵌入式
+關(guān)注
關(guān)注
5086文章
19141瀏覽量
305925 -
GPIO
+關(guān)注
關(guān)注
16文章
1205瀏覽量
52162
原文標(biāo)題:嵌入式新手注意了:GPIO系統(tǒng)搞懂了沒(méi)?聽(tīng)聽(tīng)這位老工程師的沒(méi)錯(cuò)
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論