Android Qualcomm针对USB系统,在aosp的基础之上,定制了一堆东西,简要可以分为如下两类:
- HOST模式:负责 USB 主机端和端口管理,包括type-c、usb数据传输、usb电源管理
- DEVICE模式:又叫做USB Gadget,通常与PC端通过USB连接,PC作为主设备,android设备作为从设备,支持ADB、MTP、PTP、RNDIS、NCM、UVC、MIDI、Accessory等功能。
本系列主要针对Qualcomm基线的这些定制,引申到android aosp原生相关的一些模块,进行梳理和总结。
Qualcomm定制目录通常在la.um/vendor/qcom/opensource/usb,这里的la.um通常为vendor侧代码。该目录架构如下:

1、USB启动配置
etc目录下有三个rc文件和两个sh文件,他们都是在系统启动过程中执行,这里简要介绍一下他们的关系。
- on init阶段
最早的阶段当然是执行init.qti.usb.qmaa.rc,在该文件中如下配置:
bash
on init
mount configfs none /config
mkdir /config/usb_gadget/g1 0770
mkdir /config/usb_gadget/g1/strings/0x409 0770
write /config/usb_gadget/g1/bcdUSB 0x0200
write /config/usb_gadget/g1/os_desc/use 1
write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno}
write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer}
write /config/usb_gadget/g1/strings/0x409/product ${ro.product.name}
mkdir /config/usb_gadget/g1/functions/ffs.adb
mkdir /config/usb_gadget/g1/functions/ffs.diag
mkdir /config/usb_gadget/g1/configs/b.1 0770
mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770
write /config/usb_gadget/g1/configs/b.1/MaxPower 900
write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1
write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100"
mkdir /dev/usb-ffs 0775 shell system
mkdir /dev/usb-ffs/adb 0770 shell system
mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=1000,rmode=0770,fmode=0660
mkdir /dev/ffs-diag 0770 shell system
mount functionfs diag /dev/ffs-diag uid=2000,gid=1000,rmode=0770,fmode=0660,no_disconnect=1
write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_adb"
symlink /config/usb_gadget/g1/functions/ffs.diag /config/usb_gadget/g1/configs/b.1/f1
symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2
write /config/usb_gadget/g1/idVendor 0x05c6
write /config/usb_gadget/g1/idProduct 0x901D
symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1
start adbd
setprop sys.usb.configfs -1
on property:sys.usb.ffs.ready=1
write /config/usb_gadget/g1/UDC ${vendor.usb.controller}
setprop sys.usb.state diag,adb
其实不是很理解这些配置,但是可以看出来这个阶段在做最基础的文件目录创建,看得出来是非常早的阶段,在mk中可以看出来只有USB_USES_QMAA架构被打开的时候才启用

- on zygote-start阶段
最后核心的一些启动配置还得是在init.qcom.usb.rc中,可以看的出,这个阶段其实在针对usb设备模式的一些列功能配置

当初始化配置的差不多的时候,反向调用了init.qcom.usb.sh脚本

- on zygote-start 末尾执行init.qcom.usb.sh

该脚本其实针对persist.vendor.usb.config属性进行一些初始化设置,后文讲具体介绍这块逻辑。
2、USB HAL的定义
接下来就主要是HAL里面的配置和代码实现了,先看看Android.bp
bash
#la.um/vendor/qcom/opensource/usb/hal/Android.bp
cc_binary {
name: "android.hardware.usb-service.qti",
defaults: ["qti_usb_hal_defaults"],
shared_libs: [
"android.hardware.usb-V1-ndk",
"libbase",
"libbinder_ndk",
"libcutils",
"liblog",
"libutils",
],
srcs: [
"Usb.cpp",
],
init_rc: ["android.hardware.usb-service.qti.rc"],
vintf_fragments: ["android.hardware.usb-service.qti.xml"],
}
cc_binary {
name: "android.hardware.usb.gadget-service.qti",
defaults: ["qti_usb_hal_defaults"],
shared_libs: [
"android.hardware.usb.gadget@1.1",
"android.hardware.usb.gadget-V1-ndk",
"libbase",
"libbinder_ndk",
"libcutils",
"liblog",
"libutils",
],
static_libs: [
"libusbconfigfs"
],
srcs: [
"UsbGadget.cpp",
],
init_rc: ["android.hardware.usb.gadget-service.qti.rc"],
vintf_fragments: ["android.hardware.usb.gadget-service.qti.xml"],
}
prebuilt_etc {
name: "usb_compositions.conf",
src: "usb_compositions.conf",
vendor: true,
}
其实配置了两个HAL和一个conf配置。
3、USB HOST HAL
先看看第一个hal
服务名称:android.hardware.usb-service.qti
主要代码:Usb.cpp
主要功能:当作为HOST USB设备的时候,负责 USB 主机端,管理type-c端口,以及usb充电等控制。
详细介绍:
4、USB Gadget HAL
再看看第二个hal
服务名称:android.hardware.usb.gadget-service.qti
主要代码:UsbGadget.cpp
主要功能:当作为DEVICE USB从设备的时候,支持的功能:ADB、MTP、PTP、RNDIS、NCM、UVC、MIDI、Accessory 。
详细介绍:https://blog.csdn.net/qq_27672101/article/details/156096711
5、USB Gadget 支持模式
当设备作为usb device模式的时候,也就是gadget模式的时候,那么usb有哪些端口或者功能呢?在usb_compositions.conf中进行了如下配置:
bash
# 第一列:功能组合(用逗号分隔)
# 第二列:VID (Vendor ID) = 0x05C6(Qualcomm)
# 第三列:PID (Product ID),不同组合对应不同 PID
# 第四列(可选):实际功能顺序(当与第一列不同时)
# <properties> <vid> <pid> <actual order of properties>
# 基础组合
mass_storage 0x05C6 0xF000
mass_storage,adb 0x05C6 0x9015 adb,mass_storage
diag,adb 0x05C6 0x901D
diag,adb,serial_cdev 0x05C6 0x901F
diag 0x05C6 0x900E
diag,serial_cdev,rmnet,adb 0x05C6 0x9091
diag,serial_cdev,rmnet 0x05C6 0x9092
# RNDIS组合:网络共享 + 其他功能的组合,用于 USB 网络共享场景
rndis 0x05C6 0xF00E
diag,serial_cdev,serial_cdev_nmea,adb 0x05c6 0x9020 diag,adb,serial_cdev,serial_cdev_nmea
rndis,adb 0x05C6 0x9024
rndis,diag 0x05C6 0x902C
rndis,diag,adb 0x05C6 0x902D
rndis,serial_cdev 0x05C6 0x90B3
rndis,serial_cdev,adb 0x05C6 0x90B4
rndis,serial_cdev,diag 0x05C6 0x90B5
rndis,serial_cdev,diag,adb 0x05C6 0x90B6
# MTP + 诊断,用于媒体传输与诊断
mtp,diag 0x05C6 0x901B
mtp,diag,adb 0x05C6 0x903A
# QDSS 调试组合:qdss 实际映射为 qdss_debug
diag,qdss 0x05C6 0x904A diag,qdss_debug
diag,qdss,adb 0x05C6 0x9060 diag,qdss_debug,adb、
# NCM 网络共享(类似 RNDIS,更现代)
rndis,diag,qdss 0x05C6 0x9081 rndis,diag,qdss_debug
rndis,diag,qdss,adb 0x05C6 0x9082 rndis,diag,qdss_debug,adb
diag,qdss,rmnet 0x05C6 0x9083 diag,qdss_debug,rmnet
diag,qdss,rmnet,adb 0x05C6 0x9084 diag,qdss_debug,adb,rmnet
ncm 0x05C6 0xA4A1
ncm,adb 0x05C6 0x908C
diag,serial_cdev 0x05C6 0x9004
# DPL 数据路径日志组合
diag,serial_cdev,rmnet,dpl 0x05C6 0x90B7
diag,serial_cdev,rmnet,dpl,adb 0x05C6 0x90B8
rndis,diag,dpl 0x05C6 0x90BF
rndis,diag,dpl,adb 0x05C6 0x90C0
# CCID 智能卡组合
ccid 0x05C6 0x90CE
ccid,adb 0x05C6 0x90CF
ccid,diag 0x05C6 0x90D0
ccid,diag,adb 0x05C6 0x90D1
# 双调制解调器组合:支持双调制解调器(主 + 副),包含 diag_mdm、qdss_mdm、serial_cdev_mdm
diag,serial_cdev,rmnet,ccid 0x05C6 0x90D2
diag,serial_cdev,rmnet,ccid,adb 0x05C6 0x90D3
diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,rmnet 0x05C6 0x90D7
diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,rmnet,adb 0x05C6 0x90D8
diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,dpl,rmnet 0x05C6 0x90DD
diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,dpl,rmnet,adb 0x05C6 0x90DE
diag,serial_cdev,rmnet,dpl,qdss 0x05C6 0x90DC
diag,serial_cdev,rmnet,dpl,qdss,adb 0x05C6 0x90DB
# 音频/视频组合:UAC2(USB 音频)和 UVC(USB 视频)组合,用于音频/视频传输
diag,uac2,adb 0x05C6 0x90CA diag,adb,uac2
diag,uac2 0x05C6 0x901C
diag,uvc,adb 0x05C6 0x90CB diag,adb,uvc
diag,uvc 0x05C6 0x90DF
diag,uac2,uvc,adb 0x05C6 0x90CC diag,adb,uac2,uvc
diag,uac2,uvc 0x05C6 0x90E0
# 复杂调试组合:包含更多高级组合,如多调制解调器支持(diag_mdm2),CNSS 诊断(diag_cnss),IPCR 通信(ipcr)
diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,rmnet 0x05C6 0x90E4
diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,rmnet,adb 0x05C6 0x90E5
rndis,diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl 0x05C6 0x90E6
rndis,diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,adb 0x05C6 0x90E7
rndis,diag,qdss,serial_cdev,dpl 0x05C6 0x90E8
rndis,diag,qdss,serial_cdev,dpl,adb 0x05C6 0x90E9
diag,diag_mdm,adb 0x05C6 0x90D9
diag,diag_mdm,diag_mdm2,qdss,qdss_mdm,serial_cdev,dpl,rmnet 0x05C6 0x90F6
diag,diag_mdm,diag_mdm2,qdss,qdss_mdm,serial_cdev,dpl,rmnet,adb 0x05C6 0x90F7
rndis,diag,diag_mdm,diag_mdm2,qdss,qdss_mdm,serial_cdev,dpl 0x05C6 0x90F8
rndis,diag,diag_mdm,diag_mdm2,qdss,qdss_mdm,serial_cdev,dpl,adb 0x05C6 0x90F9
diag,diag_mdm,adb,ccid 0x05C6 0x9044 diag,diag_mdm,adb,ccid
diag,diag_mdm,qdss_mdm,dpl,adb 0x05C6 0x90FF
diag,qdss,dpl,adb 0x05C6 0x9104
diag,dpl 0x05C6 0x9105
diag,diag_cnss,serial_cdev,rmnet,dpl,qdss,adb 0x05C6 0x9110
diag,diag_cnss,serial_cdev,rmnet,dpl,qdss 0x05C6 0x9111
diag,serial_cdev,rmnet,dpl,qdss,ipcr,adb 0x05C6 0x912C
diag,serial_cdev,rmnet,dpl,qdss,ipcr 0x05C6 0x912D
| 基础功能 | 说明 | 用途 |
|---|---|---|
| adb | Android Debug Bridge | 调试、文件传输、命令执行 |
| diag | Diagnostic | 诊断接口,用于刷机、日志等 |
| mass_storage | USB Mass Storage | U盘模式,文件传输 |
| mtp | Media Transfer Protocol | 媒体传输协议 |
| rndis | Remote Network Driver Interface | USB 网络共享(以太网) |
| ncm | Network Control Model | 网络控制模型(类似 RNDIS) |
| 高级功能 | 说明 | 用途 |
|---|---|---|
| serial_cdev | Serial Character Device | 串口通信 |
| serial_cdev_nmea | NMEA Serial | GPS NMEA 数据串口 |
| serial_cdev_mdm | Modem Serial | 调制解调器串口 |
| rmnet | Remote Network | 远程网络接口(数据连接) |
| dpl | Data Path Logging | 数据路径日志 |
| qdss | Qualcomm Debug Subsystem | 调试子系统 |
| qdss_mdm | QDSS for Modem | 调制解调器 QDSS |
| qdss_debug | QDSS Debug Mode | QDSS 调试模式 |
| ccid | Chip Card Interface Device | 智能卡接口 |
| uac2 | USB Audio Class 2.0 | USB 音频(输入/输出) |
| uvc | USB Video Class | USB 视频(摄像头) |
| ipcr | Inter-Processor Communication | 处理器间通信 |
| diag_mdm | Modem Diagnostic | 调制解调器诊断 |
| diag_mdm2 | Second Modem Diagnostic | 第二个调制解调器诊断 |
| diag_cnss | CNSS Diagnostic | CNSS(WiFi/蓝牙)诊断 |