Android Qualcomm USB 专题系列【总篇:USB HAL架构】

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脚本

该脚本其实针对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/蓝牙)诊断
相关推荐
DeeplyMind2 小时前
Linux 页表机制详解(x86_64 架构)
linux·驱动开发
TG:@yunlaoda360 云老大2 小时前
如何配置华为云国际站代理商OBS的跨区域复制?
服务器·网络·华为云
2401_858286112 小时前
OS39.5.【Linux】分析ar命令生成的归档文件的格式
linux·ar·unix
XiaoHu02072 小时前
Linux关于进程(第一弹)
linux·运维·服务器
while(1){yan}2 小时前
UDP和TCP的核心
java·开发语言·网络·网络协议·tcp/ip·udp
YoungHong19922 小时前
[教程] Linux 服务器无 Root (Sudo) 权限安装 CUDA Toolkit 终极指南
linux·运维·服务器
麒qiqi2 小时前
【Linux 进程间通信】信号通信与共享内存核心解析
java·linux·算法
原神启动12 小时前
Ansible(三)—— 使用Ansible自动化部署LNMP环境
android·自动化·ansible
Studying 开龙wu2 小时前
Linux 系统中apt-get 和 pip命令有什么区别
linux·运维·pip