文章摘要
今年2月,高通悄然发布了与EUD(嵌入式USB调试)交互的源代码。EUD是自2018年以来几乎所有高通SoC内置的调试接口,深度集成于SoC内部,不仅支持CPU调试,还适用于Hexagon协处理器/DSP。通过简单的寄存器写入和USB物理层启动,非生产设备(如开发板)即可启用EUD,在PC上呈现为一个7端口USB集线器,其中包含“EUD控制接口”。通过特定USB命令,还可暴露SWD接口,实现无需外部工具或昂贵调试器的封闭式调试,功能强大,甚至超越Google的Suzy-Q。JTAG和SWD均为设备内核调试机制,类似于GDB或IDE集成调试器,支持断点设置、执行暂停和状态检查。
文章总结
今年2月,高通(Qualcomm)悄然发布了与EUD(Embedded USB Debug)交互的源代码,这是他们近期最令人兴奋的举措之一,特别是对于那些花费大量时间调试内核或U-Boot的开发者来说。以下是文章的主要内容总结:
1. EUD简介
- EUD(Embedded USB Debug)是高通自2018年以来几乎所有SoC中内置的调试接口。它深度集成在SoC内部,不仅为CPU提供调试功能,还支持Hexagon协处理器/DSP的调试。
- 通过写入几个寄存器并启动USB物理层,可以在非生产设备(如开发板)上启用EUD。启用后,PC上会显示一个7端口的USB集线器,其中一个端口为“EUD控制接口”。
- 通过适当的USB命令,还可以暴露一个SWD(Serial Wire Debug)接口,允许通过USB电缆进行调试,无需外部工具或昂贵的调试器。
2. 代码发布
- 高通此前在CodeLinaro上发布了一个支持EUD集成的OpenOCD分支,但依赖于当时专有的EUD库,仅限高通员工和OEM合作伙伴使用。
- 去年8月,有人尝试为一些新平台扩展EUD支持,引发了关于Linux内核政策的讨论:是否允许在Linux中包含仅限内部使用的驱动程序?最终,高通在8个月后发布了EUD的源代码,并更新了OpenOCD分支以指向现在开源的库。
3. 代码修复与集成
- 发布的代码在Ubuntu 20.10和高通的GCC 8.x工具链上可以正常构建,但在其他环境下需要一些修复。经过一些小的修改后,代码成功构建并提交到高通的代码库。
- 高通对OpenOCD的修改还包括对Hexagon调试的支持,以及对LLDB的改进。这些修改尚未完全集成到上游OpenOCD中,但值得进一步研究。
4. 实际应用
- U-Boot调试:U-Boot在崩溃时不提供堆栈跟踪,使用EUD和GDB可以大大简化诊断过程。
- 垂直集成BSP调试:EUD为调试TF-A、OP-TEE和U-Boot等组件提供了新的可能性,特别是在OpenEmbedded的Trusted Substrate层中。
- 其他外设:除了SWD接口,EUD还支持COM(UART)和跟踪外设,这些功能尚未完全集成到OpenOCD中,但为生产环境中的闭壳调试提供了更多可能性。
5. 如何参与
- 不同SoC的调试基地址和CTI基地址可能不同,开发者可以尝试在自己的设备上启用EUD,并在linux-msm代码库中提交问题。
- 目前OpenOCD对SMP(对称多处理)的支持还不完善,建议在调试内核时使用
maxcpus=1启动。
6. 限制与未来展望
- 尽管EUD为内核调试提供了极大的便利,但它似乎无法用于获取更高执行级别(如EL2)的控制权。
- EUD的可用性取决于设备的配置选项,如熔丝设置和OEM签名的“调试策略”。在某些生产设备上,EUD可能被禁用,但仍可通过某些方式启用。
7. 结论
- EUD为高通平台的底层调试提供了全新的探索空间,极大地改善了调试体验。高通的这一举措展示了他们对开发者体验的承诺,并有望节省大量调试设备成本,缩短设置时间,简化远程调试。
- 随着工具和驱动程序的进一步集成,EUD有望成为高通平台开发者的标准工具,为未来的创新奠定基础。
评论总结
关于调试体验的改进
- 观点:新的调试体验比之前的Qualcomm调试方式更好,之前的实现方式存在严重的安全漏洞。
- 论据:之前的调试是通过USB暴露的读写执行原语,安全性极低,导致某些设备可以轻易获取root权限。
- 引用:
- "This is a much better experience than the previous Qualcomm debug experience, which was a hand-rolled set of read/write/execute primitives exposed over USB."
- "It was hilariously undersecured, allowing a few of us to continually get root on various Qualcomm models."
调试端口的现状与未来
- 观点:大多数移动芯片组的调试端口仍然不足,且OEM厂商可能会禁用这些功能。
- 论据:MediaTek仍采用旧式调试方法,且大多数OEM厂商在适配引导程序后会禁用调试功能。
- 引用:
- "These debug ports are seriously lacking in most mobile chipsets."
- "Most OEMs will certainly disable this once they've adapted their bootloaders to it."
调试功能的实现细节
- 观点:Qualcomm通过自定义硅片实现了复杂的调试功能,重新路由ARM的USB引脚,并添加了SWD编程器和串口。
- 论据:该功能通过寄存器控制,添加了USB集线器,并连接到ARM核心的IO。
- 引用:
- "Qualcomm has a piece of custom silicon, as a peripheral controlled by registers, that when enabled reroutes the ARMs USB pins through it."
- "On that hub it adds a SWD programmer and a serial port that connect back to the ARM core's IOs."
USB音频卸载的优化
- 观点:Qualcomm在USB音频卸载方面的优化令人印象深刻,尽管这似乎是一个奇怪的优化点。
- 论据:音频设备将数据转发到USB主机控制器,再发送到USB音频设备。
- 引用:
- "I was crazy impressed to see Qualcomm's dedication on getting USB audio offload going."
- "Feels like a weird thing to spend so much effort optimizing but neat as heck to see."
SoC调试功能的潜力
- 观点:某些SoC的ETM端口功能强大,能够进行全程序跟踪,甚至调试到单条汇编指令级别。
- 论据:通过ETM端口,可以调试应用程序、操作系统和驱动程序,甚至进行单指令级别的调试。
- 引用:
- "On some SoCs we could get to the ETM port and it was even parallel."
- "Can debug application together with the OS and all drivers down to single assembler instruction level."