跳转至

classb校验使用指南

1. 概述

classb校验指的是IEC 60730和IEC 60335的B类认证所需要的校验,这个校验将在uboot启动时运行,但是开关接口在userspace。

本文将介绍classb校验如何配置与使用。


2. 模块组成

本模块分为用户接口和校验本身。

用户接口位于kernel,用于开启开机自动运行classb校验。

而校验本身位于uboot,可以通过前面的用户接口自动运行,也可以在uboot通过命令行手动调起,并支持通过命令行注入错误。

2.1 用户接口

代码路径alkaid/kernel/drivers/sstar/msys/ms_msys.c

在kernel下make menuconfig进行配置,位于以下路径

Device Drivers  --->
    Sstar SoC platform drivers  --->
        [*]     ClassB Boot Control

2.2 校验本身

代码路径alkaid/boot/lib/CLASSB_LIB和alkaid/boot/lib/CLASSB_LIB_ARM

在boot下make menuconfig进行配置,位于以下路径

Library routines  --->
    [*] Support STL IEC60335/60730 CLASSB

3. 使用方法

3.1 开机自动校验

3.1.1 开启自动校验

使用下面命令开启,开启后,下一次重启时(必须是命令行重启,掉电重启会导致这个寄存器的标记丢失),uboot会运行classb校验。

注意这个校验会需要数分钟。

开启后只要不去关闭,每次重启都会运行校验。

/ # echo 1 > /sys/class/sstar/msys/classb_boot

3.1.2 关闭自动校验

使用下面命令关闭uboot启动时的classb自动校验

/ # echo 0 > /sys/class/sstar/msys/classb_boot

3.1.3 查看自动校验是否开启

/ # cat /sys/class/sstar/msys/classb_boot
0
/ # echo 1 > /sys/class/sstar/msys/classb_boot
/ # cat /sys/class/sstar/msys/classb_boot
1

3.2 手动校验

3.2.1 手动调起一次校验

SigmaStar # stl start


 *******  Self Test Library Init  *******
 Start-up CPU Test OK
 Start-up PC Self Test OK 
 Control Flow Checkpoint 1 OK
 Full RAM Test OK
 Clock frequency OK 
 Control Flow Checkpoint 2 OK 


 *******  Self Test Library Done  *******

SigmaStar # 

3.2.2 注入错误

注入错误的方式是:

stl inject_startup 检测项名称

一次只能注入一个错误

SigmaStar # stl inject_startup cpu
Running startup test with injected error: cpu


 *******  Self Test Library Init  *******

CLASSB_STARTUP_CPU_ERROR
 >>>>>>>>>> FailSafe Mode <<<<<<<<<<

可供注入的检测项有:cpu, pc, ram_march_c, clock_high, clock_low, checkpoint1

4. 自检项说明

自检入口位于alkaid/boot/lib/CLASSB_LIB/src/sgs_mcu_STLstartup.c的函数STL_StartUp

自检流程如下

4.1 cpu自检(STL_StartUpCPUTest)

该自检项使用汇编实现,代码位于alkaid/boot/lib/CLASSB_LIB_ARM/src/armv7/sgs_mcu_STLcpustartGCC.S,alkaid/boot/lib/CLASSB_LIB_ARM/src/armv8/sgs_mcu_STLcpustartGCC.S

目的是为了测试CPU的可读写寄存器是否读写正常,流程:

  1. 开始测试前,保存当前register值

  2. 分别对reg写0xAAAAAAAA、0x55555555,并检查是否有写进去。

  3. 如果发生错误,跳转到错误处理

  4. 需要用flow control进行保护。

  5. 退出时恢复register值

4.2 pc自检(STL_StartUpCpuPcSelfTest)

由于pc指向要执行的指令,直接修改pc值会导致程序跑飞,所以不能像验证其他寄存器一样直接更改再读取,只能使用执行对应地址的指令的办法来验证。

比如要将pc寄存器的值改为0x100000F0,我们可以在0x100000F0处放上一个特定的函数,调用这个函数时,pc就改成了0x100000F0。

将pc的bit2bit19分为两部分进行验证,bit2bit6,bit7~bit19。

Bit2~bit6使用下面两个地址

0x23E00080=0b1000111110000000000000 1000 0000
0x23E000FC=0b1000111110000000000000 1111 1100

bit7~bit19使用下面两个地址

0x23E00070=0b1000111110 0000 0000 0000 0111 0000
0x23EFFF80=0b1000111110 1111 1111 1111 1000 0000

自检时,分别调用这四个地址的函数,另每个函数返回固定值,只要每个函数返回了对应的值,就说明函数已经正确执行了,则代表通过了。

uint32_t STL_PcSelfTest1(int inject);
uint32_t STL_PcSelfTest2(int inject);
uint32_t STL_PcSelfTest3(int inject);
uint32_t STL_PcSelfTest4(int inject);

4.3 流程控制

这是一套软件机制,用于保证自检流程按照预期执行。具体实现如下图所示

有两个计数器,counter和counter_,它们是互补的,在检查开始时counter加上特定数字,检查结束后counter_减去这个数字,使得结束后依然互补

在特定的检查点检查计数器的值是否互补且符合预期,来确保流程按照预期进行。

4.4 内存自检

使用march-c算法,总共6个循环,流程如下:

  1. 第一个循环从低到高遍历所有待测RAM words,每个word填0x00000000。

  2. 第二个循环从低到高遍历所有待测RAM words,每次循环内先检查是否为0x00000000 ,再填上0xFFFFFFFF。

  3. 第三个循环从低到高遍历所有待测RAM words,每次循环内先检查是否为0xFFFFFFFF ,再填上0x00000000。

  4. 第四个循环从高到低遍历所有待测RAM words,每次循环内先检查是否为0x00000000 ,再填上0xFFFFFFFF。

  5. 第五个循环从高到低遍历所有待测RAM words,每次循环内先检查是否为0xFFFFFFFF ,再填上0x00000000。

  6. 第六个循环从高到低遍历所有待测RAM words,每次循环内先检查是否为0x00000000 。

自检区间0x20000000-0x23000000,0x28000000-0x60000000,避开了uboot和riscv使用的区间。本自检项耗时较长。

4.5 时钟自检

该测项使用芯片的主clk计算fro48M clk(一个与主clk完全独立的不同源clk)的频率,此功能由硬件实现,软件只需要配置寄存器即可。

将fro clk频率与预期值进行比较。如果与预期值相差+-10%以内,则代表通过。