From 1d7fb82f0aec11331635532583617d773888b991 Mon Sep 17 00:00:00 2001 From: Damien George Date: Mon, 15 Sep 2014 23:49:57 +0100 Subject: 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. --- .../class/cdc_msc_hid/inc/usbd_cdc_msc_hid.h | 2 +- .../usbdev/class/cdc_msc_hid/src/usbd_msc_scsi.c | 23 +++++++++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) (limited to 'stmhal/usbdev/class') 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 */ -- cgit v1.2.3