X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcpu%2Fcortex-m3%2Fdrv%2Fsd_sam3.c;h=75817e02b92436e8d7b31c71fa26ee87c67e167f;hb=fe1e84aff4fe0924a8e51a1792e5731ae0ea3b52;hp=8bb27ae48fbfc164e8120cfa9809bcad9f19b90f;hpb=a007449cb1305da1d1052f2fa65d6c92f737537e;p=bertos.git diff --git a/bertos/cpu/cortex-m3/drv/sd_sam3.c b/bertos/cpu/cortex-m3/drv/sd_sam3.c index 8bb27ae4..75817e02 100644 --- a/bertos/cpu/cortex-m3/drv/sd_sam3.c +++ b/bertos/cpu/cortex-m3/drv/sd_sam3.c @@ -26,12 +26,12 @@ * invalidate any other reasons why the executable file might be covered by * the GNU General Public License. * - * Copyright 2007 Develer S.r.l. (http://www.develer.com/) + * Copyright 2011 Develer S.r.l. (http://www.develer.com/) * --> * * \brief Function library for secure digital memory. * - * \author Francesco Sacchi + * \author Daniele Basile */ @@ -85,6 +85,7 @@ #define CMD8_V_ECHO_REPLY 0xFF #define CMD8_SUPP_V_RANGE_REPLY 0xFF00 +#define SD_STATUS_ERROR BV(19) #define SD_GET_ERRORS(status) ((status) & 0xFFF80000) #define SD_ADDR_TO_RCA(addr) (uint32_t)(((addr) << 16) & 0xFFFF0000) @@ -310,7 +311,6 @@ int sd_sendIfCond(Sd *sd) return 0; } LOG_ERR("IF_COND: %lx\n", (sd->status)); - return -1; } @@ -340,6 +340,7 @@ int sd_sendAppOpCond(Sd *sd) } } } + return -1; } @@ -429,6 +430,7 @@ int sd_appStatus(Sd *sd) if (hsmci_sendCmd(13, SD_ADDR_TO_RCA(sd->addr), HSMCI_CMDR_RSPTYP_48_BIT)) { LOG_ERR("STATUS: %lx\n", HSMCI_SR); + sd->status |= SD_STATUS_ERROR; return -1; } @@ -451,6 +453,7 @@ INLINE int sd_cardSelection(Sd *sd, uint32_t rca) if (hsmci_sendCmd(7, rca, HSMCI_CMDR_RSPTYP_R1B)) { LOG_ERR("SELECT_SD: %lx\n", HSMCI_SR); + sd->status |= SD_STATUS_ERROR; return -1; } @@ -628,11 +631,16 @@ void sd_setHightSpeed(Sd *sd) static size_t sd_SdReadDirect(struct KBlock *b, block_idx_t idx, void *buf, size_t offset, size_t size) { ASSERT(buf); + ASSERT(!((uint32_t)buf & 0x3)); + Sd *sd = SD_CAST(b); LOG_INFO("reading from block %ld, offset %d, size %d\n", idx, offset, size); if (sd_selectCard(sd) < 0) + { + sd->status |= SD_STATUS_ERROR; return -1; + } hsmci_read(buf, size / 4, sd->b.blk_size); @@ -663,12 +671,17 @@ static size_t sd_SdReadDirect(struct KBlock *b, block_idx_t idx, void *buf, size static size_t sd_SdWriteDirect(KBlock *b, block_idx_t idx, const void *buf, size_t offset, size_t size) { ASSERT(buf); + ASSERT(!((uint32_t)buf & 0x3)); + Sd *sd = SD_CAST(b); const uint32_t *_buf = (const uint32_t *)buf; LOG_INFO("reading from block %ld, offset %d, size %d\n", idx, offset, size); if (sd_selectCard(sd) < 0) - return 0; + { + sd->status |= SD_STATUS_ERROR; + return -1; + } hsmci_write(_buf, size / 4, sd->b.blk_size);