作者:YiLi Xie(yili.xie@gmail.com)
日期:2010/04/07
歡迎轉載,請註明出處
首先要感謝程大胖給咱這次機會入門驅動,領導交待的任務嘛,有壓力才有動力~~再次感謝公司可愛的同事們,對咱初始化過程的一堆幼稚問題總是耐心的給予解答,謝謝謝謝啦~~
在此之前總是對驅動報著一種畏懼之心,不說別的,就是因為那電路圖看不懂。。。在加上上學的時候數字電路課翹得太多,實驗更是沒做過,想想現在連做個網線的水晶頭都不會。。往事不堪回首阿 - -! 閑話就不多說了,寫這篇文章的目的是想那些很多和我一樣,在驅動方面是空白的同志們能找到一個出發點,如何在最短的時間內入手驅動~~呵呵,自己也算是總結一下,不過畢竟是粗淺之言,還請高手路過多指教~~
任務 : 板子boot起來以後一天時間內點亮屏;
MPU : MSM7627
平台 : android
IC : RM68040
當對你要做的事情完全陌生的時候,最大的障礙就是你不知道要完成這項工作你必須做什麼。在我調這個屏之前我在驅動上的基礎知識就是老宋那本書的前4章,那真是如履薄冰心裡一點底都沒有啊。。。在網上一頓海搜以後,我當時是這麼想的,讓一個一屏亮起來就是讓一個硬體工作起來,那麼瞭解這個硬體肯定是必須的,肯定要知道什麼樣的條件下它才能工作起來,而且這個螢幕肯定需要MCU來控制,那MCU如何來控制它呢?所以你就必須瞭解這塊MCU晶片,所以就從瞭解這些硬體開始。
那麼如何瞭解這些硬體知識呢,那就是晶片的datasheet了~~ 晶片的datasheet一般都是又臭又長,說出來被人笑話,我當時看這些datasheet那是正兒八經從頭到尾一字不那啊。。。後面總結了下個人覺得晶片資料裡面最重要的就是pin腳,時序,寄存器~~
第一個看的是Driver IC的datasheet,看完pin腳的描述以後就對著原理圖,看它都連了哪些線,而這些線都是做什麼用的,具體到LCD驅動,看完datasheet以後你就大致知道,要讓這個硬體工作起來需要完成什麼樣的工作了。具體到我這塊屏,就是首先必須使用SPI來發命令初始化,然後其他HSYNC VSYNC MARGIN PCLK之類的訊號正確的話應該就能顯示圖象了。於是呼又是網上一陣海搜,瞭解了SPI是一個啥東西,它就是有個特定時序的串列匯流排罷了~~
這個時候不必著急,可能有些概念你還只是停留在概念上,很飄渺,不知道具體是一個什麼東西,怎麼回事,沒關係能google.com理解下來的就理解,理解不了的就放著,等以後看完代碼就會形象起來了,關於如何尋找自己應該看的那部分代碼我待會再說~~
瞭解完LCD之後下一步就是瞭解MCU如何來控制這塊屏了,拿出主晶片的datasheet,很容易就找到關於LCDC,MDP(圖象處理器)之類的東西。結合著datasheet再加上google.com你很容易就知道瞭解這些控制器是如何控制這塊屏的。可能細節上你還不瞭解,不過最起碼你能將這麼一個過程串起來,就是從MDP到LCDC到LCD他們之間的一個流程,data flow之類的,然後帶著這麼一個過程去看代碼是很有裨益的~~
到這裡你對硬體以及原理圖已經有了一個基本的理解,下一步就是對著代碼看實現的過程,讓在datasheet上碰到的一些生疏的概念都具體起來。我的環境是linux,就說說我如何去尋找我需要的代碼。
在linux環境下,makefile是編譯的靈魂,所以你必須對kernel的編譯機制有一個瞭解,這樣你才能比較準確地找到你需要的代碼,linux kernel的編譯說穿了就是根據Kconfig確定你需要編譯進去的模組。對kernel的編譯瞭解以後,你很容易就根據config檔案在driver/video裡面找到你需要的代碼。
找到你需要的代碼以後,你現在的任務就是看懂它了,以前從來沒有看過linux核心的代碼,那麼從什麼地方開始下手呢?最簡單的你就會想到你的驅動是如何被調用的呢?所以簡單地分為兩點,一個就是你要弄明白你的驅動是如何被kernel使用的,另外一個就是你的驅動是如何和硬體打交道的。對於第一個問題你需要簡單瞭解linux kernel啟動的過程(如果有時間的話最好是把startkernel()這個函數仔細閱讀一遍),根據startkernel()你基本就知道了,device和driver是如何被使用的。然後第二個問題你就必須對驅動本身的架構有所瞭解了,在這裡我們就必須對FB有所瞭解,稍微瞭解以後你去看代碼會比較方便。要想知道驅動是如何控制硬體的,那你的著眼點應該是資料流的流向,然後對寄存器的配置。對資料流的流向集中在幾個比較重要的資料結構上,一定要弄明白,你才知道在架構的什麼地方去配置你的寄存器~~~
到具體的調試硬體,需要掌握兩個工具的使用,萬用表測量電壓是否正常,示波器測量產生的波形是否正確~~可惜咱現在示波器還是不太會用- -!這個調試過程應該是比較痛苦的,具體就不說了,調試的時候自然就知道了~~
稍微總結下一個硬體要工作起來需要的工作~~
1、供電正常 2、時鐘正常 3、寄存器配置正確(初始化)
基本就是這些了,呵呵,粗略講了下解決這個驅動的過程,希望對從沒做過驅動的人有所協助~~ 事後想想,驅動不是想象中高深,只要靜下心來,硬著頭皮看datasheet和代碼,多google.com,應該都是沒有問題的~~