Android14 USB子系統的啟動以及動態切換相關的init.usb.rc詳解

init.usb.rc的作用是在Android系統啟動和運行時,通過監聽屬性(sys.usb.config和sys.usb.configfs, sys.usb.typec.mode)變化動態,通過寫入內核接口 /sys/class/android_usb/ 來配置USB模式。

1 USB子系統的啟動

1.1 on init階段的配置

在on init階段設置sys.usb.configfs屬性,該屬性時USB配置方式開關,用來選擇使用哪種內核機制來配置USB,0-表示傳統模式,1-表示現代configfs模式。

on initsetprop sys.usb.configfs 0

? 兩種模式對比

特性sys.usb.configfs=0(傳統模式)sys.usb.configfs=1(現代模式)
技術名稱android_usb / gadgetfsconfigfs USB Gadget
出現時間Android 早期Android 6.0+ 逐漸引入
配置方式寫?/sys/class/android_usb/使用?configfs?虛擬文件系統
靈活性較低極高(支持復合設備、自定義描述符)
性能一般更好
常見設備老設備、AOSP 默認Pixel、三星、華為等新設備

? 兩種屬性對比

  • sys.usb.configfs是怎么做,即怎么選擇哪種方式配置USB。
  • sys.usb.config是做什么,即配置成哪種USB模式:mtp,adb,rndis,accessory等。
  • 總結
    特性sys.usb.configsys.usb.configfs
    類型功能列表(字符串)模式開關(0/1)
    作用“要什么功能”“用什么方式配置”
    影響范圍用戶可見的 USB 模式底層實現機制
    可變性頻繁變化(用戶切換模式)啟動時確定,很少變化
    持久化persist.sys.usb.config通常硬編碼或由內核決定

1.2 on post-fs-data階段配置

在/data分區掛載后,設置USB功能所需的文件權限和目錄結構。防止普通應用隨意修改USB行為。

on post-fs-datachown system system /sys/class/android_usb/android0/f_mass_storage/lun/filechmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun/filechown system system /sys/class/android_usb/android0/f_rndis/ethaddrchmod 0660 /sys/class/android_usb/android0/f_rndis/ethaddrmkdir /data/misc/adb 02750 system shellmkdir /data/adb 0700 root root encryption=Require
  • f_mass_storage/lun/file:U盤模式下要暴露的鏡像文件(通常是?/dev/null?或某個映像)
  • f_rndis/ethaddr:RNDIS 網絡共享時的 MAC 地址配置
  • 創建?/data/misc/adb:存放 ADB 調試相關密鑰(adb_keys
  • 創建?/data/adb:高權限 ADB 目錄(某些定制 ROM 使用)

2. 定義adbd的守護服務

service adbd /system/bin/adbd --root_seclabel=u:r:su:s0class coresocket adbd seqpacket 660 system systemdisabledupdatableseclabel u:r:adbd:s0

adbd服務默認不啟動,由init.<platform>.usb.rc中通過start adbd啟動。這里以高通平臺為例,在init.qcom.usb.rc中會啟動該adb的守護進程,eg:

on property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,dpl,rmnet,adb && property:sys.usb.configfs=1start adbd
?

3. 同步廠商的USB屬性到系統屬性

on property:vendor.sys.usb.adb.disabled=*setprop sys.usb.adb.disabled ${vendor.sys.usb.adb.disabled}

只要vendor.sys.usb.adb.disabled屬性變化,就更新系統屬性sys.usb.adb.disabled的值。其中“*”表示任何值變化都觸發。

4. USB配置屬性變化時,則修改內核對應的USB配置

init.usb.rc中配置了傳統的USB配置,是為了適配老機型。不同的平臺或者廠商可以實現configfs架構來動態配置USB,例如高通平臺中就是在init.qcom.usb.rc中配置新的USB屬性。

4.1 傳統的USB動態配置

sys.usb.config的取值由none(關閉USB), adb(ADB調試模式),accessory(當前設備作為配件,連接主機(例如汽車)),audio_source(當前設備作為音頻源輸出),以及幾種的組合。

當sys.usb.config變化時,同時還要滿足property:sys.usb.configfs=0時才會修改內核的USB配置。

例如:

# audio accessory configuration, with adb
on property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=0write /sys/class/android_usb/android0/enable 0write /sys/class/android_usb/android0/idVendor 18d1write /sys/class/android_usb/android0/idProduct 2d03write /sys/class/android_usb/android0/functions ${sys.usb.config}write /sys/class/android_usb/android0/enable 1start adbdsetprop sys.usb.state ${sys.usb.config}
  • android_usb是內核包括給用戶空間的USB驅動接口,android0表示是該啟動的第一個實例,大多設備只有一個USB實例。
  • enable 0表示安全關閉當前USB,設置新的配置之前先關閉,然后在修改VID和PID以及功能。
  • idVendor表示廠商表示,即Vendo ID,18d1?是?Google 的官方 VID(十六進制)。
  • idProduct表示產品型號標識,即Product ID,2d03(十六進制)是?AOSP 中“音頻源 + ADB”模式的專用 PID。PID取值還有:
    PID (hex)模式
    2d00accessory(配件模式)
    2d01accessory + adb
    2d02audio_source(音頻源)
    2d03audio_source + adb??
    2d04accessory + audio_source
    2d05accessory + audio_source + adb
  • functions決定啟用哪些USB功能,取值是${sys.usb.config}
  • enable 1表示激活新的USB配置,內核會根據前面設置的?idVendoridProductfunctions?創建一個新的 USB 設備,電腦端會“重新識別設備”(就像拔掉再插上)。
# Used to disable USB when switching states
on property:sys.usb.config=none && property:sys.usb.configfs=0stop adbdwrite /sys/class/android_usb/android0/enable 0write /sys/class/android_usb/android0/bDeviceClass 0setprop sys.usb.state ${sys.usb.config}

?總結

配置項取值含義 / 用途典型場景
sys.usb.configfs0使用傳統?android_usb?驅動(舊方式)AOSP、老設備
1使用現代?configfs?USB Gadget(新方式)Pixel、三星、華為新機
sys.usb.confignone僅充電,無數據功能用戶選擇“僅充電”
adb僅 ADB 調試開發者模式調試
accessoryAndroid Open Accessory 模式,當前設備作為配件,連接主機連接 Arduino、汽車主機
audio_source音頻源輸出(手機→外部設備)連車載音響播放音樂
accessory, adb即支持配件模式,也支持adb手機共享網絡給電腦
audio_source,adb音源輸出+adb連車載音響播放音樂、設備調試
accessory,audio_source

即支持Android Open Accessory 模式,當前設備作為配件,連接主機;

也作為音源輸出

連接汽車主機,并作為音源輸出
accessory,audio_source,adbAccessory + 調試開發調試配件

4.2 使用configs動態配置USB

該章節以高通平臺為例,請參考下一個。

5 USB Type-c的模式/角色/充電控制

5.1 USB Type-C模式控制

當屬性sys.usb.typec.mode發生變化時,則寫入內核dual_role_usb接口讓內核切換角色。

  • dfp(Downstream Facing Port):主機模式(Host),支持OTG(on the go)功能
  • ufp?(Upstream Facing Port):設備模式(Device)
    場景手機角色對方設備角色
    手機連電腦傳照片UFP(設備)電腦是 DFP(主機)
    手機接 OTG + U盤DFP(主機)U盤是 UFP(設備)
    手機給另一臺手機充電DFP(電源/主機)對方是 UFP(受電/設備
    # USB mode changes
    on property:sys.usb.typec.mode=dfpwrite /sys/class/dual_role_usb/otg_default/mode ${sys.usb.typec.mode}setprop sys.usb.typec.state ${sys.usb.typec.mode}on property:sys.usb.typec.mode=ufpwrite /sys/class/dual_role_usb/otg_default/mode ${sys.usb.typec.mode}setprop sys.usb.typec.state ${sys.usb.typec.mode}

    5.2?USB Type-C角色控制

當屬性sys.usb.typec.data_role變化時,取值device和host,通過dual_role_usb修改設備的充當的角色,并更新sys.usb.typec.state的屬性值。

  • 取值device時,告訴內核要作為USB設備,即UFP模式。
  • 取值host時,告訴內核要作為USB主機,即DFP模式。
# USB data role changes
on property:sys.usb.typec.data_role=devicewrite /sys/class/dual_role_usb/otg_default/data_role ${sys.usb.typec.data_role}setprop sys.usb.typec.state ${sys.usb.typec.data_role}on property:sys.usb.typec.data_role=hostwrite /sys/class/dual_role_usb/otg_default/data_role ${sys.usb.typec.data_role}setprop sys.usb.typec.state ${sys.usb.typec.data_role}

5.3 TypeC mode和 TypeC role的對比

這兩個屬性是Android采用“策略與機制分離”的設計原則,role是請求,mode是執行。

概念typec.data_roletypec.mode
層級系統/策略層硬件/內核層
作用表達系統意圖(我要當主機)直接控制硬件角色(變成主機)
類比“我要加速”,是“請求”“踩油門”,是“執行”
是否可被覆蓋是(可被電源管理等策略干預)
誰設置它系統服務(如 UsbDeviceManager)int /HAL/ 內核
設計目的策略(policy)機制(mechanism)

5.4 USB type-c充電角色控制

當屬性sys.usb.typec.power_role變化時,取值source和sink,通過dual_role_usb控制誰給誰充電,實現反向充電和被充電,并更新sys.usb.typec.state的屬性值。

  • source: 我是電源,可以給其他設備充電
  • sink:我是負載,需要被充電
# USB power role changes
on property:sys.usb.typec.power_role=sourcewrite /sys/class/dual_role_usb/otg_default/power_role ${sys.usb.typec.power_role}setprop sys.usb.typec.state ${sys.usb.typec.power_role}on property:sys.usb.typec.power_role=sinkwrite /sys/class/dual_role_usb/otg_default/power_role ${sys.usb.typec.power_role}setprop sys.usb.typec.state ${sys.usb.typec.power_role}

注意:power_role和data_role是相互獨立,前者控制電源角色,后者控制數據角色。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97216.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97216.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97216.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

宜春城區SDH網圖分析

一、SDH網圖展示 圖片來源&#xff1a; 本地網傳輸網組SDH網圖(2014年12月) - 百度文庫 SDH就是Synchronous Digital Hierarchy&#xff0c;同步數字體系的意思。 從分布圖可以看出&#xff0c;城區網和工業網一樣&#xff0c;是環狀結構&#xff0c;保障數據傳輸的穩定。我的…

lwIP MQTT 心跳 Bug 分析與修復

一、背景在使用 lwIP 內置 MQTT 客戶端時&#xff0c;如果你用的是 2.2.0 之前的版本&#xff0c;很可能會遇到一個惱人的問題&#xff1a;客戶端和服務器正常連接&#xff0c;但一段時間后 會話被 broker 踢掉。比如常見的現象&#xff1a;Mosquitto / EMQX 日志顯示客戶端超時…

Golang 面試題「中級」

以下是 100 道 Golang 中級面試題及答案&#xff0c;涵蓋并發編程、內存管理、接口實現、標準庫深入應用等核心知識點&#xff1a; 一、并發編程基礎與進階問題&#xff1a;Golang 的 GPM 調度模型中&#xff0c;G、P、M 分別代表什么&#xff1f;它們的協作關系是怎樣的&#…

沃爾瑪AI系統Wally深度拆解:零售業庫存周轉提速18%,動態定價爭議與員工轉型成熱議點

最近去沃爾瑪購物&#xff0c;發現以前總斷貨的那款早餐麥片居然常年擺在最顯眼的貨架上&#xff0c;而且價格每周末都會微調——這可不是巧合&#xff0c;背后藏著零售業最硬核的AI操作。沃爾瑪去年推出的智能系統Wally&#xff0c;正悄悄改變著我們買東西的體驗和商家的運營邏…

AutoDL算力云上傳文件太慢了如何解決?

----------------------------------------------------------------------------------------------- 這是我在我的網站中截取的文章&#xff0c;有更多的文章歡迎來訪問我自己的博客網站rn.berlinlian.cn&#xff0c;這里還有很多有關計算機的知識&#xff0c;歡迎進行留言或…

【智慧城市】2025年中國地質大學(武漢)暑期實訓優秀作品(2):智慧城市西安與一帶一路

PART 01 項目背景01政策與時代背景近年來&#xff0c;隨著科技的飛速發展和政策的積極推動&#xff0c;我國新型智慧城市建設取得了顯著成效。在“十四五”國家信息化規劃中&#xff0c;明確提出要打造智慧高效的城市治理體系&#xff0c;推動城市管理精細化、服務智能化。同時…

MySQL數據庫精研之旅第十四期:索引的 “潛規則”(上)

專欄&#xff1a;MySQL數據庫成長記 個人主頁&#xff1a;手握風云 目錄 一、索引簡介 1.1. 索引是什么 1.2. 為什么需要索引 二、索引應該選擇哪種數據結構 2.1. Hash 2.2. 二叉搜索樹 2.3. N叉樹 2.4. B樹 三、MySQL中的頁 3.1. 為什么要使用頁 3.2. 頁文件頭和頁…

架構設計——云原生與分布式系統架構

** 云原生與分布式系統架構** 5.1 云選型策略&#xff1a;多云、混合云還是單云&#xff1f;如何決定&#xff1f; “上云”已無需討論&#xff0c;但“上什么云”是第一個戰略決策。單云&#xff08;Single Cloud&#xff09;策略&#xff1a; 描述&#xff1a; 將全部資源集中…

Python圖片轉WebP常用庫推薦:Pillow、Wand、cv2

摘要 Python轉換圖片為WebP&#xff0c;Pillow最推薦&#xff1a;安裝簡單&#xff08;pip install pillow&#xff09;、使用方便&#xff0c;代碼示例顯示處理RGBA轉RGB等細節&#xff0c;適合多數場景&#xff1b;Wand功能更強基于ImageMagick&#xff0c;適合需高級處理的場…

Android WPS Office 18.20

WPS Office是一款集Word&#xff0c;PDF&#xff0c;Sheet&#xff0c;PowerPoint&#xff0c;表格&#xff0c;文檔&#xff0c;云存儲&#xff0c;模板庫和在線編輯與共享于一體的多功能免費辦公套件。它提供類似于Microsoft Office的功能&#xff0c;包括文字處理、表格編輯…

Elasticsearch核心配置與性能優化

以下是Elasticsearch&#xff08;ES&#xff09;的 核心配置項 及 性能優化措施&#xff0c;涵蓋硬件、系統、ES配置、索引設計等關鍵方面&#xff0c;幫助提升集群穩定性與查詢性能&#xff1a;一、硬件與系統層優化內存分配 堆內存&#xff08;Heap Size&#xff09;&#xf…

【谷歌瀏覽器】瀏覽器實用自用版——谷歌瀏覽器(Google Chrome)離線純凈版安裝 官方版無任何捆綁及廣告 【離線安裝谷歌瀏覽器】

經常上網的朋友們肯定深有體會&#xff1a;如今不少瀏覽器動不動就彈廣告、塞插件&#xff0c;用起來簡直是折磨。面對這些“全家桶”式捆綁&#xff0c;大家都渴望能找到一款干凈、簡潔、無打擾的瀏覽器——這時候&#xff0c;Google Chrome&#xff08;谷歌瀏覽器&#xff09…

2025年滲透測試面試題總結-39(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 3. SAST&#xff08;靜態應用安全測試&#xff09; 4. IAST&#xff08;交互式應用安全測試&#xff09; …

網站測試報告:WEB應用反CSRF的本質與防御機制

CSRF (跨站請求偽造) 本質&#xff1a; 攻擊者誘騙已登錄目標站點的用戶&#xff0c;在不知情的情況下提交一個惡意請求。該請求利用用戶瀏覽器中已存儲的認證信息&#xff08;如Cookie、Session&#xff09;&#xff0c;以該用戶的身份執行未授權的操作&#xff08;如修改密碼…

2025年9月計算機二級C++語言程序設計——選擇題打卡Day10

備考計算機二級 C 程序設計考試&#xff0c;選擇題是不容忽視的重要部分。 今天為大家帶來 10 道難點選擇題&#xff0c;聚焦繼承、多態等核心難點&#xff0c;助力提升解題精度。 1、有如下程序&#xff1a; #include<iostream> using namespace std; class Base { pub…

Formdata表單數據提交

前言&#xff1a;在表單數據提交中&#xff0c;常常除了字符串拼接的方式傳給后端&#xff0c;一般可能還需要使用Fromdata的格式包裝所要提交的表單數據傳遞。常用場景&#xff1a;表單數據提交一、Formdata的優勢使用 FormData 主要是因為它有兩個獨特優勢&#xff1a;能輕松…

React Native 初體驗

前言 最近公司需要移植一個應用到 iOS 端&#xff0c;本來想要嘗試 uniapp 的新架構 uniapp-x 的&#xff0c;折騰兩天放棄了&#xff0c;選擇了 React Native。 原因&#xff1a; HbuilderX 中的 uniapp-x 模版過于臃腫&#xff0c;夾雜很多不需要的東西&#xff08;可能是…

自動駕駛中的傳感器技術36——Lidar(11)

本章節重點介紹和FMCWOPA Lidar強相關的硅光技術。 1、硅光技術概述&#xff08;Silicon Photonics&#xff09; 硅光技術主要是用在光通信中&#xff0c;利用硅作為光學介質&#xff0c;通過光傳輸和處理數據。與依賴電子進行數據傳輸的傳統電子電路不同&#xff0c;硅光子學…

MapStruct用法和實踐

一、MapStruct 用法1. 嵌套對象深度映射&#xff08;Deep Mapping&#xff09;// 源對象 public class User {private Address address;// getter/setter }public class Address {private String city;private String street; }// 目標對象 public class UserDTO {private Stri…

設計模式相關面試題

寫在前面 &#x1f525;我把后端Java面試題做了一個匯總&#xff0c;有興趣大家可以看看&#xff01;這里&#x1f449; ??在反復復習面試題時&#xff0c;我發現不同資料的解釋五花八門&#xff0c;容易造成概念混淆。尤其是很多總結性的文章和視頻&#xff0c;要么冗長難…