ULOG使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 09/11/2025

    1. 概述

    本文档介绍了SigmaStar平台ULOG功能的使用方法。ULOG是Uart Log的缩写,该模块可以将U-Boot的串口日志保存到emmc里。当U-Boot发生异常时,可以将日志数据dump出来协助debug。

    2. 功能描述

    ULOG功能,可以将U-Boot的串口日志保存到emmc的某个指定分区中。该模块运行时,会将uart log先保存到内存buffer中,在满足下列条件之一时会将buffer里的数据写入emmc:

    • 条件1:当buffer里的数据超过指定的size时

    • 条件2:当U-Boot处于console空闲状态的时间超过指定的timeout时

    此外,也可以调用特定API来主动将buffer里的数据立刻写入emmc。

    请注意:由于U-Boot是单线程且没有中断的,如果U-Boot在执行某个task时卡死,一段时间后被watchdog reset,这种情况下卡死前的日志无法写入emmc中。可以在执行关键task后主动调用ulog_flush()将buffer中的日志写入emmc。

    当日志写满ULOG分区时,会自动从ULOG分区开头位置以覆盖旧数据的方式继续写入新日志数据。

    3. U-Boot用法介绍

    3.1. U-Boot Config配置

    在编译U-Boot时需要选择的配置如下:

    make menuconfig
    #  [*] SigmaStar drivers  --->
    #        [*] SigmaStar Uart Log Driver  --->
    #              [*]   Ulog Default Status On
    #              (ulog) Ulog Partition Name
    #              (512) Ulog Flush Size (byte)
    #              (100) Ulog Flush Timeout (ms)
    #      Command line interface  --->
    #            SigmaStar common commands  --->
    #              -*- ulog
    #      General setup  --->
    #        -*- Enable malloc() pool before relocation
    #        (0x4000) Size of malloc() pool before relocation
    

    配置项说明:

    CONFIG 说明
    CONFIG_SSTAR_ULOG ULOG模块的总开关
    CONFIG_SSTAR_ULOG_DEFAULT_ON U-Boot启动时ULOG功能的默认状态(开启/关闭)
    CONFIG_SSTAR_ULOG_PARTITION_NAME 保存U-Boot日志的分区名
    CONFIG_SSTAR_ULOG_FLUSH_SIZE 日志buffer超过多大会自动写入emmc
    CONFIG_SSTAR_ULOG_FLUSH_TIMEOUT U-Boot处于console空闲状态超时多久会自动写入emmc
    CONFIG_CMD_SSTAR_ULOG 是否使能U-Boot命令行ulog命令
    CONFIG_SYS_MALLOC_F 是否使能early malloc()功能
    CONFIG_SYS_MALLOC_F_LEN early malloc() pool的大小,ULOG功能需要至少0x1000字节

    3.2. U-Boot命令行参考

    命令 功能
    ulog enable 开启ULOG功能,后面的U-Boot日志会写入emmc
    ulog disable 关闭ULOG功能,后面的U-Boot日志不会写入emmc

    3.3. U-Boot API参考

    API名 功能
    ulog_enable 开启ULOG功能
    ulog_disable 关闭ULOG功能
    ulog_flush 将buffer里的日志数据立刻写入emmc

    3.3.1. ulog_enable

    • 功能

      开启ULOG功能,后面的U-Boot日志会写入emmc。

    • 语法

      ulog_enable();
      
    • 形参

    • 返回值

    • 依赖

      • 头文件:drivers/sstar/ulog/drv_ulog.h
    • 注意

    3.3.2. ulog_disable

    • 功能

      关闭ULOG功能,后面的U-Boot日志不会写入emmc。

    • 语法

      ulog_disable();
      
    • 形参

    • 返回值

    • 依赖

      • 头文件:drivers/sstar/ulog/drv_ulog.h
    • 注意

    3.3.3. ulog_flush

    • 功能

      将buffer里的日志数据立刻写入emmc

    • 语法

      ret = ulog_flush();
      
    • 形参

    • 返回值

      • 0: 表示成功地将buffer里的所有日志数据写入emmc。

      • -1: 表示buffer里没有日志数据需要写入emmc。

    • 依赖

      • 头文件:drivers/sstar/ulog/drv_ulog.h
    • 注意

    4. 新增ULOG分区

    ULOG分区的名字要和U-Boot中CONFIG_SSTAR_ULOG_PARTITION_NAME的值相同。CONFIG_SSTAR_ULOG_PARTITION_NAME的默认值是"ulog"。

    在分区配置文件中新增ulog分区

    • 修改IMAGE_LIST

      IMAGE_LIST = boot riscvfw kernel rootfs misc miservice pstore vendor_storage ulog customer

    • 新增ulog分区

      # ulog
      ulog$(FSTYPE)           =   ulog
      ulog$(PATSIZE)          =   0x200000
      ulog$(PATNAME)          =   ulog
      ulog$(MOUNTTG)          =   /dev/mmcblk0p8
      

    5. Dump日志数据

    5.1. Dump方法

    当U-Boot发生异常时,可以将U-Boot日志数据从ULOG分区中dump出来,协助debug。下面介绍dump的步骤:

    Step 1. 确定ULOG分区在emmc中的位置。可以在U-Boot里执行mmc part命令来查看:

    上图显示ULOG分区(即ulog分区)在emmc中的起始地址是1070080,分区size是2MB。

    Step 2. 使用Flash Tool将ULOG分区的数据dump到本地PC:

    请注意:dump前要先关闭SoC的串口(U-Boot下敲"debug"并按回车,Linux下敲"11111"),并且断开PC的终端连接(Xshell/MobaXterm)。

    Dump成功的界面如下图所示:

    Dump成功后,数据会保存在Flash Tool目录里的EMMC_DATA_UDA.bin文件里。

    Step 3. 使用strings命令将数据转换成文本文档

    strings EMMC_DATA_UDA.bin > log.txt
    

    5.2. 日志内容格式

    ULOG功能会在每份U-Boot日志里添加一个id,用来标记日志的产生时间顺序。每次U-Boot启动该id会自动加一。用strings命令转换出来的文本文档,第一行的"LASTULOG:XXXXXX"记录了最新的日志id,方便开发人员快速定位到最新的日志。