[C] 纯文本查看 复制代码
SBD_StorageTypeDef USBD_DISK_fops = {
STORAGE_Init,
STORAGE_GetCapacity,
STORAGE_IsReady,
STORAGE_IsWriteProtected,
STORAGE_Read,
STORAGE_Write,
STORAGE_GetMaxLun,
STORAGE_Inquirydata,
};
/* Private functions --------------------------------------------------------- */
/**
* @brief Initializes the storage unit (medium)
* @param lun: Logical unit number
* @retval Status (0 : OK / -1 : Error)
*/
int8_t STORAGE_Init(uint8_t lun)
{
int8_t ret = -1;
switch (lun)
{
case LUN_SPIFLASH:
//bsp_InitSFlash();
ret = 0;
break;
case LUN_SD:
BSP_SD_Init();
ret = 0;
break;
case LUN_NAND:
break;
case LUN_SDRAM:
break;
}
return ret;
}
/**
* @brief Returns the medium capacity.
* @param lun: Logical unit number
* @param block_num: Number of total block number
* @param block_size: Block size
* @retval Status (0: OK / -1: Error)
*/
int8_t STORAGE_GetCapacity(uint8_t lun, uint32_t * block_num,
uint16_t * block_size)
{
int8_t ret = -1;
switch (lun)
{
case LUN_SPIFLASH:
{
*block_size = 4096;
*block_num = 1024*8;
ret = 0;
}
break;
case LUN_SD:
{
HAL_SD_CardInfoTypeDef info;
if (BSP_SD_IsDetected() != SD_NOT_PRESENT)
{
BSP_SD_GetCardInfo(&info);
*block_num = info.LogBlockNbr - 1;
*block_size = info.LogBlockSize;
ret = 0;
}
}
break;
case LUN_NAND:
break;
case LUN_SDRAM:
ret = 0;
break;
}
return ret;
}
/**
* @brief Checks whether the medium is ready.
* @param lun: Logical unit number
* @retval Status (0: OK / -1: Error)
*/
int8_t STORAGE_IsReady(uint8_t lun)
{
int8_t ret = -1;
switch (lun)
{
case LUN_SPIFLASH:
ret = 0;
break;
case LUN_SD:
{
static int8_t prev_status = 0;
if (BSP_SD_IsDetected() != SD_NOT_PRESENT)
{
if (prev_status < 0)
{
BSP_SD_Init();
prev_status = 0;
}
if (BSP_SD_GetCardState() == SD_TRANSFER_OK)
{
ret = 0;
}
}
else if (prev_status == 0)
{
prev_status = -1;
}
}
break;
case LUN_NAND:
ret = 0;
break;
case LUN_SDRAM:
ret = 0;
break;
}
return ret;
}
/**
* @brief Checks whether the medium is write protected.
* @param lun: Logical unit number
* @retval Status (0: write enabled / -1: otherwise)
*/
int8_t STORAGE_IsWriteProtected(uint8_t lun)
{
return 0;
}
/**
* @brief Reads data from the medium.
* @param lun: Logical unit number
* @param blk_addr: Logical block address
* @param blk_len: Blocks number
* @retval Status (0: OK / -1: Error)
*/
int8_t STORAGE_Read(uint8_t lun, uint8_t * buf, uint32_t blk_addr,
uint16_t blk_len)
{
int8_t ret = -1;
switch (lun)
{
case LUN_SPIFLASH:
QSPI_ReadBuffer(buf, blk_addr << 12, blk_len<<12);
ret = 0;
break;
case LUN_SD:
{
if (BSP_SD_IsDetected() != SD_NOT_PRESENT)
{
BSP_SD_ReadBlocks((uint32_t *) buf, blk_addr, blk_len, 1000);
/* Wait until SD card is ready to use for new operation */
while (BSP_SD_GetCardState() != SD_TRANSFER_OK)
{
}
ret = 0;
}
}
break;
case LUN_NAND:
break;
case LUN_SDRAM:
break;
}
return ret;
}
/**
* @brief Writes data into the medium.
* @param lun: Logical unit number
* @param blk_addr: Logical block address
* @param blk_len: Blocks number
* @retval Status (0 : OK / -1 : Error)
*/
int8_t STORAGE_Write(uint8_t lun, uint8_t * buf, uint32_t blk_addr,
uint16_t blk_len)
{
int8_t ret = -1;
uint32_t addr;
uint16_t i;
uint8_t *p;
switch (lun)
{
case LUN_SPIFLASH:
p = (uint8_t *)buf;
for(i = 0; i < blk_len; i++)
{
addr = (blk_addr + i) << 12;
QSPI_EraseSector(addr);
QSPI_WriteBuffer(p + 256*0, addr + 256*0, 256);
QSPI_WriteBuffer(p + 256*1, addr + 256*1, 256);
QSPI_WriteBuffer(p + 256*2, addr + 256*2, 256);
QSPI_WriteBuffer(p + 256*3, addr + 256*3, 256);
QSPI_WriteBuffer(p + 256*4, addr + 256*4, 256);
QSPI_WriteBuffer(p + 256*5, addr + 256*5, 256);
QSPI_WriteBuffer(p + 256*6, addr + 256*6, 256);
QSPI_WriteBuffer(p + 256*7, addr + 256*7, 256);
QSPI_WriteBuffer(p + 256*8, addr + 256*8, 256);
QSPI_WriteBuffer(p + 256*9, addr + 256*9, 256);
QSPI_WriteBuffer(p + 256*10, addr + 256*10, 256);
QSPI_WriteBuffer(p + 256*11, addr + 256*11, 256);
QSPI_WriteBuffer(p + 256*12, addr + 256*12, 256);
QSPI_WriteBuffer(p + 256*13, addr + 256*13, 256);
QSPI_WriteBuffer(p + 256*14, addr + 256*14, 256);
QSPI_WriteBuffer(p + 256*15, addr + 256*15, 256);
p += 4096;
}
ret = 0;
break;
case LUN_SD:
{
if (BSP_SD_IsDetected() != SD_NOT_PRESENT)
{
BSP_SD_WriteBlocks((uint32_t *) buf, blk_addr, blk_len, 1000);
/* Wait until SD card is ready to use for new operation */
while (BSP_SD_GetCardState() != SD_TRANSFER_OK)
{
}
ret = 0;
}
}
break;
case LUN_NAND:
break;
case LUN_SDRAM:
break;
}
return ret;
}
/**
* @brief Returns the Max Supported LUNs.
* @param None
* @retval Lun(s) number
*/
int8_t STORAGE_GetMaxLun(void)
{
return (STORAGE_LUN_NBR - 1);
}