aboutsummaryrefslogtreecommitdiff
path: root/stmhal/usbdev/class/cdc_msc_hid
diff options
context:
space:
mode:
authorDamien George2014-09-15 23:49:57 +0100
committerDamien George2014-09-15 23:49:57 +0100
commit1d7fb82f0aec11331635532583617d773888b991 (patch)
treed1d408fafaa10826967abc1d872a5fc26c7299e1 /stmhal/usbdev/class/cdc_msc_hid
parent6ff42c54bb2c6e950206c380a100db776e3938d8 (diff)
stmhal: Change 64-bit arithmetic to 32-bit for SD card block addressing.
By measuring SD card addresses in blocks and not bytes, one can get away with using 32-bit numbers. This patch also uses proper atomic lock/unlock around SD card read/write, adds SD.info() function, and gives error code for failed read/writes.
Diffstat (limited to 'stmhal/usbdev/class/cdc_msc_hid')
-rw-r--r--stmhal/usbdev/class/cdc_msc_hid/inc/usbd_cdc_msc_hid.h2
-rw-r--r--stmhal/usbdev/class/cdc_msc_hid/src/usbd_msc_scsi.c23
2 files changed, 13 insertions, 12 deletions
diff --git a/stmhal/usbdev/class/cdc_msc_hid/inc/usbd_cdc_msc_hid.h b/stmhal/usbdev/class/cdc_msc_hid/inc/usbd_cdc_msc_hid.h
index 798bdc99d..7eca900ee 100644
--- a/stmhal/usbdev/class/cdc_msc_hid/inc/usbd_cdc_msc_hid.h
+++ b/stmhal/usbdev/class/cdc_msc_hid/inc/usbd_cdc_msc_hid.h
@@ -83,7 +83,7 @@ typedef struct {
uint16_t scsi_blk_size;
uint32_t scsi_blk_nbr;
- uint32_t scsi_blk_addr;
+ uint32_t scsi_blk_addr_in_blks;
uint32_t scsi_blk_len;
} USBD_MSC_BOT_HandleTypeDef;
diff --git a/stmhal/usbdev/class/cdc_msc_hid/src/usbd_msc_scsi.c b/stmhal/usbdev/class/cdc_msc_hid/src/usbd_msc_scsi.c
index 60258d64d..894812c18 100644
--- a/stmhal/usbdev/class/cdc_msc_hid/src/usbd_msc_scsi.c
+++ b/stmhal/usbdev/class/cdc_msc_hid/src/usbd_msc_scsi.c
@@ -510,7 +510,7 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *para
return -1;
}
- hmsc->scsi_blk_addr = (params[2] << 24) | \
+ hmsc->scsi_blk_addr_in_blks = (params[2] << 24) | \
(params[3] << 16) | \
(params[4] << 8) | \
params[5];
@@ -520,13 +520,12 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *para
- if( SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, hmsc->scsi_blk_len) < 0)
+ if( SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr_in_blks, hmsc->scsi_blk_len) < 0)
{
return -1; /* error */
}
hmsc->bot_state = USBD_BOT_DATA_IN;
- hmsc->scsi_blk_addr *= hmsc->scsi_blk_size;
hmsc->scsi_blk_len *= hmsc->scsi_blk_size;
/* cases 4,5 : Hi <> Dn */
@@ -591,7 +590,7 @@ static int8_t SCSI_Write10 (USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *pa
}
- hmsc->scsi_blk_addr = (params[2] << 24) | \
+ hmsc->scsi_blk_addr_in_blks = (params[2] << 24) | \
(params[3] << 16) | \
(params[4] << 8) | \
params[5];
@@ -601,13 +600,12 @@ static int8_t SCSI_Write10 (USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *pa
/* check if LBA address is in the right range */
if(SCSI_CheckAddressRange(pdev,
lun,
- hmsc->scsi_blk_addr,
+ hmsc->scsi_blk_addr_in_blks,
hmsc->scsi_blk_len) < 0)
{
return -1; /* error */
}
- hmsc->scsi_blk_addr *= hmsc->scsi_blk_size;
hmsc->scsi_blk_len *= hmsc->scsi_blk_size;
/* cases 3,11,13 : Hn,Ho <> D0 */
@@ -656,9 +654,12 @@ static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *pa
return -1; /* Error, Verify Mode Not supported*/
}
+ hmsc->scsi_blk_addr_in_blks = (params[2] << 24) | (params[3] << 16) | (params[4] << 8) | params[5];
+ hmsc->scsi_blk_len = (params[7] << 8) | params[8];
+
if(SCSI_CheckAddressRange(pdev,
lun,
- hmsc->scsi_blk_addr,
+ hmsc->scsi_blk_addr_in_blks,
hmsc->scsi_blk_len) < 0)
{
return -1; /* error */
@@ -705,7 +706,7 @@ static int8_t SCSI_ProcessRead (USBD_HandleTypeDef *pdev, uint8_t lun)
if( ((USBD_StorageTypeDef *)pdev->pUserData)->Read(lun ,
hmsc->bot_data,
- hmsc->scsi_blk_addr / hmsc->scsi_blk_size,
+ hmsc->scsi_blk_addr_in_blks,
len / hmsc->scsi_blk_size) < 0)
{
@@ -723,7 +724,7 @@ static int8_t SCSI_ProcessRead (USBD_HandleTypeDef *pdev, uint8_t lun)
len);
- hmsc->scsi_blk_addr += len;
+ hmsc->scsi_blk_addr_in_blks += len / hmsc->scsi_blk_size;
hmsc->scsi_blk_len -= len;
/* case 6 : Hi = Di */
@@ -752,7 +753,7 @@ static int8_t SCSI_ProcessWrite (USBD_HandleTypeDef *pdev, uint8_t lun)
if(((USBD_StorageTypeDef *)pdev->pUserData)->Write(lun ,
hmsc->bot_data,
- hmsc->scsi_blk_addr / hmsc->scsi_blk_size,
+ hmsc->scsi_blk_addr_in_blks,
len / hmsc->scsi_blk_size) < 0)
{
SCSI_SenseCode(pdev,
@@ -763,7 +764,7 @@ static int8_t SCSI_ProcessWrite (USBD_HandleTypeDef *pdev, uint8_t lun)
}
- hmsc->scsi_blk_addr += len;
+ hmsc->scsi_blk_addr_in_blks += len / hmsc->scsi_blk_size;
hmsc->scsi_blk_len -= len;
/* case 12 : Ho = Do */