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

电子说

1.3w人已加入

描述

客户需求

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

初步分析

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

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

存储

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

存储

然后,结合客户需求,最简单的方法就是在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

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

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

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

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

删掉CDC的相关定义

更改usb_device_descriptor.c

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

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

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

更新USB_DeviceSetSpeed()的相关内容。

usb_device_config.h

更改USB_DEVICE_CONFIG_CDC_ACM为0。

更改USB_DEVICE_CONFIG_MSC为2。

检查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

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

增加USB_UpdateInterfaceSetting()函数。

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

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

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

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

存储

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

存储

这样我们就得到了两个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

存储

2. 点击“Next”:

存储

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

存储

4. 然后点finish就好了。

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

存储

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

存储

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

存储

8. 最后选USB,点击OK。

存储

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

存储

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

存储
存储

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

存储

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

存储

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

存储

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

存储

15. 然后更新代码

存储

16. 点击OK

存储

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

存储

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

存储

来源:恩智浦MCU加油站

审核编辑:汤梓红


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分