FIQ-Debugger
fiq debugger是集成到内核中的一种系统调试手段。
FIQ在arm架构中相当于nmi中断,fiq debugger把串口注册成fiq中断,在串口fiq中断服务程序中集成了一些系统调试命令。
一般情况下串口是普通的console模式,在串口工具下键盘输入 fiq,串口会切换到fiq debugger模式。
因为FIQ是不可屏蔽中断,所以这种调试手段适合调试cpu被hang住的情况,可以在hang住的时候用fiq debugger打印出cpu的故障现场,常用命令是sysrq,另一种情况是文件系统把 askconsole 关闭了,也是同样适用的。
要使用fiq debugger,需要内核配置:
CONFIG_FIQ_DEBUGGER // 使能fiq debugger
CONFIG_FIQ_DEBUGGER_CONSOLE // fiq debugger与console可以互相切换
CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE // 启动时默认串口在console模式
对于RK3568 4.19内核,在rk3568-linux.dtsi
中fiq_debugger节点配置如下。由于fiq_debugger
和普通串口互斥,在使能fiq_debugger
节点后必须禁用对应的普通串口uart节点。
chosen: chosen {
bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0";
};
fiq-debugger {
compatible = "rockchip,fiq-debugger";
rockchip,serial-id = <2>;
rockchip,wake-irq = <0>;
/* If enable uart uses irq instead of fiq */
rockchip,irq-mode-enable = <1>;
rockchip,baudrate = <1500000>; /* Only 115200 and 1500000 */
interrupts = <GIC_SPI 252 IRQ_TYPE_LEVEL_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&uart2m0_xfer>;
status = "okay";
};
&uart2 {
status = "disabled";
};
Fiq debugger相关使用命令:
debug> help
FIQ Debugger commands:
pc PC status
regs Register dump
allregs Extended Register dump
bt Stack trace
reboot [<c>] Reboot with command <c>
reset [<c>] Hard reset with command <c>
irqs Interupt status
sleep Allow sleep while in FIQ
nosleep Disable sleep while in FIQ
console Switch terminal to console
cpu Current CPU
cpu <number> Switch to CPU<number>
ps Process list
sysrq sysrq options
sysrq <param> Execute sysrq with <param>