Proposed fix for USB Mass Storage.
This commit is contained in:
parent
c737086e1c
commit
d368611ea6
@ -41,10 +41,10 @@
|
|||||||
|
|
||||||
// These are needed to support removal of the medium, so that the USB drive
|
// These are needed to support removal of the medium, so that the USB drive
|
||||||
// can be unmounted, and won't be remounted automatically.
|
// can be unmounted, and won't be remounted automatically.
|
||||||
static uint8_t flash_removed = 0;
|
static uint8_t flash_started = 0;
|
||||||
|
|
||||||
#if MICROPY_HW_HAS_SDCARD
|
#if MICROPY_HW_HAS_SDCARD
|
||||||
static uint8_t sdcard_removed = 0;
|
static uint8_t sdcard_started = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
@ -73,6 +73,7 @@ static const int8_t FLASH_STORAGE_Inquirydata[] = { // 36 bytes
|
|||||||
*/
|
*/
|
||||||
int8_t FLASH_STORAGE_Init(uint8_t lun) {
|
int8_t FLASH_STORAGE_Init(uint8_t lun) {
|
||||||
storage_init();
|
storage_init();
|
||||||
|
flash_started = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,11 +96,11 @@ int8_t FLASH_STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num, uint16_t *blo
|
|||||||
* @retval Status
|
* @retval Status
|
||||||
*/
|
*/
|
||||||
int8_t FLASH_STORAGE_IsReady(uint8_t lun) {
|
int8_t FLASH_STORAGE_IsReady(uint8_t lun) {
|
||||||
if (flash_removed) {
|
if (flash_started) {
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief check whether the medium is write-protected
|
* @brief check whether the medium is write-protected
|
||||||
@ -111,8 +112,8 @@ int8_t FLASH_STORAGE_IsWriteProtected(uint8_t lun) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remove the lun
|
// Remove the lun
|
||||||
int8_t FLASH_STORAGE_StopUnit(uint8_t lun) {
|
int8_t FLASH_STORAGE_StartStopUnit(uint8_t lun, uint8_t started) {
|
||||||
flash_removed = 1;
|
flash_started = started;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,7 +177,7 @@ const USBD_StorageTypeDef USBD_FLASH_STORAGE_fops = {
|
|||||||
FLASH_STORAGE_GetCapacity,
|
FLASH_STORAGE_GetCapacity,
|
||||||
FLASH_STORAGE_IsReady,
|
FLASH_STORAGE_IsReady,
|
||||||
FLASH_STORAGE_IsWriteProtected,
|
FLASH_STORAGE_IsWriteProtected,
|
||||||
FLASH_STORAGE_StopUnit,
|
FLASH_STORAGE_StartStopUnit,
|
||||||
FLASH_STORAGE_PreventAllowMediumRemoval,
|
FLASH_STORAGE_PreventAllowMediumRemoval,
|
||||||
FLASH_STORAGE_Read,
|
FLASH_STORAGE_Read,
|
||||||
FLASH_STORAGE_Write,
|
FLASH_STORAGE_Write,
|
||||||
@ -228,7 +229,7 @@ int8_t SDCARD_STORAGE_Init(uint8_t lun) {
|
|||||||
if (!sdcard_power_on()) {
|
if (!sdcard_power_on()) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
sdcard_started = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -264,34 +265,11 @@ int8_t SDCARD_STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num, uint16_t *bl
|
|||||||
* @retval Status
|
* @retval Status
|
||||||
*/
|
*/
|
||||||
int8_t SDCARD_STORAGE_IsReady(uint8_t lun) {
|
int8_t SDCARD_STORAGE_IsReady(uint8_t lun) {
|
||||||
if (sdcard_removed) {
|
if (sdcard_started) {
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
#ifndef USE_STM3210C_EVAL
|
|
||||||
|
|
||||||
static int8_t last_status = 0;
|
|
||||||
|
|
||||||
if(last_status < 0)
|
|
||||||
{
|
|
||||||
SD_Init();
|
|
||||||
last_status = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(SD_GetStatus() != 0)
|
|
||||||
{
|
|
||||||
last_status = -1;
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if( SD_Init() != 0)
|
|
||||||
{
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief check whether the medium is write-protected
|
* @brief check whether the medium is write-protected
|
||||||
@ -303,8 +281,8 @@ int8_t SDCARD_STORAGE_IsWriteProtected(uint8_t lun) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remove the lun
|
// Remove the lun
|
||||||
int8_t SDCARD_STORAGE_StopUnit(uint8_t lun) {
|
int8_t SDCARD_STORAGE_StartStopUnit(uint8_t lun, uint8_t started) {
|
||||||
sdcard_removed = 1;
|
sdcard_started = started;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -356,7 +334,7 @@ const USBD_StorageTypeDef USBD_SDCARD_STORAGE_fops = {
|
|||||||
SDCARD_STORAGE_GetCapacity,
|
SDCARD_STORAGE_GetCapacity,
|
||||||
SDCARD_STORAGE_IsReady,
|
SDCARD_STORAGE_IsReady,
|
||||||
SDCARD_STORAGE_IsWriteProtected,
|
SDCARD_STORAGE_IsWriteProtected,
|
||||||
SDCARD_STORAGE_StopUnit,
|
SDCARD_STORAGE_StartStopUnit,
|
||||||
SDCARD_STORAGE_PreventAllowMediumRemoval,
|
SDCARD_STORAGE_PreventAllowMediumRemoval,
|
||||||
SDCARD_STORAGE_Read,
|
SDCARD_STORAGE_Read,
|
||||||
SDCARD_STORAGE_Write,
|
SDCARD_STORAGE_Write,
|
||||||
|
@ -58,7 +58,7 @@ typedef struct _USBD_STORAGE {
|
|||||||
int8_t (* GetCapacity) (uint8_t lun, uint32_t *block_num, uint16_t *block_size);
|
int8_t (* GetCapacity) (uint8_t lun, uint32_t *block_num, uint16_t *block_size);
|
||||||
int8_t (* IsReady) (uint8_t lun);
|
int8_t (* IsReady) (uint8_t lun);
|
||||||
int8_t (* IsWriteProtected) (uint8_t lun);
|
int8_t (* IsWriteProtected) (uint8_t lun);
|
||||||
int8_t (* StopUnit)(uint8_t lun);
|
int8_t (* StartStopUnit)(uint8_t lun, uint8_t started);
|
||||||
int8_t (* PreventAllowMediumRemoval)(uint8_t lun, uint8_t param0);
|
int8_t (* PreventAllowMediumRemoval)(uint8_t lun, uint8_t param0);
|
||||||
int8_t (* Read) (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
int8_t (* Read) (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
||||||
int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
||||||
|
@ -450,13 +450,10 @@ static int8_t SCSI_StartStopUnit(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t
|
|||||||
hmsc->bot_data_length = 0;
|
hmsc->bot_data_length = 0;
|
||||||
|
|
||||||
// On Mac OS X, when the device is ejected a SCSI_START_STOP_UNIT command is sent.
|
// On Mac OS X, when the device is ejected a SCSI_START_STOP_UNIT command is sent.
|
||||||
// params[1]==0 means stop, param[1]==1 seems to be something else (happens after the
|
// Bit 0 of params[4] is the START bit.
|
||||||
// device is plugged in and mounted for some time, probably a keep alive).
|
|
||||||
// If we get a stop, we must really stop the device so that the Mac does not
|
// If we get a stop, we must really stop the device so that the Mac does not
|
||||||
// automatically remount it.
|
// automatically remount it.
|
||||||
if (params[1] == 0) {
|
((USBD_StorageTypeDef *)pdev->pUserData)->StartStopUnit(lun, params[4] & 1);
|
||||||
((USBD_StorageTypeDef *)pdev->pUserData)->StopUnit(lun);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user