在i.MX RT1050上如何实现双大容量存储(MSC)设备

客户需求

昨天FAE同事报了一个客户需求过来,需要双大容量存储设备(MSC device),一个安装在SD卡上,另一个安装到SDRAM上面。

初步分析

赶紧用MCUXpresso的peripheral tool去试了一下,结果发现这个工具不支持MSC mount on SD card,只支持MSC mount on RAM, 这样就只能手动去做了。

先看看MSC的描述符结构,非常简单直观,妥妥的钢铁直男。一个interface,两个endpoint,结束。

“在i.MX

所以,双MSC的配置描述符就是:

“在i.MX

然后,结合客户需求,最简单的方法就是在MSC mount on SD card上面加一个MSC mount on RAM。SDRAM和RAM对MSC的实现基本没有区别,只是一个buffer块地址不同而已。

操作步骤

接下来我们做两件事:

1、用peripheral tool导入一个dual MSC的工程,这个工具导出的代码结构非常清晰,可以帮助我们了解如何做复合设备类。

2、导入SDK自带的MSC mount on SD card+ CDC的工程:

evkbimxrt1050_dev_composite_cdc_msc_disk_freertos。

然后要做的事情就是把MSC mount on RAM的代码集成到MSC mount on SD card+ CDC的工程的工程里面去,同时去掉里面的CDC。

需要的步骤我能想到的就是:

1、去掉MSC mount on SD card+ CDC工程里面的CDC。

2、集成MSC mount on RAM的代码。

3、集成描述符。

4、集成数据结构。

好了,下面一步一步做来试试。

做之前,先把原始代码做个备份,然后通过Beyond Compare可以看到相关的改动,这个非常重要。

代码改动

代码变动如下,更多细节请参考附件代码:

  • 删除virtual_com.c, virtual_com.h

  • 增加 usb_device_interface_0_msc_ram_disk.c

  • 更改usb_device_descriptor.h

    1. 增加MSC(RAM)的相关宏定义。

    2. 更改USB_INTERFACE_COUNT为2,之前是3个接口,现在是两个。

    3. 更改USB_MSC_DISK_INTERFACE_INDEX为1,之前为2。MSC(RAM)的index为0。

    4. 更改USB_MSC_DISK_BULK_IN_ENDPOINT为2,之前为1。MSC(RAM)使用端点1 IN,端点1 OUT。MSC(SD CARD) 使用端点2 IN,端点2 OUT。

    5. 删掉CDC的相关定义

  • 更改usb_device_descriptor.c

    1. 添加MSC(RAM)的数据结构,这些数据结构有点复杂。不过我们只需要知道他们用于维护相关的接口和端点就可以了:
      A. g_UsbDeviceInterface0MscRamDiskConfig
      B. g_UsbDeviceInterface0MscRamDiskInterfaceList
      C. g_UsbDeviceInterface0MscRamDiskInterfaces
      D. g_UsbDeviceInterface0MscRamDiskInterface
      E. g_UsbDeviceInterface0MscRamDiskSetting0DefaultEndpoints

    2. 去掉CDC接口/端点描述符。

    3. 增加MSC(RAM)接口/端点描述符。

    4. 更新USB_DeviceSetSpeed()的相关内容。

  • usb_device_config.h

    1. 更改USB_DEVICE_CONFIG_CDC_ACM为0。
    2. 更改USB_DEVICE_CONFIG_MSC为2。
    3. 检查USB_DEVICE_CONFIG_ENDPOINTS是否满足需求,默认为5。
  • composite.h

  • 去掉 #include "virtual_com.h"。

  • 更改usb_device_composite_struct_t数据类型:
    A. 去掉usb_cdc_vcom_struct_t cdcVcom
    B. 增加class_handle_t interface0MscRamDiskHandle; 。

  • composite.c

    1. 更改g_CompositeClassConfig,去掉CDC,加入MSC(RAM) 。

    2. 增加USB_UpdateInterfaceSetting()函数。

    3. 修改USB_DeviceCallback(),对以下事件加入对MSC(RAM)的处理,去掉对CDC的处理:
      A. kUSB_DeviceEventBusReset
      B. kUSB_DeviceEventSetConfiguration
      C. kUSB_DeviceEventSetInterface

    4. 修改USB_DeviceApplicationInit()加入对MSC(RAM)的处理,去掉对CDC的处理。

    5. 更改APPTask(),去掉对CDC的处理。

最后,要把MSC(RAM)的分区放到SDRAM上面,只需要更改usb_device_interface_0_msc_ram_disk.c里面的storageDisk指针指向SDRAM空间即可。默认的MCUXpresso的USB示例工程没有使能SDRAM RAM。使能SDRAM需要更改一下配置:

“在i.MX

完成上述改动后,编译代码,再下载到目标板运行,可以看到:

“在i.MX

这样我们就得到了两个MSC,一个mount on SDRAM,一个mount on SD卡。

代码链接

https://gitee.com/nxa16038/dual_msc.git

附录:使用Peripheral tool导入

基于MCUXpresso IDE 环境,我们可以很轻易的生成双MSC mount on RAM的代码,步骤如下(以下步骤是在MCUXPresso 11.6版本上操作的)。

1. 导入SDK后,选择new project

“在i.MX

2. 点击“Next”:

“在i.MX

3. 转到middleware页面,选择USB Device MSD。

“在i.MX

4. 然后点finish就好了。

5. 然后点击下图所示的按钮打开MCUXpresso内置的peripheral tool界面

“在i.MX

6. 如果有多个工程,打开后什么都看不到需要选择对应的工程,这里我们选择刚建立的工程MIMXRT1052_Project。

“在i.MX

7. 然后点击Middleware右方的+号。

“在i.MX

8. 最后选USB,点击OK。

“在i.MX

9. 然后Preset里面,选择MSC RAM disk。

“在i.MX

10. 然后会看到一个错误提示:

“在i.MX

“在i.MX

11. 在错误信息上点右键,选择时钟使能。

“在i.MX

12. 由于默认只有一个MSC,我们需要再增加一个,点下图的+号

“在i.MX

13. 默认添加的是DFU,我们需要切换到MSC

“在i.MX

14. 这样两个MSC就做好了。

“在i.MX

15. 然后更新代码

“在i.MX

16. 点击OK

“在i.MX

17. 然后IDE回到开发模式我们可以看到code已经生成好了。

“在i.MX

18. 然后build and run,就可以直接运行,得到两个MSC on RAM。

“在i.MX

来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。