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的可读写寄存器是否读写正常,流程:
-
开始测试前,保存当前register值
-
分别对reg写0xAAAAAAAA、0x55555555,并检查是否有写进去。
-
如果发生错误,跳转到错误处理
-
需要用flow control进行保护。
-
退出时恢复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个循环,流程如下:
-
第一个循环从低到高遍历所有待测RAM words,每个word填0x00000000。
-
第二个循环从低到高遍历所有待测RAM words,每次循环内先检查是否为0x00000000 ,再填上0xFFFFFFFF。
-
第三个循环从低到高遍历所有待测RAM words,每次循环内先检查是否为0xFFFFFFFF ,再填上0x00000000。
-
第四个循环从高到低遍历所有待测RAM words,每次循环内先检查是否为0x00000000 ,再填上0xFFFFFFFF。
-
第五个循环从高到低遍历所有待测RAM words,每次循环内先检查是否为0xFFFFFFFF ,再填上0x00000000。
-
第六个循环从高到低遍历所有待测RAM words,每次循环内先检查是否为0x00000000 。
自检区间0x20000000-0x23000000,0x28000000-0x60000000,避开了uboot和riscv使用的区间。本自检项耗时较长。
4.5 时钟自检¶
该测项使用芯片的主clk计算fro48M clk(一个与主clk完全独立的不同源clk)的频率,此功能由硬件实现,软件只需要配置寄存器即可。
将fro clk频率与预期值进行比较。如果与预期值相差+-10%以内,则代表通过。