uboot顯示logo的方式

kunkliu發表於2020-04-05

轉載地址:https://blog.csdn.net/jibazishinibushiwo/article/details/79625147

原文地址:uboot顯示logo的方式

 

本文使用uboot2010.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

 

在config標頭檔案中(xc2440.h)定義和LCD LOGO相關的巨集

 

  1. #define CONFIG_CMD_BMP 
  2. #define CONFIG_VIDEO 
  3. #define CONFIG_VIDEO_S3C2410 
  4. #define CONFIG_VIDEO_LOGO
  5. #define CONFIG_VIDEO_BMP_LOGO
  6. #define VIDEO_FB_16BPP_WORD_SWAP

如果定義了VIDEO_LOGO和VIDEO_BMP_LOGO

編譯時會執行tools目錄下的bmp_logo程式,讀取"tools/logos/denx.bmp"檔案,在include下生成bmp_logo.h檔案

 

檔案內容如下:

 

  1. #define BMP_LOGO_WIDTH        160
  2. #define BMP_LOGO_HEIGHT        96
  3. #define BMP_LOGO_COLORS        31
  4. #define BMP_LOGO_OFFSET        16
  5.  
  6. unsigned short bmp_logo_palette[] = {
  7.     .......................
  8. };
  9.  
  10. unsigned char bmp_logo_bitmap[] = {
  11.     .......................
  12. };

顯示logo函式就會呼叫這個陣列中的資料,顯示到屏上

 

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

 

  1. #define VIDEO_LOGO_WIDTH    BMP_LOGO_WIDTH
  2. #define VIDEO_LOGO_HEIGHT    BMP_LOGO_HEIGHT
  3. #define VIDEO_LOGO_LUT_OFFSET    BMP_LOGO_OFFSET
  4. #define VIDEO_LOGO_COLORS    BMP_LOGO_COLORS

 

這個bmp檔案是有要求的,位深度必須為8位,大小也有限制(全屏圖片肯定是不行的,讀取檔案的後半部資料都是0)

自己做個logo圖片,jpeg格式就可以,使用linux下的圖片工具轉成8位的bmp檔案

 

  1. jpegtopnm logo.jpg | ppmquant 31 | ppmtobmp -bpp 8 > denx.bmp

也可以搞個指令碼,方便轉換

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

用法:指令碼 原始檔名 轉換後的檔名

 

三星平臺預設使用denx.bmp檔案,把自己的logo改成這個檔名,再編譯就行了

 

一個顯示卡裝置的結構體:

static GraphicDevice *pGD; /* Pointer to Graphic array */

 

GraphicDevice是表示顯示裝置屬性的結構體

pGD代表的就是顯示裝置

 

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

 

  1. pGD->winSizeX = res_mode->xres;
  2.     pGD->winSizeY = res_mode->yres;
  3.     pGD->plnSizeX = res_mode->xres;
  4.     pGD->plnSizeY = res_mode->yres;
  5.     pGD->gdfBytesPP = 2;
  6.     pGD->gdfIndex = GDF_16BIT_565RGB;
  7.     pGD->frameAdrs = LCD_VIDEO_ADDR;
  8.     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中得到顯示卡視訊記憶體的地址:

  1. #define VIDEO_FB_ADRS        (pGD->frameAdrs)        
  2.     video_fb_address = (void *)VIDEO_FB_ADRS

後面的操作就使用video_fb_address

 

在logo_plot函式中,顯示BMP_LOGO的流程

(dest是指向video_fb_address的)

 

  1. source = bmp_logo_bitmap;
  2. logo_red = malloc (BMP_LOGO_COLORS);
  3. logo_green = malloc (BMP_LOGO_COLORS);
  4. logo_blue = malloc (BMP_LOGO_COLORS);
  5. for (i = 0; i < VIDEO_LOGO_COLORS; i++) {
  6.     logo_red[i] = (bmp_logo_palette[i] & 0x0f00) >> 4;
  7.     logo_green[i] = (bmp_logo_palette[i] & 0x00f0);
  8.     logo_blue[i] = (bmp_logo_palette[i] & 0x000f) << 4;
  9. }
  10.  
  11.     while (ycount--) {
  12.         xcount = VIDEO_LOGO_WIDTH;
  13.         while (xcount--) {
  14.             r = logo_red[*source - VIDEO_LOGO_LUT_OFFSET];
  15.             g = logo_green[*source - VIDEO_LOGO_LUT_OFFSET];
  16.             b = logo_blue[*source - VIDEO_LOGO_LUT_OFFSET];
  17.             *(unsigned short *) dest = SWAP16 ((unsigned short) (((r >> 3) << 11) | ((g >> 2)<< 5) | (b >> 3)));
  18.         }
  19.         source++;
  20.         dest += VIDEO_PIXEL_SIZE;
  21.     }
  22.     dest += skip;

 

如果只定義VIDEO_LOGO,沒有定義VIDEO_BMP_LOGO

就使用LINUX_LOGO顯示,用到include/linux_logo.h中定義的陣列,顯示的方式也不一樣

相關文章