USB口插电脑没反应?RK3576 HAL层5个高频坑的排查手册

电子说

1.4w人已加入

描述

 

 RK 嵌入式开发的同学,大概率都遇到过这些糟心事:板子能启动,但 ADB 连不上、MTP 不弹窗、USB 模式切不动,SystemUI 里点半天没反应,logcat 刷屏却抓不到关键信息。更头疼的是,问题往往不是 某个驱动没加载” 这么简单,而是 Android HAL 层、SELinuxinit.rcconfigfs 几层交织,查一圈半天就过去了。

这篇文章整理了 USB HAL 层 个最高频的故障场景,每段都给出正常 异常输出对照,可直接当 checklist 用,帮你快速定位问题。

Android

先确认这三件事

不管遇到哪种 USB 故障,先把这三板斧拍下去,快速缩小排查范围:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# 1. HAL 进程在不在adb shell ps -A | grep -E "usb|gadget"# 正常: android.hardware.usb.gadget-service.rockchip 和 android.hardware.usb-service.rockchip# 异常: (空) —— 服务没起来# 2. 当前 USB 配置adb shell getprop sys.usb.config# 正常: mtp,adb    异常: 空 或 none# 3. 配置是否生效(config 和 state 一致才算真生效)adb shell getprop sys.usb.state# 正常: mtp,adb    异常: 与 config 不一致

一、ADB 连不上的 logcat 分析

adb devices 显示空列表、unauthorized,或反复断开重连,按这三步查:

第一步:确认 ADB 在 config 

  •  
  •  
  •  
getprop sys.usb.config# 正常: mtp,adb(含 adb)  异常: mtp(不含 adb)# 不含 adb 就手动: setprop sys.usb.config mtp,adb

第二步:分段看 logcat

Gadget HAL 调用层

  •  
logcat -s "android.hardware.usb.gadget.aidl-service"

正常:

  •  
  •  
  •  
  •  
I setCurrentUsbFunctions: functions=5I validateAndSetVidPid: Vid:0x2207 Pid:0x0017I setupFunctions: MTP ADBI waitForPullUp success

异常:

  •  
  •  
  •  
E tearDownGadget failed                  → SELinux 写 configfs 被拒E write failed: /config/usb_gadget/g1/UDCE waitForPullUp timeout                  → FunctionFS 端点没就绪

MonitorFfs 监控层

  •  
logcat -s "librkusb-MonitorFfs"

正常:

  •  
  •  
  •  
  •  
I monitorFfs: Watching /dev/usb-ffs/adbI ep1 created, count=1I ep2 created, count=2I all endpoints ready, pulling up gadget

异常:卡在ep1 created 之后,ep2 不出来→ adbd 没有打开端点,接着查 adbd

  •  
  •  
  •  
logcat -s adbd# 正常: functionfs: opened ep1 / ep2# 异常: unable to open functionfs ep0: Permission denied → SELinux 拒绝 adbd

第三步:确认 functionfs 目录

  •  
  •  
  •  
  •  
ls -la /dev/usb-ffs/adb/# 正常: ep0 ep1 ep2 三个字符设备都在# 异常: No such file or directory → functionfs 没挂载# 检查 init.rc 有没有 mount configfs + mkdir /dev/usb-ffs/adb

排查清单

logcat 特征

大概率根因

解决方向

waitForPullUp timeout

FunctionFS 端点不全

检查 adbd 和 SELinux

functionfs: Permission denied

SELinux 拒绝 adbd

allow adbd functionfs:file rw_file_perms

tearDownGadget failed

 UDC 被 SELinux 

configfs:file write

Gadget HAL 根本没日志

服务没起来

见第五节

二、MTP 不弹窗的排查

Windows 不弹出文件管理器、macOS Finder 不显示设备,按这四步查:

第一步:确认 MTP 在配置中

  •  
  •  
getprop sys.usb.config# 正常: mtp,adb   异常: adb (没 MTP)

第二步:确认 mtp-server 进程

  •  
  •  
  •  
  •  
ps -A | grep mtp# 正常: mtp-server   异常: (空) 没启动# 用 logcat -s "UsbDeviceManager" 看: 有没有 "starting MTP service"# "failed to start MTP service" → 二进制缺失或 SELinux 拒绝

第三步:确认 MTP 的 functionfs 端点

  •  
  •  
  •  
  •  
ls -la /dev/usb-ffs/mtp/# 正常: ep1 ep2 ep3 三个端点# 异常: No such file or directory# → MonitorFfs 中没有 addInotifyFd("/dev/usb-ffs/mtp/")

第四步:弹了盘符但点不开

这是 MTP 传输层通讯正常、但 filesystem provider 没注册:

  •  
  •  
  •  
logcat -s "MtpServer" "MtpStorage" "*:S"# 正常: MtpStorage created for /storage/emulated/0# 异常: 没有 MtpStorage created → StorageManager 注册失败

三、sys.usb.config 属性无法切换

开发者选项切 USB 模式,或手动 setprop 后,属性值不变 / 弹回,按这四步查:

第一步:区分 "切不过去还是 "切了被弹回"

  •  
  •  
getprop sys.usb.config# 同时另一个终端: setprop sys.usb.config mtp,adb

属性值根本没变→ SELinux 阻止写属性,或 init 的 property trigger 没触发

变了立刻弹回→ framework 检测到 HAL 调用失败而回退

第二步:看 framework 日志

  •  
logcat -s "UsbDeviceManager" "UsbService" "*:S"

正常:

  •  
  •  
  •  
E setCurrentFunctions failed: mtp,adbE will revert to previous config: adbE Service not available               → Gadget HAL Binder 没注册(见第五节)

异常:

  •  
  •  
  •  
dmesg | grep "avc.*usb.*prop|avc.*sys.usb"# avc: denied { set } for property=sys.usb.config# → hal_usb_gadget_default.te 中缺 set_prop

第三步:查 SELinux 属性拒绝

  •  
  •  
  •  
dmesg | grep "avc.*usb.*prop|avc.*sys.usb"# avc: denied { set } for property=sys.usb.config# → hal_usb_gadget_default.te 中缺 set_prop

第四步:跳过 framework,直接看 configfs 

  •  
  •  
  •  
  •  
  •  
cat /config/usb_gadget/g1/UDC# 正常: fc400000.usb   异常: (空) 未拉高ls -la /config/usb_gadget/g1/configs/b.1/# 正常: f1.mtp -> ../../functions/ffs.mtp, f2.adb -> ...# 异常: 空的 → linkFunction() 没执行成功

四、SELinux denials 导致 USB 功能异常

RK3576 USB 排障中最常见、最隐蔽的问题,排除纯驱动问题后,大概率是 SELinux 惹的祸。

快速定位

  •  
  •  
  •  
setenforce 0          # 切宽容模式# 复现 USB 操作# 问题消失 → 100% SELinux   问题依旧 → 找别的原因

注意:生产环境绝不要保持宽容模式,仅用于快速定位。

四类常见拒绝及修复

① configfs 操作

  •  
  •  
  •  
dmesg | grep "avc.*configfs"# avc: denied { write } for path="/config/usb_gadget/g1/UDC"#   scontext=uhal_usb_gadget_default:s0

修复(hal_usb_gadget_default.te):

  •  
  •  
allow hal_usb_gadget_default configfs:dir { create rmdir };allow hal_usb_gadget_default configfs:file create_file_perms;

② functionfs 监控

  •  
  •  
# avc: denied { watch } for path="/dev/usb-ffs/adb"#   scontext=uhal_usb_gadget_default:s0

修复:

  •  
allow hal_usb_gadget_default functionfs:dir { watch watch_reads };

③ adbd 访问 functionfs

  •  
  •  
# avc: denied { read write } for path="/dev/usb-ffs/adb/ep0"#   scontext=uadbd:s0

修复(system/sepolicy/private/adbd.te):

  •  
  •  
allow adbd functionfs:dir r_dir_perms;allow adbd functionfs:file rw_file_perms;

④ 属性写入

  •  
  •  
# avc: denied { set } for property=sys.usb.config#   scontext=uhal_usb_impl:s0

修复:

  •  
set_prop(hal_usb_impl, vendor_usb_config_prop)

文件位置速查

文件

用途

device/rockchip/.../vendor/hal_usb_gadget_default.te

Gadget HAL 域策略

device/rockchip/.../vendor/hal_usb_impl.te

USB HAL + OTG 域策略

device/rockchip/.../private/hal_usb.te

USB 私有策略

system/sepolicy/private/adbd.te

adbd 域策略

hardware/rockchip/usb/gadget/sepolicy/file_contexts

Gadget HAL 文件上下文

提示:修改.te 后要完整编译 sepolicy + 刷 vendor 分区才能生效。

五、Gadget HAL 服务起不来

Android

ps -A | grep gadget 无进程,或启动后秒挂,按这四步查:

第一步:lshal

  •  
  •  
  •  
lshal | grep usb.gadget# 正常: android.hardware.usb.gadget.IUsbGadget/default ... registered# 异常: (空) → manifest.xml 没声明或没装对

第二步:init 日志

  •  
  •  
  •  
  •  
logcat -s "init" "*:S" | grep usb_gadget# 正常: starting service 'vendor.usb_gadget_default'# 异常: service 'vendor.usb_gadget_default' is not executable#       (空) → rc 文件没被加载

第三步:文件和 SELinux 标签

  •  
  •  
  •  
  •  
  •  
ls -la /vendor/bin/hw/android.hardware.usb.gadget-service.rockchip# 异常: No such file or directory → 编译产物没装进 vendorls -Z /vendor/bin/hw/android.hardware.usb.gadget-service.rockchip# 正常: uhal_usb_gadget_default_exec:s0# 异常: uvendor_file:s0 → file_contexts 没匹配

第四步:启动后秒退排查

  •  
  •  
  •  
  •  
ldd /vendor/bin/hw/android.hardware.usb.gadget-service.rockchip# 检查有没有 "not found" 的动态库logcat -b crash# 看有没有 crash 堆栈

排查清单

症状

排查点

修复

lshal 看不到

manifest xml 没装

检查vendor/etc/vintf/

init 没反应

rc 文件没 include

检查BoardConfig.mk

二进制找不到

没打包进 vendor

检查Android.bp

SELinux 标签错

file_contexts 不匹配

修正正则路径

启动即退出

动态库缺失

ldd 查依赖

六、实战案例

案例一:新板子只有 ADB 没有 MTP

现象

SystemUI 选 “MTP 传输文件” 后 Windows 不弹窗,sys.usb.config 一直是adb,手动设mtp,adb 后马上弹回adb

排查

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# 属性变化getprop sys.usb.config        → adbsetprop sys.usb.config mtp,adbgetprop sys.usb.config        → adb    ← 弹回了# framework 日志logcat -s "UsbDeviceManager"# E setCurrentFunctions failed: mtp,adb# Gadget HAL 日志logcat -s "android.hardware.usb.gadget.aidl-service"# E tearDownGadget: write failed: /config/usb_gadget/g1/UDC# SELinux 拒绝dmesg | grep avc# avc: denied { write } for path="/config/usb_gadget/g1/UDC"#   scontext=uhal_usb_gadget_default:s0# 验证setenforce 0setprop sys.usb.config mtp,adbgetprop sys.usb.config        → mtp,adb  ← 确认是 SELinux

根因

hal_usb_gadget_default 域缺 configfs 写权限。

修复(hal_usb_gadget_default.te

  •  
  •  
allow hal_usb_gadget_default configfs:file create_file_perms;allow hal_usb_gadget_default configfs:dir { create rmdir };

验证

  •  
  •  
  •  
dmesg | grep avc | grep configfs    # 空setprop sys.usb.config mtp,adbgetprop sys.usb.config               # mtp,adb

案例二:OTA 升级后 USB 彻底不认

现象

老版本 USB 正常,OTA 到新固件后插电脑毫无反应。

排查

  •  
  •  
  •  
  •  
  •  
  •  
ps -A | grep usb                 → (空)   ← 所有 USB 进程消失lshal | grep usb                 → (空)   ← HAL 没注册logcat -s "init" | grep usb# 有 "processing action" 但没有 "starting service"ls -la /vendor/bin/hw/android.hardware.usb.gadget-service.rockchip# No such file or directory       ← 二进制不在文件系统上

根因

OTA 升级包的 update_dynamic_partitions 逻辑变更,vendor 分区中 USB HAL 相关文件被裁剪。

修复

确保 OTA 包包含:

  •  
  •  
  •  
  •  
vendor/bin/hw/android.hardware.usb.gadget-service.rockchipvendor/bin/hw/android.hardware.usb-service.rockchipvendor/etc/vintf/manifest/*usb*.xmlvendor/etc/init/*usb*.rc

验证

  •  
  •  
  •  
ps -A | grep gadget    # 服务起来getprop sys.usb.config  # mtp,adbadb devices             # device

案例三:Type-C 显示 "Unknown USB Device"

现象

Windows 认到 “Unknown USB Device (Device Descriptor Failed)”Linux dmesg 报 device descriptor read/64, error -71

排查

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# HAL 和 config 正常ps -A | grep usb           → 进程正常getprop sys.usb.config     → mtp,adbcat /config/usb_gadget/g1/idVendor   → 0x2207  ✓cat /config/usb_gadget/g1/idProduct  → 0x0017  ✓# 内核报描述符读失败dmesg | tail -5# usb 1-1: device descriptor read/64, error -71# 检查 DWC3 quirkcat /sys/firmware/devicetree/base/usb@23000000/snps,dis-u2-entry-quirk# (空) ← quirk 没生效!# 对比正常板子后发现 dtsi 中 snps quirk 被 merge conflict 误删了

根因

rk3576.dtsi  DWC3 的 snps,dis-u2-entry-quirk 等属性全部丢失,DWC3 进入低功耗后无法响应描述符请求。

修复

恢复 SoC DTSI 中的 quirk

  •  
  •  
  •  
  •  
  •  
  •  
  •  
&usb_drd0_dwc3 {    snps,dis-u1-entry-quirk;    snps,dis-u2-entry-quirk;    snps,dis-enblslpm_quirk;    snps,parkmode-disable-hs-quirk;    snps,parkmode-disable-ss-quirk;};

验证

  •  
  •  
  •  
dmesg | grep "dwc3.*USB3 Host"# [ 1.232200] dwc3 23000000.usb: USB3 Host (xHCI): 1x USB 3.0 + 1x USB 2.0# Windows/Linux 正常识别

调试命令收藏

覆盖 USB HAL 层 90% 的排查场景,建议收藏:

看什么

命令

正常输出示例

USB 配置

getprop sys.usb.config

mtp,adb

配置生效

getprop sys.usb.state

mtp,adb

Gadget HAL 日志

logcat -s "android.hardware.usb.gadget.aidl-service"

waitForPullUp success

MonitorFfs

logcat -s "librkusb-MonitorFfs"

all endpoints ready

adbd 日志

logcat -s adbd

functionfs: opened ep1

framework 

logcat -s "UsbDeviceManager"

setCurrentFunctions: mtp,adb

SELinux 拒绝

dmesg | grep avc

无输出为正常

configfs UDC

cat /config/usb_gadget/g1/UDC

fc400000.usb

功能链接

ls -la /config/usb_gadget/g1/configs/b.1/

f1.mtp -> ../../functions/ffs.mtp

HAL 注册状态

lshal | grep usb

registered

宽容验证

setenforce 0 复现

问题消失→ SELinux

最后想问:你在 RK 平台上调试 USB 时,遇到过什么看起来 不可能” 的问题?比如明明代码没变、配置没改,换个批次的核心板就不行了?欢迎在留言区分享~

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分