USB口插电脑没反应?RK3576 HAL层5个高频坑的排查手册 电子说
做 RK 嵌入式开发的同学,大概率都遇到过这些糟心事:板子能启动,但 ADB 连不上、MTP 不弹窗、USB 模式切不动,SystemUI 里点半天没反应,logcat 刷屏却抓不到关键信息。更头疼的是,问题往往不是 “某个驱动没加载” 这么简单,而是 Android HAL 层、SELinux、init.rc、configfs 几层交织,查一圈半天就过去了。
这篇文章整理了 USB HAL 层 5 个最高频的故障场景,每段都给出正常 / 异常输出对照,可直接当 checklist 用,帮你快速定位问题。

先确认这三件事
不管遇到哪种 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"
修复(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.configscontext=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 服务起不来

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 时,遇到过什么看起来 “不可能” 的问题?比如明明代码没变、配置没改,换个批次的核心板就不行了?欢迎在留言区分享~
全部0条评论
快来发表一下你的评论吧 !