查看: 829|回复: 2

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

[复制链接]
  • TA的每日心情
    开心
    2020-12-18 12:56
  • 签到天数: 55 天

    [LV.5]常住居民I

    75

    主题

    225

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    1632
    最后登录
    2024-4-26
    发表于 2022-8-24 13:08:55 | 显示全部楼层 |阅读模式

    初步分析
    赶紧用MCUXpresso的peripheral tool去试了一下,结果发现这个工具不支持MSC mount on SD card,只支持MSC mount on RAM, 这样就只能手动去做了。先看看MSC的描述符结构,非常简单直观,妥妥的钢铁直男。一个interface,两个endpoint,结束。
    图片 45.png
    所以,双MSC的配置描述符就是:
    图片 46.png
    然后,结合客户需求,最简单的方法就是在MSC mount on SD card上面加一个MSC mount on RAM。SDRAM和RAM对MSC的实现基本没有区别,只是一个buffer块地址不同而已。
    操作步骤
    接下来我们做两件事:
    用peripheral tool导入一个dual MSC的工程,这个工具导出的代码结构非常清晰,可以帮助我们了解如何做复合设备类。
    导入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。
    需要的步骤我能想到的就是:
    -去掉MSC mount on SD card+ CDC工程里面的CDC。
    -集成MSC mount on RAM的代码。
    -集成描述符。
    -集成数据结构。
    好了,下面一步一步做来试试。做之前,先把原始代码做个备份,然后通过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需要更改一下配置:
    图片 47.png
    完成上述改动后,编译代码,再下载到目标板运行,可以看到:
    图片 48.png
    这样我们就得到了两个MSC,一个mount on SDRAM,一个mount on SD卡。

    代码链接
    附录:使用Peripheral tool导入
    基于MCUXpresso IDE 环境,我们可以很轻易的生成双MSC mount on RAM的代码,步骤如下(以下步骤是在MCUXPresso 11.6版本上操作的)。
    1. 导入SDK后,选择new project
    图片 49.png
    2. 点击“Next”:
    图片 50.png
    3. 转到middleware页面,选择USB Device MSD。
    图片 51.png
    4. 然后点finish就好了。
    5. 然后点击下图所示的按钮打开MCUXpresso内置的peripheral tool界面
    图片 52.png
    6. 如果有多个工程,打开后什么都看不到需要选择对应的工程,这里我们选择刚建立的工程MIMXRT1052_Project。
    图片 53.png
    7. 然后点击Middleware右方的+号。
    图片 54.png
    8. 最后选USB,点击OK。
    图片 55.png
    9. 然后Preset里面,选择MSC RAM disk。
    图片 56.png
    10. 然后会看到一个错误提示:
    图片 58.png
    图片 57.png
    11. 在错误信息上点右键,选择时钟使能。
    图片 59.png
    12. 由于默认只有一个MSC,我们需要再增加一个,点下图的+号
    图片 60.png
    13. 默认添加的是DFU,我们需要切换到MSC
    图片 61.png
    14. 这样两个MSC就做好了。
    图片 62.png
    15. 然后更新代码
    图片 63.png
    16. 点击OK
    图片 64.png

    17. 然后IDE回到开发模式我们可以看到code已经生成好了。
    图片 65.png
    18. 然后build and run,就可以直接运行,得到两个MSC on RAM。
    图片 66.png
    签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2022-8-24 15:42:24 | 显示全部楼层
    这教程也清晰明了了吧!
    楼主厉害
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 14:29
  • 签到天数: 485 天

    [LV.9]以坛为家II

    8

    主题

    1358

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2920
    最后登录
    2024-4-28
    发表于 2022-8-24 17:29:19 | 显示全部楼层
    感谢楼主的分享,写的非常的明了
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-29 07:13 , Processed in 0.117447 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表