(三)uboot移植--GSC3280芯片logo显示

        本文使用的uboot版本是2010.12版本。
一、logo显示调用流程
        在 (二)uboot移植中讲述了uboot执行的第二个步骤是进入board_init_r()函数,现在来讲述下logo显示的调用流程:
        board_init_r()->stdio_init()->drv_video_init()->video_init()
        在video_init()函数中,首先调用了video_hw_init()函数,该函数初始化GSC3280芯片的LCD控制器和GraphicDevice结构体。然后在video_init()函数中调用video_logo()函数显示logo图片。
        接下来主要讲述video_hw_init()和video_logo()函数。
二、GSC3280 LCD初始化
       芯片初始化包括初始化芯片内部控制寄存器和设置像素信息等。
       在uboot源码的根目录下, drivers/video/目录下建立gsc3280_lcdfb.c文件,video_hw_init()程序如下:

点击(此处)折叠或打开

  1. GraphicDevice fb;

  2. static void gsc3280_lcd_init(void)
  3. {
  4.     printf("init lcd sysctl\n");
  5.     lcdc_disable();
  6.     lcd_sysctl();
  7.     gsc3280_ctr_init();
  8.     lcdc_dma_init((void *)DEFAULT_VIDEO_HW_ADDR);
  9.     lcdc_monitor_para(0);
  10.     lcd_enable();
  11. }
  12. void *video_hw_init(void)
  13. {
  14.     memset(&fb, 0, sizeof(GraphicDevice));
  15.     fb.winSizeX = MAX_VIDEO_WIDTH_LEN;
  16.     fb.winSizeY = MAX_VIDEO_HIGH_LEN;
  17.     //over 16M from the head of kseg1, unmapped and uncacheable ddr2 address
  18.     fb.frameAdrs = DEFAULT_VIDEO_BASE_ADDR;
  19.     fb.plnSizeX = fb.winSizeX;
  20.     fb.plnSizeY = fb.winSizeY;
  21.     fb.gdfBytesPP = COLOR_PIXEL_SIZE / 8;
  22.     fb.gdfIndex = GDF_16BIT_565RGB;
  23.     fb.isaBase = 0;
  24.     fb.pciBase = 0;
  25.     fb.memSize = fb.winSizeX * fb.winSizeY * fb.gdfBytesPP;
  26.     /* Cursor Start Address */
  27.     fb.dprBase = 0;
  28.     fb.vprBase = 0;
  29.     fb.cprBase = 0;
  30.     gsc3280_lcd_init();
  31.     return &fb;
  32. }
三、logo图片显示原理
3.1、宏定义
          在显示图片时,需要定义一些相应宏,这些宏在显示流程中会被使用,这些宏包括:

点击(此处)折叠或打开

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

  7. #define CONFIG_GSC3280_LCD
  8. #define CONFIG_GSC3280_CMD_LCD
3.2、图片显示数据的制作
        如果定义了VIDEO_LOGO和VIDEO_BMP_LOGO宏,编译时会执行tools目录下的bmp_logo程序,读取"tools/logos/denx.bmp"文件,在include下生成bmp_logo.h文件。注意,bmp_logo.h文件是自动生成的,里面的数据和你设置的分辨率和denx.bmp图片具体内容有关
        bmp_logo.c文件中,有一个地点程序需要更改,如果不改,只能显示半屏数据,修改的是bmp_logo.c文件中main()函数语句,内容如下:

点击(此处)折叠或打开

  1. for (i=(b->height-1)*b->width; i>=0; i-=b->width) {
  2.         for (x = 0; x < b->width; x++) {
  3.             b->data[(uint32_t) i + x] = (uint8_t) fgetc (fp) \
  4.                         + DEFAULT_CMAP_SIZE;
  5.         }
  6.     }
        红色部分即为修改内容,原来为uint16_t。
3.3、制作bmp图片
        这个bmp文件是有要求的,位深度必须为8位,大小也有限制,自己做个logo图片,jpeg格式就可以,使用linux下的图片工具转成8位的bmp文件

点击(此处)折叠或打开

  1. jpegtopnm logo.jpg | ppmquant 31 | ppmtobmp -bpp 8 > denx.bmp
3.4、 video_logo()函数 说明
        在该函数中,会调用logo_plot (video_fb_address, VIDEO_COLS, 0, 0);函数,该函数的第一个参数即为内存中显存缓冲区的基地址。
        该函数较简单,如果显示的屏幕分辨率为800 * 480,那么实际上该函数有两个循环,内层循环循环800次,显示一行,外层循环循环480次,显示一张图片。
        注意,在调试中发现,需要将int ycount = video_logo_height;定义为volatile类型,否则会造成外层循环退不出来,即改为:volatile int ycount = video_logo_height;


你可能感兴趣的:(uboot)