驅動程序調試和移植的經驗

姓名:劉偉 學號:17103223402

【嵌牛導讀】

本文介紹了一些在驅動程序調試移植過程中注意的事項

【嵌牛鼻子】驅動程序調試移植

【嵌牛提問】安卓系統里驅動調試和移植有什么特點?

【嵌牛正文】

對設備驅動最通俗的解釋就是“驅使硬件設備行動”。設備驅動與底層硬件直接打交道,按照硬件設備的具體工作方式讀寫設備寄存器,完成設備的輪詢、中斷處理、DMA 通信,進行物理內存向虛擬內存的映射,最終使通信設備能夠收發數據,使顯示設備能夠顯示文字和畫面,使存儲設備能夠記錄文件和數據。設備驅動充當了硬件和應用軟件之間的紐帶,它使得應用軟件只需要調用系統軟件的應用編程接口(API)就可讓硬件去完成要求的工作。

在系統中沒有操作系統的情況下,工程師可以根據硬件設備的特點自行定義接口,如對串口定義SerialSend()、SerialRecv();對LED 定義LightOn()、LightOff();以及對Flash 定義FlashWrite()、FlashRead()等。而在有操作系統的情況下,設備驅動的架構則由相應的操作系統定義,驅動工程師必須按照相應的架構設計設備驅動,這樣,設備驅動才能良好地整合到操作系統的內核中。

下面是一位嵌入式驅動工程師關于驅動設備的調試和移植的一些經驗總結。

做linux底層軟件工作也有兩年了,算上研究生時期對底層軟件的研究,加起來也快四年了。慢慢地發現有必要總結一些一般性的方法了。因為一般性的方法有宏觀上的指導意義,以后調試和移植驅動時,經常性地回味這些一般性的方法可以防止自己犯同樣的錯誤,進而少走彎路,以最高的效率完成工作。

當談到底層軟件,我們一般都會想到bootloader、BSP、device driver、linux kernel等等。這里將會著重介紹linux device driver調試的一般性方法。

注意,這里說的一般方法不是固定套路,也就是說你不用把它當做教科書來讀。你只需要根據具體情況靈活的選用其中某些步驟即可。

一般情況下,進行設備驅動的調試之前,你必須具備以下條件:

? ? ? 1.設備驅動的代碼和應用層測試軟件(或者代碼)。因為你做驅動的最終目的還是要給上層應用去操作的。所以,一個針對驅動的測試應用程序是必須的。這里的應用層測試軟件一般都是供應商提供的,或者系統現有的可以用的應用,如果沒有就必須自己寫了。

? ? ? 2.你要調試的設備對應的datasheet、規格書和相關資料。盡可能地去搞到詳盡的芯片相關資料和相關說明,因為這些都是你隨后調試驅動的指引。

? ? ? 3.開發板的原理圖和貼片圖。

(1)如果是飛線過來的模塊,而且你又不確定硬件工程師的操作是完全正確的,是不是每條線都接的是對的,這時候你就必須搞到貼片圖和原理圖,然后和板子上的飛線一條一條線的核對一遍。如果準確無誤,那你就開工。

(2)當你們的硬件工程師沒有給你提供硬件板子的引腳具體在板子上的哪個位置的說明時,你就必須搞到貼片圖。

(3)此外,經常貼片圖有助于提高一個驅動工程師的硬件素養。

萬用表和示波器是必備的,其次,根據需要,你可能會用到頻譜分析儀和邏輯分析儀。OK!當你拿到這些資料后,你就可以大刀闊斧地進行設備驅動調試了。一般的,設備驅動的調試都會經歷如下幾個步驟。

一、把設備驅動的代碼添加進kernel

這一點要注意了,不同的方案提供商給出的添加方法是不同的。例如,對于Mediatek方案提供商,添加設備驅動的方法就和一般化的不一樣,因為Mediatek的體系架構不同于像telechips、Qualcomm等這樣的kernel傳統架構。所以,對于像Mediatek這樣的特殊供應商,你必須遵循其提供的一套添加驅動的流程(mtk支持比較好,一般會提供sop)。傳統架構的話,就很簡單了,一般都會涉及到一下幾步:

新建設備驅動目錄

添加頭文件

創建當前目錄的Makefile

創建上層目錄的Makefile

在上層目錄添加Kconfig選項

在板文件添加對應項

如果不想每次都用menuconfig配置,就在kernel/arch/arm/configs/XXX_defconfig里面添加編譯項

具體的實例我之類就不寫了,google一下一大把,這篇文章也不會涉及到過多的細節問題。

二、使得添加進去的設備驅動可以編譯通過

設備驅動添加進來之后,一般的,都需要你添加、刪除、修改一些內容,才能保證其編譯通過。如果是調試,這里可能改動不大,因為驅動文件一般是由芯片原廠提供的,他們已經修改的基本可以編譯通過了。但如果是移植,在這里花費的精力一般是比較大的,這會在后文中的附加說明里面提及到。

三、 檢查設備驅動是否正常初始化

進行到這一步,你需要檢查設備驅動是否可以順利初始化,這個很簡單,你只需要在設備驅動的probe函數或者init函數里面添加一條打印信息即可在串口觀察是否有打印,如果沒有打印,說明驅動根本就沒有得到初始化。此時,你應該趕緊跑過去問和你合作的硬件工程師:“hi,我這塊板子,那個XXX芯片是否貼上了?”,或者問他們:“這些飛線是不是都連接的OK了?”。 問這些問題都是很有必要的,因為很有可能硬件上沒有準備好,或者硬件連線本來就有問題。所以,為了避免浪費時間,你還是主動去問下他們。

其次,如果芯片確實貼上了,而且硬件連線都接對了(后來你不放心,自己也核對了一遍),這時候問題就在你嘍。馬上檢查設備驅動的添加是否有什么問題,是否是板文件沒有修改好,是否驅動本身就沒有注冊好等等。

如果驅動得到了正常的初始化,這時候你開始檢查該設備驅動對應的應用程序是否可以正常使用(或者自己寫設備驅動的測試應用程序)。如果可以正常使用,那你太幸運了,這說明芯片原廠為你考慮的很周到,你可以節省N多時間干別的事兒了。

但遺憾的是,往往事情不會這么順利,當你檢查應用程序的時候,你發現應用程序沒有做出應有的反應——例如當你辛苦把camera的驅動添加到kernel而且順利初始化之后,你興奮地進入系統打開camera發現:黑屏!你郁悶了,但是郁悶不能解決問題,這時候真正的所謂設備驅動的“調”和“試”才來了。趕緊去找一個萬用表和一個示波器吧。

四、 設備驅動的“調”和“試”

所謂“調”,就是你依據設備芯片datasheet、主控datasheet、相關的規格書等資料,以及觀察與測量的結果,不斷地對設備驅動 code進行添加、刪除和修改。

所謂“試”,就是你在添加、刪除和修改的同時要不斷地:

通過串口對反饋信息進行觀察。

通過萬用表對各電源引腳電壓進行測量。

通過示波器對芯片的時鐘(輸入的和輸出的)頻率(包括測量晶振)、數據信號的波形、某種總線信號的波形,等各個引腳進行測量。

觀察設備的上電時序,數據交互時序等等是否正常(參考datasheet)。

通過測試應用程序對驅動進行測試,并反復觀察設備驅動的運行狀態。

測試不光是測試員的事情,你必須保證自己調試的驅動可以運行穩定才可以提交代碼,發給測試員進行大量測試。測試自己調試的設備驅動有以下幾種:

(1)利用系統里面現有的應用程序進行測試

這個是最直接的測試,也省去了你自己編寫測試程序的時間。

(2)自己編寫linux應用程序來測試驅動

如果你對系統現有的應用程序不放心,或者不滿意,就自己編寫測試驅動吧。

(3) 利用proc或者sys文件系統的讀和寫函數

如果你在設備驅動里面添加了proc或者sys文件系統的讀和寫函數,你就可以在命令行通過cat或者echo命令來對設備驅動的各項參數進行手動測試。

注:以上測試方法是我習慣用的,除了這些,還是有其他一些測試方法我沒有列舉出來,感興趣的話可以google一下。

此外,應該養成一個好習慣,那就是在測量各個引腳的同時,你最好創建一份excel表格,把各個引腳的電壓、波形等情況記錄下來,目的是在N多次修改之間作比較,也更有備忘的作用。

這里的“調”和“試”的過程是最耗時的,也是設備驅動調試的最關鍵的步驟,所以你應該非常有耐心的走好這一步。還應該注意的是,設備驅動的調試不光是你一個人的事情,有時候你悶頭苦干一個星期都不一定能搞定。所以,進行調試的同時,必須有一個硬件工程師配合你,因為驅動不能正常運行也很有可能是硬件的設計紕漏導致的。此外,不要閉門造車,畢竟你在一個大的開發團隊里面,你需要及時和同事進行有效的交流,避免走彎路。最后,如果還是存在問題,你就得邀請芯片原廠的FAE過來嘍。

補充說明

要進行設備驅動的移植,一般的,你必須具備以下條件:

1.和當前設備芯片相近的或者相類似的芯片的現有驅動代碼

舉個例子來講吧。例如,你現在要移植一份驅動到g-sensor(BMA250E)上,你現在就應該盡可能地去找到和芯片BMA250E相近的芯片所對應的驅動代碼。這時候,你高興的發現,咦?!手頭上還有一份BMA250的代碼,太幸運了。此時你就可以基于BMA250的代碼來做移植。但有時候并沒有這么幸運,那怎么辦呢?這時候你完全可以去找其他類型的g-sensor啊,假如你手頭上并沒有BMA250的代碼,但是你有一份ADXL345的代碼,那當然也是可以的,你完全可以基于ADXL345的代碼來做移植。至于為什么要選擇與當前設備芯片相近的芯片所對應的驅動代碼,原因就四個字“提高效率”。

2.當前芯片的詳細datasheet,以及芯片的相關說明

3.開發板的原理圖

如果有pads版本的原理圖和貼片圖,那是最好的了,方便以后測量引腳的各項參數。

4.萬用表和示波器

這是調試、移植、開發設備驅動必不可少的設備。

具備了以上幾個條件之后,接著走上文所講的第一個和第二個步驟,尤其在第二個步驟,你可能得費好大力氣來針對你當前的開發板進行驅動文件的修改。修改一般都包括IO配置、中斷的設置、總線的配置(例如I2C、SPI、SDIO等)、寄存器的配置、甚至驅動代碼的框架都得修改。等你這一步做好了,接著進行上文談到的第三步,然后一步一步往下走完即可。

用一句話概括一下驅動移植吧。驅動的移植實際上就是:“通過添加、刪除和修改,使現有的一份芯片相近的驅動代碼可以在目標芯片和目標板上跑起來并且跑的很穩定!”

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,775評論 25 708
  • 姓名:吳兆陽 學號:14020199009 轉自韋東山 嵌牛導讀:對嵌入式初學者,沒有足夠的視野選擇一個合適投入方...
    吳兆陽閱讀 2,402評論 0 4
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,836評論 18 139
  • 我寧愿自己 是一個靜默的舞者 跳躍在琴鍵上 嗚咽于細弦中 踮起腳尖,踩出最美妙的音符 舞動臂腕,劃出最優美的弧線 ...
    拾月和初一閱讀 293評論 3 4
  • 文 /夏蓮 但凡人只要有點自知之明,世界或許會簡單很多,莫名其妙的雙眼被遮蔽,心里蒙上一層塵埃。從前人人都具有的東...
    周小錦閱讀 214評論 2 8