设为首页 加入收藏

TOP

U-Boot显示logo的方式
2014-11-24 12:05:09 来源: 作者: 【 】 浏览:0
Tags: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


在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中定义的数组,显示的方式也不一样


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux2.6.37.4在XC2440上移植成功 下一篇C语言 - 动态分配内存

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)