
在 Linux 内核和 Android 系统中UDC是一个极其核心的硬件术语UDCUSBDeviceControllerUSB 设备控制器 / 从机硬件控制器一、 形象的比喻汽车发动机与发车如果把子 设备 的 USB 系统比作一辆汽车ConfigFS/config/usb_gadget/g1是汽车的设计图与中控台里面配置了 VID/PID、CD-ROM 光盘、ADB 调试、ACM 串口等软参数。UDC如11201000.usb0就是汽车的物理发动机SoC 芯片内部控制 USB 物理 D/D- 针脚电平的真正硬件。绑定 UDCwrite /config/usb_gadget/g1/UDC 11201000.usb0相当于拧钥匙点火、踩下油门发车这一步执行后USB 硬件芯片才会正式通电、拉高 D 引脚信号母 设备 才能在物理上感知到有设备插入解绑 UDCwrite /config/usb_gadget/g1/UDC none相当于挂空挡、熄火断开 D 信号物理断连。二、 为什么你的日志里 UDC 叫11201000.usb0在 MT8联发科芯片内部11201000是这块芯片内部 USB 控制器硬件在物理内存里的寄存器基地址0x11201000。usb0代表第 0 号 USB 物理接口。11201000.usb0就是这块USB 发动机的“硬件身份证号”。三、 什么是 Change 2 里提到的“纯 adb 绑 UDC 增加限制防抢绑”在原生 Android 系统里有一个默认的配置文件init.usb.configfs.rc。没有加限制前存在“抢绑”引发的冲突原生 Android 发现sys.usb.configadb它的默认脚本会跑去把“发动机”UDC启动了但此时只绑定了f1adb一个功能。几毫秒后MTK 的 POS 专用脚本也启动了准备绑定f1mass_storage, f2adb, f3acm三个功能也跑去启动“发动机”UDC。两套脚本抢着去启动 UDC 发动机导致 USB 状态机发生竞态冲突UDC 抢绑导致串口或 ADB 随机卡死加了限制后Change 2 做的事情我们在原生 AOSP 的“纯 ADB 脚本”条件里加了一个锁property:vendor.usb.acm_enable0只有当没有开启 设备 串口通讯时纯 ADB 脚本才允许去绑 UDC。效果当 设备串口开启时acm_enable1原生 AOSP 脚本自动退避交由 MTK 的三合一脚本独占、干净地去一次性绑定 UDC彻底根除了上电时两套脚本抢绑 UDC 导致的死锁