linux启动图片与内核分离

本文详细阐述了如何在Linux内核环境下,通过修改内核配置和编译过程,实现将静态PPM文件从内核中删除,并将图片数组放入内存中,从而优化图片显示效果。包括内核源码的修改、图片数据的生成、图片和内核烧录到Flash的方法,以及启动参数的调整等步骤。

首先说一下环境:2.6.33-rc4, arm9运行, 640*480

基本思想就是将静态的ppm文件从内核中删除, 将生产的数组放到内存里, 步骤如下

1. 解压内核后, 修改 drivers/video/logo/Makefile

将 obj-$ 打头的只保留 obj-$(CONFIG_LOGO) += logo.o  

这样做的目的是去掉生成 xxx_logo_xxx.c的过程, 因为我们不需要了




2.linux显示图片是224色的,如果我们不去掉自动生成, 可以看到, 他会生成下面的结构体

const struct linux_logo logo_linux_clut224 = {

.type = LINUX_LOGO_CLUT224,

.width = 640,

.height = 480,

.clutsize = 217, //实际使用到的颜色数, 最多224

.clut = logo_linux_clut224_clut, //大小是clutsize*3, 作为调色板, 每个颜色存储rgb三个值

.data = logo_linux_clut224_data //640*480, 每个数值代表调色板中的索引

};

224色用到了调色板, 原理和256色bmp格式类似, 只是这里是224色

在drivers/video/logo/logo.c中, 增加定义

volatile static unsigned char* remapped_area;

static unsigned char clut[224*3]; //1~224色

static unsigned char data[640*480]; //大小固定

const struct linux_logo logo_buf = {

.type = 3,//LINUX_LOGO_CLUT224,

.width = 640,

.height = 480,

.clutsize = 224,

.clut = clut,

.data = data

};


修改函数

const struct linux_logo * __init_refok fb_find_logo(int depth)

{

struct linux_logo *logo = NULL;

if (nologo)

return NULL;

logo = &logo_buf;

remapped_area = (volatile unsigned char*) ioremap (0xc1700000,640*480+224*3+4); //我的uImage从0xc0700000, 这里向后移动16m, 足够内核用的

memcpy ( logo->data, remapped_area, 640*480 );

memcpy ( &logo->clutsize, remapped_area+640*480, 4 );

memcpy ( logo->clut, remapped_area+640*480+4, logo->clutsize * 3 );

iounmap ( remapped_area );

return logo;

}




3. 编译内核





4. 准备图片数据,

首先在windows用gimp做一个224色的ppm(asicc方式)图片(和以前类似), 放到linux的任意文件夹下, 如/tmp/1.ppm

在Linux内核下有个script/pnmtolog,

运行 ./你的内核源码/scripts/pnmtologo -t clut224 -n logo_linux_clut224 -o /tmp/1.c /tmp/1.ppm

生成的1.c和之前编译内核生成的 xxx_logo.c一样, 把logo_linux_clut224_data数组(640*480字节), 总颜色数(4字节)和logo_linux_clut224_clut数组(颜色数*3)

写入一个文件里 logo.dat



5. 将图片和内核烧进flash的不同地方



6. 修改启动参数 先读图片到 0xc1700000, 再读内核到0xc0700000 即可 (内存地址可以更换) 

评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值