uboot修改启动logo-sunxi

时间: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修改是不同的。

uboot修改启动logo-sunxi_第1张图片

然后这里给出将(图片或)文件转化为数组的代码,供参考:

#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,但是它只显示了图像中间的一部分,其它部分全都是黑浅色显示,可以明显的看到这张图片的轮廓,其图像如下:

uboot修改启动logo-sunxi_第2张图片

就是图片写进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时修改这个值就好了。

下图是成功后的图像:

uboot修改启动logo-sunxi_第3张图片


over!



你可能感兴趣的:(linux应用移植,linux学习笔记)