6.2.8. 烧录进度条

6.2.8.1. 概述

ZX 平台支持 SDCard / Udisk 烧录时显示进度条和数字百分比。进度条和数字百分比通过 CPU 进行绘制。 进度条默认居中,显示蓝绿两种颜色。数字百分比通过 fb console 实现,fb console 默认支持 32x32 点阵字体,ASCII 32 - 127。

../../../../_images/progress_bar.jpg

6.2.8.2. 使能配置

在 zx-rtt-sdk 根目录下执行 scons –menuconfig, 进入 BootLoader 工程配置界面

使能 SDCard/Udisk 烧录

Baremetal APP options  --->
    Bootloader options  --->
        Upgrading  --->
            [*] Upgrading by SD Card

使能 Display Engine

Board options  --->
    [*] Using Display Engine (DE)
        Display Parameter  --->

配置显示子系统参数,详情参考 参数配置 章节,屏幕参数需要与项目工程保持一致(背光除外)

备注

  • BootLoader 工程需要 GPIO 控制背光,不支持 PWM 调节亮度,其余屏幕参数需要与项目工程保持一致

  • framebuffer format 支持 argb8888 和 rgb565, 配置项 select framebuffer format (rgb565)  ---> , 推荐 rgb565 格式 ,内存占用小

使能烧录进度条命令

烧录进度条支持三种场景

  • 同时显示进度条和 fb console

  • 只显示进度条

  • 只显示 fb console

Baremetal APP options  --->
    Bootloader options  --->
        Commands  --->
            [*] boot progress bar
            (0)   progress bar rotate degress (0/90/270) (NEW)
            [ ]     only fb console (NEW)

6.2.8.3. 自定义配置

自定义配置支持修改进度条颜色、进度条宽高、进度条位置、fb console 字体颜色、fb console 字体大小。

自定义配置需要修改 SDK 源代码,源码路径:

application/baremetal/bootloader/cmd/progress_bar.c

6.2.8.3.1. 进度条颜色

修改宏定义

#define BAR_BACKGROUND_COLOR        0x00, 0xA2, 0xE9    // r, g, b
#define BAR_FILL_COLOR              0x18, 0xD4, 0x0A

6.2.8.3.2. 进度条宽高

进度条高度宏定义,以 pixel 为单位

#define BAR_HEIGHT                  35

进度条宽度宏定义,进度条宽度自适应 LCD 分辨率,默认为 LCD 宽度的 5/6,配置不同的比例调整进度条宽度

#define WIDTH_SPLIT_NUMERATOR       5
#define WIDTH_SPLIT_DENOMINATOR     6

6.2.8.3.3. 进度条位置

修改进度条绘制逻辑,默认居中显示

void aicfb_draw_bar(unsigned int value)
{
    ...
    bar_x     = (info.width - width) / 2;   // 居中显示
    bar_y     = (info.height - height) / 2;
    ...
}

6.2.8.3.4. fb console 字体颜色

fb console 支持 16 种颜色,通过宏定义指定

enum color_idx {
    CONSOLE_BLACK = 0,
    CONSOLE_RED,
    CONSOLE_GREEN,
    CONSOLE_BROWN,
    CONSOLE_BLUE,
    CONSOLE_MAGENTA,
    CONSOLE_CYAN,
    CONSOLE_LIGHT_GRAY,
    CONSOLE_GRAY,
    CONSOLE_LIGHT_RED,
    CONSOLE_LIGTH_GREEN,
    CONSOLE_YELLOW,
    CONSOLE_LIGHT_BLUE,
    CONSOLE_LIGHT_MAGENTA,
    CONSOLE_LIGHT_CYAN,
    CONSOLE_WHITE,
    CONSOLE_COLOR_COUNT
};

字体颜色宏定义

#define CONSOLE_COLOR_FG            CONSOLE_LIGHT_GRAY
#define CONSOLE_COLOR_BG            CONSOLE_BLACK

6.2.8.3.5. fb console 显示位置

修改 fb console 逻辑,默认居中显示

void aicfb_draw_bar(unsigned int value)
{
    ...
    console_x = info.width / 2;     // 居中显示
    console_y = bar_y + BAR_HEIGHT + 5;
    ...
}

6.2.8.3.6. fb console 字体大小

字体数据源

fb console 字体大小修改需要提供新的字体点阵数据源,数据源保存路径:

application/baremetal/bootloader/include/video_font_data.h

可通过点阵字库工具导出点阵数据,推荐第三方开源工具 点阵字库生成工具

将数据源复制到数组中,并修改数据类型,默认数据类型为 uint32_t

static uint32_t video_fontdata[VIDEO_FONT_SIZE] = {
    ...
    ...
};

修改字体属性

#define VIDEO_FONT_CHARS    96  // 支持的字符个数
#define VIDEO_FONT_WIDTH    32  // 字体宽度,以 pixel 为单位
#define VIDEO_FONT_HEIGHT   32  // 字体高度,以 pixel 为单位

修改 fb console 逻辑

节选部分代码,需要重新指定数据索引,数据类型和掩码

static void aicfb_console_putc(struct aicfb_screeninfo *info,
     unsigned int x, unsigned int y, char ch)
{
    int pbytes = info->bits_per_pixel / 8;
    int i, row;
    void *line;

    line = (unsigned char *)(info->framebuffer + y * info->stride + x * pbytes);

    for (row = 0; row < VIDEO_FONT_HEIGHT; row++) {
        unsigned int idx = (ch - 32) * VIDEO_FONT_HEIGHT + row; // 根据新数据源重新索引
        uint32_t bits = video_fontdata[idx];    // 修改数据类型

        switch (info->format) {
        case MPP_FMT_RGB_565:
        {
            uint16_t *dst = line;

            for (i = 0; i < VIDEO_FONT_WIDTH; i++) {
                *dst++ = (bits & 0x80000000) ? colour_fg : colour_bg; // 根据数据类型修改掩码 0x80000000
                bits <<= 1;
            }
            break;
        }
        case MPP_FMT_ARGB_8888:
        {
            uint32_t *dst = line;

            for (i = 0; i < VIDEO_FONT_WIDTH; i++) {
                *dst++ = (bits & 0x80000000) ? colour_fg : colour_bg; // 根据数据类型修改掩码 0x80000000
                bits <<= 1;
            }
            break;
        }
    }
}

6.2.8.4. 常见问题

1. menuconfig 配置中未出现 BootLoader options 选项

Bootloader options  --->

当前未处于 BootLoader 工程,需要切换到 BootLoader 工程

2. 重编 BootLoader 工程后配置未生效

BootLoader 工程编译后需要再次编译项目工程

3. 烧录过程未显示 fb console

检查 zx-rtt-sdk 版本,v1.0.4 及以上版本支持 fb console

4. 烧录过程屏幕不亮

  • BootLoader 工程需要 GPIO 控制背光,不支持 PWM 调节亮度

  • 检查 display 参数配置,确认 BootLoader 工程与项目工程配置一致(背光除外)

5. 串口输出 alloc fb0 failed

BootLoader 内存不足
  • 推荐 RGB565 格式,减少内存占用

  • 修改 BootLoader 工程的 ld 链接文件,增大内存 heap

以 ZXM3A7D0_bootloader 工程为例,其 ld 链接文件路径为:

application/baremetal/bootloader/ldscript/m3a_bootloader_gcc.ld.S

调整内存 heap

MEMORY
{
    /* The last 256KB for bootloader */
    SRAM_SW     : ORIGIN = 0x30040000, LENGTH = 0x8000
    PSRAM_BOOT_SW : ORIGIN = 0x40400100, LENGTH = 0x200000
}

备注

部分工程支持 menuconfig 配置内存 heap,注意是否存在宏定义

6. 调整内存 heap 起始地址后无法烧录

未调整 BootLoader 加载/启动地址,BootLoader 无法正确运行。

以 ZXM3A7D0_bootloader 工程为例,调整 BootLoader 加载/启动地址

//target/m3a/ZXM3A7D0/pack/image_cfg.json

"bootloader.aic": {
            ...
            "loader": {
                ...
                "load address ext": "0x40400000",
                "entry point ext":  "0x40400100",
            },
            ...

7. fb console 字体显示偏瘦或颜色不对

  • fb console 数据类型与数据源不匹配。

    当前 fb console 框架支持宽度为 8/16/32/64 的字体 ,对应的数据类型分别为 uint8_t/uint16_t/uint32_t/uint64_t

  • 数据掩码与数据类型不匹配

    数据类型 uint8_t/uint16_t/uint32_t/uint64_t 对应的数据掩码分别为 0x80/0x8000/0x80000000/0x8000000000000000