<strong><font color="#4e5e9e">客户需求</font> </strong>
昨天FAE同事报了一个客户需求过来,需要双大容量存储设备(MSC device),一个安装在SD卡上,另一个安装到SDRAM上面。
<strong><font color="#4e5e9e">初步分析</font> </strong>
赶紧用MCUXpresso的peripheral tool去试了一下,结果发现这个工具不支持MSC mount on SD card,只支持MSC mount on RAM, 这样就只能手动去做了。
先看看MSC的描述符结构,非常简单直观,妥妥的钢铁直男。一个interface,两个endpoint,结束。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266487-1.png&…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
所以,双MSC的配置描述符就是:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266490-2.png&…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
然后,结合客户需求,最简单的方法就是在MSC mount on SD card上面加一个MSC mount on RAM。SDRAM和RAM对MSC的实现基本没有区别,只是一个buffer块地址不同而已。
<strong><font color="#4e5e9e">操作步骤</font> </strong>
接下来我们做两件事:
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可以看到相关的改动,这个非常重要。
<strong><font color="#4e5e9e">代码改动</font> </strong>
代码变动如下,更多细节请参考附件代码:
<ul>
<li>
<p>删除virtual_com.c, virtual_com.h</p>
</li>
<li>
<p>增加 usb_device_interface_0_msc_ram_disk.c</p>
</li>
<li>
<p>更改usb_device_descriptor.h</p>
<ol>
<li>
<p>增加MSC(RAM)的相关宏定义。</p>
</li>
<li>
<p>更改USB_INTERFACE_COUNT为2,之前是3个接口,现在是两个。</p>
</li>
<li>
<p>更改USB_MSC_DISK_INTERFACE_INDEX为1,之前为2。MSC(RAM)的index为0。</p>
</li>
<li>
<p>更改USB_MSC_DISK_BULK_IN_ENDPOINT为2,之前为1。MSC(RAM)使用端点1 IN,端点1 OUT。MSC(SD CARD) 使用端点2 IN,端点2 OUT。</p>
</li>
<li>
<p>删掉CDC的相关定义</p>
</li>
</ol>
</li>
<li>
<p>更改usb_device_descriptor.c</p>
<ol>
<li>
<p>添加MSC(RAM)的数据结构,这些数据结构有点复杂。不过我们只需要知道他们用于维护相关的接口和端点就可以了:<br />
A. g_UsbDeviceInterface0MscRamDiskConfig<br />
B. g_UsbDeviceInterface0MscRamDiskInterfaceList<br />
C. g_UsbDeviceInterface0MscRamDiskInterfaces<br />
D. g_UsbDeviceInterface0MscRamDiskInterface<br />
E. g_UsbDeviceInterface0MscRamDiskSetting0DefaultEndpoints </p>
</li>
<li>
<p>去掉CDC接口/端点描述符。</p>
</li>
<li>
<p>增加MSC(RAM)接口/端点描述符。</p>
</li>
<li>
<p>更新USB_DeviceSetSpeed()的相关内容。</p></li></ol></li>
<li><p>usb_device_config.h</p>
<ol>
<li>更改USB_DEVICE_CONFIG_CDC_ACM为0。 </li>
<li>更改USB_DEVICE_CONFIG_MSC为2。 </li>
<li>检查USB_DEVICE_CONFIG_ENDPOINTS是否满足需求,默认为5。 </li>
</ol></p></li>
</ul>
<ul>
<li>
<p>composite.h</p>
</li>
</ul>
<ul>
<li>
<p>去掉 #include "virtual_com.h"。</p>
</li>
<li>
<p>更改usb_device_composite_struct_t数据类型:<br />
A. 去掉usb_cdc_vcom_struct_t cdcVcom<br />
B. 增加class_handle_t interface0MscRamDiskHandle; 。</p>
</li>
</ul>
<ul>
<li>
<p>composite.c</p><ol>
<li>
<p>更改g_CompositeClassConfig,去掉CDC,加入MSC(RAM) 。</p>
</li>
<li>
<p>增加USB_UpdateInterfaceSetting()函数。</p>
</li>
<li>
<p>修改USB_DeviceCallback(),对以下事件加入对MSC(RAM)的处理,去掉对CDC的处理:<br />
A. kUSB_DeviceEventBusReset<br />
B. kUSB_DeviceEventSetConfiguration<br />
C. kUSB_DeviceEventSetInterface</p>
</li>
<li>
<p>修改USB_DeviceApplicationInit()加入对MSC(RAM)的处理,去掉对CDC的处理。</p>
</li>
<li>
<p>更改APPTask(),去掉对CDC的处理。</p>
</li>
</ol>
</li>
</ul>
最后,要把MSC(RAM)的分区放到SDRAM上面,只需要更改usb_device_interface_0_msc_ram_disk.c里面的storageDisk指针指向SDRAM空间即可。默认的MCUXpresso的USB示例工程没有使能SDRAM RAM。使能SDRAM需要更改一下配置:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266491-3.png&…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
完成上述改动后,编译代码,再下载到目标板运行,可以看到:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266492-4.png&…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
这样我们就得到了两个MSC,一个mount on SDRAM,一个mount on SD卡。
<strong><font color="#4e5e9e">代码链接</font> </strong>
https://gitee.com/nxa16038/dual_msc.git
<strong><font color="#4e5e9e">附录:使用Peripheral tool导入</font> </strong>
基于MCUXpresso IDE 环境,我们可以很轻易的生成双MSC mount on RAM的代码,步骤如下(以下步骤是在MCUXPresso 11.6版本上操作的)。
1. 导入SDK后,选择new project
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266494-5.png&…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
2. 点击“Next”:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266495-6.png&…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
3. 转到middleware页面,选择USB Device MSD。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266497-7.png&…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
4. 然后点finish就好了。
5. 然后点击下图所示的按钮打开MCUXpresso内置的peripheral tool界面
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266498-8.png&…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
6. 如果有多个工程,打开后什么都看不到需要选择对应的工程,这里我们选择刚建立的工程MIMXRT1052_Project。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266500-9.png&…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
7. 然后点击Middleware右方的+号。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266501-10.png…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
8. 最后选USB,点击OK。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266503-11.png…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
9. 然后Preset里面,选择MSC RAM disk。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266504-12.png…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
10. 然后会看到一个错误提示:
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266506-13.png…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266507-14.png…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
11. 在错误信息上点右键,选择时钟使能。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266508-15.png…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
12. 由于默认只有一个MSC,我们需要再增加一个,点下图的+号
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266509-16.png…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
13. 默认添加的是DFU,我们需要切换到MSC
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266510-17.png…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
14. 这样两个MSC就做好了。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266511-18.png…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
15. 然后更新代码
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266512-19.jpg…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
16. 点击OK
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266513-20.png…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
17. 然后IDE回到开发模式我们可以看到code已经生成好了。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266514-21.png…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
18. 然后build and run,就可以直接运行,得到两个MSC on RAM。
<center><img src="http://mcu.eetrend.com/files/2022-08/wen_zhang_/100563176-266515-22.png…; alt=“在i.MX RT1050上如何实现双大容量存储(MSC)设备" /></center>
来源:<a href="https://mp.weixin.qq.com/s/B1rfgGWTq8g88qlivz67Vw">恩智浦MCU加油站</a>
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。