Linux 2 6 38的LCD驅動分析(三)

2021-06-19 21:16:18 字數 2558 閱讀 7745

三、解剖s3cfb_driver變數

s3cfb_driver變數有什麼作用呢?在前面的2.2節提到了它的定義,從它的原型可以看出s3cfb_driver是個platform_driver型別的變數,前面的幾個小節提到了從platform_driver的名字可以看出它應該是platform_device的驅動型別。為了方便閱讀,這裡再貼一次s3cfb_driver的定義:

static struct platform_driver s3cfb_driver = , };

從定義可以看出,該platform_device的驅動函式有s3cfb_probe,s3cfb_remove,s3cfb_suspend和s3cfb_suspend。.resource成員前面的章節有說明,.driver成員的值相信不用再說明了吧,再明白不過了。前面的章節,s3cfb_probe被比較詳細的介紹,這節中的主要任務就是解釋其他的幾個函式。在解釋他們之前,s3cfb_probe裡面在該函式結尾的時候呼叫了幾個函式沒有說到,所以在這裡補上。

3.1 s3cfb_probe餘黨

在s3cfb_probe中最好呼叫了s3cfb_init_registers和s3cfb_check_var函式,這裡應該將他們交代清楚。很顯然,s3cfb_init_registers是初始化相關暫存器。那麼後者呢?這裡先把s3cfb_init_registers搞定再說。在檔案drivers\video\samsung\s3cfb_fimd4x.c中,

s3cfb_init_registers的定義與實現如下,先根據它的指向流程,一步一步解釋:

int s3cfb_init_registers(s3cfb_info_t *fbi)

writel(video_phy_temp_f1, s3c_vidw00add0b0 + (0x08 * win_num));

writel(s3c_vidwxxadd1_vbasel_f((unsigned long) video_phy_temp_f1 + (page_width + offset) * (var->yres)), s3c_vidw00add1b0 + (0x08 * win_num));

writel(s3c_vidwxxadd2_offsize_f(offset) | (s3c_vidwxxadd2_pagewidth_f(page_width)), s3c_vidw00add2 + (0x04 * win_num));

if (win_num < 2)

下面的幾個writel函式開始初始化lcd控制暫存器

switch (win_num)

local_irq_restore(flags);

//使能中斷,並恢復以前的狀態

return 0;}

ok,s3cfb_init_registers就簡單介紹到這裡。下面看看s3cfb_check_var函式要幹些什麼事,要說到這個函式,還得提到fb_var_screeninfo結構型別,與它對應的是fb_fix_screeninfo結構型別。這兩個型別分別代表了顯示屏的屬性資訊,這些資訊可以分為可變屬性資訊(如:顏色深度,解析度等)和不可變的資訊(如幀緩衝的其實位址)。既然fb_var_screeninfo表示了可變的屬下資訊,那麼這些可變資訊就應該有一定範圍,否則顯示就會出問題,所以s3cfb_check_var函式的功能就是要在lcd的幀緩衝驅動開始執行之前將這些值初始到合法的範圍內。知道了s3cfb_check_var要做什麼,再去閱讀s3cfb_check_var函式的**就沒什麼問題了。

3.2 s3cfb_remove

從這裡開始將解釋s3cfb_driver中的其他幾個函式。那麼就從s3cfb_remove開刀吧!顧名思義該函式就該知道,它要將這個platform裝置從系統中移除,可以推測它應該釋放掉所有的資源,包括記憶體空間,中斷線等等。還是按照慣例,在它的實現**中一步步的解釋。\

static int s3cfb_remove(struct platform_device *pdev)

irq = platform_get_irq(pdev, 0);

得到中斷線,以便釋放

release_resource(info->mem);釋放記憶體空間

for (index = 0; index < s3cfb_num; index++)

return 0;}

3.3 s3cfb_suspend與s3cfb_resume

在實際的裝置,常常可以看到lcd在不需要的時候進入休眠狀態,當需要使用的時候又開始工作,比如手機,在不需要的時候lcd就熄滅,當需要使用的時候lcd又被點亮。從實際中可以看出這對函式非常重要。雖然他們很重要,但不一定很複雜,下面看看它們是怎麼樣實現的。

int s3cfb_suspend(struct platform_device *dev, pm_message_t state)

下面來看看s3cfb_resume

int s3cfb_resume(struct platform_device *dev)

ok,到現在為止,對於platform device的相關驅動就over了。不過精彩的還在後頭哦!

Linux 2 6 38的LCD驅動分析(一)

一 讓lcd顯示可愛的小企鵝 還是先說說環境吧,處理器為s3c6410,linux的版本是2.6.38 友善之臂提供的 下面先說說怎樣讓lcd上顯示出可愛的小企鵝。最直接的步驟如下 記住不要問為什麼哈 一步一步跟著走就行了 1.新增s3c6410處理器的lcd控制暫存器的初始值,具體做法為在檔案ar...

Linux 2 6 38中ioctl的變化

linux驅動程式剛接觸,雖然不是很清楚,但是總歸是慢慢學習的過程。我的環境是fedora14虛擬機器。核心版本是2.6.38.1,其中的實現過程存在很多的問題,主要是因為很多的核心函式發生了較大的差別.其中最大的可能是ioctl以及互資訊量的實現。這兩個的問題也使得我們在驅動設計過程中出現很多的疑...

Linux的LCD驅動分析

linux的graphics子系統介紹 一 lcd介紹 liquid crystal display液晶顯示器,lcd按材料分有 stn 超扭曲陣列 tft 薄膜電晶體 ltps 低溫晶體多晶矽 oled 有機發光二極體 等。lcd的介面種類有 ttlrgb 數字rgb顏色介面 i80 又稱mcu介...