歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

U-Boot顯示logo的方式

本文使用u-boot2010.03版本,2010.06版本同樣適用,在XC2440板上實現顯示bmp logo

首先需要有LCD的驅動支持,XC2440板的LCD驅動是:drivers/video/xc2440_lcd.c

顯示LOGO的函數調用流程:
在arch/arm/lib/board.c中的start_armboot調用common/stdio.c中的stdio_init
如果定義了CONFIG_VIDEO和CONFIG_CFB_CONSOLE,調用drivers/video/cfb_console.c中的drv_video_init
video_init調用XC2440的LCD驅動中的video_hw_init
接著video_logo調用logo_plot顯示logo

相關閱讀:U-Boot源代碼下載地址 http://www.linuxidc.com/Linux/2011-07/38897.htm

在config頭文件中(xc2440.h)定義和LCD LOGO相關的宏

#define CONFIG_CMD_BMP

#define CONFIG_VIDEO

#define CONFIG_VIDEO_S3C2410

#define CONFIG_VIDEO_LOGO

#define CONFIG_VIDEO_BMP_LOGO

#define VIDEO_FB_16BPP_WORD_SWAP

如果定義了VIDEO_LOGO和VIDEO_BMP_LOGO
編譯時會執行tools目錄下的bmp_logo程序,讀取"tools/logos/denx.bmp"文件,在include下生成bmp_logo.h文件


文件內容如下:

#define BMP_LOGO_WIDTH        160

#define BMP_LOGO_HEIGHT        96

#define BMP_LOGO_COLORS        31

#define BMP_LOGO_OFFSET        16

 

unsigned short bmp_logo_palette[] = {

    .......................

};

 

unsigned char bmp_logo_bitmap[] = {

    .......................

};

顯示logo函數就會調用這個數組中的數據,顯示到屏上


在cfb_console.c中定義了LOGO的屬性

#define VIDEO_LOGO_WIDTH    BMP_LOGO_WIDTH

#define VIDEO_LOGO_HEIGHT    BMP_LOGO_HEIGHT

#define VIDEO_LOGO_LUT_OFFSET    BMP_LOGO_OFFSET

#define VIDEO_LOGO_COLORS    BMP_LOGO_COLORS


這個bmp文件是有要求的,位深度必須為8位,大小也有限制(全屏圖片肯定是不行的,讀取文件的後半部數據都是0)
自己做個logo圖片,jpeg格式就可以,使用linux下的圖片工具轉成8位的bmp文件

jpegtopnm logo.jpg | ppmquant 31 | ppmtobmp -bpp 8 > denx.bmp
也可以搞個腳本,方便轉換

#!/bin/sh
jpegtopnm $1 | ppmquant 31 | ppmtobmp -bpp 8 > $2

用法:腳本 原始文件名 轉換後的文件名


三星平台默認使用denx.bmp文件,把自己的logo改成這個文件名,再編譯就行了


一個顯卡設備的結構體:
static GraphicDevice *pGD; /* Pointer to Graphic array */


GraphicDevice是表示顯示設備屬性的結構體
pGD代表的就是顯示設備


在xc2440_lcd.c驅動中,給pGD賦值

pGD->winSizeX = res_mode->xres;

    pGD->winSizeY = res_mode->yres;

    pGD->plnSizeX = res_mode->xres;

    pGD->plnSizeY = res_mode->yres;

    pGD->gdfBytesPP = 2;

    pGD->gdfIndex = GDF_16BIT_565RGB;

    pGD->frameAdrs = LCD_VIDEO_ADDR;

    pGD->memSize = VIDEO_MEM_SIZE;

顯存的地址:#define LCD_VIDEO_ADDR 0x33d00000  (in xc2440.h)
顯存的大小:#define VIDEO_MEM_SIZE   0x200000     (in xc2440_lcd.c)


在cfb_console.c中得到顯卡顯存的地址:
#define VIDEO_FB_ADRS        (pGD->frameAdrs)       

    video_fb_address = (void *)VIDEO_FB_ADRS
後面的操作就使用video_fb_address


在logo_plot函數中,顯示BMP_LOGO的流程 
(dest是指向video_fb_address的)

source = bmp_logo_bitmap;

logo_red = malloc (BMP_LOGO_COLORS);

logo_green = malloc (BMP_LOGO_COLORS);

logo_blue = malloc (BMP_LOGO_COLORS);

for (i = 0; i < VIDEO_LOGO_COLORS; i++) {

    logo_red[i] = (bmp_logo_palette[i] & 0x0f00) >> 4;

    logo_green[i] = (bmp_logo_palette[i] & 0x00f0);

    logo_blue[i] = (bmp_logo_palette[i] & 0x000f) << 4;

}

 

    while (ycount--) {

        xcount = VIDEO_LOGO_WIDTH;

        while (xcount--) {

            r = logo_red[*source - VIDEO_LOGO_LUT_OFFSET];

            g = logo_green[*source - VIDEO_LOGO_LUT_OFFSET];

            b = logo_blue[*source - VIDEO_LOGO_LUT_OFFSET];

            *(unsigned short *) dest = SWAP16 ((unsigned short) (((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3)));

        }

        source++;

        dest += VIDEO_PIXEL_SIZE;

    }

    dest += skip;


如果只定義VIDEO_LOGO,沒有定義VIDEO_BMP_LOGO
就使用LINUX_LOGO顯示,用到include/linux_logo.h中定義的數組,顯示的方式也不一樣

Copyright © Linux教程網 All Rights Reserved