AOSP ~ USB

Usb Host 主模式

USB Host,中文意思是USB主模式,是相對於USB Accessory(USB副模式)來說的。如果Android工作在USB Host模式下,則連接到Android上的USB設備把Android類似的看作是一臺PC機,PC機能幹的事兒,Android也能幹,例如將鼠標、鍵盤插入則可以使用鍵盤、鼠標來操作Android系統,如果插入U盤則,通過Android可以讀寫U盤上的數據。

 

 Accessory 副模式

USB Accessory模式表示將Android設備類似當作一個USB的鍵盤、鼠標、U盤插入到電腦主機上一樣使用。

 

USB 屬性設置ADB、RNDIS、MTP

1. 命令

設置屬性:setprop persist.sys.usb.config

查看屬性:getprop persist.sys.usb.config,可查看當前手機USB功能角色(adb,mtp,rndis等)

persist.sys.usb.config 在 /data/property目錄下

2. 具體設置

1)打開adb功能:setprop persist.sys.usb.config adb

2)打開mtp功能:setprop persist.sys.usb.config mtp

3)同時打開adb和mtp:setprop persist.sys.usb.config adb,mtp

注:在設置某個功能的同時會將其它功能都關閉,

setprop persist.sys.usb.config adb 在打開adb功能的同時會將USB其它功能都關閉。

3. 打開rndis操作(USB網絡共享)

3.1 方法1,步驟:

1)手機使用USB線接入Ubuntu,打開手機 terminal,執行su

2)手機執行:setprop persist.sys.usb.config rndis 啓動rndis

3)手機執行:echo 0 > /sys/class/android_usb/android0/enable

echo 1 > /sys/class/android_usb/android0/enable

先關閉USB服務,再開啓,即重啓usb功能。

4)手機執行:busybox ifconfig -a 可發現新增rndis0網絡接口

5)Ubuntu執行:ifconfig 可發現新增usb0接口

6)手機執行:busybox ifconfig rndis0 111.111.111.111 up 啓用接口

7)Ubuntu執行:sudo ifconfig usb0 111.111.111.112 up

8)Ubuntu執行:ping 111.111.111.111 -c 3 ping成功

ok

3.2 方法2,步驟如下

手機端執行:

su

echo 0 > /sys/class/android_usb/android0/enable

echo rndis > /sys/class/android_usb/android0/functions

echo 1 > /sys/class/android_usb/android0/enable

busybox ifconfig rndis0 111.111.111.111 up

Ubuntu端執行:

同3.1步驟一致。

ping 測試,ok。

3.3 注:

1)配置成功後,插拔usb不需重新配置,Ubuntu能直接識別usb0接口,但需要重新up,手機端無需重新up。

2)打開其它USB功能步驟一致,如mtp,adb。

3)配置adb功能時,手機端需要再執行以下命令,重啓adb服務。

stop adbd

start adbd

 

4. 注:

1)USB功能配置的開機啓動腳本:/init.usb.rc

2)更改USB的某些功能後可能需要重啓才能生效,如將USB改爲mtp功能

3)setprop persist.sys.usb.config rndis 操作最終會寫入 到/sys/class/android_usb/android0/functions,可以cat functions查看配置。

 
 

 

4)mtp功能:類似於u盤,一般Android手機都帶這個功能。

5)除了可以配置USB device的功能,還可以配置USB相關屬性,如VID,PID等,

 

往/sys/class/android_usb/android0/下的各個屬性寫入參數即可,然後重啓USB功能或重啓手機。配置的屬性手機重啓後會還原。

如修改PID:

echo 1111 > /sys/class/android_usb/android0/idProduct

echo 0 > /sys/class/android_usb/android0/enable

echo 1 > /sys/class/android_usb/android0/enable

 

6)華爲Mate9配置rndis

由於未在 /sys/class/android_usb/android0/目錄下找到functions,所以mate9只能使用方法1進行配置。

adb shell下執行:setprop persist.sys.usb.config rndis,adb 啓動rndis和adb

手機shell(或adb shell)執行:ifconfig -a 可發現新增rndis0網絡接口

Ubuntu執行:ifconfig 可發現新增usb0接口

手機執行:ifconfig rndis0 111.111.111.111 up 啓用接口

Ubuntu執行:sudo ifconfig usb0 111.111.111.112 up

Ubuntu執行:ping 111.111.111.111 -c 3 ping成功

實測無需重啓usb功能即可正常被Ubuntu識別。

另外在CMD下也可以直接進入adb shell,無需再rndis和adb功能間切換,但一次只能使用一種功能。

 

7)Android下初始化腳本有類似的語句:

    on property:sys.usb.config=mtp,adb

    write /sys/class/android_usb/android0/enable 0

    write /sys/class/android_usb/android0/idVendor 18d1

    write /sys/class/android_usb/android0/idProduct 4ee2

    write /sys/class/android_usb/android0/functions ${sys.usb.config}

    write /sys/class/android_usb/android0/enable 1

    start adbd

    setprop sys.usb.state ${sys.usb.config}

 

參考:

https://www.jianshu.com/p/fd5211fffe0f

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章