u-boot字符顯示原理_第1頁
u-boot字符顯示原理_第2頁
u-boot字符顯示原理_第3頁
u-boot字符顯示原理_第4頁
u-boot字符顯示原理_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 u-boot字符顯示原理在u-boot源碼的頭文件include/video_font_data.h中定義了ASCII碼的8*16像素點陣字庫,以無符號字符數組形式保存,其中的每個字符相關元素的順序與ASCII碼的順序一致,在訪問每個字符的時候,可以通過字符的ASCII值與每個字符編碼所占的空間來進行偏移量計算,從而得到相關的數據,字庫中每個字符信息都包含十六個數據,且每個數據都是一個八位無符號整數,展開成二進制后,他們每一位都對應了實際顯示一個像素,其中為1的位代表亮,為0的位代表暗,這樣就完成了一個字符從外形到抽象的數據的轉換保存。如字符A的點陣數據如下:/*650 x41A*/0 x0

2、0,/*00000000*/第1行的8個像素點0 x00,/*00000000*/0 x10,/*00010000*/紅色表示顯示有效的像素點0 x38,/*00111000*/0 x6c,/*01101100*/0 xc6,/*11000110*/0 xc6,/*11000110*/0 xfe,/*11111110*/0 xc6,/*11000110*/0 xc6,/*11000110*/0 xc6,/*11000110*/0 xc6,/*11000110*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000

3、000*/第16行的8個像素點A的ASCII碼為65,可以通過65*16的偏移量來訪問,而實際顯示時,仍然需要根據每像素顏色位數進行映射,并且配合前景色和背景色顯示。下面通過代碼進行詳細分析。首先,介紹幾個相關數據結構。1)用來生成前景色和背景色的參考值(include/video_fb.h):#defineCONSOLE_BG_COL0 x00#defineCONSOLE_FG_COL0 xa02)前景色和背景色的數值表示(drivers/video/cfb_console.c):staticu32eorx,fgx,bgx;/*colorpats*/我們以RGB565彩色模式為例(一個像素占

4、兩個字節,其中,低字節的前5位用來表示BLUE,低字節的后三位+高字節的前三位用來表示Green,高字節的后5位用來表示RED):caseGDF_16BIT_565RGB:fgx=(CONSOLE_FG_COL3)2)3)3)2)3);bgx=(CONSOLE_BG_COL3)2)3)3)2)3);break;eorx=fgx人bgx;可以得到,前景色fgx為(紅色分量10100,綠色分量101000,藍色分量為10100):10100101000101001010110100010100同樣,背景色bgx為:00000000000000000000000000000000eorx即為前景色和

5、背景色的異或(混合),這里eorx實際就是前景色fgx的值。3)輸出顏色索引表,用來實現字庫中有效像素數據(每2位數據為一組)到實際像素數據(RGB565)的映射(drivers/video/cfb_console.c):staticconstintvideo_font_draw_table16=0 x00000000,0 x0000ffff,0 xffff0000,0 xffffffff;4)用來交換32位數的高低16位中的高低8位的順序的宏(drivers/video/cfb_console.c):#defineSHORTSWAP32(x)(x)&0 x000000ff)8)|(x)&0

6、x00ff0000)8)5)相關字符數據(include/video_font_data.h):#defineVIDEO_FONT_CHARS256/*ASCII碼字符總數*/#defineVIDEO_FONT_WIDTH8#defineVIDEO_FONT_WIDTH8/*字符寬度*/16/*字符高度16/*字符高度*/#defineVIDEO_FONT_SIZE(VIDEO_FONT_CHARS*VIDEO_FONT_HEIGHT)/*字#defineVIDEO_FONT_SIZE庫所占內存空間大小*/6)ASCII碼字符數據,每個字符16行,每個像素8位數據占一行(include/vid

7、eo_font_data.h):staticunsignedchar_maybe_unusedvideo_fontdataVIDEO_FONT_SIZE=/*00 x00嶂*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*000000

8、00*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/;在drivers/video/cfb_console.c文件中定義了video_drawchars函數,下面仍然以字符必(控制字符,鍵盤Ctrl組合掃描碼)和RGB565彩色模式為例,分析其代碼:staticvoidvideo_drawchars(intxx,intyy,unsignedchar*s,intcount)u8*cdat,*dest,*dest0;introws,offset,c;/*計算偏移量*/offset=yy*VIDEO_

9、LINE_LEN+xx*VIDEO_PIXEL_SIZE;/*設置繪制的基址*/dest0=video_fb_address+offset;switch(VIDEO_DATA_FORMAT)/*以16BIT_565RGB模式為例*/caseGDF_16BIT_565RGB:while(count-)/*count為需要顯示的字符總數*/c=*s;/*提取單個字符*/*通過ASCII碼字庫獲取點陣數據*/cdat=video_fontdata+c*VIDEO_FONT_HEIGHT;for(rows=VIDEO_FONT_HEIGHT,dest=dest0;rows-;dest+=VIDEO_L

10、INE_LEN)/*提取每行數據單獨處理*/u8bits=*cdat+;/*將8位二進制數分成4組,每組兩位,進行處理,這幾行的分析在后面補充說明*/(u32*)dest)0=SHORTSWAP32(video_font_draw_table16bits6&eorx)Abgx);(u32*)dest)1=SHORTSWAP32(video_font_draw_table16bits4&3&eorx)Abgx);if(VIDEO_FONT_WIDTH=4)continue;(u32*)dest)2=SHORTSWAP32(video_font_draw_table16bits2&3&eorx)A

11、bgx);(u32*)dest)3=SHORTSWAP32(video_font_draw_table16bits&3&eorx)Abgx);/*移動繪制的指針*/dest0+=VIDEO_FONT_WIDTH*VIDEO_PIXEL_SIZE;/*準備處理下個字符*/s+;break;下面對如下代碼進行補充說明:(u32*)dest)0=SHORTSWAP32(video_font_draw_table16bits6&eorx)Abgx);(u32*)dest)1=SHORTSWAP32(video_font_draw_table16bits4&3&eorx)Abgx);(u32*)dest

12、)2=SHORTSWAP32(video_font_draw_table16bits2&3&eorx)Abgx);(u32*)dest)3=SHORTSWAP32(video_font_draw_table16bits&3&eorx)Abgx);這里首先將每行8位二進制數分成4組,以字符A的第三行為例,也就是01111110(表示8個像素點),分成四組01B,11B,11B,10B。然后依次使用它們作為數組video_font_draw_table16口的下標查詢對應顏色值,該數組定義如下:staticconstintvideo_font_draw_table16=0 x00000000,0

13、x0000ffff,0 xffff0000,0 xffffffff;此數組中保存的十六進制數以四四分組,0 x0000對應傳遞進來的0B(表示RGB分量全為最小值),0 xffff對應傳遞進來的1B(表示RGB分量全為最大值)。那么,01B就映射成了0 x0000ffff,11B映射成了0 xffffffff,10B映射成了0 xffff0000。01B對應兩個像素點,第一個像素無效(需要設置為背景色),第二個像素有效(需要設置成前景色),將該值先與eorx進行按位與操作:31272116115000000000000000001111111111111111(01B)10100101000101001010110100010100(eorx)得到:00000000000000001010110100010100再與背景色bgx做異或操作:00000000000000000000000000000000(bgx)得到:000000000000000010101101000

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論