a、 修改kernel下获取LOGO数据源码,不在读取内核中文件数据,而是读取内存中固定地址位置数据;(最好是不影响其他LOGO编译选项,添加新的CONFIG选项来实现)
在“driver/video/logo/”下打开logo.c文件,增加定义
#ifdef CONFIG_LOGO_CLUT224_OUT_UIMAGE //宏定义通过在Kconfig文件中添加
volatile static unsigned char* remapped_area;
static unsigned char clut[224*3]; //1~224色
static unsigned char data[480*800]; //大小固定
const struct linux_logo logo_buf = {
.type = 3, //LINUX_LOGO_CLUT224,
.width = 480,
.height = 800,
.clutsize = 224,
.clut = clut,
.data = data
};
#endif // CONFIG_LOGO_CLUT224_OUT_UIMAGE
修改函数
const struct linux_logo * __init_refok fb_find_logo(int depth)
{
struct linux_logo *logo = NULL;
if (nologo)
return NULL;
#ifdef CONFIG_LOGO_CLUT224_OUT_UIMAGE //宏定义通过在Kconfig文件中添加
logo = &logo_buf;
remapped_area = (volatile unsigned char*) ioremap (0xc1700000,640*480+224*3+4); //我的uImage从0x80700000, 这里向后移动16m, 足够内核用的
memcpy ( logo->data, remapped_area, 480*800 );
memcpy ( &logo->clutsize, remapped_area+480*800, 4 );
memcpy ( logo->clut, remapped_area+480*800+4, logo->clutsize * 3 );
iounmap ( remapped_area );
return logo;
#endif // CONFIG_LOGO_CLUT224_OUT_UIMAGE
}
b、 编译内核(也可以单独给LOGO写一个分区在内核中,不影响);
c、 使用GIMP工具制作LOGO文件(PPM格式,不再赘述);
d、 使用kernel源码下提供的工具将PPM生成.c文件(同源码下编译时生成的文件完全一样);
scripts/pnmtologo -t clut224 -n logo_linux_clut224 -o /tmp/1.c /tmp/1.ppm
e、 将生成的LOGO的C文件根据自己写的程序生成bin文件(注意和kernel下修改的读取数据顺序保持一致);
将上一步生成的.c文件,和转换使用的其他源码放在一起,修改.c文件(修改包含头文件,同时去掉三个结构体的关键字“__initdata”),默认.c文件名称为logo_linux_clut224.c,如果是其他名称,需要修改Makefile文件
在Linux环境下,执行make命令生成,生成可执行程序“clut224_c2bin”,然后运行程序“clut224_c2bin”生成可以写入Flash的bin文件,详见附件。
(没有找到插入附件方法,实现附件保存在本地)
f、 (进行到此步骤后,可以进行验证是否可行:将修改后的kernel烧录启动,此时没有LOGO显示,在uboot菜单下使用nand命令写入到Flash区域,断电重启,在菜单下将LOGO数据通过nand read命令读取到内存中,示例如下:
例如:LOGO数据在Flash物理地址为0x1cc00000,大小0x100000(1M);
读取到内存地址为0x81700000,kernel从此地址读取LOGO数据
Tftp 0x81700000 logo.bin //将转换后的LOGO的bin数据下载到内存
Nand erase 0x1cc00000 0x100000 //擦除要写入LOGO数据的区域
Nand write 0x81700000 0x1cc00000 0x100000 //写入LOGO数据
断电重启,进入uboot菜单; //如果直接启动,不显示LOGO
Nand read 0x81700000 0x1cc00000 0x100000 //将LOGO从Flash读取到内存
Boot //正常启动,可以显示LOGO
此时就可以正常显示LOGO数据
)
g、 修改uboot源码,将LOGO数据读取到内存固定地址;
Common/main.c下修改main_loop函数,如下
Void main_loop(void)
{
Char strLogoRead[] = “nand read 0x81700000 0x1cc00000 0x100000”;
。。。。。。
Run_command(strLogoRead, 0); //在执行bootcmd命令加载kernel之前加载LOGO;
Run_command(s, 0); //执行bootcmd命令加载kernel;
。。。。。。
}