客戶需求
昨天FAE同事報(bào)了一個(gè)客戶需求過(guò)來(lái),需要雙大容量存儲(chǔ)設(shè)備(MSC device),一個(gè)安裝在SD卡上,另一個(gè)安裝到SDRAM上面。
初步分析
趕緊用MCUXpresso的peripheral tool去試了一下,結(jié)果發(fā)現(xiàn)這個(gè)工具不支持MSC mount on SD card,只支持MSC mount on RAM, 這樣就只能手動(dòng)去做了。
先看看MSC的描述符結(jié)構(gòu),非常簡(jiǎn)單直觀,妥妥的鋼鐵直男。一個(gè)interface,兩個(gè)endpoint,結(jié)束。

所以,雙MSC的配置描述符就是:

然后,結(jié)合客戶需求,最簡(jiǎn)單的方法就是在MSC mount on SD card上面加一個(gè)MSC mount on RAM。SDRAM和RAM對(duì)MSC的實(shí)現(xiàn)基本沒有區(qū)別,只是一個(gè)buffer塊地址不同而已。
操作步驟
接下來(lái)我們做兩件事:
1、用peripheral tool導(dǎo)入一個(gè)dual MSC的工程,這個(gè)工具導(dǎo)出的代碼結(jié)構(gòu)非常清晰,可以幫助我們了解如何做復(fù)合設(shè)備類。
2、導(dǎo)入SDK自帶的MSC mount on SD card+ CDC的工程:
evkbimxrt1050_dev_composite_cdc_msc_disk_freertos。
然后要做的事情就是把MSC mount on RAM的代碼集成到MSC mount on SD card+ CDC的工程的工程里面去,同時(shí)去掉里面的CDC。
需要的步驟我能想到的就是:
1、去掉MSC mount on SD card+ CDC工程里面的CDC。
2、集成MSC mount on RAM的代碼。
3、集成描述符。
4、集成數(shù)據(jù)結(jié)構(gòu)。
好了,下面一步一步做來(lái)試試。
做之前,先把原始代碼做個(gè)備份,然后通過(guò)Beyond Compare可以看到相關(guān)的改動(dòng),這個(gè)非常重要。
代碼改動(dòng)
代碼變動(dòng)如下,更多細(xì)節(jié)請(qǐng)參考附件代碼:
刪除virtual_com.c, virtual_com.h
增加 usb_device_interface_0_msc_ram_disk.c
更改usb_device_descriptor.h
增加MSC(RAM)的相關(guān)宏定義。
更改USB_INTERFACE_COUNT為2,之前是3個(gè)接口,現(xiàn)在是兩個(gè)。
更改USB_MSC_DISK_INTERFACE_INDEX為1,之前為2。MSC(RAM)的index為0。
更改USB_MSC_DISK_BULK_IN_ENDPOINT為2,之前為1。MSC(RAM)使用端點(diǎn)1 IN,端點(diǎn)1 OUT。MSC(SD CARD) 使用端點(diǎn)2 IN,端點(diǎn)2 OUT。
刪掉CDC的相關(guān)定義
更改usb_device_descriptor.c
添加MSC(RAM)的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)有點(diǎn)復(fù)雜。不過(guò)我們只需要知道他們用于維護(hù)相關(guān)的接口和端點(diǎn)就可以了:
A. g_UsbDeviceInterface0MscRamDiskConfig
B. g_UsbDeviceInterface0MscRamDiskInterfaceList
C. g_UsbDeviceInterface0MscRamDiskInterfaces
D.g_UsbDeviceInterface0MscRamDiskInterface
E.g_UsbDeviceInterface0MscRamDiskSetting0DefaultEndpoints
去掉CDC接口/端點(diǎn)描述符。
增加MSC(RAM)接口/端點(diǎn)描述符。
更新USB_DeviceSetSpeed()的相關(guān)內(nèi)容。
usb_device_config.h
更改USB_DEVICE_CONFIG_CDC_ACM為0。
更改USB_DEVICE_CONFIG_MSC為2。
檢查USB_DEVICE_CONFIG_ENDPOINTS是否滿足需求,默認(rèn)為5。
composite.h
去掉 #include "virtual_com.h"。
更改usb_device_composite_struct_t數(shù)據(jù)類型:
A. 去掉usb_cdc_vcom_struct_t cdcVcom
B. 增加class_handle_t interface0MscRamDiskHandle; 。
composite.c
更改g_CompositeClassConfig,去掉CDC,加入MSC(RAM) 。
增加USB_UpdateInterfaceSetting()函數(shù)。
修改USB_DeviceCallback(),對(duì)以下事件加入對(duì)MSC(RAM)的處理,去掉對(duì)CDC的處理:
A. kUSB_DeviceEventBusReset
B. kUSB_DeviceEventSetConfiguration
C.kUSB_DeviceEventSetInterface
修改USB_DeviceApplicationInit()加入對(duì)MSC(RAM)的處理,去掉對(duì)CDC的處理。
更改APPTask(),去掉對(duì)CDC的處理。
最后,要把MSC(RAM)的分區(qū)放到SDRAM上面,只需要更改usb_device_interface_0_msc_ram_disk.c里面的storageDisk指針指向SDRAM空間即可。默認(rèn)的MCUXpresso的USB示例工程沒有使能SDRAM RAM。使能SDRAM需要更改一下配置:

完成上述改動(dòng)后,編譯代碼,再下載到目標(biāo)板運(yùn)行,可以看到:

這樣我們就得到了兩個(gè)MSC,一個(gè)mount on SDRAM,一個(gè)mount on SD卡。
代碼鏈接
https://gitee.com/nxa16038/dual_msc.git
附錄:使用Peripheral tool導(dǎo)入
基于MCUXpresso IDE 環(huán)境,我們可以很輕易的生成雙MSC mount on RAM的代碼,步驟如下(以下步驟是在MCUXPresso 11.6版本上操作的)。
1. 導(dǎo)入SDK后,選擇new project

2. 點(diǎn)擊“Next”:

3. 轉(zhuǎn)到middleware頁(yè)面,選擇USB Device MSD。

4. 然后點(diǎn)finish就好了。
5. 然后點(diǎn)擊下圖所示的按鈕打開MCUXpresso內(nèi)置的peripheral tool界面

6. 如果有多個(gè)工程,打開后什么都看不到需要選擇對(duì)應(yīng)的工程,這里我們選擇剛建立的工程MIMXRT1052_Project。

7. 然后點(diǎn)擊Middleware右方的+號(hào)。

8. 最后選USB,點(diǎn)擊OK。

9. 然后Preset里面,選擇MSC RAM disk。

10. 然后會(huì)看到一個(gè)錯(cuò)誤提示:


11. 在錯(cuò)誤信息上點(diǎn)右鍵,選擇時(shí)鐘使能。

12. 由于默認(rèn)只有一個(gè)MSC,我們需要再增加一個(gè),點(diǎn)下圖的+號(hào)

13. 默認(rèn)添加的是DFU,我們需要切換到MSC

14. 這樣兩個(gè)MSC就做好了。

15. 然后更新代碼

16. 點(diǎn)擊OK

17. 然后IDE回到開發(fā)模式我們可以看到code已經(jīng)生成好了。

18. 然后build and run,就可以直接運(yùn)行,得到兩個(gè)MSC on RAM。

來(lái)源:恩智浦MCU加油站
審核編輯:湯梓紅
-
SDRAM
+關(guān)注
關(guān)注
7文章
459瀏覽量
57862 -
存儲(chǔ)
+關(guān)注
關(guān)注
13文章
4897瀏覽量
90307 -
SD卡
+關(guān)注
關(guān)注
2文章
592瀏覽量
69704
發(fā)布評(píng)論請(qǐng)先 登錄
請(qǐng)問(wèn)如何在 i.MX RT1050 上從多個(gè)起始地址運(yùn)行相同的引導(dǎo)加載程序?
如何在 i.MX RT1050 上實(shí)現(xiàn)兩個(gè)鏡像(引導(dǎo)加載程序應(yīng)用程序)的雙 HAB 身份驗(yàn)證?
【大聯(lián)大品佳 NXP i.MX RT1050試用申請(qǐng)】語(yǔ)音識(shí)別評(píng)測(cè)
【大聯(lián)大品佳 NXP i.MX RT1050試用申請(qǐng)】基于 NXP i.MX RT1050工業(yè)機(jī)器人開發(fā)
【大聯(lián)大品佳 NXP i.MX RT1050試用申請(qǐng)】i.MX RT1050 3D打印機(jī)控制器
i.MX RT1050平臺(tái)的相關(guān)資料推薦
i.MX RT1050跨界處理器產(chǎn)品數(shù)據(jù)手冊(cè)
i.MX RT系列(例如 RT1050/1060)有多少個(gè)PWM通道?
【044】SylixOS 正式支持 i.MX RT1050平臺(tái)
RT-Thread & NXP 發(fā)布 i.MX RT 系列 BSP 新框架
移植Arm-2D到i.MX RT1050-EVKB并繪制圖形界面
移植Arm-2D到i.MX RT1050-EVKB并繪制圖形界面
基于 NXP i.MX RT1050 的 3D 打印機(jī)方案
在i.MX RT1050上如何實(shí)現(xiàn)雙大容量存儲(chǔ)(MSC)設(shè)備
評(píng)論