framebuffer設備,字符設備,platform總線間的聯繫

歡迎各位轉載!!!


最近在看Linux設備的驅動程序編程,裏面的類型的設備驅動類型把我搞糊塗了。首先書上說linux中有字符設備,塊設備,網絡設備三大類驅動。但是接着又扯出一大堆的的什麼platfrom平臺設備驅動,幀緩衝區設備驅動等各種設備驅動,於是我就蒙b了......... !網上搜各種資料,因爲不搞清楚的話感覺想寫個驅動都不知道要選哪一種。下面來說說我的總結和理解,純手打,有不對的地方望各位看官海涵,也加以斧正!!!


先來上一個LCD幀緩衝設備驅動的構架圖,沒圖說個圈圈,先知道有這個東西就好接着往下看





首先我的理解是把所謂的字符設備/字符設備驅動 當做只對於用戶空間有意義,因爲字符設備中最重要的結構體file_operations中的各種read,write,iotrl操作都是爲了給應用程序統一的操作接口而存在的,讓用戶編寫app的時候可以通過這些read,write操作/dev/中的設備文件來調用我們實現的驅動程序來最終控制硬件設備的行爲。我們在編寫LCD驅動的時候纔不管他麼的字符設備跟我們的驅動程序有什麼關係,我們只要把我們驅動程序跟這個 字符設備/字符設備驅動 聯繫起來就可以了 , 關鍵是怎麼讓我們填充的結構體跟字符設備聯繫起來,其實就是在字符設備的read,write這些函數中會去調用registered_fb[]這個全局數組中的那個你填充的結構體的信息,這樣就聯繫起來了。所以字符設備和字符設備驅動在我的理解中應該如下圖的層次,在下圖中字符設備驅動這個就代表的上面架構途中的fbmem.c那一層了。


那麼什麼是LCD驅動相關呢?其實LCD驅動相關就跟架構途中的xxxfb.c這一層對應啦。更具體點就是s3c2410fb.c文件中的實現。我們知道LCD在soc中通常集成了現成的控制器來模擬時序,這是爲了讓我們更容易控制硬件。而這些有現成的控制器的驅動我們通常掛在到platform總線上。這裏涉及另一個重要的需要銘記的概念,在linux2.6中,我們關注的是總線,設備,驅動之間的關係。這個platform是總線不是設備,什麼平臺設備平臺設備驅動這聽着很是誤導人,所以我在標題中寫的是platform總線。關於platform總線是虛擬總線這些概念,去查其他資料吧,在這裏只要明白它是一種總線,它存在的目的時爲了更方便的管理設備和驅動就行了。爲了更好的管理LCD驅動,所以我們用到了paltform總線所以LCD驅動相關可以如下劃分



那麼platfrom_device中當然包含的是LCD相關的一些硬件資源什麼的它定義在/arch/arm/plat-s3c24xx/devs.c中的s3c_device_lcd。platform_driver定義在/drivers/video/s3c2410fb.c中的s3c2410fb_driver。其實就是幀緩衝設備驅動填充struct fb_info結構體,然後使用register_framebuffer()來註冊這個結構體到上面第二張圖提到的registered_fb[]全局數組中去,這個數組保存了所有註冊過的struct fb_info結構體,所謂註冊本質就是保存到這個數組中去啦。當然填充以及註冊幀緩衝設備的工作都是在platform_driver中的probe函數中去做的,所以platform_driver又可以如下劃分:



好了,到這裏爲止,是否對字符驅動,平臺總線以及幀緩衝設備驅動串到一起了呢?希望對你有所幫助。最後在上一張對我啓發挺大的一張圖,這張圖是否能對應上面的分析過程呢?哈哈,這是從別人的文章中轉的,原文章在

http://blog.csdn.net/chen198746/article/details/8954063




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章