系统重启和原因获取使用参考


1. 概述

本文档介绍了SigmaStar平台进行系统重启,以及获取重启原因的接口和命令的使用方法。本平台SoC包含一颗ARM CPU和一颗RISCV CPU,支持重启整个SoC、单独重启ARM以及单独重启RISCV。

本平台在ARM上运行U-Boot/Linux,在RISCV上运行FreeRTOS。下面分别对U-Boot/Linux/FreeRTOS进行说明。

2. U-Boot API参考

API名 功能
drv_reboot_read_rtc_io1 读取RTC IO1的电平状态。
drv_reboot_read_rtc_io3 读取RTC IO3的电平状态。
drv_reboot_get_wakeup_source 获取系统的唤醒源。
drv_reboot_get_reason 获取重启原因。
drv_reboot_read_kernel_panic_flag 读取kernel panic标记。
drv_reboot_clear_kernel_panic_flag 清除kernel panic标记。
drv_reboot_reset 重启整个SoC。
drv_reboot_poweroff 让SoC下电。
drv_riscv_reset 停止RISCV FreeRTOS。
drv_riscv_start 启动RISCV FreeRTOS。
reboot reason枚举类型 定义
REBOOT_HW_RESET 表示Hardware Reset。
REBOOT_WDT_RESET 表示Watchdog Reset。
REBOOT_SW_RESET 表示Software Reset。
REBOOT_ARM_CORE_RESET 表示ARM Core Reset。
wakeup source枚举类型 定义
RTC_IO1_WAKEUP 表示唤醒源是RTC IO1。
RTC_IO3_WAKEUP 表示唤醒源是RTC IO3。
RTC_ALARM_WAKEUP 表示唤醒源是RTC ALARM。

2.1. drv_reboot_read_rtc_io1

  • 功能

    读取RTC IO1当前的电平状态。

  • 语法

    status = drv_reboot_read_rtc_io1();
    
  • 形参

  • 返回值

    • 0: 表示RTC IO1当前是低电平。

    • 1: 表示RTC IO1当前是高电平。

  • 依赖

    • 头文件:drivers/sstar/reboot/drv_reboot.h
  • 注意

2.2. drv_reboot_read_rtc_io3

  • 功能

    读取RTC IO3当前的电平状态。

  • 语法

    status = drv_reboot_read_rtc_io3();
    
  • 形参

  • 返回值

    • 0: 表示RTC IO3当前是低电平。

    • 1: 表示RTC IO3当前是高电平。

  • 依赖

    • 头文件:drivers/sstar/reboot/drv_reboot.h
  • 注意

2.3. drv_reboot_get_wakeup_source

  • 功能

    获取系统的唤醒源。

  • 语法

    wakeup_source = drv_reboot_get_wakeup_source();
    
  • 形参

  • 返回值

    • RTC_IO1_WAKEUP: 表示唤醒源是RTC IO1。

    • RTC_IO3_WAKEUP: 表示唤醒源是RTC IO3。

    • RTC_ALARM_WAKEUP: 表示唤醒源是RTC ALARM。

  • 依赖

    • 头文件:drivers/sstar/reboot/drv_reboot.h
  • 注意

2.4. drv_reboot_get_reason

  • 功能

    获取系统本次启动/重启的原因。

  • 语法

    reason = drv_reboot_get_reason();
    
  • 形参

  • 返回值

    • REBOOT_HW_RESET: 表示本次是硬件上电启动。

    • REBOOT_WDT_RESET: 表示本次是Watchdog触发的重启。

    • REBOOT_SW_RESET: 表示本次是软件触发的重启。

    • REBOOT_ARM_CORE_RESET: 表示本次是单独重启ARM触发的重启。

  • 依赖

    • 头文件:drivers/sstar/reboot/drv_reboot.h
  • 注意

2.5. drv_reboot_read_kernel_panic_flag

  • 功能

    读取kernel panic标记。

  • 语法

    status = drv_reboot_read_kernel_panic_flag();
    
  • 形参

  • 返回值

    • 0: 表示此次重启前没有发生kernel panic。

    • 1: 表示此次重启前发生了kernel panic。

  • 依赖

    • 头文件:drivers/sstar/reboot/drv_reboot.h
  • 注意

2.6. drv_reboot_clear_kernel_panic_flag

  • 功能

    清除kernel panic标记。

  • 语法

    drv_reboot_clear_kernel_panic_flag();
    
  • 形参

  • 返回值

  • 依赖

    • 头文件:drivers/sstar/reboot/drv_reboot.h
  • 注意

2.7. drv_reboot_reset

  • 功能

    重启整个SoC。

  • 语法

    drv_reboot_reset();
    
  • 形参

  • 返回值

  • 依赖

    • 头文件:drivers/sstar/reboot/drv_reboot.h
  • 注意

2.8. drv_reboot_poweroff

  • 功能

    让SoC下电。

  • 语法

    drv_reboot_poweroff();
    
  • 形参

  • 返回值

  • 依赖

    • 头文件:drivers/sstar/reboot/drv_reboot.h
  • 注意

2.9. drv_riscv_reset

  • 功能

    停止RISCV FreeRTOS。

  • 语法

    drv_riscv_reset();
    
  • 形参

  • 返回值

  • 依赖

    • 头文件:drivers/sstar/riscv/drv_riscv.h
  • 注意

    • 调用drv_riscv_reset()停止RISCV FreeRTOS之后,可以再调用drv_riscv_start()启动RISCV FreeRTOS。

2.10. drv_riscv_start

  • 功能

    启动RISCV FreeRTOS。

  • 语法

    drv_riscv_start();
    
  • 形参

  • 返回值

  • 依赖

    • 头文件:drivers/sstar/riscv/drv_riscv.h
  • 注意

    • 需要先调用drv_riscv_reset()停止RISCV FreeRTOS,然后再调用drv_riscv_start()启动RISCV FreeRTOS。

3. U-Boot 命令行参考

命令 功能
reboot io1 读取RTC IO1的电平状态。
reboot io3 读取RTC IO3的电平状态。
reboot wakeup_source 获取系统的唤醒源。
reboot reason 获取重启原因。
reboot kernel_panic 读取kernel panic标记。
reboot clear_kernel_panic 清除kernel panic标记。
reboot reset 重启整个SoC。
reboot poweroff 让SoC下电。
riscv stop 停止RISCV FreeRTOS。
riscv start 启动RISCV FreeRTOS。

3.1. 读取RTC IO1的电平状态

  • 命令

    reboot io1
    
  • 打印

    • "io1: 0" 表示RTC IO1当前是低电平。

    • "io1: 1" 表示RTC IO1当前是高电平。

  • 注意

3.2. 读取RTC IO3的电平状态

  • 命令

    reboot io3
    
  • 打印

    • "io3: 0" 表示RTC IO3当前是低电平。

    • "io3: 1" 表示RTC IO3当前是高电平。

  • 注意

3.3. 获取系统的唤醒源

  • 命令

    reboot wakeup_source
    
  • 打印

    • "wakeup source: io1" 表示唤醒源是RTC IO1。

    • "wakeup source: io3" 表示唤醒源是RTC IO3。

    • "wakeup source: alarm" 表示唤醒源是RTC ALARM。

  • 注意

3.4. 获取系统本次启动/重启的原因

  • 命令

    reboot reason
    
  • 打印

    • "reason: hw reset" 表示本次是硬件上电启动。

    • "reason: wdt reset" 表示本次是Watchdog触发的重启。

    • "reason: sw reset" 表示本次是软件触发的重启。

    • "reason: arm core reset" 表示本次是单独重启ARM触发的重启。

  • 注意

3.5. 读取kernel panic标记

  • 命令

    reboot kernel_panic
    
  • 打印

    • "kernel_panic: 0" 表示此次重启前没有发生kernel panic。

    • "kernel_panic: 1" 表示此次重启前发生了kernel panic。

  • 注意

3.6. 清除kernel panic标记

  • 命令

    reboot clear_kernel_panic
    
  • 打印

  • 注意

3.7. 重启整个SoC

  • 命令

    reboot reset
    
  • 打印

  • 注意

3.8. 让SoC下电

  • 命令

    reboot poweroff
    
  • 打印

  • 注意

3.9. 停止RISCV FreeRTOS

  • 命令

    riscv stop
    
  • 打印

  • 注意

    • 执行riscv stop停止RISCV FreeRTOS之后,可以再执行riscv start启动RISCV FreeRTOS。

3.10. 启动RISCV FreeRTOS

  • 命令

    riscv start
    
  • 打印

  • 注意

    • 需要先执行riscv stop停止RISCV FreeRTOS,然后再执行riscv start启动RISCV FreeRTOS。

4. Linux 命令行参考

命令 功能
reboot 重启整个SoC。
poweroff 让SoC下电。
cat /sys/class/sstar/msys/REBOOT_TYPE 获取重启原因。
cat /sys/class/sstar/msys/KERNEL_PANIC 读取kernel panic标记。
echo 2 > /sys/class/sstar/riscv/reset 停止RISCV FreeRTOS。
echo 1 > /sys/class/sstar/riscv/reset 重启RISCV FreeRTOS。

4.1. 重启整个SoC

  • 命令

    reboot
    
  • 打印

  • 注意

4.2. 让SoC下电

  • 命令

    poweroff
    
  • 打印

  • 注意

4.3. 获取重启原因

  • 命令

    cat /sys/class/sstar/msys/REBOOT_TYPE
    
  • 打印

    • "Reboot_Type: hard" 表示本次是硬件上电启动。

    • "Reboot_Type: watchdog" 表示本次是Watchdog触发的重启。

    • "Reboot_Type: reboot" 表示本次是软件触发的重启。

    • "Reboot_Type: arm_core" 表示本次是单独重启ARM触发的重启。

  • 注意

4.4. 读取kernel panic标记

  • 命令

    cat /sys/class/sstar/msys/KERNEL_PANIC
    
  • 打印

    • "Kernel_Panic: 0" 表示此次重启前没有发生kernel panic。

    • "Kernel_Panic: 1" 表示此次重启前发生了kernel panic。

  • 注意

4.5. 停止RISCV FreeRTOS

  • 命令

    echo 2 > /sys/class/sstar/riscv/reset
    
  • 打印

  • 注意

    • 执行echo 2 > /sys/class/sstar/riscv/reset停止RISCV FreeRTOS之后,可以再执行echo 1 > /sys/class/sstar/riscv/reset重启RISCV FreeRTOS。

4.6. 重启RISCV FreeRTOS

  • 命令

    echo 1 > /sys/class/sstar/riscv/reset
    
  • 打印

  • 注意

    • 直接执行echo 1 > /sys/class/sstar/riscv/reset的效果是重启RISCV FreeRTOS。

    • 可以先执行echo 2 > /sys/class/sstar/riscv/reset停止RISCV FreeRTOS,然后再执行echo 1 > /sys/class/sstar/riscv/reset重启RISCV FreeRTOS。

5. FreeRTOS API参考

API名 功能
drv_reboot_read_rtc_io1 读取RTC IO1的电平状态。
drv_reboot_read_rtc_io3 读取RTC IO3的电平状态。
drv_reboot_get_wakeup_source 获取系统的唤醒源。
drv_reboot_get_reason 获取重启原因。
drv_reboot_reset 重启整个SoC。
drv_reboot_reset_riscv 重启RISCV FreeRTOS。
drv_reboot_stop_arm 停止ARM Linux。
drv_reboot_reset_arm 重启ARM Linux。
drv_reboot_poweroff 让SoC下电。
reboot reason枚举类型 定义
REBOOT_HW_RESET 表示Hardware Reset。
REBOOT_WDT_RESET 表示Watchdog Reset。
REBOOT_SW_RESET 表示Software Reset。
REBOOT_RISCV_CORE_ACTIVE_RESET 表示RISCV Core主动Reset。
REBOOT_RISCV_CORE_PASSIVE_RESET 表示RISCV Core被动Reset。
wakeup source枚举类型 定义
RTC_IO1_WAKEUP 表示唤醒源是RTC IO1。
RTC_IO3_WAKEUP 表示唤醒源是RTC IO3。
RTC_ALARM_WAKEUP 表示唤醒源是RTC ALARM。

5.1. drv_reboot_read_rtc_io1

  • 功能

    读取RTC IO1当前的电平状态。

  • 语法

    status = drv_reboot_read_rtc_io1();
    
  • 形参

  • 返回值

    • 0: 表示RTC IO1当前是低电平。

    • 1: 表示RTC IO1当前是高电平。

  • 依赖

    • 头文件:sc/driver/sysdriver/reboot/drv/pub/drv_reboot.h
  • 注意

5.2. drv_reboot_read_rtc_io3

  • 功能

    读取RTC IO3当前的电平状态。

  • 语法

    status = drv_reboot_read_rtc_io3();
    
  • 形参

  • 返回值

    • 0: 表示RTC IO3当前是低电平。

    • 1: 表示RTC IO3当前是高电平。

  • 依赖

    • 头文件:sc/driver/sysdriver/reboot/drv/pub/drv_reboot.h
  • 注意

5.3. drv_reboot_get_wakeup_source

  • 功能

    获取系统的唤醒源。

  • 语法

    wakeup_source = drv_reboot_get_wakeup_source();
    
  • 形参

  • 返回值

    • RTC_IO1_WAKEUP: 表示唤醒源是RTC IO1。

    • RTC_IO3_WAKEUP: 表示唤醒源是RTC IO3。

    • RTC_ALARM_WAKEUP: 表示唤醒源是RTC ALARM。

  • 依赖

    • 头文件:sc/driver/sysdriver/reboot/drv/pub/drv_reboot.h
  • 注意

5.4. drv_reboot_get_reason

  • 功能

    获取系统本次启动/重启的原因。

  • 语法

    reason = drv_reboot_get_reason();
    
  • 形参

  • 返回值

    • REBOOT_HW_RESET: 表示本次是硬件上电启动。

    • REBOOT_WDT_RESET: 表示本次是Watchdog触发的重启。

    • REBOOT_SW_RESET: 表示本次是软件触发的重启。

    • REBOOT_RISCV_CORE_ACTIVE_RESET: 表示本次是单独重启RISCV触发的重启,并且发起者是RISCV FreeRTOS。

    • REBOOT_RISCV_CORE_PASSIVE_RESET: 表示本次是单独重启RISCV触发的重启,并且发起者是ARM Linux。

  • 依赖

    • 头文件:sc/driver/sysdriver/reboot/drv/pub/drv_reboot.h
  • 注意

5.5. drv_reboot_reset

  • 功能

    重启整个SoC。

  • 语法

    drv_reboot_reset();
    
  • 形参

  • 返回值

  • 依赖

    • 头文件:sc/driver/sysdriver/reboot/drv/pub/drv_reboot.h
  • 注意

5.6. drv_reboot_reset_riscv

  • 功能

    重启RISCV FreeRTOS。

  • 语法

    drv_reboot_reset_riscv();
    
  • 形参

  • 返回值

  • 依赖

    • 头文件:sc/driver/sysdriver/reboot/drv/pub/drv_reboot.h
  • 注意

5.7. drv_reboot_stop_arm

  • 功能

    停止ARM Linux。

  • 语法

    drv_reboot_stop_arm();
    
  • 形参

  • 返回值

  • 依赖

    • 头文件:sc/driver/sysdriver/reboot/drv/pub/drv_reboot.h
  • 注意

    • 调用drv_reboot_stop_arm()停止ARM Linux之后,可以再调用drv_reboot_reset_arm()重启ARM Linux。

5.8. drv_reboot_reset_arm

  • 功能

    重启ARM Linux。

  • 语法

    drv_reboot_reset_arm();
    
  • 形参

  • 返回值

  • 依赖

    • 头文件:drivers/sstar/riscv/drv_riscv.h
  • 注意

    • 直接调用drv_reboot_reset_arm()的效果是重启ARM Linux。

    • 可以先调用drv_reboot_stop_arm()停止ARM Linux,然后再调用drv_reboot_reset_arm()重启ARM Linux。

5.9. drv_reboot_poweroff

  • 功能

    让SoC下电。

  • 语法

    drv_reboot_poweroff();
    
  • 形参

  • 返回值

  • 依赖

    • 头文件:sc/driver/sysdriver/reboot/drv/pub/drv_reboot.h
  • 注意

6. FreeRTOS 命令行参考

命令 功能
reboot io1 读取RTC IO1的电平状态。
reboot io3 读取RTC IO3的电平状态。
reboot wakeup_source 获取系统的唤醒源。
reboot reason 获取重启原因。
reboot reset 重启整个SoC。
reboot reset_riscv 重启RISCV FreeRTOS。
reboot stop_arm 停止ARM Linux。
reboot reset_arm 重启ARM Linux。
reboot poweroff 让SoC下电。

6.1. 读取RTC IO1的电平状态

  • 命令

    reboot io1
    
  • 打印

    • "io1: 0" 表示RTC IO1当前是低电平。

    • "io1: 1" 表示RTC IO1当前是高电平。

  • 注意

6.2. 读取RTC IO3的电平状态

  • 命令

    reboot io3
    
  • 打印

    • "io3: 0" 表示RTC IO3当前是低电平。

    • "io3: 1" 表示RTC IO3当前是高电平。

  • 注意

6.3. 获取系统的唤醒源

  • 命令

    reboot wakeup_source
    
  • 打印

    • "wakeup source: io1" 表示唤醒源是RTC IO1。

    • "wakeup source: io3" 表示唤醒源是RTC IO3。

    • "wakeup source: alarm" 表示唤醒源是RTC ALARM。

  • 注意

6.4. 获取系统本次启动/重启的原因

  • 命令

    reboot reason
    
  • 打印

    • "reason: hw reset" 表示本次是硬件上电启动。

    • "reason: wdt reset" 表示本次是Watchdog触发的重启。

    • "reason: sw reset" 表示本次是软件触发的重启。

    • "reason: riscv core active reset" 表示本次是单独重启RISCV触发的重启,并且发起者是RISCV FreeRTOS。

    • "reason: riscv core passive reset" 表示本次是单独重启RISCV触发的重启,并且发起者是ARM Linux。

  • 注意

6.5. 重启整个SoC

  • 命令

    reboot reset
    
  • 打印

  • 注意

6.6. 重启RISCV FreeRTOS

  • 命令

    reboot reset_riscv
    
  • 打印

  • 注意

6.7. 停止ARM Linux

  • 命令

    reboot stop_arm
    
  • 打印

  • 注意

    • 执行reboot stop_arm停止ARM Linux之后,可以再执行reboot reset_arm重启ARM Linux。

6.8. 重启ARM Linux

  • 命令

    reboot reset_arm
    
  • 打印

  • 注意

    • 直接执行reboot reset_arm的效果是重启ARM Linux。

    • 可以先执行reboot stop_arm停止ARM Linux,然后再执行reboot reset_arm重启ARM Linux。

6.9. 让SoC下电

  • 命令

    reboot poweroff
    
  • 打印

  • 注意