1. USB驱动代码在/drivers/usb/gadget下,有文件:android.c,其他驱动文件f_adb.c,f_mass_storage.c;其中android.c 依赖于f_adb.c 和 f_mass_storage.c(这两个文件之间无依赖关系)。
2. usb_mass_storage重新mount一个分区;
a. adb shell 进入/sys/devices/platform/usb_mass_storage/lun0
b. echo "" > file //unmount card
c. echo /dev/block/vold/179:14 > file //mount internal mass storage
d. echo "" > file //unmount card
e. echo /dev/block/vold/179:32 > file //mount external mass storage
3. 如何check 设备号
a. cat /proc/partitions
b. cat /proc/mounts
c. ls -l /dev/block
4. f_mass_storage.c中 android_register_function(&mass_storage_function);注册该驱动为USB驱动,其中有如下设置其属性
static DEVICE_ATTR(ro, 0644, fsg_show_ro, fsg_store_ro);
static DEVICE_ATTR(file, 0644, fsg_show_file, fsg_store_file);
fsg_show_ro, fsg_store_ro, 和 fsg_show_file, fsg_store_file 位于 storage_common.c文件中
5. 函数 fsg_store_file 中会把以前的partition给fsg_lun_close,然后 fsg_lun_open 一个新的partition,这就可以解释为什么不能同时mount两个partition暴露给PC, 如何挂载多个mass storage设备?
6. kernel\arch\arm\mach-ux500\board-rio-grande.c中有static struct usb_mass_storage_platform_data mass_storage_pdata定义,修改nluns = 2,测试
7. 进入手机会发现/sys/devices/platform/usb_mass_storage 目录下多一个lun?, 在两个不同的lun0/1下,可以手动挂载两个卡
a. 进入lun0
b. echo /dev/block/vold/179:14 > file
c. 进入lun1
d. echo /dev/block/vold/179:32 > file
(顺便提及下多出的lun2 是给cdrom用的,因为在f_mass_storage.c中fsg_probe 有nluns = fsg_cfg.nluns + fsg_cfg.cdrom_nluns;而cdrom_nluns=1
8. system\vold\volumemanager.cpp中函数sharevolume和unsinit.rcharevolume中会往/sys/devices/platform/usb_mass_storage/lun0 写入/dev/block/vold/179:xx; 可在这修改添加挂载多一个sd卡设备
9. system\vold\main.cpp中process_config函数会分析/system/etc/vold.fstab,然后addVolume 到volumemanager.cpp中的变量mVolumes中
10. system\vold\commandlistener.cpp中int CommandListener::VolumeCmd::runCommand(SocketClient*cli,int argc, char **argv)函数接收sd卡的挂载命令
11. frameworks\base\services\java\com\android\server\mountservice.java,中函数setEachUsbMassStorageEnabled(String path, boolean enable) <--setUsbMassStorageEnabled
12. /dev/block/vold/179:14设备可以同时挂载为mtp 和 sd 卡
2. usb_mass_storage重新mount一个分区;
a. adb shell 进入/sys/devices/platform/usb_mass_storage/lun0
b. echo "" > file //unmount card
c. echo /dev/block/vold/179:14 > file //mount internal mass storage
d. echo "" > file //unmount card
e. echo /dev/block/vold/179:32 > file //mount external mass storage
3. 如何check 设备号
a. cat /proc/partitions
b. cat /proc/mounts
c. ls -l /dev/block
4. f_mass_storage.c中 android_register_function(&mass_storage_function);注册该驱动为USB驱动,其中有如下设置其属性
static DEVICE_ATTR(ro, 0644, fsg_show_ro, fsg_store_ro);
static DEVICE_ATTR(file, 0644, fsg_show_file, fsg_store_file);
fsg_show_ro, fsg_store_ro, 和 fsg_show_file, fsg_store_file 位于 storage_common.c文件中
5. 函数 fsg_store_file 中会把以前的partition给fsg_lun_close,然后 fsg_lun_open 一个新的partition,这就可以解释为什么不能同时mount两个partition暴露给PC, 如何挂载多个mass storage设备?
6. kernel\arch\arm\mach-ux500\board-rio-grande.c中有static struct usb_mass_storage_platform_data mass_storage_pdata定义,修改nluns = 2,测试
7. 进入手机会发现/sys/devices/platform/usb_mass_storage 目录下多一个lun?, 在两个不同的lun0/1下,可以手动挂载两个卡
a. 进入lun0
b. echo /dev/block/vold/179:14 > file
c. 进入lun1
d. echo /dev/block/vold/179:32 > file
(顺便提及下多出的lun2 是给cdrom用的,因为在f_mass_storage.c中fsg_probe 有nluns = fsg_cfg.nluns + fsg_cfg.cdrom_nluns;而cdrom_nluns=1
8. system\vold\volumemanager.cpp中函数sharevolume和unsinit.rcharevolume中会往/sys/devices/platform/usb_mass_storage/lun0 写入/dev/block/vold/179:xx; 可在这修改添加挂载多一个sd卡设备
9. system\vold\main.cpp中process_config函数会分析/system/etc/vold.fstab,然后addVolume 到volumemanager.cpp中的变量mVolumes中
10. system\vold\commandlistener.cpp中int CommandListener::VolumeCmd::runCommand(SocketClient*cli,int argc, char **argv)函数接收sd卡的挂载命令
11. frameworks\base\services\java\com\android\server\mountservice.java,中函数setEachUsbMassStorageEnabled(String path, boolean enable) <--setUsbMassStorageEnabled
12. /dev/block/vold/179:14设备可以同时挂载为mtp 和 sd 卡