STM32 Shared Media - USB Mass Storage Device (#20956)
This commit is contained in:
		
				
					committed by
					
						 Scott Lahteine
						Scott Lahteine
					
				
			
			
				
	
			
			
			
						parent
						
							460cdf4c09
						
					
				
				
					commit
					da80fd782c
				
			| @@ -42,6 +42,11 @@ | |||||||
|   #endif |   #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #if HAS_SD_HOST_DRIVE | ||||||
|  |   #include "msc_sd.h" | ||||||
|  |   #include "usbd_cdc_if.h" | ||||||
|  | #endif | ||||||
|  |  | ||||||
| // ------------------------ | // ------------------------ | ||||||
| // Public Variables | // Public Variables | ||||||
| // ------------------------ | // ------------------------ | ||||||
| @@ -88,6 +93,19 @@ void HAL_init() { | |||||||
|   #if ENABLED(EMERGENCY_PARSER) && USBD_USE_CDC |   #if ENABLED(EMERGENCY_PARSER) && USBD_USE_CDC | ||||||
|     USB_Hook_init(); |     USB_Hook_init(); | ||||||
|   #endif |   #endif | ||||||
|  |  | ||||||
|  |   #if HAS_SD_HOST_DRIVE | ||||||
|  |     MSC_SD_init();                         // Enable USB SD card access | ||||||
|  |   #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // HAL idle task | ||||||
|  | void HAL_idletask() { | ||||||
|  |   #if HAS_SHARED_MEDIA | ||||||
|  |     // Stm32duino currently doesn't have a "loop/idle" method | ||||||
|  |     CDC_resume_receive(); | ||||||
|  |     CDC_continue_transmit(); | ||||||
|  |   #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void HAL_clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); } | void HAL_clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); } | ||||||
|   | |||||||
| @@ -135,6 +135,8 @@ extern uint16_t HAL_adc_result; | |||||||
|  |  | ||||||
| // Enable hooks into  setup for HAL | // Enable hooks into  setup for HAL | ||||||
| void HAL_init(); | void HAL_init(); | ||||||
|  | #define HAL_IDLETASK 1 | ||||||
|  | void HAL_idletask(); | ||||||
|  |  | ||||||
| // Clear reset reason | // Clear reset reason | ||||||
| void HAL_clear_reset_source(); | void HAL_clear_reset_source(); | ||||||
|   | |||||||
| @@ -21,6 +21,6 @@ | |||||||
|  */ |  */ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #if defined(USBD_USE_CDC_COMPOSITE) && DISABLED(NO_SD_HOST_DRIVE) | #if defined(USBD_USE_CDC_MSC) && DISABLED(NO_SD_HOST_DRIVE) | ||||||
|   #define HAS_SD_HOST_DRIVE 1 |   #define HAS_SD_HOST_DRIVE 1 | ||||||
| #endif | #endif | ||||||
|   | |||||||
							
								
								
									
										112
									
								
								Marlin/src/HAL/STM32/msc_sd.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								Marlin/src/HAL/STM32/msc_sd.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | |||||||
|  | /** | ||||||
|  |  * Marlin 3D Printer Firmware | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] | ||||||
|  |  * Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech] | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | #include "../../inc/MarlinConfigPre.h" | ||||||
|  |  | ||||||
|  | #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) && HAS_SD_HOST_DRIVE | ||||||
|  |  | ||||||
|  | #include "msc_sd.h" | ||||||
|  | #include "../shared/Marduino.h" | ||||||
|  | #include "usbd_core.h" | ||||||
|  | #include <USB.h> | ||||||
|  | #include <USBMscHandler.h> | ||||||
|  |  | ||||||
|  | #define BLOCK_SIZE 512 | ||||||
|  | #define PRODUCT_ID 0x29 | ||||||
|  |  | ||||||
|  | #include "../../sd/cardreader.h" | ||||||
|  |  | ||||||
|  | class Sd2CardUSBMscHandler : public USBMscHandler { | ||||||
|  | public: | ||||||
|  |   bool GetCapacity(uint32_t *pBlockNum, uint16_t *pBlockSize) { | ||||||
|  |     *pBlockNum = card.getSd2Card().cardSize(); | ||||||
|  |     *pBlockSize = BLOCK_SIZE; | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   bool Write(uint8_t *pBuf, uint32_t blkAddr, uint16_t blkLen) { | ||||||
|  |     auto sd2card = card.getSd2Card(); | ||||||
|  |     // single block | ||||||
|  |     if (blkLen == 1) { | ||||||
|  |       watchdog_refresh(); | ||||||
|  |       sd2card.writeBlock(blkAddr, pBuf); | ||||||
|  |       return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // multi block optmization | ||||||
|  |     sd2card.writeStart(blkAddr, blkLen); | ||||||
|  |     while (blkLen--) { | ||||||
|  |       watchdog_refresh(); | ||||||
|  |       sd2card.writeData(pBuf); | ||||||
|  |       pBuf += BLOCK_SIZE; | ||||||
|  |     } | ||||||
|  |     sd2card.writeStop(); | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   bool Read(uint8_t *pBuf, uint32_t blkAddr, uint16_t blkLen) { | ||||||
|  |     auto sd2card = card.getSd2Card(); | ||||||
|  |     // single block | ||||||
|  |     if (blkLen == 1) { | ||||||
|  |       watchdog_refresh(); | ||||||
|  |       sd2card.readBlock(blkAddr, pBuf); | ||||||
|  |       return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // multi block optmization | ||||||
|  |     sd2card.readStart(blkAddr); | ||||||
|  |     while (blkLen--) { | ||||||
|  |       watchdog_refresh(); | ||||||
|  |       sd2card.readData(pBuf); | ||||||
|  |       pBuf += BLOCK_SIZE; | ||||||
|  |     } | ||||||
|  |     sd2card.readStop(); | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   bool IsReady() { | ||||||
|  |     return card.isMounted(); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | Sd2CardUSBMscHandler usbMscHandler; | ||||||
|  |  | ||||||
|  | /* USB Mass storage Standard Inquiry Data */ | ||||||
|  | uint8_t  Marlin_STORAGE_Inquirydata[] = { /* 36 */ | ||||||
|  |   /* LUN 0 */ | ||||||
|  |   0x00, | ||||||
|  |   0x80, | ||||||
|  |   0x02, | ||||||
|  |   0x02, | ||||||
|  |   (STANDARD_INQUIRY_DATA_LEN - 5), | ||||||
|  |   0x00, | ||||||
|  |   0x00, | ||||||
|  |   0x00, | ||||||
|  |   'M', 'A', 'R', 'L', 'I', 'N', ' ', ' ', /* Manufacturer : 8 bytes */ | ||||||
|  |   'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product      : 16 Bytes */ | ||||||
|  |   ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', | ||||||
|  |   '0', '.', '0', '1',                     /* Version      : 4 Bytes */ | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | USBMscHandler *pSingleMscHandler = &usbMscHandler; | ||||||
|  |  | ||||||
|  | void MSC_SD_init() { | ||||||
|  |   USBDevice.end(); | ||||||
|  |   delay(200); | ||||||
|  |   USBDevice.begin(); | ||||||
|  |   USBDevice.registerMscHandlers(1, &pSingleMscHandler, Marlin_STORAGE_Inquirydata); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif // __STM32F1__ && HAS_SD_HOST_DRIVE | ||||||
							
								
								
									
										18
									
								
								Marlin/src/HAL/STM32/msc_sd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								Marlin/src/HAL/STM32/msc_sd.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | /** | ||||||
|  |  * Marlin 3D Printer Firmware | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] | ||||||
|  |  * Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech] | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | void MSC_SD_init(); | ||||||
| @@ -1524,6 +1524,22 @@ build_flags       = ${stm32_flash_drive.build_flags} | |||||||
|   -DUSE_USB_HS_IN_FS |   -DUSE_USB_HS_IN_FS | ||||||
|   -DUSBD_USE_CDC |   -DUSBD_USE_CDC | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # MKS Robin Nano V3 with USB Flash Drive Support and Shared Media | ||||||
|  | # Currently, using a STM32duino fork, until USB Host and USB Device MSC get merged | ||||||
|  | # | ||||||
|  | [env:mks_robin_nano_v3_usb_flash_drive_msc] | ||||||
|  | extends           = env:mks_robin_nano_v3 | ||||||
|  | platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc-cdc-msc.zip | ||||||
|  | build_unflags     = ${common_stm32.build_unflags} -DUSBD_USE_CDC | ||||||
|  | build_flags       = ${stm32_flash_drive.build_flags} | ||||||
|  |   -DUSBCON | ||||||
|  |   -DUSE_USBHOST_HS | ||||||
|  |   -DUSBD_IRQ_PRIO=5 | ||||||
|  |   -DUSBD_IRQ_SUBPRIO=6 | ||||||
|  |   -DUSE_USB_HS_IN_FS | ||||||
|  |   -DUSBD_USE_CDC_MSC | ||||||
|  |  | ||||||
| # | # | ||||||
| # Mingda MPX_ARM_MINI | # Mingda MPX_ARM_MINI | ||||||
| # | # | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user