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

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