尽管Android4.4以上无法使用"大容量存储模式"(mass_storage),但内核中仍然包含对mass_storage驱动.
root@land:/ # ls |grep usb
init.qcom.usb.rc
init.qcom.usb.sh
init.usb.configfs.rc
init.usb.rc
Android通过根目录下的`init.usb.rc`对usb gadget进行配置,其中对mass_storage的配置不完整,需要手工配置后即可使用mass_storage.
主要有两种配置方式: 通过sysfs配置和通过configfs配置(无需root),(貌似还有就得lagecy方式).
大部分手机适用于sysfs配置, 但使用三星芯片的一些手机可能需要使用configfs配置(sysfs配置后默认为CD ROM). 由于我的手机只能使用sysfs配置, 下面介绍sysfs配置的方法:
在/sys 中有 `devices/virtual/android_usb` 以及 `class/android_usb` ,下级有`android0`目录(一些手机对内核有修改, 具体路径可能不一样).
root@land:/sys # find -name android_usb
./bus/platform/drivers/android_usb
./devices/virtual/android_usb
./class/android_usb
以下假定当前目录为`/sys/class/android_usb/android0`
cd /sys/class/android_usb/android0
对enable写0可关闭usb device.
echo 0 > enable
对functions写mass_storage选择device 驱动
echo mass_storage > functions
对f_mass_storage/lun/file 写入镜像文件路径或块设备路径 选择要连接到的"磁盘"
echo /dev/block/mmcblk0 > f_mass_storage/lun/file #选中整块emmc,android很可能会崩溃,但内核正常运行,通过此方式可将整块emmc挂到ubuntu上使用gparted等工具进行分区等操作(新版android使用gpt分区表,busybox自带的fdisk无法进行分区等操作)
也可以选则一个含pe的磁盘镜像(网盘中提供了),作为启动盘使用如:
echo /sdcard/win8pe.img > f_mass_storage/lun/file #选择含PE的镜像文件, 可从网盘中下载
更加正常的情况是选择一个含有分区的块设备, 如 `/dev/block/bootdevice/by-name/persist`.
注意: 手机上使用的文件系统, windows很可能不支持. 这种情况下, 建议新建一个镜像文件, 格式化为vfat:
dd if=/dev/zero of=/sdcard/demo.img bs=1048576 count=50 #新建大小为50MB的镜像文件`/sdcard/demo.img`
busybox mkfs.vfat /sdcard/demo.img #格式化为vfat
echo /sdcard/demo.img > f_mass_storage/lun/file
最后, 对enable写1打开usb device:
echo 1 > enable
注意事项:
*务必先"echo 0 > enable",即使enble本来就为1(折腾了好几天才发现)
*如果失败,尝试先关掉adb(我的手机必须关adb)
*我的手机上配置完成后必须设置sys.usb.config(`setprop sys.usb.config mass_storage`)
-------------------------------------------------------------------------------------------------------------------
(2019年更新)
目前新出的手机基本上都不支持使用sysfs配置了, 需要使用configfs配置.
configfs配置方法见下面网盘资料
最后,为了方便配置写了一个APP UMS-Interface
可一键生成镜像,格式化,配置,;也可自动查找外置存储卡, 一键配置. 支持sysfs及configfs配置.
详情见https://github.com/outofmemo/UMS-Interface
APP及相关工具资料镜像:
http://pan.baidu.com/s/1gfa9GbD (密码 er8y)