init.usb.configfs.rc的USB动态配置
1. 什么是ConfigFS
ConfigFS
是 Linux 内核提供的一种用户空间可配置的伪文件系统- 在Linux内核中一个设备(如手机)作为USB从设备时,成为一个“Gadget”。
- 路径:
/config/usb_gadget/,g1表示系统重第一个USB Gadget的配置实例。
- 允许用户空间(如
init
)动态创建和配置 USB 设备功能 - 取代了旧时代的
android_usb.ko
驱动
2. 属性解释
属性 | 一句话解释 |
---|---|
sys.usb.config | “我要什么 USB 功能”(如 MTP+ADB) |
sys.usb.configfs | “是否用 ConfigFS 方式配置”(1=是,0是传统模式) |
init.svc.adbd | “ADB 进程当前状态”(running/stopped) |
sys.usb.ffs.ready | “ADB 的底层准备好了吗”(1=可以挂载) |
3. 关闭USB功能,进入未配置状态
场景:拔掉USB线、重启、关闭USB调试、进入关机模式
on property:sys.usb.config=none && property:sys.usb.configfs=1write /config/usb_gadget/g1/UDC "none"stop adbdsetprop sys.usb.ffs.ready 0write /config/usb_gadget/g1/bDeviceClass 0write /config/usb_gadget/g1/bDeviceSubClass 0write /config/usb_gadget/g1/bDeviceProtocol 0rm /config/usb_gadget/g1/configs/b.1/f1rm /config/usb_gadget/g1/configs/b.1/f2rm /config/usb_gadget/g1/configs/b.1/f3rmdir /config/usb_gadget/g1/functions/rndis.gs4setprop sys.usb.state ${sys.usb.config}
- write /config/usb_gadget/g1/UDC "none":表示内核停用USB控制器UDC(USB Device Controller),即内核层面关闭了USB设备功能,断开了该gadget与硬件控制器的连接,效果就是电脑会显示设备已断开。
- stop adbd:停止adbd进程,释放其占用的资源。
- setprop sys.usb.ffs.ready 0: 表示当前不能使用adb功能。当adbd启动并初始化成功后,会自己设置sys.usb.ffs.ready=1。
- write /config/usb_gadget/g1/bDeviceClass、bDeviceSubClass、bDeviceProtocol这三组值是USB协议中定义的设备类型描述符,用来告诉主机我是什么设备。
0表示“未指定设备类”。- rm /config/usb_gadget/g1/configs/b.1/f1、f2、f3表示删除配置功能中功能链接(symlink)。b.1表示配置#1,f1, f2, f3表示该配置中的功能槽位,它实际上一个符号链接,指向functions/下真实的功能。
eg: f1 -> ../functions/ffs.adb- rmdir /config/usb_gadget/g1/functions/rndis.gs4 删除RNDIS(USB网络)的功能配置。因为该目录是动态创建的。
- setprop sys.usb.state ${sys.usb.config}:同步USB状态属性为当前配置,用于通知上层USB状态。
4. sys.usb.ffs.ready属性的更新的三大场景
4.1 当adbd服务stopped时,设置为0
on property:init.svc.adbd=stoppedsetprop sys.usb.ffs.ready 0
4.2 当sys.usb.config=“none”时,设置为0
on property:sys.usb.config=none && property:sys.usb.configfs=1...stop adbdsetprop sys.usb.ffs.ready 0...
4.3 adbd服务启动并完成初始化时,设备为1
// path: android/packages/modules/adb/daemon/usb_ffs.cpp
bool open_functionfs(android::base::unique_fd* out_control, android::base::unique_fd* out_bulk_out,android::base::unique_fd* out_bulk_in) {...android::base::SetProperty("sys.usb.ffs.ready", "1");...
}
5. sys.usb.config的各种配置
usb配置为adb、mtp、ptp、accessory、audio_source、midi、rndis以及其组合时,会将对应配置通过写入内核路径/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration中,多种组合以下划线连接,例如accessory_audiosource_adb,并通过symlink创建对应f1、f2、f3与functions之间的软链。
5.1 sys.usb.config取值
取值 | 含义 | 典型场景 | 用户可见行为 |
---|---|---|---|
none | 无功能 | 拔线、关机 | 电脑无反应 |
adb | ADB 调试 | 开发调试 | 仅显示“充电” |
mtp | Media Transfer Protocol,多媒体传输 使用mtp.gs0功能,通过USB实现文件系统的访问 | 1. 默认模式 2. 支持照片、音乐、文件等 | 弹出“传输文件” |
ptp | Picture Transfer Protocol 图片传输协议 使用ptp.gs1,专为相机设计的协议 | 1. 连接电脑导出图片 2. 相机直接访问 | 弹出“传输照片” |
rndis | Remote NDIS,远程网络驱动接口 使用rndis.gs4,手机作为USB网卡,共享网络给电脑 | 1. 手机作为网络设备,共享网络给PC 2. 设置-网络-USB共享网络 | 电脑识别为“以太网适配器” |
accessory | Android Open Accessory,外设模式 使用Accessory.gs2,手机作为外设 | 录音、直播 | 不弹窗,直接进入配件模式 |
audio_source | 音频输入 使用audio_source.gs3,手机的音频作为USB音频输入 | 1. 手机作为USB 麦克风,用于专业录音场景 2.设置-音频源 | 电脑设备为“USB麦克风” |
midi | Musical Instrument Digital Interface,MIDI 设备 使用midi.gs5功能,手机作为MIDI输入/输出设备 | 1. 连接电子琴、DJ控制器 | 作为 MIDI 输入 |
mtp,adb | 文件+调试 | 开发者模式 | “文件传输 + ADB” |
ptp,adb | 照片+调试 | 摄影+调试 | “照片传输 + ADB” |
rndis,adb | 网络+调试 | 网络调试 | “USB 网络 + ADB” |
accessory,adb | 外设+调试 | AOA 调试 | 配件模式 + ADB |
audio_source,adb | 麦克风+调试 | 音频开发 | 麦克风 + ADB |
accessory, audio_source | 外设+麦克风 | ||
accessory, audio_source,adb | 外设+麦克风+adb |
5.2 切换USB配置
- init.usb.configfs.rc中的USB配置中要求
sys.usb.configfs=1的前提
,而init.usb.rc的USB配置中要求sys.usb.configfs=0。
- 如果USB配置中有adb的话,需要额外的条件sys.usb.ffs.ready=1的条件,因为adb配置需要创建指向ffs.adb的软链,因此需要其先Ready,否则会报错。
ffs.adb目录是由adbd在启动时创建,则需要做前提动作:当满足该usb配置和configfs=1外,要start adbd(adbd在启动完成后才会将sys.usb.ffs.ready置为1)。 - 以usb.config=mtp, adb为例
on property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1start adbdon property:sys.usb.ffs.ready=1 && property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_adb"symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2write /config/usb_gadget/g1/UDC ${sys.usb.controller}setprop sys.usb.state ${sys.usb.config}
5.2.1设置USB描述符
write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_adb"详解
- 作用:设置USB配置描述符的字符串
- /configs/b.1:表示配置#1
- strings/0x409:表示语言ID是0x409,即英语(美国)
- configuration:这是USB协议中定义的配置名称,mtp_adb是配置的值。
5.2.2 创建指向对应配置功能的符号链接
symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1和
symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2详解
- 作用:将MTP功能加入配置
- fucntions/mtp.gs0:MTP 功能的实现目录(由内核驱动创建)
- functions/ffs.adb:ADB功能目录(基于FunctionFS,FFS,基于用户空间实现USB功能的机制,adbd服务通过/dev)
configs/b.1/f1
:配置 #1 的第一个功能槽位- configs/b.1/f2:配置 #1 的第二个功能槽位
- symlink用于创建符号链接 ,将 MTP 功能绑定到该配置
5.2.3 启用USB控制器(UDC)
write /config/usb_gadget/g1/UDC ${sys.usb.controller}详解
- 作用:将 Gadget g1 绑定到实际的 USB 硬件控制器,触发 USB 枚举过程
- UDC:USB Device Controller
- ${sys.usb.controller}取值常见的有fe800000.dwc3,a600000.dwc3等,其中fe800000是内存映射地址,常见于高通骁龙8系列;dwc3是驱动名称,
dwc3
= DesignWare Core USB3,是Synopsys公司设计的USB3.0控制器的IP核。
eg:
fe800000 常见于 高通骁龙 8 系列(如 msm8998、sdm845) a600000 常见于 高通骁龙 6/7 系列 或旧平台 12c00000 三星 Exynos 1e000000 联发科 MT 系列
驱动名 含义 常见平台 dwc3
DesignWare Core USB3 高通、三星、MTK dwc2
DesignWare USB2 旧设备、嵌入式 ci_hdrc
ChipIdea HDRC 恩智浦 i.MX musb-hdrc
Mentor Graphics USB 老高通、TI snps,dwc3
设备树兼容名 同 dwc3
5.2.4更新系统sys.usb.state的值
setprop sys.usb.state ${sys.usb.config}详解
- 作用:更新USB状态,属性sys.usb.state表示最终成功启动的模式。
- 该属性一般由UsbDeviceManager和BatteryService监听。