Linux驅(qū)動開發(fā),看起來是一份很高大上的職業(yè),畢竟從事上層應(yīng)用開發(fā)人員太多,而且門檻又不是特別高,而內(nèi)核級開發(fā)從業(yè)人員要少得多,而且資料又較少。
有許多剛剛接觸到Linux驅(qū)動開發(fā)的同學(xué)會感覺非常困惑,面對復(fù)雜的Linux內(nèi)核有一種無從下手的感覺。今天就和大家分享一下,讓剛剛步入驅(qū)動開發(fā)的同學(xué)少走一些彎路。
01要知道將來要做什么學(xué)習(xí),都是有目的性的,要么是興趣使然,要么就是剛性需求,為了找一份好的工作。在這里先和大家聊聊做設(shè)備驅(qū)動將來可以做哪些方面。
我把linux設(shè)備驅(qū)動開發(fā)工作分為兩大類,一類是做BSP級的開發(fā),另外一類是做外設(shè)驅(qū)動的開發(fā)。
BSP的開發(fā)指的是板級代碼的開發(fā),和CPU是密切相關(guān)的,例如I2C/SPI Adapter的驅(qū)動。如果使用通用的芯片,比如三星的Exynos,飛思卡爾的I.MX系列,TI的OMAP或者DaVinci系列,基本都會有現(xiàn)成的BSP包,這部分代碼通常是芯片廠商提供和大型公司貢獻(xiàn)。
大家可以看看linux內(nèi)核源碼中/arch/arm/mach-omap,內(nèi)部很多代碼都是諾基亞貢獻(xiàn)。做BSP級的開發(fā)需要有較深的功底,首先要十分了解CPU特性,另外要使代碼有良好的擴展性和復(fù)用性,方便后續(xù)移植。有這樣需求的往往是芯片商或使用專用芯片的設(shè)備商。
外設(shè)驅(qū)動開發(fā)就相對簡單一些,都是和特定的外設(shè)硬件打交道。
通過利用BSP級代碼提供的API或者linux提供的更高層的抽象接口來操作硬件。實際上和應(yīng)用層的開發(fā)大同小異。
例如操作I2C總線上的EEPROM,實際上的讀和寫操作都有已經(jīng)封裝好的API來完成.而開發(fā)者需要做的是了解外設(shè)的特性,通過封裝好的API對外設(shè)進(jìn)行操作。新入門的開發(fā)者建議從外設(shè)驅(qū)動開發(fā)入手,循序漸進(jìn)。當(dāng)然,一個優(yōu)秀的開發(fā)者是即可以做BSP級代碼的開發(fā),也能做外設(shè)驅(qū)動的開發(fā)的。
02用面向?qū)ο蟮乃枷肴ニ伎?/strong>面向?qū)ο?,即OO思想,大家應(yīng)該非常熟悉。linux的內(nèi)核雖然用面向過程的C語言實現(xiàn),但是仍然是通過面向?qū)ο蟮乃枷肴ピO(shè)計的。
如果從單片機轉(zhuǎn)行做linux設(shè)備驅(qū)動,會發(fā)現(xiàn)和單片機的或者裸機的驅(qū)動設(shè)計有很大區(qū)別。設(shè)計linux設(shè)備驅(qū)動不單單是對硬件設(shè)備的操作,更多需要考慮的是擴展性和代碼的復(fù)用。
所以就出現(xiàn)了platform device/driver,i2c device/driver,spi device/driver,抽象出了設(shè)備和驅(qū)動兩部分,使設(shè)備細(xì)節(jié)和驅(qū)動分離。另外還出現(xiàn)了一些框架,提供了底層接口的封裝,做開發(fā)時要習(xí)慣用OO思想去設(shè)計。當(dāng)然要記住條條大路通羅馬,不使用這些device/driver也可以實現(xiàn)設(shè)備驅(qū)動,只是不太推薦這樣做。
03從各驅(qū)動框架入手Linux提供了各種框架(子系統(tǒng)),對底層進(jìn)行封裝,抽象出相同操作的接口,這樣可以更好的實現(xiàn)復(fù)用。想入門linux驅(qū)動開發(fā),可以先從框架入手,掌握API的使用,再逐漸深入研究,從上到下去學(xué)習(xí)。不要把驅(qū)動開發(fā)想象的太復(fù)雜,實際和英語的完型填空差不多,框架有了,只需要自己去填寫操作具體硬件的細(xì)節(jié)代碼而已。
幾個比較重要和常用的框架有:
GPIO:這個就不用多說了,剛開始接觸驅(qū)動的基本會練習(xí)通過GPIO點亮LED的操作,linux封裝了相關(guān)的gpio操作接口。
SPI:學(xué)會spi device/driver的用法,以及收發(fā)消息API,可以參考一些代碼,基本都是相同的套路。
I2C:學(xué)會i2c device/driver的用法,和學(xué)習(xí)SPI的套路一樣。
PINCTRL:非常重要的一個框架,負(fù)責(zé)CPU引腳復(fù)用,由于現(xiàn)在的CPU都很復(fù)雜,一個引腳支持多種復(fù)用。
V4L2:一個非常復(fù)雜的視頻采集框架,具體可以參考相關(guān)的文檔。驅(qū)動里面有很多例子可供參考,同時提供了模板vivi.c
Framebuffer:顯示相關(guān)的框架,熟悉其中API,而且有模板skeletonfb.c。
DMA Engine: 把DMA操作進(jìn)行封裝,目前驅(qū)動代碼中關(guān)于DMA的操作很多是使用私有的BSP包中的DMA接口,如果支持DMA Engine的話,建議使用DMA Engine。
中斷:比較常用的了,接口不多,很少掌握。
USB框架:USB框架比較復(fù)雜,API較多,可以通過讀已有的代碼進(jìn)行學(xué)習(xí)。
MTD框架:存儲相關(guān)比較重要的框架,網(wǎng)上相關(guān)的文檔很多。
設(shè)備樹:設(shè)備樹是在新的內(nèi)核里面引進(jìn)來的,可以把板級代碼中的各種device通過設(shè)備樹文件去描述,動態(tài)創(chuàng)建,這樣更靈活。其實不要把設(shè)備樹想象的太復(fù)雜,實際和解析JSON,XML一樣,各個節(jié)點中記錄設(shè)備相關(guān)的信息,提供給驅(qū)動使用。
-
驅(qū)動器
+關(guān)注
關(guān)注
53文章
8264瀏覽量
146703 -
Linux
+關(guān)注
關(guān)注
87文章
11329瀏覽量
209978
發(fā)布評論請先 登錄
相關(guān)推薦
評論