USB mass storage驱动分析

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 卡
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值