客戶需求
昨天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. 然后會看到一個錯誤提示:
12. 由于默認只有一個MSC,我們需要再增加一個,點下圖的+號
13. 默認添加的是DFU,我們需要切換到MSC
14. 這樣兩個MSC就做好了。
15. 然后更新代碼
16. 點擊OK
17. 然后IDE回到開發模式我們可以看到code已經生成好了。
18. 然后build and run,就可以直接運行,得到兩個MSC on RAM。
來源:恩智浦MCU加油站
審核編輯:湯梓紅
-
SDRAM
+關注
關注
7文章
432瀏覽量
55399 -
存儲
+關注
關注
13文章
4359瀏覽量
86205 -
SD卡
+關注
關注
2文章
566瀏覽量
64144
發布評論請先 登錄
相關推薦
【大聯大品佳 NXP i.MX RT1050試用申請】語音識別評測
【大聯大品佳 NXP i.MX RT1050試用申請】基于 NXP i.MX RT1050工業機器人開發
【大聯大品佳 NXP i.MX RT1050試用申請】i.MX RT1050 3D打印機控制器
【大聯大品佳 NXP i.MX RT1050試用申請】使用NXP i.MX RT1050開發板設計一款低成本CAN數據采集儀
【大聯大品佳 NXP i.MX RT1050試用體驗】芯林至尊,寶刀RT1050,初識i.MX RT系列跨界處理器 (之一)
i.MX RT1050平臺的相關資料推薦
i.MX RT系列(例如 RT1050/1060)有多少個PWM通道?
【044】SylixOS 正式支持 i.MX RT1050平臺
![【044】SylixOS 正式支持 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT1050</b>平臺](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread & NXP 發布 i.MX RT 系列 BSP 新框架
![<b class='flag-5'>RT</b>-Thread & NXP 發布 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b> 系列 BSP 新框架](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
移植Arm-2D到i.MX RT1050-EVKB并繪制圖形界面
移植Arm-2D到i.MX RT1050-EVKB并繪制圖形界面
基于 NXP i.MX RT1050 的 3D 打印機方案
![基于 NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>RT1050</b> 的 3D 打印機方案](https://file.elecfans.com/web2/M00/9D/7C/pYYBAGQub1CAf97kAAAfivdqN5Q338.png)
評論