当前位置: 首页 > news >正文

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无功能拔线、关机电脑无反应
adbADB 调试开发调试仅显示“充电”
mtpMedia Transfer Protocol,多媒体传输
使用mtp.gs0功能,通过USB实现文件系统的访问
1. 默认模式
2. 支持照片、音乐、文件等
弹出“传输文件”
ptp

Picture Transfer Protocol

图片传输协议

使用ptp.gs1,专为相机设计的协议

1. 连接电脑导出图片
2. 相机直接访问
弹出“传输照片”
rndisRemote 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 系列
    驱动名含义常见平台
    dwc3DesignWare Core USB3高通、三星、MTK
    dwc2DesignWare USB2旧设备、嵌入式
    ci_hdrcChipIdea HDRC恩智浦 i.MX
    musb-hdrcMentor 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监听。
http://www.dtcms.com/a/355834.html

相关文章:

  • 算法学习笔记:双指针_滑动窗口专题
  • STM32CubeMX 6.15.0 + CLion
  • 3.渗透-.IP地址-详解
  • AI批量抠图工具,无需付费,永久使用
  • 报错记录 Error: CUDNN_STATUS_BAD_PARAM; Reason: finalize_internal()
  • 仓颉编程语言青少年基础教程:输入输出
  • Vue 自定义筛选组件:3 种全选反选场景的优雅实现
  • Groovy闭包语法详解
  • 【MySQL数据库入门课程】开课啦!
  • 一个是“内容生成器”,一个是“知识管理器”:VibeVoice 与 NoteBookLM 优劣对决?
  • 《零基础入门AI:YOLO目标检测模型详解(从基础概念到YOLOv1核心原理)》
  • Vue模版:Ant-design模态框弹窗
  • vue3的setup
  • 基于离散小波变换(DWT)的数字水印Matlab
  • @Indexed注解的作用
  • 整理3点结构点与点之间的距离
  • Paimon——官网阅读:非主键表
  • 基于pytorch的垃圾分类识别项目实战
  • Qt|QElapsedTimer 的使用详解
  • H5小游戏-超级马里奥
  • 【涂鸦T5】2. 光感bh1750
  • 效率飙升200%:Appsmith开发结合cpolar远程访问实战解析
  • 前端面试题2(vue)
  • 高并发内存池(14)- PageCache回收内存
  • Go 语言常用命令使用与总结
  • 【Agent】AutoAgent: A Fully-Automated and Zero-Code Framework for LLM Agents
  • 从零开始:手写数字识别程序的深度学习实践
  • 《实际项目》空调水系统群控方案
  • TensorFlow 深度学习 | 三种创建模型的 API
  • Promptalot-Midjourney提示词分享平台