zoukankan      html  css  js  c++  java
  • uboot显示logo的方式

    转:http://blog.chinaunix.net/uid-22030783-id-3257554.html

    本文使用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. unsigned short bmp_logo_palette[] = {
    6.     .......................
    7. };
    8. unsigned char bmp_logo_bitmap[] = {
    9.     .......................
    10. };
    显示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_ADDR0x33d00000  (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.     while (ycount--) {
    11.         xcount = VIDEO_LOGO_WIDTH;
    12.         while (xcount--) {
    13.             r = logo_red[*source - VIDEO_LOGO_LUT_OFFSET];
    14.             g = logo_green[*source - VIDEO_LOGO_LUT_OFFSET];
    15.             b = logo_blue[*source - VIDEO_LOGO_LUT_OFFSET];
    16.             *(unsigned short *) dest = SWAP16 ((unsigned short) (((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3)));
    17.         }
    18.         source++;
    19.         dest += VIDEO_PIXEL_SIZE;
    20.     }
    21.     dest += skip;
    如果只定义VIDEO_LOGO,没有定义VIDEO_BMP_LOGO
    就使用LINUX_LOGO显示,用到include/linux_logo.h中定义的数组,显示的方式也不一样
     
  • 相关阅读:
    DHT(Distributed Hash Table) Translator
    Introducing shard translator
    【转】shell脚本中echo显示内容带颜色
    javac 错误: 编码GBK的不可映射字符
    一致性哈希(consistent hashing)
    在bash shell中使用getfattr查看文件扩展属性
    css3在不同型号手机浏览器上的兼容一览表
    META是什么意思?
    JS异步加载的三种方式
    AJAX中的同步加载与异步加载
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/3339499.html
Copyright © 2011-2022 走看看