uboot show logo
2014-02-18 14:39
369 查看
本文使用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相关的宏
#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中定义的数组,显示的方式也不一样
首先需要有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中定义的数组,显示的方式也不一样
相关文章推荐
- u-boot之开机logo篇
- Android 动态logo bootanimation.zip 制作
- Linux Boot logo 图片的修改
- am3359 u-boot显示logo
- 修改u-boot的开机logo及显示过程
- Create a Custom Boot Logo for Windows Vista
- x4412开发板&ibox卡片电脑项目实战4-在uboot中添加开机LOGO
- 修改u-boot的开机logo及显示过程
- U-boot中设置开机logo的方法
- uboot keep logo
- 制作uboot LCD开机logo以及lcd字符显示错误的解决方法
- u-boot logo全屏显示
- show boot 命令也可以用
- Kernel logo到Bootanimaiton显示之源码分析
- 自定义u-boot启动logo的方法
- 从U-Boot显示Logo到Android
- android添加动态logo之bootanimation.zip制作 --- 小V
- [转]imx6 uboot logo 更改
- 关于freescale开机第一帧画面,即bootlogo
- 实现uboot到内核logo的持续显示