注: 本文使用的uboot版本是2010.12版本。 | ||||
一、logo顯示調用流程 | ||||
現(xiàn)在來講述下logo顯示的調用流程: board_init_r()->stdio_init()->drv_video_init()->video_init() 在video_init()函數(shù)中,首先調用了video_hw_init()函數(shù),該函數(shù)初始化GSC3280芯片的LCD控制器和GraphicDevice結構體。然后在video_init()函數(shù)中調用video_logo()函數(shù)顯示logo圖片。 接下來主要講述video_hw_init()和video_logo()函數(shù)。 | ||||
二、GSC3280 LCD初始化 | ||||
芯片初始化包括初始化芯片內部控制寄存器和設置像素信息等。 在uboot源碼的根目錄下,drivers/video/目錄下建立gsc3280_lcdfb.c文件,video_hw_init()程序如下: 2. 3. static void gsc3280_lcd_init(void) 4. { 5. printf("init lcd sysctl\n"); 6. lcdc_disable(); 7. lcd_sysctl(); 8. gsc3280_ctr_init(); 9. lcdc_dma_init((void *)DEFAULT_VIDEO_HW_ADDR); 10. lcdc_monitor_para(0); 11. lcd_enable(); 12. } 13. void *video_hw_init(void) 14. { 15. memset(&fb, 0, sizeof(GraphicDevice)); 16. fb.winSizeX = MAX_VIDEO_WIDTH_LEN; 17. fb.winSizeY = MAX_VIDEO_HIGH_LEN; 18. //over 16M from the head of kseg1, unmapped and uncacheable ddr2 address 19. fb.frameAdrs = DEFAULT_VIDEO_BASE_ADDR; 20. fb.plnSizeX = fb.winSizeX; 21. fb.plnSizeY = fb.winSizeY; 22. fb.gdfBytesPP = COLOR_PIXEL_SIZE / 8; 23. fb.gdfIndex = GDF_16BIT_565RGB; 24. fb.isaBase = 0; 25. fb.pciBase = 0; 26. fb.memSize = fb.winSizeX * fb.winSizeY * fb.gdfBytesPP; 27. /* Cursor Start Address */ 28. fb.dprBase = 0; 29. fb.vprBase = 0; 30. fb.cprBase = 0; 31. gsc3280_lcd_init(); 32. return &fb; 33. } 34. | ||||
三、logo圖片顯示原理 | ||||
3.1、宏定義 | ||||
在顯示圖片時,需要定義一些相應宏,這些宏在顯示流程中會被使用,這些宏包括: | ||||
3.2、圖片顯示數(shù)據(jù)的制作 | ||||
如果定義了VIDEO_LOGO和VIDEO_BMP_LOGO宏,編譯時會執(zhí)行tools目錄下的bmp_logo程序,讀取"tools/logos/denx.bmp"文件,在include下生成bmp_logo.h文件。注意,bmp_logo.h文件是自動生成的,里面的數(shù)據(jù)和你設置的分辨率和denx.bmp圖片具體內容有關。 bmp_logo.c文件中,有一個地點程序需要更改,如果不改,只能顯示半屏數(shù)據(jù),修改的是bmp_logo.c文件中main()函數(shù)語句,內容如下: 紅色部分即為修改內容,原來為uint16_t。 | ||||
3.3、制作bmp圖片 | ||||
這個bmp文件是有要求的,位深度必須為8位,大小也有限制,自己做個logo圖片,jpeg格式就可以,使用linux下的圖片工具轉成8位的bmp文件 | ||||
3.4、video_logo()函數(shù)說明 | ||||
在該函數(shù)中,會調用logo_plot (video_fb_address, VIDEO_COLS, 0, 0);函數(shù),該函數(shù)的第一個參數(shù)即為內存中顯存緩沖區(qū)的基地址。 該函數(shù)較簡單,如果顯示的屏幕分辨率為800 * 480,那么實際上該函數(shù)有兩個循環(huán),內層循環(huán)循環(huán)800次,顯示一行,外層循環(huán)循環(huán)480次,顯示一張圖片。 注意,在調試中發(fā)現(xiàn),需要將int ycount = video_logo_height;定義為volatile類型,否則會造成外層循環(huán)退不出來,即改為:volatile int ycount = video_logo_height;。 | ||||
原文請參見:http://blog.chinaunix.net/uid-25445243-id-4144347.html | ||||