Edit online

烧录进度条

4 Dec 2024
Read time: 5 minute(s)

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


/progress_bar

执行下列步骤,可在烧录时显示进度条和数字百分比:
  1. Luban-Lite 根目录下执行 scons --menuconfig, 进入 BootLoader 工程配置界面。

  2. 使能 SDCard/ Udisk 烧录功能。
    Bootloader options  --->
        Upgrading  --->
            [*] Upgrading by SD Card
            [*] Upgrading by UDISK
  3. 使能 Display Engine 并配置相关参数。
    Board options  --->
        [*] Using Display Engine (DE)
            Display Parameter  --->
    配置显示子系统参数,详情参考 Display 配置 ,屏幕参数需要与项目工程保持一致(背光除外)。
    注:
    • BootLoader 工程需要 GPIO 控制背光,不支持 PWM 调节亮度,其余屏幕参数需要与项目工程保持一致

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

  4. 使能烧录进度条命令

    Bootloader options  --->
        Commands  --->
            [*] boot progress bar
            [*]   fb console support (NEW)
            [ ]     only fb console (NEW)
    烧录进度条支持三种场景
    • 同时显示进度条和 fb console

    • 只显示进度条

    • 只显示 fb console

  5. 如需,可添加自定义配置,否则可略过。

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

自定义配置

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

自定义配置需要修改 SDK 源代码,源码路径 application/baremetal/bootloader/cmd/progress_bar.c
  • 进度条颜色
    修改宏定义:
    #define BAR_BACKGROUND_COLOR        0x00, 0xA2, 0xE9    // r, g, b
    #define BAR_FILL_COLOR              0x18, 0xD4, 0x0A
  • 进度条宽高
    • 进度条高度宏定义,以 pixel 为单位:
      #define BAR_HEIGHT                  35
    • 进度条宽度宏定义,进度条宽度自适应 LCD 分辨率,默认为 LCD 宽度的 5/6,配置不同的比例调整进度条宽度:
      #define WIDTH_SPLIT_NUMERATOR       5
      #define WIDTH_SPLIT_DENOMINATOR     6
  • 进度条位置
    修改进度条绘制逻辑,默认居中显示:
    void aicfb_draw_bar(unsigned int value)
    {
        ...
        bar_x     = (info.width - width) / 2;   // 居中显示
        bar_y     = (info.height - height) / 2;
        ...
    }
  • 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
  • fb console 显示位置

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

    void aicfb_draw_bar(unsigned int value)
    {
        ...
        console_x = info.width / 2;     // 居中显示
        console_y = bar_y + BAR_HEIGHT + 5;
        ...
    }
  • fb console 字体大小
    如需修改 fb console 字体大小:
    1. 提供新的字体数据源

      数据源保存路径 application/baremetal/bootloader/include/video_font_data.h

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

    2. 将数据源复制到数组中,并修改数据类型,默认数据类型为 uint32_t
      static uint32_t video_fontdata[VIDEO_FONT_SIZE] = {
          ...
          ...
      };
    3. 修改字体属性
      #define VIDEO_FONT_CHARS    96  // 支持的字符个数
      #define VIDEO_FONT_WIDTH    32  // 字体宽度,以 pixel 为单位
      #define VIDEO_FONT_HEIGHT   32  // 字体高度,以 pixel 为单位
    4. 修改 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;
               }
           }
       }