文章目录 uboot添加logo显示概述 u-boot中添加logo操作步骤 获取bmp格式图片 制作logo图片数组文件 在u-boot中添加logo显示函数调用 修改common目录下的Makefile 编译u-boot 烧写测试 uboot添加logo显示概述用到的工具和代码链接:https://github.com/acbbghhgf/linux_drivers/tree/master/arm-base/uboot-logo uboot添加logo显示的原则:越早显示越好。logo本质就是一张图片,图片越小越好。LCD显示屏显示logo的硬件原理:内存控制器从显存后取需要显示的图像数据。内存控制器将图像数据丢给LCD控制器。LCD控制器将图像数据投射到LCD面板上,与其说是研究LCD显示屏,不如说是操作显存。只要将显存的数据进行修改,图像立刻发生变化。一帧图像(一张图片)由若干个像素点组成,并且每一个像素点都有唯一的一种颜色,而颜色又由红绿蓝(RGB)三元色组成,每一个颜色分量的范围都是0x00~0xff。u-boot中添加logo操作步骤获取bmp格式图片首先使用Image2Lcd工具将选好的logo图片转换成LCD显示使用的数据。 LCD的显示原理是通过对像素点RGB三基色的刷新,因此需要将先设计好的logo图片转换为bmp格式,然后再使用Image2Lcd工具来制作logo的数组文件,该工具运行如图-3所示: ![20200109073903983.png 20200109073903983.png](https://ucc.alicdn.com/pic/developer-ecology/ca4t6ntzh423w_421df40de9544e7bb3ad02df8962caf8.png)
点击“打开”按钮,导入设计好的logo图片: ![20200109073947177.png 20200109073947177.png](https://ucc.alicdn.com/pic/developer-ecology/ca4t6ntzh423w_e61b11bf3c184145bbd4b55c0007566b.png) 可以看到该工具支持导入的格式限于“jpg”,“bmp”,“gif”,“ico”等格式,如果你的logo图片不是以上所支持的格式,可以通过windows自带的画图工具或photoshop等图像处理工具进行转换。如果,设计的logo图片的大小不是想显示的尺寸,也需要photoshop等工具对图片进行比例缩放。本示例中已经制作好了一个demo_logo.bmp的图片,所以直接使用工具打开该图片制作logo图片数组文件将图片制作成数组放在一个.c文件中,在u-boot中添加代码实现将数组数据存放到显存地址的存储空间中去,实现logo显示。 如图:打开logo图片,设置输出的数据类型为“C语言数组(*.c)”![20200112080731762.png 20200112080731762.png](https://ucc.alicdn.com/pic/developer-ecology/ca4t6ntzh423w_8db68ce5f9e94bdcbadde62db2a59be3.png) 图片修改好后,保存成文件“demo_logo.c”,然后打开demo_logo.c文件后可以看到里面只要一个unsigned char 类型的数组,将该文件放到u-boot工程目录common下。并且将lcd显存操作代码也放到common下。lcd_logo.c//#define LCD_VIDEO_ADDR (0x28000000) // 显存地址
#define LCD_VIDEO_ADDR (0x46000000) // 显存地址
#define LCD_BASE (LCD_VIDEO_ADDR) // 显存地址
#define ROW (600) //LCD屏 行数
#define COL (1024) //LCD屏 列数
#define X0 (350) //图片显示的 X 起始位置
#define Y0 (200) //图片显示的 Y 起始位置
#define W (320) //logo图片高度
#define H (200) //logo图片宽度
extern const unsigned char gImage_demo_logo[];//刚刚生成的图片数据数组声明
// 描点
void lcd_draw_pixel(int row, int col, int color)
{
unsigned long * pixel = (unsigned long *)LCD_BASE;
*(pixel + row * COL + col) = color;
}
// 清屏
void lcd_clear_screen(int color)
{
int i, j;
for (i = 0; i < ROW; i++)
for (j = 0; j < COL; j++)
lcd_draw_pixel(i, j, color);
}
// 画图
void lcd_draw_logo()
{
int i, j;
unsigned char *p = (unsigned char *)gImage_demo_logo;//修改读取数据数组
int blue, green, red;
int color;
// 清屏
lcd_clear_screen(0x000000);
#if 1
// 图片大小320x200像素
for (i = Y0; i < (Y0 + H); i++)
for (j = X0; j < (X0 + W); j++)
{
blue = *p++;
green = *p++;
red = *p++;
color = red |