客戶需求
昨天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塊地址不同而已。
操作步驟
接下來我們做兩件事:
用peripheral tool導入一個dual MSC的工程,這個工具導出的代碼結構非常清晰,可以幫助我們了解如何做復合設備類。
導入SDK自帶的MSC mount on SD card+ CDC的工程:evkbimxrt1050_dev_composite_cdc_msc_disk_freertos。
然后要做的事情就是把MSC mounton 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需要更改一下配置:
完成上述改動后,編譯代碼,再下載到目標板運行,可以看到:
這樣我們就得到了兩個MSC,一個mounton 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. 然后會看到一個錯誤提示:
12. 由于默認只有一個MSC,我們需要再增加一個,點下圖的+號
13. 默認添加的是DFU,我們需要切換到MSC
14. 這樣兩個MSC就做好了。
15. 然后更新代碼
16. 點擊OK
17. 然后IDE回到開發模式我們可以看到code已經生成好了。
18. 然后build and run,就可以直接運行,得到兩個MSC on RAM。
-
SDRAM
+關注
關注
7文章
423瀏覽量
55226 -
msc
+關注
關注
0文章
29瀏覽量
20125 -
RAM
+關注
關注
8文章
1368瀏覽量
114698 -
代碼
+關注
關注
30文章
4788瀏覽量
68612
原文標題:在i.MX RT1050上如何實現雙大容量存儲(MSC)設備
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論