X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;ds=inline;f=bertos%2Fcpu%2Fcortex-m3%2Fdrv%2Fsd_sam3.c;fp=bertos%2Fcpu%2Fcortex-m3%2Fdrv%2Fsd_sam3.c;h=0c1c0a0628f51acd7980c6237e59df6bfd344e33;hb=c50c518c2dfe5529750d50f477b840f0b4338074;hp=75817e02b92436e8d7b31c71fa26ee87c67e167f;hpb=ce1b495bea8cd889e56e947fae4b9587a52f154d;p=bertos.git diff --git a/bertos/cpu/cortex-m3/drv/sd_sam3.c b/bertos/cpu/cortex-m3/drv/sd_sam3.c index 75817e02..0c1c0a06 100644 --- a/bertos/cpu/cortex-m3/drv/sd_sam3.c +++ b/bertos/cpu/cortex-m3/drv/sd_sam3.c @@ -524,7 +524,6 @@ int sd_setBusWidth(Sd *sd, size_t len) hsmci_readResp(&(sd->status), 1); if ((sd->status) & (SD_STATUS_APP_CMD | SD_STATUS_READY)) { - hsmci_setBusWidth(len); uint8_t arg = 0; if (len == 4) @@ -542,7 +541,10 @@ int sd_setBusWidth(Sd *sd, size_t len) LOG_INFO("State[%d]\n", SD_GET_STATE(sd->status)); if (sd->status & SD_STATUS_READY) + { + hsmci_setBusWidth(len); return 0; + } } LOG_ERR("SET_BUS_WIDTH REP %lx\n", (sd->status)); @@ -636,19 +638,13 @@ static size_t sd_SdReadDirect(struct KBlock *b, block_idx_t idx, void *buf, size 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_waitTransfer(); hsmci_read(buf, size / 4, sd->b.blk_size); if (hsmci_sendCmd(17, idx * sd->b.blk_size + offset, HSMCI_CMDR_RSPTYP_48_BIT | BV(HSMCI_CMDR_TRDIR) | HSMCI_CMDR_TRCMD_START_DATA | HSMCI_CMDR_TRTYP_SINGLE)) { LOG_ERR("SIGLE_BLK_READ: %lx\n", HSMCI_SR); - sd_deSelectCard(sd); return -1; } @@ -660,11 +656,8 @@ static size_t sd_SdReadDirect(struct KBlock *b, block_idx_t idx, void *buf, size if (sd->status & SD_STATUS_READY) { hsmci_waitTransfer(); - sd_deSelectCard(sd); return size; } - - sd_deSelectCard(sd); return -1; } @@ -675,21 +668,15 @@ static size_t sd_SdWriteDirect(KBlock *b, block_idx_t idx, const void *buf, size 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) - { - sd->status |= SD_STATUS_ERROR; - return -1; - } + LOG_INFO("writing block %ld, offset %d, size %d\n", idx, offset, size); + hsmci_waitTransfer(); hsmci_write(_buf, size / 4, sd->b.blk_size); if (hsmci_sendCmd(24, idx * sd->b.blk_size + offset, HSMCI_CMDR_RSPTYP_48_BIT | HSMCI_CMDR_TRCMD_START_DATA | HSMCI_CMDR_TRTYP_SINGLE)) { LOG_ERR("SIGLE_BLK_WRITE: %lx\n", HSMCI_SR); - sd_deSelectCard(sd); return -1; } @@ -700,12 +687,9 @@ static size_t sd_SdWriteDirect(KBlock *b, block_idx_t idx, const void *buf, size if (sd->status & SD_STATUS_READY) { - hsmci_waitTransfer(); - sd_deSelectCard(sd); return size; } - sd_deSelectCard(sd); return -1; } @@ -796,7 +780,6 @@ static bool sd_blockInit(Sd *sd, KFile *ch) sd_set_BlockLen(sd, SD_DEFAULT_BLOCKLEN); sd_setBus4bit(sd); sd_setHightSpeed(sd); - sd_deSelectCard(sd); #if CONFIG_SD_AUTOASSIGN_FAT disk_assignDrive(&sd->b, 0);