电子说
客户需求
昨天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加油站
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !