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

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

相关文章

广东省省考备考(第八十九天8.28)——判断推理(听课后强化训练)

判断推理:定义判断 错题解析 第一步:找出定义关键词。 “为了明确所承运的货物是否发生了残损,以及残损责任是否属于船方”。 第二步:逐一分析选项。 A项:甲船向商检机构申请检查船舶卸货前舱口、风筒的封盖和封识情况…

【C++】C++11的右值引用和移动语义

各位大佬好,我是落羽!一个坚持学习进步的学生。 如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步! 也欢迎关注我的blog主页: 落羽的落羽 文章目录一、C11简介二、左值和右值是什么三、左值引用与右值引…

Logic Error: 如何识别和修复逻辑错误

逻辑错误是指程序中的代码在语法上是正确的,但在执行时没有按预期工作。这种错误可能导致程序输出错误的结果或行为异常。逻辑错误通常比语法错误更难检测,因为它们不会产生编译或解释错误。本文将详细介绍如何识别和修复逻辑错误。一、识别逻辑错误1. 理…

TUN模式端口冲突 启动失败如何解决?

从日志信息来看,TUN模式启动失败是由于端口冲突导致的。 具体来说,Xray在尝试监听10808端口时失败了,因为该端口已经被其他进程占用。 错误信息分析 Failed to start: app/proxyman/inbound: failed to listen TCP on 10808 > transport/i…

如何调试一个EVM合约:实战操作 + 常见报错说明

在Solidity开发过程中,大多数开发者最常遇到的问题不是“代码写不了”,而是“代码部署了,但行为不对”。本篇文章将带你梳理一套完整的EVM智能合约调试流程,并附上几类真实常见报错场景及排查方法,适用于Hardhat、Remi…

使用Wireshark分析自助终端机网络数据

如果是明文还好, 是密文就没办法了。工具.1自助终端机.2组装结构主流架构选择‌B/S架构‌:通过Web应用调用本地硬件插件,开发速度快但依赖浏览器兼容性。 ‌‌C/S架构‌:直接调用硬件驱动,交互响应快但更新维护复杂。 …

数学建模——马尔科夫链(Markov Chain Model)

数学建模——马尔科夫链(Markov Chain Model)一、马尔可夫链的定义1. 状态与状态空间2. 无后效性(马尔科夫性)​3. 转移概率与转移概率矩阵(1)一步转移概率(2)转移概率矩阵二、马尔科…

《拉康精神分析学中的欲望辩证法:能指的拓扑学与主体的解构性重构》

在当代人文思想图谱中,雅克拉康以语言学为利刃对弗洛伊德理论进行的结构性重铸构成了20世纪最具颠覆性的理论创造之一。这位被誉为"法国弗洛伊德"的思想巨匠通过"回到弗洛伊德"的口号,实则完成了对精神分析学的哥白尼式革命——将主…

数字时代下的智能信息传播引擎

在商场、楼宇、交通枢纽等公共场所,数字广告机已成为信息传播的重要载体。其背后的广告机系统,是一套集硬件控制、内容管理、网络传输与数据分析于一体的综合技术解决方案,正推动传统静态广告向动态化、交互化、智能化方向演进。系统架构与核…

文献阅读笔记:KalmanNet-融合神经网络和卡尔曼滤波的部分已知动力学状态估计

文献阅读笔记:KalmanNet-融合神经网络和卡尔曼滤波的部分已知动力学状态估计摘要一、研究背景1.1 状态估计问题的重要性1.2 传统方法的局限:非线性与模型不确定性非线性问题噪声统计未知问题1.3 数据驱动方法的兴起与局限1.4 KalmanNet:混合方…

使用EasyExcel根据模板导出文件

文章目录概要工具类核心功能核心代码解析模板导出核心方法文件下载处理HTTP响应设置文件下载处理使用示例概要 在企业级应用开发中,Excel数据导出是一个常见的需求。本文实现一个基于阿里巴巴EasyExcel库实现的根据模板导出文件的工具类,它通过预定义的…

【AI基础:神经网络】19、机器学习实战:径向基函数神经网络(RBFN)指南

一、引言:为什么RBFN是神经网络中的“局部专家”? 在机器学习领域,神经网络的“全局逼近”与“局部逼近”一直是两大核心思路。像我们熟悉的多层感知机(MLP),使用Sigmoid、ReLU等全局激活函数,每个神经元都会对整个输入空间产生响应——就像“全员参与”处理所有数据,…

Linux 性能调优实战:CPU、磁盘 I/O、网络与内核参数

前言 一、CPU 资源调优 1. 调整进程优先级(nice/renice) 2. 设置 CPU 亲和力(taskset) 3. 查看 CPU 信息 4. 使用 vmstat 分析系统瓶颈 二、磁盘 I/O 调优 1. ulimit 资源限制 2. 磁盘速度测试 三、内核参数调优 1. 常用…

【进阶篇第五弹】《详解存储过程》从0掌握MySQL中的存储过程以及存储函数

文章目录存储过程一、基本语法(1)创建存储过程(2)调用存储过程(3)查看存储过程(4)删除存储过程(5)设置结束符(6)参数二、变量(1)系统变量(2)用户自定义变量(3)局部变量三、基本语句(1)if判断(2)case(3)while循环(4)repeat(5)loop循环四、游标五、条件处理程序六、存储函数存储过…

HarmonyOS布局实战:用声明式UI构建自适应电商卡片

首先诚邀大家参加学习鸿蒙拿好礼活动,即日起,只要加入班级考取华为开发者基础/高级证书,并发表一篇技术文章,就有机会获得官方发放的精美礼品,数量有限,先到先得。冷老师的班级链接如下:​华为开…

日语学习-日语知识点小记-构建基础-JLPT-N3阶段(21):文法+单词第7回3

日语学习-日语知识点小记-构建基础-JLPT-N3阶段(21):文法单词第7回3 1、前言(1)情况说明(2)工程师的信仰2、知识点1ー 。。。と。。。なる2ーVて欲しい ・ …

Baumer高防护相机如何通过Tiny-YOLO单类模型实现人体跌倒检测与跟踪(C#代码UI界面版)

《------往期经典推荐------》 AI应用软件开发实战专栏【链接】 序号项目名称项目名称11.工业相机 YOLOv8 实现人物检测识别:(C#代码,UI界面版)2.工业相机 YOLOv8 实现PCB的缺陷检测:(C#代码&#xff0…

从源码看浏览器弹窗消息机制:SetDefaultView 的创建、消息转发与本地/在线页通用实践

引言在现代浏览器的开发中,前端页面和 C 内核之间的通信是一项核心功能。无论是本地设置页(chrome:// 内置 H5)还是在线活动页,前端都可能需要调用浏览器底层 API,实现诸如“设置默认浏览器”、“更改壁纸”、“读取用…

对比视频处理单元(VPU)、图形处理器(GPU)与中央处理器(CPU)

如今选择互联网点播流媒体与直播视频的用户数量已远超传统广播电视,这一转变催生了对高性能媒体转码与OTT流媒体功能专用技术的需求。 我们最新推出的Accelerated Compute云计算解决方案,首次通过NETINT Quadra视频处理单元(VPU)…

vue3写一个简单的时间轴组件

插件版本:"element-plus": "^2.3.12""vue": "^3.0.0"代码示例:样式文件style.less:改变el-tooltip样式,可以复制代码到公共样式文件.el-popper.o-el-tooltip-popper-class {max-width: 3…