客户需求
昨天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加油站
索尼推出全新G系列CFast规格存储卡,读写直逼高端SATA SSD
通过生物信号采集处理系统来分析胃肠运动
新能源政策新规出台 新能源汽车市场迎来春天
九天睿芯入选2023年度“中国AI芯片企业先锋榜”
如何让通用微控制器MSP430集成多种功能来简化设计?
在i.MX RT1050上如何实现双大容量存储(MSC)设备
家博会完美谢幕:盘点那些“高智商”智能家电、机器人
蓝矽科技发布会隆重推出新一代功率产品——BlueMOS
【硬见小百科】PLC输出电路区别和注意事项
乐视网股价超下跌40% 贾跃亭股权质押濒危
广和通L610 Cat 1模组定位追踪解决方案
金博股份能否帮助下游光伏企业打赢这场“性价比”之战?
博通公司扩充其针对数字家庭的5G WiFi芯片产品阵容
PhotoBloom AR 将其印刷产品与AR技术结合在一起
如何在下一个设计中成功集成USB 3.2 IP
磁粉制动器工作原理及使用注意事项
ESD保护组件对NFC天线的保护方案设计
可控硅触发板是什么?如何选择合适的可控硅触发板?
Win10系统下我们该如何打开wWindows控制台
小型无人机倾斜摄影技术在地质测量测绘中的分析