客户需求
昨天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. 然后会看到一个错误提示:
12. 由于默认只有一个MSC,我们需要再增加一个,点下图的+号
13. 默认添加的是DFU,我们需要切换到MSC
14. 这样两个MSC就做好了。
15. 然后更新代码
16. 点击OK
17. 然后IDE回到开发模式我们可以看到code已经生成好了。
18. 然后build and run,就可以直接运行,得到两个MSC on RAM。
来源:恩智浦MCU加油站
审核编辑:汤梓红
-
SDRAM
+关注
关注
7文章
423浏览量
55205 -
存储
+关注
关注
13文章
4298浏览量
85807 -
SD卡
+关注
关注
2文章
564浏览量
63890
发布评论请先 登录
相关推荐
【大联大品佳 NXP i.MX RT1050试用申请】语音识别评测
【大联大品佳 NXP i.MX RT1050试用申请】基于 NXP i.MX RT1050工业机器人开发
【大联大品佳 NXP i.MX RT1050试用申请】i.MX RT1050 3D打印机控制器
【大联大品佳 NXP i.MX RT1050试用申请】使用NXP i.MX RT1050开发板设计一款低成本CAN数据采集仪
【大联大品佳 NXP i.MX RT1050试用体验】芯林至尊,宝刀RT1050,初识i.MX RT系列跨界处理器 (之一)
i.MX RT1050平台的相关资料推荐
i.MX RT系列(例如 RT1050/1060)有多少个PWM通道?
【044】SylixOS 正式支持 i.MX RT1050平台

RT-Thread & NXP 发布 i.MX RT 系列 BSP 新框架

移植Arm-2D到i.MX RT1050-EVKB并绘制图形界面
移植Arm-2D到i.MX RT1050-EVKB并绘制图形界面
基于 NXP i.MX RT1050 的 3D 打印机方案

评论