嵌入式之對(duì)學(xué)習(xí)Linux設(shè)備驅(qū)動(dòng)的看法
從接觸ARM到現(xiàn)在半年多了(準(zhǔn)確地說(shuō)應(yīng)該是大三下學(xué)期才開始的),在這半年的時(shí)間里,有過(guò)快樂(lè),也有過(guò)痛苦,有過(guò)成功的高興,也有過(guò)失敗的難過(guò),總之,在這個(gè)程中,所嘗到了應(yīng)該嘗到的,由于在大二的時(shí)候?qū)W習(xí)過(guò)DSP,對(duì)嵌入式的概念有一點(diǎn)了解,所以,在接觸ARM時(shí),并沒(méi)有花大多的時(shí)間去入門,直接一邊看手冊(cè),一邊寫驅(qū)動(dòng)了。開發(fā)板一到手就開始了對(duì)ARM驅(qū)動(dòng)程序的開發(fā)。沒(méi)有多久就一邊學(xué)習(xí)裸機(jī)驅(qū)動(dòng),一邊學(xué)習(xí)基于Linux操作系的驅(qū)動(dòng),因?yàn)檫@樣可以一起學(xué)習(xí),其實(shí),裸機(jī)驅(qū)動(dòng)開發(fā)成功,再移植到Linux操作系統(tǒng)上不難,難的是怎樣寫出一個(gè)可移植的,穩(wěn)定的驅(qū)動(dòng)。 很多人認(rèn)為只學(xué)習(xí)Linux驅(qū)動(dòng)就可以了,完全看不起裸機(jī)驅(qū)動(dòng)。不然,Linux驅(qū)動(dòng)是在你對(duì)裸機(jī)的了解的基礎(chǔ)上實(shí)現(xiàn)的,如果連裸機(jī)驅(qū)動(dòng)的寫不對(duì),何以對(duì)理解、修改,書寫基于Linux系統(tǒng)的驅(qū)動(dòng)呢?比如,SPI總線系統(tǒng),如果你連SPI協(xié)議都不清楚,你需要驅(qū)動(dòng)的是一般的SPI接口的EEPROM,還是CAN總線驅(qū)動(dòng)器,還是其它SPI接口的硬件,需要怎么樣的時(shí)序都不懂(在嵌入式領(lǐng)域,時(shí)序很重要,我在寫DS18B20驅(qū)動(dòng)時(shí),因?yàn)閹讉(gè)ns的時(shí)序,折騰了三天)。你能看懂內(nèi)核SPI總線子系統(tǒng)下的源碼,你能真正的應(yīng)用?所以,裸機(jī)也一樣的重要,在真正了解裸機(jī)驅(qū)動(dòng)的基礎(chǔ)上來(lái)了解Linux驅(qū)動(dòng),會(huì)更加內(nèi)容。 沒(méi)有開始寫基于Linux驅(qū)動(dòng)程序之前,在網(wǎng)上聽(tīng)說(shuō)《LDD3》這本書不錯(cuò),但是,還好,在網(wǎng)上下載到相應(yīng)的chm格式文檔,也許是由于個(gè)人的原因?yàn)榘桑傁矚g看PDF格式的,所以花了點(diǎn)時(shí)間把它轉(zhuǎn)化為PDF格式,剛開始看的時(shí)候,怎么也看不懂,說(shuō)實(shí)在的,《LDD3》這本書不太適合初學(xué)者看,有幸在圖書館借到《Linux設(shè)備驅(qū)動(dòng)開發(fā)技術(shù)與應(yīng)用》,才慢慢的走進(jìn)基于Linux操作系統(tǒng)的驅(qū)動(dòng)的門,這本書這一學(xué)期來(lái)一直在我的手里,一直沒(méi)有還回去,繼借了一次,馬上還了又馬上借過(guò)來(lái),暑假區(qū)間,手里的資金還可以,就把這本書給買下來(lái)了,對(duì)于《LDD3》,雖然也不錯(cuò),還是看原版的吧,中文版看得不太明白,翻譯太差了,有個(gè)電子版的就行了,這兩本書在一起看的話,應(yīng)該很好入門了,但是更多時(shí)候還是看看《Linux設(shè)備驅(qū)動(dòng)開發(fā)技術(shù)與應(yīng)用》,這是個(gè)人的認(rèn)為,也許跟你的認(rèn)為不一樣,請(qǐng)?jiān)彙?/div> 轉(zhuǎn)眼間,暑假就快完了,這個(gè)暑假?zèng)]有做多少事,很多時(shí)候是在看Linux內(nèi)核相關(guān)驅(qū)動(dòng)的源碼,終于明白了別人告訴我一句話,如果真的想學(xué)好Linux設(shè)備驅(qū)動(dòng),去看內(nèi)核相關(guān)的驅(qū)動(dòng)吧,里面的東西太多了,能看懂,再寫出相應(yīng)的應(yīng)用程序,那么證明你不錯(cuò)了。剛開始不以為然,后來(lái),由于IIC總線的需要的,所以開始看內(nèi)核提供的IIC總線子系統(tǒng),也看到了自己的C與別人的差距,有時(shí)候,別說(shuō)去了解某行代碼的用途,連看懂是怎么聲明的有點(diǎn)難,所以,這對(duì)C的要求有點(diǎn)高,但是,如果你的C夠用,那么,看Linux內(nèi)核源碼可以使你的C更進(jìn)一步,指針,特別是函數(shù)指針(非指針函數(shù)),在其中應(yīng)用得最多;再者宏定義技術(shù),內(nèi)聯(lián)函數(shù),應(yīng)用預(yù)定義處理控制調(diào)試信息,在源碼中保留調(diào)試信息,為以后的維護(hù)提供方便。 好了,我們回到Linux驅(qū)動(dòng)上來(lái),在Linux內(nèi)核中,有很多穩(wěn)定的,很有價(jià)值的驅(qū)動(dòng)源碼,而且這些源碼都可以為我們提供服務(wù),我們直接應(yīng)用,也可修改一下就可以應(yīng)用的,所以,在商品化產(chǎn)品來(lái)說(shuō),還是直接應(yīng)用或者修改內(nèi)核提供的驅(qū)動(dòng)最好,因?yàn)檫@在穩(wěn)定性與可移植性上得到一定的認(rèn)可,當(dāng)然,前提是你能正確應(yīng)用與修改,這就得要求去了解與懂這些驅(qū)動(dòng)源碼。當(dāng)然,這不是一般的人都能懂的,你可以寫一個(gè)LED驅(qū)動(dòng),應(yīng)用register_chrdev_region或者register_chrdev進(jìn)行注冊(cè),應(yīng)用unregister_chrdev_region或者unregister_chrdev進(jìn)行注銷,也就可以應(yīng)用輸入子系統(tǒng)(input subsystem)所提供的 input_register_device來(lái)進(jìn)行注冊(cè),應(yīng)用input_unregister_device來(lái)進(jìn)行注銷,當(dāng)然,你也可以應(yīng)用其它的注冊(cè)與注銷方式來(lái)進(jìn)行,只要是你掌握的,你想怎么做都行,前提是你必須掌握。 剛開始學(xué)習(xí)的時(shí)候,都是自己從頭開始寫驅(qū)動(dòng),自己實(shí)現(xiàn)read,write,ioctl,open等,沒(méi)有想到Linux內(nèi)核那么豐富而又穩(wěn)定的代碼,一般輸入類型的驅(qū)動(dòng),現(xiàn)在知道盡量應(yīng)用input subsystem來(lái)實(shí)現(xiàn),比如usbmouse,觸摸屏,游桿等應(yīng)用輸入子系統(tǒng)可以為我們提供很多東西,但是,前提是你必須了解輸入子系統(tǒng)的構(gòu)架,能看懂其源碼。其實(shí),看懂別人的源碼,有時(shí)候是很困難的一件事,不過(guò),還好,在內(nèi)核的Documentation目錄下有相關(guān)的幫助文檔。在這些幫助文檔的幫助下,應(yīng)該可以看懂,到應(yīng)用了吧,這需要時(shí)間,某些子系統(tǒng)內(nèi)部的結(jié)構(gòu)很復(fù)雜,沒(méi)有一兩天,或者更長(zhǎng)的時(shí)間是搞不懂的,也許你會(huì)問(wèn),一個(gè)LED驅(qū)動(dòng),太簡(jiǎn)單了,我自己寫一個(gè)也就一個(gè)小時(shí)不到的時(shí)間,何必花那么多時(shí)間去了解輸入子系統(tǒng)呢,這就是Linux操作系在嵌入式之所以受歡迎的原因?yàn),我是這樣認(rèn)為,當(dāng)你真正的了解,懂了輸入子系統(tǒng)的時(shí)候,你會(huì)的不只是LED驅(qū)動(dòng),在這個(gè)基礎(chǔ)上,你可以很順手地開發(fā)其它的輸入型驅(qū)動(dòng)了,這就是也許就是所謂的經(jīng)驗(yàn)吧。 目前Linux中有多少子系統(tǒng),我不太清楚,但是堅(jiān)信,每一個(gè)子系統(tǒng)的存在,都是有用的,雖然沒(méi)有必要去把每個(gè)子系統(tǒng)都搞懂,這也是不可能的,但是,盡量搞懂你目前正在學(xué)習(xí)的子系統(tǒng),比如,一般IIC總線子系統(tǒng),SPI子系統(tǒng),CD卡,輸入子系統(tǒng),F(xiàn)ramebuffer(LCD相關(guān)驅(qū)動(dòng)構(gòu)架)子系統(tǒng)這些比較常見(jiàn)的子系統(tǒng),應(yīng)該得去了解吧,在工作中,我們還會(huì)接很多子系統(tǒng),硬件的發(fā)展,Linux內(nèi)核也在不斷更新其子系統(tǒng)的分類,所以,我認(rèn)為,能快速看懂內(nèi)核子系統(tǒng),并能正確應(yīng)用,這就是最終的目的,在Linux世界里,修改也是一種能力,能把內(nèi)核中相近類型的硬件驅(qū)動(dòng)修改為自己所用,這也是個(gè)人的修為。 很多人都喜歡最新的Linux內(nèi)核,對(duì)于學(xué)習(xí)來(lái)說(shuō),我更加喜歡能應(yīng)用目前資料中的例子能應(yīng)行的,資料最多的內(nèi)核版本(我用的內(nèi)核版本還是Linux-2.6.13,還沒(méi)有自己移植過(guò)Linux操作系統(tǒng),在對(duì)Linux相關(guān)構(gòu)架不了解的情況下,不會(huì)去做,真正了解了,移植應(yīng)該不在話下),這樣在學(xué)習(xí)過(guò)程中會(huì)減少很多不必要的事,如果真正的在一個(gè)內(nèi)核版本中把想學(xué)的學(xué)好了,那么換個(gè)內(nèi)核,也就是頭文件所在的目錄不大相同,某此內(nèi)容不同罷了,看看一兩個(gè)例子,或者直接到內(nèi)核里面去看看,修改一下就行了,學(xué)習(xí),不是學(xué)習(xí)某一內(nèi)核版本下的驅(qū)動(dòng),學(xué)習(xí)是某一種操作系統(tǒng)下的思想,有了思想也就是所謂的神,還有什么不會(huì)的,在說(shuō),你在學(xué)校學(xué)習(xí)的是Linux2.6.32,但是,在公司,也許會(huì)讓你應(yīng)用2.6.13或者其它的版本來(lái)寫驅(qū)動(dòng),那么,如果你只會(huì)你學(xué)習(xí)過(guò)的,你可以走人了,證明你更本就沒(méi)有學(xué)會(huì),因?yàn)槟銢](méi)有思候。 好了,這是個(gè)人的一點(diǎn)看法,也許你有你自己的看法,有不對(duì)的地放,請(qǐng)給予指正,讓我也有學(xué)習(xí)的機(jī)會(huì)。 舒穩(wěn) 2010-8-18于長(zhǎng)沙理工大學(xué) |