无论任何时候都不要把你没有做过的事情想的太简单了!
在800x600分辨率的lcd上实现logo显示(平台wince4.2+smdk2440)。原来认为很简单的东西,不就是找个同样像素大小的图片,再找个工具将其转换成.c格式拷贝到framebuffer中去就行了。大体的过程是这样的。但是故事往往就发生在实际动手的过程中。下面说说我碰到的几个问题。
首先,我按照上面的办法做了,重新build,报错:堆太小,无法生成tupian.c的.obj文件,请用/Zm调整堆的大小。靠,在pb中找了一圈也没有找到在什么地方调整。在vc或者evc这样的编译器中倒是搞过这玩意,在pb里还真没玩过,不过我想应该在某个配置文件中。现在是在编译内核的时候出的鬼啊!没折,想别的法子了。想来想去,觉得在系统完全跑起来之前要显示图片无非就是将数据拷贝到framebuffer中去。靠,现在这个图片大了,我可以用个小点的啊,其余部分我随便写个数填到framebuffer中去。你别说,这样还真不错。
其次,在我的印象中unsigned short和unsigned char的长度是不一样的。在原来的用640*480的.c中用的是unsigned short数组,元素个数为307200,而我现在800*360的图片用unsigned char数组,个数为576000。上述两种情况在build os的时候第一种ok(先不说lcd实际显示结果如何),第二种挂掉了,还是堆太小。后来想想可能是因为几字节对齐问题,应该也可以调整的。
为什么framebuffer的大小要用X*Y*2来表示呢?在用工具将图片转换成.c数组的时候发现,一个像素要用两个byte来表示(这个应该和显示模式有关,我用的是16位真彩色)。
在cfw.c文件中实现的logo显示时间很短,因为kernel正在加载驱动,shell很快就起来了。然而在这两者之间,每次启动的时候都会发现有RGB三条色带闪一下。出现这个东西无非就是在什么地方给framebuffer里考了些东西。哈哈,突然想起了上一个帖子中的那段代码:
//for 800*600
for (index = 0; index < 800*600; index++)
{
if(index < 800*150)
{
ptr[index] = 0xf800;
}
else if(index < 800*150*2)
{
ptr[index] = 0x07e0;
}
else if(index < 800*150*3)
{
ptr[index] = 0x001f;
}
else
{
ptr[index] = 0xffff;
}
}
经过验证,0xf800就是红色,x07e0绿色,0x001f蓝色,0xffff白色,0x0000黑色。