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

機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(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:27  點(diǎn)擊數(shù):0
【字體: 字體顏色
http://blog.chinaunix.net/u1/49924/showart_507500.html  四、s3c2410fb_ops變量詳解      在上面的文字中,較為詳細(xì)的解釋了platform device相關(guān)的代碼,通過(guò)上面的代碼的執(zhí)行,一個(gè)platform設(shè)備(framebuffer被當(dāng)作了platform設(shè)備)就加載到內(nèi)核中去了。就像一個(gè)PCI的網(wǎng)卡被加入到內(nèi)核一樣,不同的是PCI的網(wǎng)卡占用的是PCI總線,內(nèi)核會(huì)直接支持它。而對(duì)于platform設(shè)備需要用上面軟件的方法加載到內(nèi)核,同PCI網(wǎng)卡一樣,設(shè)備需要驅(qū)動(dòng)程序,剛才只是將platform設(shè)備注冊(cè)到內(nèi)核中,現(xiàn)在它還需要驅(qū)動(dòng)程序,本節(jié)中就來(lái)看看這些驅(qū)動(dòng)。4.1 static struct fb_ops s3c2410fb_ops

       對(duì)于s3c2410的framebuffer驅(qū)動(dòng)支持的操作主要有s3c2410fb_ops變量中定義,該變量類(lèi)型為struct fb_ops,該類(lèi)型的定義在include/linux/fb.h文件中。它的相關(guān)解釋可以在http://www.91linux.com/html/article/kernel/20071204/8805.html頁(yè)面中找到,當(dāng)然在fb.h中也有很詳細(xì)的說(shuō)明。下面看看對(duì)于s3c2410的驅(qū)動(dòng)為該framebuffer提供了哪些操作。

static struct fb_ops s3c2410fb_ops = {

       .owner           = THIS_MODULE,

       .fb_check_var = s3c2410fb_check_var,       .fb_set_par     = s3c2410fb_set_par,

       .fb_blank = s3c2410fb_blank,

       .fb_setcolreg   = s3c2410fb_setcolreg,       .fb_fillrect      = cfb_fillrect,       .fb_copyarea   = cfb_copyarea,       .fb_imageblit   = cfb_imageblit,};       上面的代碼描述了支持的相關(guān)操作,下面主要會(huì)解釋s3c2410****的函數(shù),從.fb_fillrect開(kāi)始的三個(gè)函數(shù)將不會(huì)被提及,當(dāng)然也可以去看看它們的行為是什么。這里還有一個(gè)問(wèn)題要說(shuō)明一下,就是s3c2410fb_ops是在什么時(shí)候被注冊(cè)的,這個(gè)問(wèn)題的答案可以在s3c2410fb_probe函數(shù)中找到,請(qǐng)查看s3c2410fb_probe分析的那一小節(jié)。 4.2.1 s3c2410fb_check_var       在上面的小節(jié)中提到對(duì)于一個(gè)LCD屏來(lái)說(shuō)內(nèi)核提供了兩組數(shù)據(jù)結(jié)構(gòu)來(lái)描述它,一組是可變屬性(fb_var_screeninfo描述),另一組是不變屬性(fb_fix_screeninfo描述)。對(duì)于可變屬性,應(yīng)該防止在操作的過(guò)程中出現(xiàn)超出法定范圍的情況,因此內(nèi)核應(yīng)該可以調(diào)用相關(guān)函數(shù)來(lái)檢測(cè)、并將這些屬性固定在法定的范圍內(nèi),完成這個(gè)操作的函數(shù)就是s3c2410_check_var。下面簡(jiǎn)單說(shuō)明一下該函數(shù)要做的事情,在這里最好看著fb_var_screeninfo和fb_info的定義。 

static int s3c2410fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)

{       struct s3c2410fb_info *fbi = info->par; //得到驅(qū)動(dòng)的私有數(shù)據(jù)信息,注意info-par的值……/* 下面檢查fb_var_screeninfo的xres和yres的值是否超出法定范圍,如果查出將其設(shè)定為正確的值。*/

       if (var->yres > fbi->mach_info->yres.max)

              var->yres = fbi->mach_info->yres.max;

       else if (var->yres < fbi->mach_info->yres.min)

              var->yres = fbi->mach_info->yres.min;

 

       if (var->xres > fbi->mach_info->xres.max)

              var->yres = fbi->mach_info->xres.max;

       else if (var->xres < fbi->mach_info->xres.min)

              var->xres = fbi->mach_info->xres.min;

…… /* 羨慕開(kāi)始檢查bpp(表示用多少位表示一個(gè)像素),如果不合法,將其設(shè)置正確*/

       if (var->bits_per_pixel > fbi->mach_info->bpp.max)

              var->bits_per_pixel = fbi->mach_info->bpp.max;

       else if (var->bits_per_pixel < fbi->mach_info->bpp.min)

              var->bits_per_pixel = fbi->mach_info->bpp.min;

 

       /* 下面的代碼根據(jù)bpp設(shè)置正確的顏色信息,代碼略 */

……       }       return 0;} 4.2.2 s3c2410fb_set_par       該函數(shù)的主要工作是重新設(shè)置驅(qū)動(dòng)的私有數(shù)據(jù)信息,主要改變的屬性有bpp和行的長(zhǎng)度(以字節(jié)為單位)。這些屬性值其實(shí)是存放在fb_fix_screeninfo結(jié)構(gòu)中的,前面說(shuō)過(guò)這些值在運(yùn)行基本是不會(huì)改變的,這些不可改變的值又可分為絕對(duì)不能改變和允許改變的兩種類(lèi)型,前一種的例子就是幀緩沖區(qū)的起始地址,后一種的例子就是在s3c2410fb_set_par函數(shù)中提到的屬性。假如應(yīng)用程序需要修改硬件的顯示狀態(tài)之類(lèi)的操作,這個(gè)函數(shù)就顯得十分重要。 static int s3c2410fb_set_par(struct fb_info *info){       struct s3c2410fb_info *fbi = info->par;              //得到私有數(shù)據(jù)信息

       struct fb_var_screeninfo *var = &info->var;    //可變的數(shù)據(jù)屬性

        switch (var->bits_per_pixel)     //根據(jù)bpp設(shè)置不變屬性信息的顏色模式       {              case 16:

                     fbi->fb->fix.visual = FB_VISUAL_TRUECOLOR;  //真彩色

                     break;              case 1:                      fbi->fb->fix.visual = FB_VISUAL_MONO01;   // 單色                      break;              default:                      fbi->fb->fix.visual = FB_VISUAL_PSEUDOCOLOR;  //偽彩色                      break;       } 

       fbi->fb->fix.line_length     = (var->width*var->bits_per_pixel)/8; //修改行長(zhǎng)度信息(以字節(jié)為單位),計(jì)算方法是一行中的(像素總數(shù) * 表達(dá)每個(gè)像素的位數(shù))/8。

……              s3c2410fb_activate_var(fbi, var);  //該函數(shù)實(shí)際是設(shè)置硬件寄存器,解釋略。       return 0;}4.2.3 s3c2410fb_blank和s3c2410fb_setcolreg       對(duì)于s3c2410fb_blank函數(shù)實(shí)現(xiàn)的功能非常簡(jiǎn)單,而且也有較詳細(xì)的說(shuō)明,因此對(duì)它的說(shuō)明就省略了。s3c2410fb_setcolreg函數(shù)的功能是設(shè)置顏色寄存器。它需要6個(gè)參數(shù),分別代表寄存器編號(hào),紅色,綠色,藍(lán)色,透明和fb_info結(jié)構(gòu)。static int s3c2410fb_setcolreg(unsigned regno,

                            unsigned red, unsigned green, unsigned blue,

                            unsigned transp, struct fb_info *info){       struct s3c2410fb_info *fbi = info->par;          //得到私有數(shù)據(jù)信息       unsigned int val;……       switch (fbi->fb->fix.visual) {       case FB_VISUAL_TRUECOLOR:   //真彩色,使用了調(diào)色板

              /* true-colour, use pseuo-palette */

              if (regno < 16) {

                     u32 *pal = fbi->fb->pseudo_palette;

                      val  = chan_to_field(red,   &fbi->fb->var.red);  //根據(jù)顏色值生成需要的數(shù)據(jù)

                     val |= chan_to_field(green, &fbi->fb->var.green);

                     val |= chan_to_field(blue,  &fbi->fb->var.blue);

                      pal[regno] = val;              }              break;        case FB_VISUAL_PSEUDOCOLOR:    //偽彩色              if (regno < 256) {

                     /* 當(dāng)前假設(shè)為 RGB 5-6-5 模式 */

 

                     val  = ((red   >>  0) & 0xf800);

                     val |= ((green >>  5) & 0x07e0);

                     val |= ((blue  >> 11) & 0x001f);                      writel(val, S3C2410_TFTPAL(regno));  //將此值直接寫(xiě)入寄存器

                     schedule_palette_update(fbi, regno, val);   //相關(guān)寄存器

              }              break;       default:              return 1;   /* unknown type */       }       return 0;}  到目前為止,整個(gè)驅(qū)動(dòng)的主要部分已經(jīng)解釋完畢了。最后還是得提一下中斷處理函數(shù)s3c2410fb_irq,這個(gè)函數(shù)實(shí)現(xiàn)也比較短,它的主要調(diào)用了s3c2410fb_write_palette函數(shù)將它的功能是將調(diào)色板中的數(shù)據(jù)顯示到LCD上。兩個(gè)函數(shù)的實(shí)現(xiàn)也不難,這里就不再贅述。

OK!good bye everyone!see you next time。

                                         The End                                   ------ anmnmnly                                    ------ 2008.03.25
  • 上一篇: Linux-2.6.20的LCD驅(qū)動(dòng)分析(三)(轉(zhuǎn)載)
  • 下一篇: Linux-2.6.20的cs8900驅(qū)動(dòng)分析(一)(轉(zhuǎn)載)
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(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