信创SOC撸豹记

有一种创新叫信创,它代表着一种潮流,也代表着一个产业。随着这个产业的发展,越来越多的软件同行投身其中。

去年夏天有同行问,格蠹的挥码枪能不能调试信创的SOC芯片。我说没有测试过。

去年9月,我通过正规渠道联系了一家信创SOC大厂。很快对接上了一位经理,一番交流后,进入等待过程。今年1月,再次联系,他让我联系另一个经理。

两张截图

3月2日,格友亨利打电话给我,再次提到用挥码枪来调试信创SOC。更为重要的是,他不仅有想法,而且有行动,他先是搞到一块信创SOC的开发板,然后是搞到一套罗德巴赫的硬件调试器,再然后是用罗德巴赫的TRACE32软件把信创SOC中断到调试器里,并且给我发了两张截图。

亨特是随意触发中断,顺手做了截图,但其实,他的两张截图都是很有代表性的,两张截图反映的都是CPU在执行Linux内核代码的场景。第一张截图里包含了一组原子函数,里面包含了一条非常有特色的ARM64指令PRFM。

prfm pstl1strm, [x1]

PRFM的全称是prefetch from memory。在Linux内核源代码的arch/arm64目录下可以找到它们的家。

#define ATOMIC_OP(op, asm_op)                       \__LL_SC_INLINE void                         \__LL_SC_PREFIX(atomic_##op(int i, atomic_t *v))             \{                                   \    unsigned long tmp;                      \    int result;                         \                                    \    asm volatile("// atomic_" #op "\n"              \"   prfm    pstl1strm, %2\n"                    \"1: ldxr    %w0, %2\n"                      \"   " #asm_op " %w0, %w0, %w3\n"                \"   stxr    %w1, %w0, %2\n"                     \"   cbnz    %w1, 1b"                        \    : "=&r" (result), "=&r" (tmp), "+Q" (v->counter)        \    : "Ir" (i));                            \}                                   \__LL_SC_EXPORT(atomic_##op);

第二张截图对我来说是寻常见的,是CPU执行IDLE线程时的典型场景。图中有很多ARM64特色的系统寄存器,比如TPIDR_EL0,TPIDR_EL1等,它们都是CPU硬件为操作系统系统软件设计的特殊寄存器。

两种接口

亨特的两张截图激起了我的探索欲望,我问他用的什么接口。他说是10针的JTAG。

简单来说,ARM平台的调试接口有两种,一种是3线的SWD,另一种是6线的JTAG。

格蠹的挥码枪已经支持SWD,但是当时还不支持JTAG。

三月行动

一年四季中,春天最美好。春回大地,万物复苏,最能激发人的斗志。因为此,我在每一年春天,都愿意做一些基础性的“长线”投入。很多格友都知道,格蠹的大多数新产品都是在春天推出的。

JTAG支持是在挥码枪的发展路线图里的。就在这个春天里把它落地吧。

3月10日,GPU训练营结束后的一周,JTAG项目正式开始了。我先找了一个树莓派3的板子,准备用它做目标机。

选树莓派的原因是,格蠹的其它开发板大多数ARM板子都是SWD调试接口,而树莓派3是有JTAG接口的。

但是很快就发现树莓派3的几个问题。第一个问题是它的JTAG信号不是默认的,需要软件动态启用。根据多方的信息,可以通过config.txt文件启用。

[pi4]kernel=loop.bin[pi3]kernel=loop.bin[all]arm_64bit=1 enable_uart=1 uart_2ndstage=1 
enable_jtag_gpio=1gpio=22-27=a4init_uart_clock=48000000init_uart_baud=115200

上面文件中的如下两句是用于启用JTAG的:

enable_jtag_gpio=1gpio=22-27=a4

但是把配置文件复制到SD卡上后,发现系统起不来。

小伙伴Jerry换了很多种镜像,包括恢复基础固件。

基础固件的恢复是成功的 ,但最后还是无法启动Linux。而且感觉没有运行到启用JTAG的地方。因为使用OpenOCD和JLink扫描不到JTAG设备。

树莓派的玩家很多,按说应该很稳定啊,但它成了Jerry的噩梦,新老镜像尝试很多,都无济于事,无法启动到Linux。树莓派的HDMI接口是小口,特意找了一个小口的HDMI线,但是也只看到启动早期的画面,很快就黑屏了。几天下来,Jerry无可奈何,闷声不语。

现在回想起来,可能是供电的问题。我们用的是树莓派3,没有电源接口,只有USB Type-C供电,Jerry特别使用一个给手机充电的转换头来供电,也不管用。

ARM7开发板

使用树莓派3受挫后,我突然想起来一个很老的ARM7开发板,来自著名的“周立功单片机”,它的好处是有标准的JTAG口。

换上ARM7开发板后,很快有进展,OpenOCD可以扫描到一些信息。

geduer@lupan:~/openocd$ openocd -f jlink.cfg -f /usr/share/openocd/scripts/target/lpc2294.cfgOpen On-Chip Debugger 0.11.0Licensed under GNU GPL v2For bug reports, read        http://openocd.org/doc/doxygen/bugs.htmlDEPRECATED! use 'adapter driver' not 'interface'init_targetsInfo : Listening on port 6666 for tcl connectionsInfo : Listening on port 4444 for telnet connectionsWarning - assuming default core clock 12MHz! Flashing may fail if actual core clock is different.Info : auto-selecting first available session transport "jtag". To override use 'transport select <transport>'.Info : J-Link V10 compiled Jun  9 2020 13:38:07Info : Hardware version: 10.10Info : VTarget = 3.296 VInfo : clock speed 1500 kHzInfo : JTAG tap: lpc2294.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787 (<unknown>), part: 0xf1f0, ver: 0x4)Warn : JTAG tap: lpc2294.cpu       UNEXPECTED: 0x4f1f0f0f (mfg: 0x787 (<unknown>), part: 0xf1f0, ver: 0x4)Error: JTAG tap: lpc2294.cpu  expected 1 of 1: 0xffffffff (mfg: 0x7ff (<invalid>), part: 0xffff, ver: 0xf)Error: Trying to use configured scan chain anyway...Warn : Bypassing JTAG setup events due to errorsInfo : Embedded ICE version 4Info : lpc2294.cpu: hardware has 2 breakpoint/watchpoint unitsInfo : starting gdb server for lpc2294.cpu on 3333Info : Listening on port 3333 for gdb connections

仔细观察OpenOCD输出的信息,里面有两行错误。但是当时我没有在意,看到报告中检测到2个硬件断点就以为可以了。

全0错误

有了ARM7开发板可以提供JTAG调试目标后,我开始修改挥码枪的固件代码,增加JTAG信号支持。

新增的代码很快写好。但是调试时很不顺利,总是遇到错误。

CMSIS-DAP:Interface Initialised (JTAG)SWCLK/TCK= 1 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 0CMSIS-DAP:Interface readyclockspeed 12000 kHzcmsis-dap JTAG TLR_RESETcmsis-dap JTAG TLR_RESETJTAGscan chain interrogation failed: all zeroesCheckJTAG interface, timings, target power, etc.Tryingto use configured scan chain anyway...RK3588.cpu:IR capture error; saw 0x00 not 0x01cmsis-dap JTAG TLR_RESETBypassingJTAG setup events due to errorsInvalidACK (0) in DAP response

上面信息中,最关键的一句是:

scan chain interrogation failed: all zeroes

中文大意是:扫描链审问失败:都是0。

我在《软件调试》中详细介绍过JTAG的基本原理。它的思想非常简单,就是通过很基础的指令来执行读写操作。建立对话之初,它首先会对IDCODE寄存器,对于这个寄存器的结果,上层代码会执行一个审查逻辑:如果ID的所有比特位全是0或者全是1,便认为通信有问题,报告失败。

因为JTAG历史悠久,设备众多,有些设备可能没有很好的遵守标准,所以上层代码有逻辑忽略这个错误,但是如果真的有通信问题,那么后面的操作会连锁失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值