《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于μClinux的圖形顯示驅動的研究與實現
基于μClinux的圖形顯示驅動的研究與實現
趙 鑫, 李 曦
中國科學技術大學 計算機系,安徽 合肥230027
摘要: 本文在分析嵌入式系統中圖形系統的軟件體系結構后,系統介紹了實現圖形化輸出的底層驅動的相關數據結構和算法實現,并介紹了將圖形顯示驅動安裝到嵌入式操作系統?滋Clinux內核的方法。
Abstract:
Key words :

摘  要: 本文在分析嵌入式系統中圖形系統的軟件體系結構后,系統介紹了實現圖形化輸出的底層驅動的相關數據結構和算法實現,并介紹了將圖形顯示驅動安裝到嵌入式操作系統?滋Clinux內核的方法。
關鍵詞: μClinux  驅動  FrameBuffer

  隨著計算機技術的迅速發展,嵌入式系統得到了廣泛的應用。因為嵌入式系統本身固有的嵌入性和專用性,所以對嵌入式系統的開發有別于傳統意義上的計算機系統開發。嵌入式操作系統的普及使得基于嵌入式操作系統的開發成為嵌入式應用系統開發的主導方式。
嵌入式系統對完整的圖形系統的要求越來越迫切,GUI(圖形化接口)已經成為嵌入式系統信息輸出的一種重要方式。本文詳細闡述了基于?滋Clinux操作系統的圖形應用的軟件結構,并在此基礎上介紹了圖形顯示的底層硬件驅動技術,系統地給出了實現驅動的數據結構和算法。
1  μClinux簡介
  μClinux由Linux2.0內核發展而來,它繼承了Linux的主要特點,并針對微控制領域中不具有MMU(存儲管理單元)的處理器做了修改。μClinux重寫了內核中大部分的二進制代碼和源代碼,因此內核比Linux2.0小很多,但它同時卻保留了Linux操作系統的穩定性以及出色地支持多種文件系統的特性。?滋Clinux已被廣泛應用于嵌入式系統中,本文將基于該操作系統研究圖形硬件驅動。
2  圖形系統的體系結構
  嵌入式系統的顯示輸出分為圖形輸出和純文本輸出二部分。μClinux操作系統中控制臺(Console)處理純文本的輸出,而幀緩沖(Frame Buffer)負責圖形信息的輸出。
  μClinux操作系統的圖形系統從軟件結構角度可以分為如圖1所示的三層。

  最底層是圖形硬件驅動程序,用來操作圖形硬件設備。μClinux系統中對圖形硬件設備的操作通過標準化的調用接口映射到該層實施。
  中間層是GUI圖形引擎,該層把最底層提供的基本圖形輸出操作結合起來完成較為復雜的圖形輸出。為該層設計的GUI圖形引擎已經有成熟的產品,如國內的MiniGUI、國外的MicroWindows以及Embedded QT等。
  最高層是圖形應用程序層,各種圖形應用程序都在該層實現。應用程序調用中間層的圖形引擎完成各種復雜圖形效果的輸出。
  本文研究的對象是圖形系統最底層的硬件驅動。
3  圖形硬件驅動
3.1 μClinux設備驅動簡介
  μClinux將設備分為字符設備、塊設備和網絡設備三大類。圖形顯示硬件設備屬于字符設備。
μClinux驅動程序的基本結構和Linux驅動程序的結構類似。不同的是:Linux使用模塊化(module)的方式處理設備驅動,可以根據需求將所需驅動加載到系統內核中。μClinux雖然也支持模塊化的處理方式,但是,由于存儲空間的限制以及嵌入式系統具有針對性的功能要求,所以,通常在編譯內核時便放棄了對模塊化的支持而采用將驅動直接編譯進內核的方式安裝驅動。
  μClinux的設備驅動程序和文件系統緊密地結合在一起,各種設備以文件的形式存放在/dev目錄下,稱為設備文件。用戶程序使用open( )、close( )、read( )、write( )等標準調用函數操作硬件設備。內核通過file_operations結構調用驅動程序中的函數。這是一個通用的文件操作函數指針的集合,包含了?滋Clinux提供的全部文件系統操作函數。在硬件驅動程序中只需實現該硬件所需的部分函數,而將其他的函數指針置空。
3.2 圖形硬件驅動的研究與實現
3.2.1 圖形硬件驅動
  圖形硬件的驅動在?滋Clinux中是比較復雜的驅動,同它相關的函數及文件分為二類。
  (1)Frame Buffer驅動程序。驅動程序的代碼存放在fbmem.c文件中。Frame Buffer為顯示設備提供一個通用接口,它是將顯存抽象后的設備。它通過地址映射允許上層用戶在圖形模式下對顯示緩沖區進行讀寫。Frame Buffer的存在使用戶不必關心物理顯存的位置、換頁機制等細節問題,同時簡化了用戶程序代碼在不同硬件平臺間的移植。
  (2)Frmae Buffer的輔助函數。這些函數聲明在fb.h中。不同的嵌入式系統中,圖形顯示硬件不完全相同,硬件獨有的狀態數據由這些輔助函數記錄并修改。Frame Buffer調用輔助函數控制顯示硬件設備。
下面從這二方面探討圖形硬件驅動的實現。
3.2.2 Frame Buffer驅動
  Frame Buffer的驅動代碼存放在fbmem.c中,該文件最早出現在Linux-1.3.94內核版本中。其中最核心的數據結構是包含操作Frame Buffer函數的指針集合struct file_operations fb_fops。
static struct file_operations fb_fops={
  NULL,  //lseek
     fb_read, //read
     fb_write, //write
     NULL,  //readdir
     NULL,  //select
     fb_ioctl, //ioctl
     fb_mmap, //mmap
     fb_open, //open
     fb_release, //release
     NULL  //fsync
};
  Frame Buffer設備文件的特征決定了其只需要實現文件操作函數中的部分調用,如:fb_read、fb_write、fb_mmap等。
  由于處理器不支持MMU,μClinux操作系統對內存的管理不同于標準的Linux。在沒有MMU的嵌入式系統中,顯存的空間是獨立且固定的,μClinux操作系統可以線性地訪問顯存空間。基于此,?滋Clinux中的fb_mmap可以修改成如下代碼:
  static int fb_mmap(struct inode*inode,struct file*file,
  struct vm_area_struct*vma) {
  struct fb_ops*fb=registered_fb[ GET_FB_IDX(inode->i_rdev)];
  struct fb_fix_screeninfo fix;
  if(!fb)
     return -ENODEV;
  fb->fb_get_fix(&fix,PROC_CONSOLE( ));
  vma->vm_start=fix.smem_start+vma->vm_offset;
  return 0;
  }
  由于μClinux直接通過地址總線訪問顯存空間,所以地址映射被處理成直接訪問內存地址的方式。
  fb_open、fb_write、fb_read等函數完成驅動Frame Buffer所必須的另外幾個操作,函數fb_ioctl則用來調用輔助函數記錄和修改硬件狀態數據。這些函數只需做微小的修改便可以滿足嵌入式系統圖形顯示的需要。限于篇幅,在此不作詳細說明。
3.2.3 Frame Buffer的輔助函數
  Frame Buffer調用顯示驅動的輔助函數記錄與修改顯示硬件狀態數據。由于不同顯示硬件設備的工作方式不同,所以需要為它們定制特別的輔助函數。Frame Buffer的實現離不開輔助函數,因此include/linux/fb.h最初和fbmem.c一起出現在Linux-1.3.94內核版本中。fb.h中聲明了輔助函數的接口,函數實現代碼則需要根據具體的硬件結構編寫并保存在文件xxxfb.c中。
  fb.h文件中定義了記錄圖形硬件固有狀態參數的struct fb_fix_screeninfo和記錄圖形硬件可變參數的struct fb_var_screeninfo,同時聲明了操作這二組數據的函數指針集合struct fb_ops:
  struct fb_ops {
  //讀取固有參數
  int (*fb_get_fix) (struct fb_fix_screeninfo*,int);
  //讀取可變參數
  int (*fb_get_var) (struct fb_var_screeninfo*,int);
  //設置可變參數
  int (*fb_set_var) (struct fb_var_screeninfo*,int);
  //讀取color map
  int (*fb_get_cmap) (struct fb_cmap*,int,int);
  //設置color map
  int (*fb_set_cmap) (struct fb_cmap*,int,int);
  //平面顯示函數
  int (*fb_pan_display) (struct fb_var_screeninfo*,int);
  int (*fb_ioctl)(struct inode*,struct file*,unsigned int,
  unsigned long,int);
  };
  在xxxfb.c文件中必須聲明這樣兩個變量:
  static struct fb_fix_screeninfo   xxx_fb_fix;/*硬件固有參數*/
  static struct fb_var_screeninfo   xxx_fb_var;/*硬件可變參數*/
  fb_ops中的函數指針在xxxfb.c文件中完成函數代碼:
  static struct fb_ops xxxfb_ops={
      xxxfb_get_fix,
      xxxfb_get_var,
      xxxfb_set_var,
      xxxfb_get_cmap,
      xxxfb_set_cmap,
      xxxfb_pan_display,

       xxxfb_ioctl
  };
  結合顯示硬件結構特征實現這幾個函數,其中關鍵的函數有xxxfb_get_fix、xxxfb_set_var和xxxfb_get_var。這三個函數分別對xxx_fb_fix和xxx_fb_var中的參數進行讀取和設置。
  以xxxfb_get_fix為例,該函數從xxx_fb_fix中讀取硬件的固有狀態參數。有二種實現方法:(1)從xxx_fb_fix中逐個讀取需要的參數。對具體的硬件,fb_fix_screeninfo中只有部分數據是需要被處理的,因此只需要讀取有效數據。(2)調用系統的memcpy( )函數將xxx_fb_fix完全拷貝出來。這種方法方便,但對嵌入式系統來說是以加大存儲空間的開銷為代價的。
  另外二個函數xxxfb_get_var和xxxfb_set_var也可以做類似的處理。
  在xxxfb.c文件中,啟動顯示硬件的函數是xxxfb_init( )。該函數將當前的顯示硬件注冊到系統中供Frame buffer調用,同時還完成對xxx_fb_fix的賦值。具體代碼如下:
  void xxxfb_init(void)
  {
      ……
      /*硬件的固有數據是固定的,因此在這里對xxx_fb_fix進行賦值*/
      ……
      //將顯示硬件注冊到系統中
  err=register_framebuffer(&fb_info.gen.info);
  if (err<0)
     return err;
      ……
  return mem_start;//返回顯存起始地址
  }
  xxxfb_init( )函數被fbmem.c文件的fb_open( )函數調用。由于圖形硬件的多樣性,fb_open( )函數根據具體硬件信息選擇xxxfb_init( )啟動輔助函數。
  μClinux中線性的顯存訪問是實現圖形顯示驅動首先要注意的問題,處理好上面提到的函數和數據就可以為特定嵌入式系統的顯示設備開發出合適的輔助函數。
3.2.4 安裝驅動
  下面介紹將顯示驅動安裝進內核的步驟。
  (1)圖形顯示硬件屬字符設備,因此將fbme.c文件保存到目錄/linux-2.0/driver/char/中。
  (2)將圖形設備加入到的Makefile文件中。
  (3)在/linux/init/main.c文件中添加驅動的啟動函數fbmem_init( )。
  (4)修改編譯選項文件,在/linux/arm/armnommu/config.in文件中加入:
  bool′ framebuffer support′ CONFIG_FB_XXX
  (5)為文件系統的open( )調用提供設備文件名。在/vendors/<VENDOR>/<BOARD>/Makefile的‘DEVICES=’中,加入‘xxxfb,c,29,0’作為顯示設備驅動的入口。其中29是主設備號,從設備號可以根據需要改變,這里將它設為0。
  (6)使用make工具重新編譯內核,就可將圖形顯示的驅動編譯進μClinux內核。
  以上六步將顯示硬件驅動安裝到μClinux的內核中,在此基礎上選用合適的圖形包就可以在嵌入式系統中方便地開發圖形應用程序。
4  結束語
  在某些特殊場合應用的嵌入式系統可能需要支持多個顯示硬件的輸出,依照本文的方法可以為不同的顯示硬件設計輔助函數來支持多終端圖形輸出。
  至此,本文完成了基于?滋Clinux操作系統的嵌入式設備的圖形顯示驅動的探討并給出了部分實現算法。
參考文獻
1   Bovet D P,Cesati M著,陳莉君譯.深入理解Linux內核(第二版).北京:中國電力出版社,2004
2   Rubini A,Corbet J著,魏永明譯.Linux設備驅動程序(第二版).北京:中國電力出版社,2002
3   毛德操,胡希明.Linux內核源代碼情景分析.杭州:浙江大學出版社,2001

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          亚洲小视频在线| 欧美精品不卡| 国产视频亚洲| 精品不卡一区二区三区| 欧美午夜一区二区| 亚洲国产一区二区在线| 亚洲欧美激情一区| 国产精品色午夜在线观看| 一区二区三区免费网站| 国产亚洲二区| 极品日韩久久| 亚洲国产欧美不卡在线观看| 一区二区亚洲欧洲国产日韩| 亚洲成人在线视频网站| 欧美一区二区三区视频免费| 国产亚洲精品久久久久动| 韩日视频一区| 一本色道久久88综合日韩精品| 欧美色网在线| 一本色道久久88综合亚洲精品ⅰ| 欧美国产综合一区二区| 欧美激情国产日韩精品一区18| 1024精品一区二区三区| 狠狠色综合网站久久久久久久| 午夜精品免费在线| 销魂美女一区二区三区视频在线| 日韩视频在线一区二区三区| 国产性猛交xxxx免费看久久| 亚洲影视综合| 欧美日韩一区二区三区在线观看免| 葵司免费一区二区三区四区五区| 一卡二卡3卡四卡高清精品视频| 国产亚洲成精品久久| 久久久久国产精品一区三寸| 老司机久久99久久精品播放免费| 夜夜爽夜夜爽精品视频| 99re热这里只有精品视频| 国产精品色在线| 亚洲激情专区| 精品福利免费观看| 国产农村妇女精品一区二区| 你懂的亚洲视频| 欧美不卡视频一区发布| 亚洲国产毛片完整版| 久久亚洲国产精品日日av夜夜| 国产精品久久久久久一区二区三区| 亚洲第一页中文字幕| 欧美v日韩v国产v| 国产主播一区二区三区四区| 欧美mv日韩mv国产网站app| 国产永久精品大片wwwapp| 香蕉免费一区二区三区在线观看| 欧美日韩第一区| 亚洲黄色影院| 美女露胸一区二区三区| 国产精品永久在线| 亚洲黄色视屏| 欧美激情一区二区三区在线视频| 免费在线欧美视频| 欧美影院在线播放| 久久躁狠狠躁夜夜爽| 久久精品国产视频| 国产精品区一区| 久久久久**毛片大全| 99精品国产高清一区二区| 国产精品sm| 一区二区三区在线观看国产| 性8sex亚洲区入口| 国产精品成人免费| 欧美日韩亚洲一区二| 另类激情亚洲| 亚洲欧美在线免费| 亚洲国产另类久久久精品极度| 国产精品日韩一区二区三区| 性娇小13――14欧美| 一区二区三区欧美视频| 国产在线精品一区二区中文| 一色屋精品视频免费看| 国产网站欧美日韩免费精品在线观看| 国产午夜精品视频| 国产精品久久久久久久久久免费看| 欧美一级播放| 亚洲国产精彩中文乱码av在线播放| 久久精品国产精品亚洲综合| 美女精品网站| 羞羞漫画18久久大片| 欧美午夜视频一区二区| 亚洲国产一区二区三区a毛片| 亚洲香蕉在线观看| 一本一本久久a久久精品牛牛影视| 国内精品伊人久久久久av影院| 中文欧美字幕免费| 牛夜精品久久久久久久99黑人| 国产日韩高清一区二区三区在线| 99这里只有精品| 欧美日韩dvd在线观看| 欧美日韩国产精品成人| 欧美aa在线视频| 夜夜嗨av一区二区三区| 日韩视频一区| 欧美大片在线看免费观看| 先锋亚洲精品| 日韩一区二区电影网| 亚洲网站啪啪| 亚洲人成在线播放网站岛国| 欧美日韩精品免费观看视频| 开元免费观看欧美电视剧网站| 尤物视频一区二区| 亚洲精品欧美日韩专区| 国产精品在线看| 欧美日韩中字| 久久美女性网| 亚洲免费一级电影| 午夜久久电影网| 久久久久国产一区二区三区四区| 国产一区二区三区免费观看| 亚洲国产天堂久久综合| 国产亚洲精品一区二区| 久久久久久久久久码影片| 裸体一区二区三区| 欧美亚日韩国产aⅴ精品中极品| 国产免费观看久久黄| 日韩视频免费在线观看| 国产精品视频你懂的| 国产精品久久久久久久第一福利| 久久久久久久一区| 久久高清一区| 老司机精品视频网站| 两个人的视频www国产精品| 久久视频在线看| 欧美高清在线视频观看不卡| 久久在线91| 欧美色道久久88综合亚洲精品| 国产精品揄拍一区二区| 久久福利毛片| 国产伦精品一区二区三区高清版| 中文成人激情娱乐网| 亚洲欧美日韩专区| 一区二区三区日韩欧美| 亚洲国产你懂的| 亚洲欧美日韩在线一区| 国产一区二三区| 欧美视频日韩视频| 欧美午夜电影在线| 日韩视频在线永久播放| 欧美在线看片a免费观看| 亚洲国产影院| 久久天天狠狠| 欧美系列亚洲系列| 欧美视频一区二区三区…| 国产一区二区三区免费不卡| 国产精品影音先锋| 欧美日本亚洲视频| 玖玖玖国产精品| 一本大道av伊人久久综合| 亚洲国产日韩欧美在线图片| 亚洲国产美国国产综合一区二区| 狠狠久久亚洲欧美专区| 久久久噜久噜久久综合| 久久婷婷影院| 日韩一区二区免费看| 国产一区久久久| 亚洲在线成人| 久久丁香综合五月国产三级网站| 欧美高清视频一二三区| 国产精品免费久久久久久| 欧美色道久久88综合亚洲精品| 牛牛影视久久网| av成人激情| 国产在线精品自拍| 国产视频亚洲| 亚洲一区二区三区四区在线观看| 久久综合网色—综合色88| 依依成人综合视频| 亚洲男女自偷自拍图片另类| 亚洲欧美一级二级三级| 亚洲一区在线观看视频| 久久精品视频在线播放| 欧美凹凸一区二区三区视频| 欧美日韩在线第一页| 曰本成人黄色| 亚洲国产精品一区二区尤物区| 欧美三级黄美女| 欧美一二三区精品| 欧美资源在线观看| 亚欧成人精品| 欧美日韩高清在线一区| 国产日韩欧美a| 可以免费看不卡的av网站| 国产免费成人av| 亚洲综合好骚| 99国产精品99久久久久久| 一区二区成人精品| 另类天堂av| 国产亚洲成av人在线观看导航| 免费久久久一本精品久久区| 韩日成人在线| 欧美国产欧美综合| 有坂深雪在线一区| 亚洲另类春色国产| 在线观看国产日韩| 国产精品一区二区黑丝| 在线视频日韩精品| 国产精品美女主播| 性欧美长视频| 韩国av一区二区三区在线观看| 久久成人18免费观看| 欧美在线你懂的| 在线免费高清一区二区三区| 一区精品久久| 欧美亚州在线观看| 国产一区二区精品在线观看| 亚洲专区一二三| 午夜精品久久久久久久蜜桃app| 久久久久这里只有精品| 欧美一级在线播放| 欧美一级理论性理论a| 国产亚洲一区二区三区| 一区二区三区免费在线观看| 欧美日韩99| 激情综合色综合久久| 欧美激情在线免费观看| 亚洲主播在线观看| 99ri日韩精品视频| 免费亚洲网站| 欧美一级黄色网| 亚洲激情视频在线播放| 国产亚洲精品久久久久久| 久久综合久久综合九色| 久久久999| 久久影视三级福利片| 蜜臀av在线播放一区二区三区| 久久男女视频| 亚洲成色777777女色窝| 国产在线精品成人一区二区三区| 日韩视频专区| 亚洲一二三区精品| 久久精品国产v日韩v亚洲| 99xxxx成人网| 欧美一区二区三区视频在线观看| 久热re这里精品视频在线6| 国产精品久久一区二区三区| 久久久久国产精品www| 怡红院精品视频在线观看极品| 一区二区欧美亚洲| 国产精品久久久久久久久动漫| 午夜精品久久| 在线播放豆国产99亚洲| 国产精品国产| 国产欧美日韩在线| 欧美日韩国产探花| 亚洲精品老司机| 妖精视频成人观看www| 亚洲一区二区影院| 一区二区三区欧美在线观看| 亚洲影视在线播放| 亚洲国产天堂久久国产91| 国产精品人人爽人人做我的可爱| 在线视频欧美日韩| 欧美大成色www永久网站婷| 久久一区二区视频| 欧美色视频日本高清在线观看| 亚洲国产精选| 合欧美一区二区三区| 欧美日韩日本网| 欧美不卡视频一区| 一色屋精品视频免费看| 国产精品乱码| 午夜精品99久久免费| 国产视频综合在线| 国产在线观看91精品一区| 欧美日韩三级一区二区| 久久综合婷婷| 国产日韩精品入口| 亚洲精品美女在线观看播放| 一区二区三区成人精品| 午夜在线精品偷拍| 欧美日韩激情网| 欧美一区二区三区四区在线观看| 国产精品日韩欧美一区二区| 伊人久久大香线蕉综合热线| 亚洲午夜精品福利| 一区二区三区你懂的| 欧美日韩亚洲一区三区| 欧美在线黄色| 欧美一级大片在线观看| 国产精品99久久久久久久女警| aa亚洲婷婷| 国产美女精品人人做人人爽| 国产欧美日韩视频| 99精品久久| 久久免费视频在线观看| 狠狠色综合日日| 亚洲欧洲在线视频| 国产一区在线免费观看| 国产精品av一区二区| 久久蜜桃香蕉精品一区二区三区| 亚洲一二三区在线观看| 国产精品免费aⅴ片在线观看| 一区二区三区久久久| 欧美日韩麻豆| 久久综合色天天久久综合图片| 亚洲精品一二三| 新片速递亚洲合集欧美合集| 日韩亚洲欧美成人一区| 久久婷婷国产麻豆91天堂| 久久久91精品| 国产精品高潮呻吟久久| 国产精品一区二区久久久久| 亚洲电影免费| 欧美中文字幕视频在线观看| 99香蕉国产精品偷在线观看| 亚洲欧美激情一区二区| 免费h精品视频在线播放| 欧美国产激情二区三区| 久久久久久久性| 一区二区三区在线视频免费观看| 日韩小视频在线观看专区| 美女视频黄 久久| 久热这里只精品99re8久| 亚洲丶国产丶欧美一区二区三区| 亚洲国产精品久久久久秋霞影院| 日韩视频在线永久播放| 亚洲一区二区三区四区五区黄| 亚洲国产综合在线| 久久―日本道色综合久久| 亚洲视频中文字幕| 久久精品视频在线|