客戶需求
昨天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)基本沒(méi)有區(qū)別,只是一個(gè)buffer塊地址不同而已。
操作步驟
接下來(lái)我們做兩件事:
用peripheral tool導(dǎo)入一個(gè)dual MSC的工程,這個(gè)工具導(dǎo)出的代碼結(jié)構(gòu)非常清晰,可以幫助我們了解如何做復(fù)合設(shè)備類。
導(dǎo)入SDK自帶的MSC mount on SD card+ CDC的工程:evkbimxrt1050_dev_composite_cdc_msc_disk_freertos。
然后要做的事情就是把MSC mounton RAM的代碼集成到MSC mount on SD card+ CDC的工程的工程里面去,同時(shí)去掉里面的CDC。
需要的步驟我能想到的就是:
去掉MSC mount on SD card+ CDC工程里面的CDC。
集成MSC mount on RAM的代碼。
集成描述符。
集成數(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示例工程沒(méi)有使能SDRAM RAM。使能SDRAM需要更改一下配置:
完成上述改動(dòng)后,編譯代碼,再下載到目標(biāo)板運(yùn)行,可以看到:
這樣我們就得到了兩個(gè)MSC,一個(gè)mounton 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)擊下圖所示的按鈕打開(kāi)MCUXpresso內(nèi)置的peripheral tool界面
6. 如果有多個(gè)工程,打開(kāi)后什么都看不到需要選擇對(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回到開(kāi)發(fā)模式我們可以看到code已經(jīng)生成好了。
18. 然后build and run,就可以直接運(yùn)行,得到兩個(gè)MSC on RAM。
-
SDRAM
+關(guān)注
關(guān)注
7文章
432瀏覽量
55397 -
msc
+關(guān)注
關(guān)注
0文章
29瀏覽量
20163 -
RAM
+關(guān)注
關(guān)注
8文章
1369瀏覽量
115054 -
代碼
+關(guān)注
關(guān)注
30文章
4835瀏覽量
69117
原文標(biāo)題:在i.MX RT1050上如何實(shí)現(xiàn)雙大容量存儲(chǔ)(MSC)設(shè)備
文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
VHDL工具實(shí)現(xiàn)SDRAM控制器的要點(diǎn)分享
![VHDL工具<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>SDRAM</b>控制器的要點(diǎn)分享](https://file.elecfans.com/web1/M00/45/03/o4YBAFpfFN-ATmNRAAGyhZrYevk390.png)
SDRAM與雙口RAM數(shù)據(jù)轉(zhuǎn)移接口控制電路
ARM里的ram和SDRAM有什么區(qū)別?
如何去實(shí)現(xiàn)外部RAM擴(kuò)展接口呢
RAM與SRAM及其SDRAM都有哪些不同呢
ARM里的ram和SDRAM有什么區(qū)別
如何提高evkmimxrt1170_dev_msc_disk_bm_cm7示例的傳輸速度?
使用Verilog實(shí)現(xiàn)基于FPGA的SDRAM控制器
SDRAM接口的VHDL設(shè)計(jì)方案
![<b class='flag-5'>SDRAM</b>接口的VHDL設(shè)計(jì)方案](https://file.elecfans.com/web2/M00/48/F6/pYYBAGKhtDCAV5zgAAANLPBS5Y8970.jpg)
Turbo碼譯碼在MSC8101上的實(shí)現(xiàn)探討
![Turbo碼譯碼在<b class='flag-5'>MSC</b>8101上的<b class='flag-5'>實(shí)現(xiàn)</b>探討](https://file.elecfans.com/web2/M00/49/1F/pYYBAGKhtDmAFI1dAAAVZjtcOZk100.jpg)
SDRAM與SRAM的區(qū)別
一文看懂ARM里的RAM和SDRAM有什么區(qū)別
采用VHDL語(yǔ)言實(shí)現(xiàn)SDRAM與雙口RAM的數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)
![采用VHDL語(yǔ)言<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>SDRAM</b>與雙口<b class='flag-5'>RAM</b>的數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)](https://file.elecfans.com/web1/M00/BD/DD/pIYBAF7UVTWABSbCAABLC5k73kg163.png)
ARM里的ram和SDRAM之間的區(qū)別是什么
SDRAM工作原理 SDRAM布局布線說(shuō)明
![<b class='flag-5'>SDRAM</b>工作原理 <b class='flag-5'>SDRAM</b>布局布線說(shuō)明](https://file1.elecfans.com/web2/M00/8F/BF/wKgaomTR6hCAdozbAAC2Yo7KbUI082.jpg)
評(píng)論