Linux下将LOGO放在uImage外引导实现方法

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);     //需要确定存放LOGO数据的具体地址
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

pnmtologo语法
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”;//我的uImage从0x80700000, 这里向后移动16m, 足够内核用的
    。。。。。。
    Run_command(strLogoRead, 0);     //在执行bootcmd命令加载kernel之前加载LOGO;
    Run_command(s, 0);          //执行bootcmd命令加载kernel;
    。。。。。。
}

h、后来,觉得这样太复杂,每次OEM,都需要自己参与,所以自己写了bmp到clut224的bin格式数据的转换的程序,主要参考了下面两个链接,多谢网友(hello)的指点。
BMP转换为PPM,然后PPM转换为kernel下生成的.c程序,然后又使用自定义格式的转换,生成了bin格式数据。

i、在kernel下分配logo分区,开机后可以通过命令写入(测试可以正常使用);
flash_eraseall /dev/mtd7
nandwrite -pn /dev/mtd7 logo.bin

注意:如果没有写入logo数据时,烧写分离出LOGO的kernel,会导致系统启动不了,但是没有LOGO分区,又不能通过此种方法写入logo。所以原来系统版本升级到此版本方法,制作一个带有logo分区和logo没有从kernel下分离的系统作为中间版本,先烧写中间版本,然后写入LOGO数据,最后升级正式版本。

参考链接:
LOGO与uImage分离方法
Linux下对LOGO的支持及替换

BMP与PPM格式转换
pnmtologo.c源码

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值