Linux嵌入式开发——uboot添加logo显示功能

简介: Linux嵌入式开发——uboot添加logo显示功能

文章目录

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

点击“打开”按钮,导入设计好的logo图片:

20200109073947177.png

  • 可以看到该工具支持导入的格式限于“jpg”,“bmp”,“gif”,“ico”等格式,如果你的logo图片不是以上所支持的格式,可以通过windows自带的画图工具或photoshop等图像处理工具进行转换。如果,设计的logo图片的大小不是想显示的尺寸,也需要photoshop等工具对图片进行比例缩放。本示例中已经制作好了一个demo_logo.bmp的图片,所以直接使用工具打开该图片

制作logo图片数组文件

将图片制作成数组放在一个.c文件中,在u-boot中添加代码实现将数组数据存放到显存地址的存储空间中去,实现logo显示。


  • 如图:打开logo图片,设置输出的数据类型为“C语言数组(*.c)”

20200112080731762.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 << 16 | green << 8 | blue << 0;
            lcd_draw_pixel(i, j, color);
        }
#endif
}


在u-boot中添加logo显示函数调用

打开并修改u-boot源码中arch/arm/cpu/slsiap/common/cmd_draw_logo.c +408


  • 将fill_lcd函数中内容的修改成调用lcd_draw_logo()
extern void lcd_draw_logo();
static void fill_lcd(U32 FrameBase, int XResol, int YResol, U32 PixelByte)
{
  #if 0
 …  //原先的内容注释掉
#endif
    lcd_draw_logo(); //将来可以把自己的画各种图形的函数放在这里调用
}


  • 原始u-boot启动使用的函数就是fill_lcd,所以在这里添加logo显示即可。

修改common目录下的Makefile

将添加的文件添加到Makefile中,当执行make命令时能被编译链接,添加代码如下:


obj-y      += lcd_logo.o
obj-y      += demo_logo.o


编译u-boot

以上步骤完成以后,就可以进行make编译了,如果编译成功将生成ubootpak.bin的烧录文件,将新生成的ubootpak.bin文件复制到/tftpboot目录下,命名为

ubootpak_logo.bin,命令如下:
cd /opt/uboot
$make
$cp   ubootpak.bin /tftpboot/


烧写测试

通过tftp命令将有logo的ubootpak.bin下载到内存,然后让其写到emmc中,命令如下:


tarena # tftp  0x48000000   ubootpak.bin
tarena # mmc erase 0 1000
tarena # update_mmc 2 2ndboot  0x48000000   0x200  0x828f8

烧写完成后,复位T-PAD。在u-boot刚启动,串口工具中有打印信息时,LCD上显示logo。

20200109080141558.png

相关文章
|
8月前
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
417 32
|
10月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
2598 77
|
6月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
331 0
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
638 15
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
562 13
|
人工智能 Java 关系型数据库
Red Hat Enterprise Linux 9.5 发布下载,新增功能亮点概述
Red Hat Enterprise Linux 9.5 发布下载,新增功能亮点概述
818 4
Red Hat Enterprise Linux 9.5 发布下载,新增功能亮点概述
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
433 1
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
507 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
264 6
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
299 5