网站地图 业务咨询:400-601-6788   联系我们
开放式开发平台
资料下载
教学培训
常见问题解答
技术文摘
 

400-601-6788
技术咨询: 点击这里和我在线联系
     线上留言      伙伴申请
     投递简历
 
  您的位置:首页 > 技术支持 > 技术文摘 >

 

uboot移植--GSC3280芯片logo显示 

 

 注: 本文使用的uboot版本是2010.12版本。

 

一、logo显示调用流程

     现在来讲述下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.   

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、宏定义

         在显示图片时,需要定义一些相应宏,这些宏在显示流程中会被使用,这些宏包括:

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.    

8.   #define CONFIG_GSC3280_LCD

9.   #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;。

 

原文请参见:http://blog.chinaunix.net/uid-25445243-id-4144347.html

 
联系我们  总机:010-82357611 传真:010-82357612
Copyright 2011 © 北京神州龙芯集成电路设计有限公司版权所有  京ICP备05080070号