《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于μClinux的圖形顯示驅(qū)動(dòng)的研究與實(shí)現(xiàn)
基于μClinux的圖形顯示驅(qū)動(dòng)的研究與實(shí)現(xiàn)
趙 鑫, 李 曦
中國(guó)科學(xué)技術(shù)大學(xué) 計(jì)算機(jī)系,安徽 合肥230027
摘要: 本文在分析嵌入式系統(tǒng)中圖形系統(tǒng)的軟件體系結(jié)構(gòu)后,系統(tǒng)介紹了實(shí)現(xiàn)圖形化輸出的底層驅(qū)動(dòng)的相關(guān)數(shù)據(jù)結(jié)構(gòu)和算法實(shí)現(xiàn),并介紹了將圖形顯示驅(qū)動(dòng)安裝到嵌入式操作系統(tǒng)?滋Clinux內(nèi)核的方法。
Abstract:
Key words :

摘  要: 本文在分析嵌入式系統(tǒng)中圖形系統(tǒng)的軟件體系結(jié)構(gòu)后,系統(tǒng)介紹了實(shí)現(xiàn)圖形化輸出的底層驅(qū)動(dòng)的相關(guān)數(shù)據(jù)結(jié)構(gòu)和算法實(shí)現(xiàn),并介紹了將圖形顯示驅(qū)動(dòng)安裝到嵌入式操作系統(tǒng)?滋Clinux內(nèi)核的方法。
關(guān)鍵詞: μClinux  驅(qū)動(dòng)  FrameBuffer

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

  最底層是圖形硬件驅(qū)動(dòng)程序,用來(lái)操作圖形硬件設(shè)備。μClinux系統(tǒng)中對(duì)圖形硬件設(shè)備的操作通過(guò)標(biāo)準(zhǔn)化的調(diào)用接口映射到該層實(shí)施。
  中間層是GUI圖形引擎,該層把最底層提供的基本圖形輸出操作結(jié)合起來(lái)完成較為復(fù)雜的圖形輸出。為該層設(shè)計(jì)的GUI圖形引擎已經(jīng)有成熟的產(chǎn)品,如國(guó)內(nèi)的MiniGUI、國(guó)外的MicroWindows以及Embedded QT等。
  最高層是圖形應(yīng)用程序?qū)樱鞣N圖形應(yīng)用程序都在該層實(shí)現(xiàn)。應(yīng)用程序調(diào)用中間層的圖形引擎完成各種復(fù)雜圖形效果的輸出。
  本文研究的對(duì)象是圖形系統(tǒng)最底層的硬件驅(qū)動(dòng)。
3  圖形硬件驅(qū)動(dòng)
3.1 μClinux設(shè)備驅(qū)動(dòng)簡(jiǎn)介
  μClinux將設(shè)備分為字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備三大類。圖形顯示硬件設(shè)備屬于字符設(shè)備。
μClinux驅(qū)動(dòng)程序的基本結(jié)構(gòu)和Linux驅(qū)動(dòng)程序的結(jié)構(gòu)類似。不同的是:Linux使用模塊化(module)的方式處理設(shè)備驅(qū)動(dòng),可以根據(jù)需求將所需驅(qū)動(dòng)加載到系統(tǒng)內(nèi)核中。μClinux雖然也支持模塊化的處理方式,但是,由于存儲(chǔ)空間的限制以及嵌入式系統(tǒng)具有針對(duì)性的功能要求,所以,通常在編譯內(nèi)核時(shí)便放棄了對(duì)模塊化的支持而采用將驅(qū)動(dòng)直接編譯進(jìn)內(nèi)核的方式安裝驅(qū)動(dòng)。
  μClinux的設(shè)備驅(qū)動(dòng)程序和文件系統(tǒng)緊密地結(jié)合在一起,各種設(shè)備以文件的形式存放在/dev目錄下,稱為設(shè)備文件。用戶程序使用open( )、close( )、read( )、write( )等標(biāo)準(zhǔn)調(diào)用函數(shù)操作硬件設(shè)備。內(nèi)核通過(guò)file_operations結(jié)構(gòu)調(diào)用驅(qū)動(dòng)程序中的函數(shù)。這是一個(gè)通用的文件操作函數(shù)指針的集合,包含了?滋Clinux提供的全部文件系統(tǒng)操作函數(shù)。在硬件驅(qū)動(dòng)程序中只需實(shí)現(xiàn)該硬件所需的部分函數(shù),而將其他的函數(shù)指針置空。
3.2 圖形硬件驅(qū)動(dòng)的研究與實(shí)現(xiàn)
3.2.1 圖形硬件驅(qū)動(dòng)
  圖形硬件的驅(qū)動(dòng)在?滋Clinux中是比較復(fù)雜的驅(qū)動(dòng),同它相關(guān)的函數(shù)及文件分為二類。
  (1)Frame Buffer驅(qū)動(dòng)程序。驅(qū)動(dòng)程序的代碼存放在fbmem.c文件中。Frame Buffer為顯示設(shè)備提供一個(gè)通用接口,它是將顯存抽象后的設(shè)備。它通過(guò)地址映射允許上層用戶在圖形模式下對(duì)顯示緩沖區(qū)進(jìn)行讀寫。Frame Buffer的存在使用戶不必關(guān)心物理顯存的位置、換頁(yè)機(jī)制等細(xì)節(jié)問(wèn)題,同時(shí)簡(jiǎn)化了用戶程序代碼在不同硬件平臺(tái)間的移植。
  (2)Frmae Buffer的輔助函數(shù)。這些函數(shù)聲明在fb.h中。不同的嵌入式系統(tǒng)中,圖形顯示硬件不完全相同,硬件獨(dú)有的狀態(tài)數(shù)據(jù)由這些輔助函數(shù)記錄并修改。Frame Buffer調(diào)用輔助函數(shù)控制顯示硬件設(shè)備。
下面從這二方面探討圖形硬件驅(qū)動(dòng)的實(shí)現(xiàn)。
3.2.2 Frame Buffer驅(qū)動(dòng)
  Frame Buffer的驅(qū)動(dòng)代碼存放在fbmem.c中,該文件最早出現(xiàn)在Linux-1.3.94內(nèi)核版本中。其中最核心的數(shù)據(jù)結(jié)構(gòu)是包含操作Frame Buffer函數(shù)的指針集合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設(shè)備文件的特征決定了其只需要實(shí)現(xiàn)文件操作函數(shù)中的部分調(diào)用,如:fb_read、fb_write、fb_mmap等。
  由于處理器不支持MMU,μClinux操作系統(tǒng)對(duì)內(nèi)存的管理不同于標(biāo)準(zhǔn)的Linux。在沒(méi)有MMU的嵌入式系統(tǒng)中,顯存的空間是獨(dú)立且固定的,μClinux操作系統(tǒng)可以線性地訪問(wèn)顯存空間。基于此,?滋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直接通過(guò)地址總線訪問(wèn)顯存空間,所以地址映射被處理成直接訪問(wèn)內(nèi)存地址的方式。
  fb_open、fb_write、fb_read等函數(shù)完成驅(qū)動(dòng)Frame Buffer所必須的另外幾個(gè)操作,函數(shù)fb_ioctl則用來(lái)調(diào)用輔助函數(shù)記錄和修改硬件狀態(tài)數(shù)據(jù)。這些函數(shù)只需做微小的修改便可以滿足嵌入式系統(tǒng)圖形顯示的需要。限于篇幅,在此不作詳細(xì)說(shuō)明。
3.2.3 Frame Buffer的輔助函數(shù)
  Frame Buffer調(diào)用顯示驅(qū)動(dòng)的輔助函數(shù)記錄與修改顯示硬件狀態(tài)數(shù)據(jù)。由于不同顯示硬件設(shè)備的工作方式不同,所以需要為它們定制特別的輔助函數(shù)。Frame Buffer的實(shí)現(xiàn)離不開(kāi)輔助函數(shù),因此include/linux/fb.h最初和fbmem.c一起出現(xiàn)在Linux-1.3.94內(nèi)核版本中。fb.h中聲明了輔助函數(shù)的接口,函數(shù)實(shí)現(xiàn)代碼則需要根據(jù)具體的硬件結(jié)構(gòu)編寫并保存在文件xxxfb.c中。
  fb.h文件中定義了記錄圖形硬件固有狀態(tài)參數(shù)的struct fb_fix_screeninfo和記錄圖形硬件可變參數(shù)的struct fb_var_screeninfo,同時(shí)聲明了操作這二組數(shù)據(jù)的函數(shù)指針集合struct fb_ops:
  struct fb_ops {
  //讀取固有參數(shù)
  int (*fb_get_fix) (struct fb_fix_screeninfo*,int);
  //讀取可變參數(shù)
  int (*fb_get_var) (struct fb_var_screeninfo*,int);
  //設(shè)置可變參數(shù)
  int (*fb_set_var) (struct fb_var_screeninfo*,int);
  //讀取color map
  int (*fb_get_cmap) (struct fb_cmap*,int,int);
  //設(shè)置color map
  int (*fb_set_cmap) (struct fb_cmap*,int,int);
  //平面顯示函數(shù)
  int (*fb_pan_display) (struct fb_var_screeninfo*,int);
  int (*fb_ioctl)(struct inode*,struct file*,unsigned int,
  unsigned long,int);
  };
  在xxxfb.c文件中必須聲明這樣兩個(gè)變量:
  static struct fb_fix_screeninfo   xxx_fb_fix;/*硬件固有參數(shù)*/
  static struct fb_var_screeninfo   xxx_fb_var;/*硬件可變參數(shù)*/
  fb_ops中的函數(shù)指針在xxxfb.c文件中完成函數(shù)代碼:
  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
  };
  結(jié)合顯示硬件結(jié)構(gòu)特征實(shí)現(xiàn)這幾個(gè)函數(shù),其中關(guān)鍵的函數(shù)有xxxfb_get_fix、xxxfb_set_var和xxxfb_get_var。這三個(gè)函數(shù)分別對(duì)xxx_fb_fix和xxx_fb_var中的參數(shù)進(jìn)行讀取和設(shè)置。
  以xxxfb_get_fix為例,該函數(shù)從xxx_fb_fix中讀取硬件的固有狀態(tài)參數(shù)。有二種實(shí)現(xiàn)方法:(1)從xxx_fb_fix中逐個(gè)讀取需要的參數(shù)。對(duì)具體的硬件,fb_fix_screeninfo中只有部分?jǐn)?shù)據(jù)是需要被處理的,因此只需要讀取有效數(shù)據(jù)。(2)調(diào)用系統(tǒng)的memcpy( )函數(shù)將xxx_fb_fix完全拷貝出來(lái)。這種方法方便,但對(duì)嵌入式系統(tǒng)來(lái)說(shuō)是以加大存儲(chǔ)空間的開(kāi)銷為代價(jià)的。
  另外二個(gè)函數(shù)xxxfb_get_var和xxxfb_set_var也可以做類似的處理。
  在xxxfb.c文件中,啟動(dòng)顯示硬件的函數(shù)是xxxfb_init( )。該函數(shù)將當(dāng)前的顯示硬件注冊(cè)到系統(tǒng)中供Frame buffer調(diào)用,同時(shí)還完成對(duì)xxx_fb_fix的賦值。具體代碼如下:
  void xxxfb_init(void)
  {
      ……
      /*硬件的固有數(shù)據(jù)是固定的,因此在這里對(duì)xxx_fb_fix進(jìn)行賦值*/
      ……
      //將顯示硬件注冊(cè)到系統(tǒng)中
  err=register_framebuffer(&fb_info.gen.info);
  if (err<0)
     return err;
      ……
  return mem_start;//返回顯存起始地址
  }
  xxxfb_init( )函數(shù)被fbmem.c文件的fb_open( )函數(shù)調(diào)用。由于圖形硬件的多樣性,fb_open( )函數(shù)根據(jù)具體硬件信息選擇xxxfb_init( )啟動(dòng)輔助函數(shù)。
  μClinux中線性的顯存訪問(wèn)是實(shí)現(xiàn)圖形顯示驅(qū)動(dòng)首先要注意的問(wèn)題,處理好上面提到的函數(shù)和數(shù)據(jù)就可以為特定嵌入式系統(tǒng)的顯示設(shè)備開(kāi)發(fā)出合適的輔助函數(shù)。
3.2.4 安裝驅(qū)動(dòng)
  下面介紹將顯示驅(qū)動(dòng)安裝進(jìn)內(nèi)核的步驟。
  (1)圖形顯示硬件屬字符設(shè)備,因此將fbme.c文件保存到目錄/linux-2.0/driver/char/中。
  (2)將圖形設(shè)備加入到的Makefile文件中。
  (3)在/linux/init/main.c文件中添加驅(qū)動(dòng)的啟動(dòng)函數(shù)fbmem_init( )。
  (4)修改編譯選項(xiàng)文件,在/linux/arm/armnommu/config.in文件中加入:
  bool′ framebuffer support′ CONFIG_FB_XXX
  (5)為文件系統(tǒng)的open( )調(diào)用提供設(shè)備文件名。在/vendors/<VENDOR>/<BOARD>/Makefile的‘DEVICES=’中,加入‘xxxfb,c,29,0’作為顯示設(shè)備驅(qū)動(dòng)的入口。其中29是主設(shè)備號(hào),從設(shè)備號(hào)可以根據(jù)需要改變,這里將它設(shè)為0。
  (6)使用make工具重新編譯內(nèi)核,就可將圖形顯示的驅(qū)動(dòng)編譯進(jìn)μClinux內(nèi)核。
  以上六步將顯示硬件驅(qū)動(dòng)安裝到μClinux的內(nèi)核中,在此基礎(chǔ)上選用合適的圖形包就可以在嵌入式系統(tǒng)中方便地開(kāi)發(fā)圖形應(yīng)用程序。
4  結(jié)束語(yǔ)
  在某些特殊場(chǎng)合應(yīng)用的嵌入式系統(tǒng)可能需要支持多個(gè)顯示硬件的輸出,依照本文的方法可以為不同的顯示硬件設(shè)計(jì)輔助函數(shù)來(lái)支持多終端圖形輸出。
  至此,本文完成了基于?滋Clinux操作系統(tǒng)的嵌入式設(shè)備的圖形顯示驅(qū)動(dòng)的探討并給出了部分實(shí)現(xiàn)算法。
參考文獻(xiàn)
1   Bovet D P,Cesati M著,陳莉君譯.深入理解Linux內(nèi)核(第二版).北京:中國(guó)電力出版社,2004
2   Rubini A,Corbet J著,魏永明譯.Linux設(shè)備驅(qū)動(dòng)程序(第二版).北京:中國(guó)電力出版社,2002
3   毛德操,胡希明.Linux內(nèi)核源代碼情景分析.杭州:浙江大學(xué)出版社,2001

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
午夜在线视频一区二区区别| 欧美一区影院| 99亚洲一区二区| 国内精品视频一区| 国产精品久久久久久久久免费樱桃| 美女黄毛**国产精品啪啪| 亚洲欧洲日产国产网站| 香蕉成人啪国产精品视频综合网| 亚洲乱码精品一二三四区日韩在线| 黑丝一区二区三区| 国产麻豆成人精品| 欧美视频在线免费看| 欧美**字幕| 免费成人高清| 欧美激情女人20p| 欧美激情综合在线| 欧美喷潮久久久xxxxx| 欧美裸体一区二区三区| 欧美日韩成人| 欧美日韩在线一区二区三区| 欧美日韩精品是欧美日韩精品| 欧美日本韩国在线| 欧美日韩在线直播| 国产精品免费在线 | 亚洲国产精品高清久久久| 在线日本成人| 亚洲精品视频在线观看网站 | 久久精品免费观看| 亚洲黄网站在线观看| 日韩视频永久免费观看| 亚洲午夜三级在线| 欧美一区二区三区四区夜夜大片 | 亚洲国产日韩一级| 亚洲欧洲一区二区三区| 日韩一级大片| 亚洲专区在线| 久久国产色av| 日韩亚洲成人av在线| 亚洲影视在线播放| 欧美中文字幕久久| 暖暖成人免费视频| 欧美日韩综合久久| 国产人成一区二区三区影院| 很黄很黄激情成人| 日韩视频免费在线观看| 亚洲一区精品电影| 久久国产精品高清| 99精品99久久久久久宅男| 亚洲一区久久| 久久一区欧美| 欧美日韩日本国产亚洲在线| 国产精品毛片在线| 精品成人免费| 一区二区三区四区蜜桃| 欧美一区二区在线免费播放| 亚洲精品在线视频观看| 午夜精品久久久| 久久综合色影院| 欧美视频一区在线观看| 国内精品写真在线观看| 亚洲精品网址在线观看| 性欧美xxxx视频在线观看| 亚洲精品在线视频观看| 欧美一区二区三区电影在线观看| 欧美.日韩.国产.一区.二区| 国产精品毛片| 亚洲黑丝一区二区| 亚洲欧美日韩精品一区二区| 亚洲美女视频| 久久精品国产精品| 欧美午夜不卡在线观看免费| 红桃视频一区| 亚洲一区三区视频在线观看| 亚洲激情视频网| 午夜欧美电影在线观看| 欧美暴力喷水在线| 国产欧美日韩综合| 亚洲美女中出| 亚洲丰满在线| 亚洲欧美精品一区| 欧美国产激情二区三区| 国产亚洲在线| 亚洲天堂成人在线观看| 亚洲精品一区中文| 久久精品免费播放| 欧美视频二区36p| 亚洲成人资源| 欧美伊人久久久久久久久影院 | 久久久精品日韩欧美| 国产精品电影观看| 亚洲人成久久| 亚洲黄色成人久久久| 久久国产色av| 国产精品高清网站| 亚洲免费av网站| 日韩视频中文字幕| 你懂的亚洲视频| 国内精品嫩模av私拍在线观看| 亚洲在线1234| 亚洲视频碰碰| 欧美日韩1区2区3区| 影音先锋另类| 性欧美大战久久久久久久免费观看 | 久久精品盗摄| 欧美一区二区在线播放| 国产精品magnet| 亚洲美女性视频| 99re在线精品| 欧美精品情趣视频| 亚洲激情啪啪| 亚洲美女毛片| 欧美精彩视频一区二区三区| 尤物视频一区二区| 久久大逼视频| 久久免费黄色| 国产一区在线视频| 香蕉久久夜色| 欧美制服丝袜| 国产日韩免费| 亚洲在线黄色| 欧美在线观看日本一区| 国产精品一区二区三区四区| 亚洲天堂成人在线观看| 亚洲欧美综合v| 国产精品午夜在线观看| 国产精品99久久久久久久女警 | 激情文学综合丁香| 亚洲国产第一| 蜜桃av综合| 亚洲日本成人| 亚洲视频播放| 国产精品免费看| 亚洲欧美日韩国产综合在线| 久久精品30| 黄网站免费久久| 亚洲国产高清aⅴ视频| 欧美成人乱码一区二区三区| 亚洲激情综合| 一区二区三区四区五区精品视频 | 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 最新成人av网站| 欧美激情第3页| av成人老司机| 性色av一区二区三区在线观看| 国产欧美一区二区三区视频| 欧美一区午夜精品| 欧美www在线| 一区二区激情小说| 亚洲欧美制服另类日韩| 国产亚洲精品一区二区| 久久精品免费观看| 欧美人与性禽动交情品| 亚洲视频免费观看| 久久精品国产免费观看| 在线看国产一区| 亚洲天堂激情| 国产视频精品免费播放| 亚洲黄色在线观看| 欧美日韩一级黄| 亚洲欧美激情视频| 你懂的亚洲视频| 亚洲午夜高清视频| 久久久久国产精品午夜一区| 一色屋精品视频免费看| 中日韩美女免费视频网站在线观看| 国产精品久久久久久久久搜平片 | 欧美伦理91i| 亚洲自拍电影| 欧美www在线| 亚洲在线成人精品| 免费视频亚洲| 亚洲手机视频| 免费在线亚洲欧美| av成人老司机| 免费成人av| 亚洲一区二区三区高清不卡| 看片网站欧美日韩| 亚洲视频电影在线| 欧美成人日本| 亚洲欧美一区二区在线观看| 欧美激情精品久久久久久大尺度 | 亚洲精品一区二区三区四区高清| 欧美一区二区播放| 亚洲激情校园春色| 翔田千里一区二区| 亚洲欧洲一二三| 久久精品国产99| 亚洲另类视频| 久久久欧美一区二区| 99国产精品久久久久久久久久| 久久久久国产精品一区三寸| 日韩午夜电影在线观看| 久久综合99re88久久爱| 一区二区三区高清不卡| 男女av一区三区二区色多| 亚洲宅男天堂在线观看无病毒| 欧美国产精品劲爆| 欧美亚洲网站| 国产精品豆花视频| 99精品视频网|