1?Android14 USB子系統啟動以及動態切換的init.usb.rc
2?Android14 基于Configfs的USB動態配置init.usb.configfs.rc
3?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 | 無功能 | 拔線、關機 | 電腦無反應 |
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監聽。