日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
Linux-2.6.20的LCD驅(qū)動(dòng)分析(三)(轉(zhuǎn)載)
Linux-2.6.20的LCD驅(qū)動(dòng)分析(三)(轉(zhuǎn)載)
 更新時(shí)間:2009-8-12 16:51:24  點(diǎn)擊數(shù):0
【字體: 字體顏色
http://blog.chinaunix.net/u1/49924/showart_506417.html  三、解剖s3c2410fb_driver變量s3c2410fb_driver變量有什么作用呢?在前面的2.2節(jié)提到了它的定義,從它的原型可以看出s3c2410fb_driver是個(gè)platform_driver類型的變量,前面的幾個(gè)小節(jié)提到了從platform_driver的名字可以看出它應(yīng)該是platform_device的驅(qū)動(dòng)類型。為了方便閱讀,這里再貼一次s3c2410fb_driver的定義:

static struct platform_driver s3c2410fb_driver = {

      .probe            = s3c2410fb_probe,

       .remove          = s3c2410fb_remove,

       .suspend  = s3c2410fb_suspend,

       .resume          = s3c2410fb_resume,

       .driver            = {

              .name      = "s3c2410-lcd",              .owner    = THIS_MODULE,       },};從定義可以看出,該platform_device的驅(qū)動(dòng)函數(shù)有s3c2410fb_probe,s3c2410fb_remove,s3c2410fb_suspend和s3c2410fb_suspend。.resource成員前面的章節(jié)有說明,.driver成員的值相信不用再說明了吧,再明白不過了。前面的章節(jié),s3c2410fb_probe被比較詳細(xì)的介紹,這節(jié)中的主要任務(wù)就是解釋其他的幾個(gè)函數(shù)。在解釋他們之前,s3c2410fb_probe里面在該函數(shù)結(jié)尾的時(shí)候調(diào)用了幾個(gè)函數(shù)沒有說到,所以在這里補(bǔ)上。 3.1 s3c2410fb_probe余黨       在s3c2410fb_probe中最好調(diào)用了s3c2410fb_init_registers和s3c2410fb_check_var函數(shù),這里應(yīng)該將他們交代清楚。很顯然,s3c2410fb_init_registers是初始化相關(guān)寄存器。那么后者呢?這里先把s3c2410fb_init_registers搞定再說。s3c2410fb_init_registers的定義與實(shí)現(xiàn)如下,先根據(jù)它的指向流程,一步一步解釋: static int s3c2410fb_init_registers(struct s3c2410fb_info *fbi){       unsigned long flags; 

       /* Initialise LCD with values from haret */

        local_irq_save(flags);     /* 關(guān)閉中斷,在關(guān)閉中斷前,中斷的當(dāng)前狀態(tài)被保存在flags中,對(duì)于關(guān)閉中斷的函數(shù),linux內(nèi)核有很多種,可以查閱相關(guān)的資料。*/ 

       /* modify the gpio(s) with interrupts set (bjd) */

/*下面的modify_gpio函數(shù)是修改處理器GPIO的工作模式,它的實(shí)現(xiàn)很簡(jiǎn)單,將第二個(gè)參數(shù)的值與第三個(gè)參數(shù)的反碼按位與操作后,在寫到第一個(gè)參數(shù)。這里的第一個(gè)參數(shù)實(shí)際就是硬件的GPIO控制器。*/

       modify_gpio(S3C2410_GPCUP,  mach_info->gpcup,  mach_info->gpcup_mask);

       modify_gpio(S3C2410_GPCCON, mach_info->gpccon, mach_info->gpccon_mask);

       modify_gpio(S3C2410_GPDUP,  mach_info->gpdup,  mach_info->gpdup_mask);

       modify_gpio(S3C2410_GPDCON, mach_info->gpdcon, mach_info->gpdcon_mask);

        local_irq_restore(flags);  //使能中斷,并恢復(fù)以前的狀態(tài)  /*下面的幾個(gè)writel函數(shù)開始初始化LCD控制寄存器,它的值就是我們?cè)趕mdk2410_lcd_platdata(arch/arm/mach-s3c2410/mach-smdk2410.c)中regs域的值。*/       writel(fbi->regs.lcdcon1, S3C2410_LCDCON1);       writel(fbi->regs.lcdcon2, S3C2410_LCDCON2);       writel(fbi->regs.lcdcon3, S3C2410_LCDCON3);       writel(fbi->regs.lcdcon4, S3C2410_LCDCON4);       writel(fbi->regs.lcdcon5, S3C2410_LCDCON5);       s3c2410fb_set_lcdaddr(fbi);    /*該函數(shù)的主要作用是讓處理器的LCD控制器的三個(gè)地址寄存器指向正確的位置,這個(gè)位置就是LCD的緩沖區(qū),詳細(xì)的情況可以參見s3c2410的用戶手冊(cè)。*/……

       /* Enable video by setting the ENVID bit to 1 這里打開video,在s3c2410fb_probe中被關(guān)閉了,這里打開*/

       fbi->regs.lcdcon1 |= S3C2410_LCDCON1_ENVID;       writel(fbi->regs.lcdcon1, S3C2410_LCDCON1);       return 0;}OK,s3c2410fb_init_registers就簡(jiǎn)單介紹到這里。下面看看s3c2410fb_check_var函數(shù)要干些什么事,要說到這個(gè)函數(shù),還得提到fb_var_screeninfo結(jié)構(gòu)類型,與它對(duì)應(yīng)的是fb_fix_screeninfo結(jié)構(gòu)類型。這兩個(gè)類型分別代表了顯示屏的屬性信息,這些信息可以分為可變屬性信息(如:顏色深度,分辨率等)和不可變的信息(如幀緩沖的其實(shí)地址)。既然fb_var_screeninfo表示了可變的屬下信息,那么這些可變信息就應(yīng)該有一定范圍,否則顯示就會(huì)出問題,所以s3c2410fb_check_var函數(shù)的功能就是要在LCD的幀緩沖驅(qū)動(dòng)開始運(yùn)行之前將這些值初始到合法的范圍內(nèi)。知道了s3c2410fb_check_var要做什么,再去閱讀s3c2410fb_check_var函數(shù)的代碼就沒什么問題了。 3.2 s3c2410fb_remove       從這里開始將解釋s3c2410fb_driver中的其他幾個(gè)函數(shù)。那么就從s3c2410fb_remove開刀吧!顧名思義該函數(shù)就該知道,它要將這個(gè)platform設(shè)備從系統(tǒng)中移除,可以推測(cè)它應(yīng)該釋放掉所有的資源,包括內(nèi)存空間,中斷線等等。還是按照慣例,在它的實(shí)現(xiàn)代碼中一步步的解釋。static int s3c2410fb_remove(struct platform_device *pdev){

       struct fb_info     *fbinfo = platform_get_drvdata(pdev);  /*該函數(shù)從platform_device中,到fb_info信息*/

       struct s3c2410fb_info *info = fbinfo->par;  //得到私有數(shù)據(jù)       int irq;        s3c2410fb_stop_lcd(info);    //該函數(shù)停止LCD控制器,實(shí)現(xiàn)可以在s3c2410fb.c中找到       msleep(1); //休息以下,等待LCD停止        s3c2410fb_unmap_video_memory(info);   //該函數(shù)釋放緩沖區(qū) 

      if (info->clk) {          //停止時(shí)鐘

             clk_disable(info->clk);             clk_put(info->clk);

             info->clk = NULL;

       }        irq = platform_get_irq(pdev, 0);     //得到中斷線,以便釋放       free_irq(irq,info);    //釋放該中斷       release_mem_region((unsigned long)S3C24XX_VA_LCD, S3C24XX_SZ_LCD); /* 釋放內(nèi)存空間 */       unregister_framebuffer(fbinfo);       //向內(nèi)核注銷該幀緩沖        return 0;} 3.3 s3c2410fb_suspends3c2410fb_resume       在實(shí)際的設(shè)備,常?梢钥吹絃CD在不需要的時(shí)候進(jìn)入休眠狀態(tài),當(dāng)需要使用的時(shí)候又開始工作,比如手機(jī),在不需要的時(shí)候LCD就熄滅,當(dāng)需要使用的時(shí)候LCD又被點(diǎn)亮。從實(shí)際中可以看出這對(duì)函數(shù)非常重要。雖然他們很重要,但不一定很復(fù)雜,下面看看它們是怎么樣實(shí)現(xiàn)的。 

static int s3c2410fb_suspend(struct platform_device *dev, pm_message_t state)

{

       struct fb_info     *fbinfo = platform_get_drvdata(dev);  //這兩條語句好面熟^_^

       struct s3c2410fb_info *info = fbinfo->par;        s3c2410fb_stop_lcd(info);  //停止LCD 

       /* sleep before disabling the clock, we need to ensure

        * the LCD DMA engine is not going to get back on the bus

        * before the clock goes off again (bjd) */

        msleep(1);  //等待一下,因?yàn)長(zhǎng)CD停止需要一點(diǎn)時(shí)間       clk_disable(info->clk);  //關(guān)閉LCD的時(shí)鐘        return 0;}^_^,下面的代碼就不用解釋了吧!static int s3c2410fb_resume(struct platform_device *dev){

       struct fb_info     *fbinfo = platform_get_drvdata(dev);

       struct s3c2410fb_info *info = fbinfo->par;        clk_enable(info->clk);       msleep(1);        s3c2410fb_init_registers(info);        return 0;} OK,到現(xiàn)在為止,對(duì)于platform device的相關(guān)驅(qū)動(dòng)就over了。不過精彩的還在后頭哦!To be continued……------ anmnmnly
------ 2008.03.24
  • 上一篇: Linux-2.6.20的LCD驅(qū)動(dòng)分析(二) (轉(zhuǎn)載)
  • 下一篇: Linux-2.6.20的LCD驅(qū)動(dòng)分析(四)(轉(zhuǎn)載)
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1