Android14 USB子系统启动以及动态切换的init.usb.rc

Android14 基于Configfs的USB动态配置init.usb.configfs.rc

Android14 高通平台的USB子系统启动和动态配置init.qcom.usb.rc


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.pswp.cn/pingmian/95126.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95126.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95126.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年KBS SCI1区TOP,矩阵差分进化算法+移动网络视觉覆盖无人机轨迹优化,深度解析+性能实测

目录1.摘要2.系统模型和问题表述3.矩阵差分进化算法4.结果展示5.参考文献6.算法辅导应用定制读者交流1.摘要 本文提出了一种面向无人机(UAV)新型轨迹优化方法,以实现对地面移动节点的高效视觉覆盖。与传统方法不同,该方法显式考虑…

Python OpenCV图像处理与深度学习:Python OpenCV图像几何变换入门

图像变换:掌握OpenCV中的几何变换 学习目标 通过本课程,学员们将能够理解图像的几何变换原理,包括缩放、旋转和平移,并能够使用Python和OpenCV库实现这些变换。本课程将通过理论讲解与实践操作相结合的方式,帮助学员们…

Redis Windows 7.0.5 安装教程(附exe/msi下载+环境配置+命令测试)

​第一步:下安装包​ 打开浏览器(比如 Edge 或 Chrome),复制这个链接到地址栏敲回车: https://pan.quark.cn/s/31912e0d0443 进去后往下翻,找名字带 ​**redis-7.0.5​ 的文件,​选那个 .exe 结…

数据结构(单链表)

目录 1.链表的概念及结构 2.单链表的应用 2.1 打印链表 2.2申请新节点 2.3插入(尾删和头删) 2.4删除(尾删和头删) 2.5查找 2.6任意位置插入 2.7删除指定位置的元素 2.8 销毁链表 3.总结 1.链表的概念及结构 &#xff…

电脑没加域却能获取到IP地址

企业网络管理的核心逻辑!电脑没加域却能获取到IP地址,这完全是一种刻意为之的安全设计,而不是网络故障。 简单来说就是:“给你IP,但不给你权限。” 这背后是一套完整的 网络准入控制(NAC) 策略。…

Go语言入门学习笔记

📚 前言 欢迎学习Go语言!这份教材假设您是编程零基础,从最基本的概念开始讲解。Go语言(也称为Golang)由Google开发,简单、高效、并发能力强,适合后端开发、系统编程和云计算。 学习建议&#xf…

gradle安装、配置环境变量、配置阿里源及idea 中配置gradle

下载gradle https://services.gradle.org/distributions/ 配置系统环境变量 新增GRADLE_HOME D:\Information_Technology\App\gradle-8.14.3-bin\gradle-8.14.3 新增GRADLE_USER_HOME D:\Information_Technology\App\gradleHouse 设置 path,新增一行 %GRADLE_…

C# FlaUI win 自动化框架,介绍

一、简洁介绍 FlaUI 是一套基于 .NET 的 Windows 桌面应用自动化测试库,支持 Win32、WinForms、WPF、UWP 等多种类型的应用。它基于微软原生 UI Automation 库,提供了更现代、易用的 API,适合自动化测试工程师和开发者实现高效、可维护的 UI …

命名空间级别应用 Pod 安全标准

🎯 命名空间级别应用 Pod 安全标准 一、创建 Kubernetes 集群(使用 kind) 使用 kind (Kubernetes IN Docker)快速创建一个本地集群: kind create cluster --name my-cluster验证集群是否运行正常&#xff1…

Ubuntu 25.10 Snapshot4 发布。

Ubuntu 25.10 的第四个快照(Snapshot 4)已于 2025 年 8 月 28 日发布,供开发者和测试人员进行验证。这是 Ubuntu 25.10 正式发布前的最后一个月度快照,标志着该版本已进入功能冻结阶段,预计将在 10 月发布正式版。 Ca…

STM32F2/F4系列单片机解密和芯片应用介绍

STM32F2/F4系列单片机解密和芯片应用介绍STM32F2和STM32F4系列微控制器凭借其出色的性能、丰富的外设接口和强大的连接能力,在很多对计算能力和实时性有要求的领域都有应用。同时,芯片解密的价格因其型号、加密技术等因素差异较大。🧭 重要提…

250901-BookStack跨服务器从Rootless-Docker到Rootful-Docker的备份迁移及服务启动

下面给你一套「可离线、最小停机」的迁移步骤,从 A(rootless)搬到 B(rootful)。思路是:停 A → 打包数据卷 → 传到 B → 还原 → 用同版本镜像启动 → 验证。整套操作不依赖公网,只用你已有的离…

(Redis)Redis 分布式锁及改进策略详解

一、为什么需要分布式锁在单机应用中,synchronized 或 ReentrantLock 足以解决并发问题。但在 分布式系统 中,多台服务器之间共享同一个资源时,如果没有锁,很可能出现 超卖、重复扣减、数据不一致 等问题。 因此,分布式…

Linux应用开发-windows,linux环境下相关工具

VS Code Remote - SSH 虚拟机部分的操作 sudo systemctl status sshsudo apt update sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh # 设置开机自启hostname -IVS Code部分的操作 安装 Remote - SSH 插件 vscode右下角出现&#xff…

Java泛型通配符详解:搞懂?/extends/super用法,避开集合操作踩坑点

上次跟你们聊了泛型的基础用法,今天接着往下说 —— 泛型里还有个挺重要的概念叫 “通配符”,就是那个问号 “?”,很多人第一次见都懵:这玩意儿跟普通泛型有啥区别?为啥有时候非得用它不可?小索奇当初也卡…

EXCEL开发之路(二)跨表交互模拟—仙盟创梦IDE

在车辆租赁行业,数据的高效管理与分析对于企业的运营决策、资源调配及客户服务优化至关重要。自建 Excel 实现多表统计交互,如同为行业装上了效能驱动引擎,助力企业在复杂多变的市场环境中稳健前行。一、精准资源管理,优化车辆调配…

医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(八)

5.4 性能测试与结果分析 为了评估GoEHRStream的性能,我们设计测试模拟真实的医院数据流场景,并测量关键指标。 5.4.1 实验环境 硬件: CPU: Intel Xeon E-2288G (8 cores, 16 threads) RAM: 32 GB DDR4 Storage: 512 GB NVMe SSD (用于GoEHRStream和BadgerDB) Network: 1 G…

开关电源设计“反馈回路”部分器件分析

目录 主要分析问题如下: 一、问题1 二、问题二 分析电路如下: 主要分析问题如下: 1、分析TL431芯片1、2两引脚间并联电阻和电容(RC电路)的作用? 2、PC817A光耦输入两个引脚间并联电阻的作用?…

AI 编程新玩法:用 yunqi-saas-kit 框架制作小游戏,看广告变现轻松赚钱​

AI 编程新玩法:用 yunqi-saas-kit 框架制作小游戏,看广告变现轻松赚钱 在数字经济快速发展的当下,AI 技术正不断渗透到各个领域,其中 **#AI 编程凭借高效、便捷的优势,成为不少开发者和创业者的新选择。尤其是在小游戏…

Kafka 架构原理

一个kafka集群中包含一个或多个Producer、一个或多个broker、一个或多个ConsumerGrop以及一个Zookeeper集群。kafka通过Zookeeper管理kafka集群配置、leader副本的选举、生产者的负载均衡等。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消…