【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 后,该问题已解决。

点击阅读原文,了解更多精彩内容~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值