aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUladzimir Pylinski <barthess@yandex.ru>2015-03-24 20:20:56 +0000
committerUladzimir Pylinski <barthess@yandex.ru>2015-03-24 20:20:56 +0000
commite3083bb6a9bf6daa7d6799078745cb11fd3ac58b (patch)
treeb3e37a0e94ece6c5fe75a5c170857797d8271195
parent398079ea3016ab874a53c6f401644251da270ade (diff)
downloadChibiOS-e3083bb6a9bf6daa7d6799078745cb11fd3ac58b.tar.gz
ChibiOS-e3083bb6a9bf6daa7d6799078745cb11fd3ac58b.tar.bz2
ChibiOS-e3083bb6a9bf6daa7d6799078745cb11fd3ac58b.zip
SDIO. sdcErase() function reintroduced.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7804 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r--os/hal/include/sdc.h1
-rw-r--r--os/hal/src/sdc.c59
2 files changed, 60 insertions, 0 deletions
diff --git a/os/hal/include/sdc.h b/os/hal/include/sdc.h
index e7f6202d9..94b6841d6 100644
--- a/os/hal/include/sdc.h
+++ b/os/hal/include/sdc.h
@@ -182,6 +182,7 @@ extern "C" {
sdcflags_t sdcGetAndClearErrors(SDCDriver *sdcp);
bool sdcSync(SDCDriver *sdcp);
bool sdcGetInfo(SDCDriver *sdcp, BlockDeviceInfo *bdip);
+ bool sdcErase(SDCDriver *mmcp, uint32_t startblk, uint32_t endblk);
bool _sdc_wait_for_transfer_state(SDCDriver *sdcp);
#ifdef __cplusplus
}
diff --git a/os/hal/src/sdc.c b/os/hal/src/sdc.c
index a159ce19a..e3cf125dd 100644
--- a/os/hal/src/sdc.c
+++ b/os/hal/src/sdc.c
@@ -933,6 +933,65 @@ bool sdcGetInfo(SDCDriver *sdcp, BlockDeviceInfo *bdip) {
return HAL_SUCCESS;
}
+/**
+ * @brief Erases the supplied blocks.
+ *
+ * @param[in] sdcp pointer to the @p SDCDriver object
+ * @param[in] startblk starting block number
+ * @param[in] endblk ending block number
+ *
+ * @return The operation status.
+ * @retval HAL_SUCCESS the operation succeeded.
+ * @retval HAL_FAILED the operation failed.
+ *
+ * @api
+ */
+bool sdcErase(SDCDriver *sdcp, uint32_t startblk, uint32_t endblk) {
+ uint32_t resp[1];
+
+ osalDbgCheck((sdcp != NULL));
+ osalDbgAssert(sdcp->state == BLK_READY, "invalid state");
+
+ /* Erase operation in progress.*/
+ sdcp->state = BLK_WRITING;
+
+ /* Handling command differences between HC and normal cards.*/
+ if (!(sdcp->cardmode & SDC_MODE_HIGH_CAPACITY)) {
+ startblk *= MMCSD_BLOCK_SIZE;
+ endblk *= MMCSD_BLOCK_SIZE;
+ }
+
+ _sdc_wait_for_transfer_state(sdcp);
+
+ if ((sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_ERASE_RW_BLK_START,
+ startblk, resp) != HAL_SUCCESS) ||
+ MMCSD_R1_ERROR(resp[0]))
+ goto failed;
+
+ if ((sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_ERASE_RW_BLK_END,
+ endblk, resp) != HAL_SUCCESS) ||
+ MMCSD_R1_ERROR(resp[0]))
+ goto failed;
+
+ if ((sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_ERASE,
+ 0, resp) != HAL_SUCCESS) ||
+ MMCSD_R1_ERROR(resp[0]))
+ goto failed;
+
+ /* Quick sleep to allow it to transition to programming or receiving state */
+ /* TODO: ??????????????????????????? */
+
+ /* Wait for it to return to transfer state to indicate it has finished erasing */
+ _sdc_wait_for_transfer_state(sdcp);
+
+ sdcp->state = BLK_READY;
+ return HAL_SUCCESS;
+
+failed:
+ sdcp->state = BLK_READY;
+ return HAL_FAILED;
+}
+
#endif /* HAL_USE_SDC == TRUE */
/** @} */