【Semidrive】解决 X9HP reboot 导致 Android 崩溃的问题

本篇博文介绍如何解决 X9HP 平台的 AP1 域中插着 u 盘时运行 reboot 导致 Android 系统崩溃的问题,软件版本是 X9 PTG4.0,硬件环境是 X9H 开发板 X9H_REF_A04。

一、问题原因

在调试过程中遇到插着 u 盘时用 adb shell reboot 命令或直接在串口中 reboot 重启 Android, 重启后系统卡住,Android 这边的启动报错 log 如下:



二、问题分析及解决思路

1. 看 Android 启动 log 可以看出是 kernel rcu 的报错,该报错可能是 kernel 内下发命令时自旋锁上锁,然后有软中断触发,也需要使用自旋锁,此时下发命令的锁还未解锁,就会出现 rcu 的报错并且 Android 会崩溃。

2. 插上 u 盘就会出现该报错,所以有可能是 usb 驱动识别设备时使用了自旋锁,跟启动时 kernel 初始化任务的自旋锁冲突了,随后使用了原厂修复该问题的 patch 《X9-PTG4.0-Normal-Featrue-rebootNcr-patch-1101040.tar.gz》,但打入 patch 后问题依然未解决。


3. 查看 patch 内容,发现 patch 只针对 usb 的 OTG 和 PERIPHERAL 模式进行修复,但当前 dts 配置的 USB1 是 HOST 模式,新增了针对 HOST 模式的修复如下:
--- a/kernel/drivers/usb/dwc3/core.c
+++ b/kernel/drivers/usb/dwc3/core.c
@@ -1420,11 +1420,12 @@ static int dwc3_remove(struct platform_device *pdev)
static void dwc3_shutdown(struct platform_device *pdev)
{
struct dwc3 *dwc = platform_get_drvdata(pdev);
-
if (dwc->dr_mode == USB_DR_MODE_PERIPHERAL)
dwc3_gadget_exit(dwc);
if (dwc->dr_mode == USB_DR_MODE_OTG)
dwc3_drd_exit(dwc);
+ if (dwc->dr_mode == USB_DR_MODE_HOST)
+ dwc3_host_exit(dwc);
}

打上 patch 后,该问题已解决。

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论