USB mass storage驱动分析

http://blog.csdn.net/tanxs001/article/details/7733754

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 卡

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要让STM32 USB Mass Storage设备与电脑通信,您需要在STM32设备上实现USB Mass Storage设备固件,并将其连接到电脑的USB端口。然后,您可以使用计算机上的文件管理器或其他支持USB Mass Storage协议的应用程序访问STM32设备上的文件系统。您还可以通过USB接口发送和接收数据,以便在STM32设备和计算机之间传输数据。 ### 回答2: 要让STM32 USB Mass Storage设备与电脑通信,首先需要在STM32 MCU上编写相应的固件代码。 1. 首先,在STM32硬件上连接一个USB接口,并将其配置为USB设备模式。可以选择配置的方式包括使用STM32提供的CubeMX软件来生成USB设备库文件或手动配置USB设备模式。 2. 然后,在STM32上编写固件代码来处理USB通信协议。这涉及到设置USB设备描述符,配置USB传输端点等。 3. 在STM32上实现Mass Storage协议。这个协议定义了通信双方之间传输文件和数据的规则。可以使用相应的软件库或编写自己的代码实现。 4. 配置文件系统。STM32 USB Mass Storage设备通常用于存储和传输文件。因此,需要在STM32上配置适当的文件系统,如FAT文件系统。 5. 将STM32插入电脑的USB端口。电脑会检测到STM32设备并加载其驱动程序。 6. 现在,可以在电脑上使用文件管理器或其他USB Mass Storage设备支持的应用程序来访问STM32设备。可以像访问其他USB存储设备一样使用它,如复制、粘贴、删除文件等。 需要注意以下事项: - 确保STM32和电脑之间使用正确的USB电缆连接。 - 在STM32的固件代码中实现正确的错误处理和状态指示,以便能够识别和解决通信问题。 - 根据系统需求,可以为STM32设备添加额外的功能,如读写保护、加密等。 总之,要使STM32 USB Mass Storage设备能够与电脑通信,必须在STM32上实现USB设备模式和Mass Storage协议,并在电脑上正确加载驱动程序。一旦连接成功,就可以像使用其他USB存储设备一样使用STM32设备。 ### 回答3: 要将STM32作为USB Mass Storage Device连接到电脑上进行通信,可以按照以下步骤进行: 1. 首先,需要在STM32的固件中实现USB MSC(Mass Storage Class)功能。这意味着STM32将会被识别为一个可见的USB存储设备。可以使用STM32提供的软件库或者其他第三方库来实现这个功能。 2. 在STM32的固件中,需要实现设备的基本功能,如初始化USB硬件、配置USB端口、配置USB中断等等。这些步骤可以通过参考相关资料或者使用官方提供的示例来完成。 3. 在电脑上,需要安装USB驱动程序。这些驱动程序通常由芯片或者供应商提供。安装驱动程序可以确保电脑能够正确识别并操作STM32作为USB设备。 4. 在电脑上,需要使用支持USB Mass Storage Device的操作系统。大部分现代操作系统都支持USB Mass Storage Device,如Windows、Linux、macOS等。插入STM32到电脑上后,操作系统会自动识别STM32作为USB存储设备。 5. 一旦STM32被识别为USB存储设备,电脑上就可以像操作常规硬盘一样进行读写操作。用户可以通过资源管理器、文件浏览器等工具来访问STM32存储设备,并操作其中的文件和文件夹。 总结起来,要将STM32作为USB Mass Storage Device与电脑通信,关键是在STM32的固件中实现USB MSC功能,并确保在电脑上安装了相关驱动程序和支持USB Mass Storage Device的操作系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值