| /* USER CODE BEGIN Header */ | |
| /** | |
| ****************************************************************************** | |
| * @file : usbd_storage_if.c | |
| * @version : v1.0_Cube | |
| * @brief : Memory management layer. | |
| ****************************************************************************** | |
| * @attention | |
| * | |
| * <h2><center>© Copyright (c) 2020 STMicroelectronics. | |
| * All rights reserved.</center></h2> | |
| * | |
| * This software component is licensed by ST under Ultimate Liberty license | |
| * SLA0044, the "License"; You may not use this file except in compliance with | |
| * the License. You may obtain a copy of the License at: | |
| * www.st.com/SLA0044 | |
| * | |
| ****************************************************************************** | |
| */ | |
| /* USER CODE END Header */ | |
| /* Includes ------------------------------------------------------------------*/ | |
| #include "usbd_storage_if.h" | |
| /* USER CODE BEGIN INCLUDE */ | |
| #include "ff.h" | |
| #include "diskio.h" | |
| #include "USBManager.h" | |
| /* USER CODE END INCLUDE */ | |
| /* Private typedef -----------------------------------------------------------*/ | |
| /* Private define ------------------------------------------------------------*/ | |
| /* Private macro -------------------------------------------------------------*/ | |
| /* USER CODE BEGIN PV */ | |
| /* Private variables ---------------------------------------------------------*/ | |
| extern USBManager g_usbManager; | |
| /* USER CODE END PV */ | |
| /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY | |
| * @brief Usb device. | |
| * @{ | |
| */ | |
| /** @defgroup USBD_STORAGE | |
| * @brief Usb mass storage device module | |
| * @{ | |
| */ | |
| /** @defgroup USBD_STORAGE_Private_TypesDefinitions | |
| * @brief Private types. | |
| * @{ | |
| */ | |
| /* USER CODE BEGIN PRIVATE_TYPES */ | |
| /* USER CODE END PRIVATE_TYPES */ | |
| /** | |
| * @} | |
| */ | |
| /** @defgroup USBD_STORAGE_Private_Defines | |
| * @brief Private defines. | |
| * @{ | |
| */ | |
| #define STORAGE_LUN_NBR 1 | |
| #define STORAGE_BLK_NBR 0x10000 | |
| #define STORAGE_BLK_SIZ 0x200 | |
| /* USER CODE BEGIN PRIVATE_DEFINES */ | |
| /* USER CODE END PRIVATE_DEFINES */ | |
| /** | |
| * @} | |
| */ | |
| /** @defgroup USBD_STORAGE_Private_Macros | |
| * @brief Private macros. | |
| * @{ | |
| */ | |
| /* USER CODE BEGIN PRIVATE_MACRO */ | |
| /* USER CODE END PRIVATE_MACRO */ | |
| /** | |
| * @} | |
| */ | |
| /** @defgroup USBD_STORAGE_Private_Variables | |
| * @brief Private variables. | |
| * @{ | |
| */ | |
| /* USER CODE BEGIN INQUIRY_DATA_HS */ | |
| /** USB Mass storage Standard Inquiry Data. */ | |
| const uint8_t STORAGE_Inquirydata_HS[] = {/* 36 */ | |
| /* LUN 0 */ | |
| 0x00, | |
| 0x80, | |
| 0x02, | |
| 0x02, | |
| (STANDARD_INQUIRY_DATA_LEN - 5), | |
| 0x00, | |
| 0x00, | |
| 0x00, | |
| 'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */ | |
| '3', '2', 'B', 'l', 'i', 't', ' ', 'S', /* Product : 16 Bytes */ | |
| 'D', ' ', ' ', ' ', ' ', ' ', ' ', ' ', | |
| '0', '.', '0' ,'1' /* Version : 4 Bytes */ | |
| }; | |
| /* USER CODE END INQUIRY_DATA_HS */ | |
| /* USER CODE BEGIN PRIVATE_VARIABLES */ | |
| /* USER CODE END PRIVATE_VARIABLES */ | |
| /** | |
| * @} | |
| */ | |
| /** @defgroup USBD_STORAGE_Exported_Variables | |
| * @brief Public variables. | |
| * @{ | |
| */ | |
| extern USBD_HandleTypeDef hUsbDeviceHS; | |
| /* USER CODE BEGIN EXPORTED_VARIABLES */ | |
| /* USER CODE END EXPORTED_VARIABLES */ | |
| /** | |
| * @} | |
| */ | |
| /** @defgroup USBD_STORAGE_Private_FunctionPrototypes | |
| * @brief Private functions declaration. | |
| * @{ | |
| */ | |
| static int8_t STORAGE_Init_HS(uint8_t lun); | |
| static int8_t STORAGE_GetCapacity_HS(uint8_t lun, uint32_t *block_num, uint16_t *block_size); | |
| static int8_t STORAGE_IsReady_HS(uint8_t lun); | |
| static int8_t STORAGE_IsWriteProtected_HS(uint8_t lun); | |
| static int8_t STORAGE_Read_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); | |
| static int8_t STORAGE_Write_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); | |
| static int8_t STORAGE_GetMaxLun_HS(void); | |
| /* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */ | |
| /* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */ | |
| /** | |
| * @} | |
| */ | |
| USBD_StorageTypeDef USBD_Storage_Interface_fops_HS = | |
| { | |
| STORAGE_Init_HS, | |
| STORAGE_GetCapacity_HS, | |
| STORAGE_IsReady_HS, | |
| STORAGE_IsWriteProtected_HS, | |
| STORAGE_Read_HS, | |
| STORAGE_Write_HS, | |
| STORAGE_GetMaxLun_HS, | |
| (int8_t *)STORAGE_Inquirydata_HS | |
| }; | |
| /* Private functions ---------------------------------------------------------*/ | |
| /** | |
| * @brief . | |
| * @param lun: . | |
| * @retval USBD_OK if all operations are OK else USBD_FAIL | |
| */ | |
| int8_t STORAGE_Init_HS(uint8_t lun) | |
| { | |
| /* USER CODE BEGIN 9 */ | |
| return (USBD_OK); | |
| /* USER CODE END 9 */ | |
| } | |
| /** | |
| * @brief . | |
| * @param lun: . | |
| * @param block_num: . | |
| * @param block_size: . | |
| * @retval USBD_OK if all operations are OK else USBD_FAIL | |
| */ | |
| int8_t STORAGE_GetCapacity_HS(uint8_t lun, uint32_t *block_num, uint16_t *block_size) | |
| { | |
| /* USER CODE BEGIN 10 */ | |
| // get sector size and count | |
| DWORD sectorCount = 0; | |
| WORD sectorSize = 0; | |
| if (disk_ioctl(lun, GET_SECTOR_SIZE, §orSize) == RES_OK) | |
| { | |
| if (disk_ioctl(lun, GET_SECTOR_COUNT, §orCount) == RES_OK) | |
| { | |
| *block_num = sectorCount; | |
| *block_size = sectorSize; | |
| return (USBD_OK); | |
| } | |
| } | |
| return (USBD_FAIL); | |
| // *block_num = 0x7735940; | |
| // *block_size = 512; | |
| // return (USBD_OK); | |
| /* USER CODE END 10 */ | |
| } | |
| /** | |
| * @brief . | |
| * @param lun: . | |
| * @retval USBD_OK if all operations are OK else USBD_FAIL | |
| */ | |
| int8_t STORAGE_IsReady_HS(uint8_t lun) | |
| { | |
| /* USER CODE BEGIN 11 */ | |
| if(g_usbManager.IsMSCReady()) | |
| return (USBD_OK); | |
| else | |
| return (USBD_FAIL); | |
| /* USER CODE END 11 */ | |
| } | |
| /** | |
| * @brief . | |
| * @param lun: . | |
| * @retval USBD_OK if all operations are OK else USBD_FAIL | |
| */ | |
| int8_t STORAGE_IsWriteProtected_HS(uint8_t lun) | |
| { | |
| /* USER CODE BEGIN 12 */ | |
| return (USBD_OK); | |
| /* USER CODE END 12 */ | |
| } | |
| /** | |
| * @brief . | |
| * @param lun: . | |
| * @param buf: . | |
| * @param blk_addr: . | |
| * @param blk_len: . | |
| * @retval USBD_OK if all operations are OK else USBD_FAIL | |
| */ | |
| int8_t STORAGE_Read_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) | |
| { | |
| /* USER CODE BEGIN 13 */ | |
| g_usbManager.LogActivity(); | |
| if (disk_read(lun, buf, blk_addr, blk_len) != RES_OK) | |
| return -1; | |
| return USBD_OK; | |
| /* USER CODE END 13 */ | |
| } | |
| /** | |
| * @brief . | |
| * @param lun: . | |
| * @param buf: . | |
| * @param blk_addr: . | |
| * @param blk_len: . | |
| * @retval USBD_OK if all operations are OK else USBD_FAIL | |
| */ | |
| int8_t STORAGE_Write_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) | |
| { | |
| /* USER CODE BEGIN 14 */ | |
| g_usbManager.LogActivity(); | |
| if (disk_write(lun, buf, blk_addr, blk_len) != RES_OK) | |
| return -1; | |
| return USBD_OK; | |
| /* USER CODE END 14 */ | |
| } | |
| /** | |
| * @brief . | |
| * @param None | |
| * @retval . | |
| */ | |
| int8_t STORAGE_GetMaxLun_HS(void) | |
| { | |
| /* USER CODE BEGIN 15 */ | |
| return (STORAGE_LUN_NBR - 1); | |
| /* USER CODE END 15 */ | |
| } | |
| /* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */ | |
| /* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */ | |
| /** | |
| * @} | |
| */ | |
| /** | |
| * @} | |
| */ | |
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |