时间:2018-02-10
题记:关于uboot启动logo修改
背景:由于项目一部分的需要,需要在系统前期开机阶段就要显示logo,我使用的是全志T3开发板,uboot也是其相应的SDK,于是开始了这修改logo的尝试。
说明:最为初始的SDK的uboot是有启动logo的,也就是全志V40这个logo,但是这个logo的启动方式是:将logo放在一个uboot分区中,然后再启动的时候使用fat文件系统读数据的函数,从指定的地址将这个图片读取过来,然后进行相应的显示。
目标:我们不想划分额外的分区给这张图片,于是想将这张图片直接在编译阶段直接编译进uboot,方法就是将这张图片变成数组就好了。
下面是我在进行目标这个操作所总结的全志T3开发板uboot启动logo过程的分析,它和网上流传的ubootl启动ogo修改是不同的。
然后这里给出将(图片或)文件转化为数组的代码,供参考:
#include
#include
#include
#include
#include
#include
#define FILE_NAME "data.h"
int main (int argc, char *argv[])
{
FILE *fp;
FILE *fp1;
struct stat fileStat;
char *ptr =NULL;
char *head =NULL;
int i=1;
char uch ;
if(stat(argv[1], &fileStat)<0)
{
printf("Couldn't stat %s\n", argv[1]);
return -1;
}
printf("file size:%d\n",(int)fileStat.st_size);
fp = fopen(argv[1], "rb");
fp1 = fopen(FILE_NAME, "w");
if (!fp || !fp1) {
printf("error: open %s\n",argv[1]);
return -1;
}
if (fgetc (fp) != 'B' || fgetc (fp) != 'M')
{
printf ("Input file is not a bitmap\n");
return -1;
}
ptr = (char*)malloc(fileStat.st_size);
head = ptr;
fseek(fp, 0, SEEK_SET);
fprintf(fp1,"%s","unsigned char bmp_logo_bitmap[] = {\n");
while(!feof(fp))
{
if(fread(ptr,sizeof(char),1,fp)<0) //这里没用fgetc()是因为出现了一些问题
continue;
ptr ++;
}
while(head != ptr)
{
fprintf(fp1,"0x%02X,",0xff&(*head));
if(i%16==0)
fprintf(fp1,"%s","\n");
head++;
i++;
}
fprintf(fp1,"%s","}\n");
fclose(fp);
fclose(fp1);
return 0;
}
下面贴出修改后的是sunxi_bmp_display()代码:
int sunxi_bmp_display(char *name)
{
int ret = 0;
char *argv[6];
char bmp_head[32];
char bmp_name[32];
char *bmp_head_addr = (char *)bmp_data; //bmp_data 是一个数组的名字
ret = show_bmp_on_fb(bmp_head_addr, FB_ID_0);
if (0 != ret)
printf("show bmp on fb failed !\n");
return ret;
}
然后期间遇到了一个问题,就是显示方面遇到的问题。
问题描述:我把一张图片写入到framebuff,但是它只显示了图像中间的一部分,其它部分全都是黑浅色显示,可以明显的看到这张图片的轮廓,其图像如下:
就是图片写进framebuff却显示其中的一部分,这个bug,一开始弄得好心烦。
经过不小心的尝试,终于发现原因:
我用的是32位的bmp图像,原因是显示器要求32位的即ARGB8888,但是后面再看图像十六进制数据的时候,发现ARGB8888中的A全部是00,也就是图像的A的值为0,以下为A的对照表。A其实表示的是在RGB这图像上盖上了一层膜,a取值不同的时候,这层膜的透明度就会改变,所以当a=ff时相当于这层膜透明了,图像就全彩显示了。
//透明度;alpha 取值对照
100% — FF
95% — F2
90% — E6
85% — D9
80% — CC
75% — BF
70% — B3
65% — A6
60% — 99
55% — 8C
50% — 80
45% — 73
40% — 66
35% — 59
30% — 4D
25% — 40
20% — 33
15% — 26
10% — 1A
5% — 0D
0% — 00
而我遇到的问题就是,上面那张bmp图只有中间那个框的ARGB中的a不为0,所以中间就显示了那部分,其余部分都被盖住了。为什么会出现这个问题,可能是产生着张图片的工具的原因,而解决此问题的方法就是,在代码中把透明度的值打开让A=ff即可,该怎么实现就是在拷贝到framebuff时修改这个值就好了。
下图是成功后的图像:
over!