git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15914 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
0aafc42a56
commit
86fbad44a5
|
@ -75,7 +75,7 @@
|
||||||
#define STM32_PLLQ_VALUE 8
|
#define STM32_PLLQ_VALUE 8
|
||||||
#define STM32_PLLR_VALUE 2
|
#define STM32_PLLR_VALUE 2
|
||||||
#define STM32_HPRE STM32_HPRE_DIV1
|
#define STM32_HPRE STM32_HPRE_DIV1
|
||||||
#define STM32_PPRE1 STM32_PPRE1_DIV2
|
#define STM32_PPRE1 STM32_PPRE1_DIV4
|
||||||
#define STM32_PPRE2 STM32_PPRE2_DIV1
|
#define STM32_PPRE2 STM32_PPRE2_DIV1
|
||||||
#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK
|
#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK
|
||||||
#define STM32_MCOPRE STM32_MCOPRE_DIV1
|
#define STM32_MCOPRE STM32_MCOPRE_DIV1
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
/* Making sure mcuconf.h setup is as expected.*/
|
/* Making sure mcuconf.h setup is as expected.*/
|
||||||
#if STM32_PCLK1 != 85000000
|
#if STM32_PCLK1 != 85000000/2
|
||||||
#error "unexpected PCLK1 frequency"
|
#error "unexpected PCLK1 frequency"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -152,6 +152,7 @@ static ShellConfig shell_cfg1 = {
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
#if !HAL_USE_SDC
|
#if !HAL_USE_SDC
|
||||||
|
static uint8_t __nocache_mmcbuf[MMC_BUFFER_SIZE];
|
||||||
mmc_spi_driver_t MMCD1;
|
mmc_spi_driver_t MMCD1;
|
||||||
|
|
||||||
/* MMC/SD over SPI driver configuration.*/
|
/* MMC/SD over SPI driver configuration.*/
|
||||||
|
@ -281,7 +282,7 @@ int main(void) {
|
||||||
/* Activates the card insertion monitor.*/
|
/* Activates the card insertion monitor.*/
|
||||||
tmr_init(&PORTAB_SDCD1);
|
tmr_init(&PORTAB_SDCD1);
|
||||||
#else
|
#else
|
||||||
mmcObjectInit(&MMCD1);
|
mmcObjectInit(&MMCD1, __nocache_mmcbuf);
|
||||||
mmcStart(&MMCD1, &mmccfg);
|
mmcStart(&MMCD1, &mmccfg);
|
||||||
|
|
||||||
/* Activates the card insertion monitor.*/
|
/* Activates the card insertion monitor.*/
|
||||||
|
|
|
@ -593,6 +593,7 @@ void mmcStop(MMCDriver *mmcp) {
|
||||||
"invalid state");
|
"invalid state");
|
||||||
|
|
||||||
spiStop(mmcp->config->spip);
|
spiStop(mmcp->config->spip);
|
||||||
|
|
||||||
mmcp->config = NULL;
|
mmcp->config = NULL;
|
||||||
mmcp->state = BLK_STOP;
|
mmcp->state = BLK_STOP;
|
||||||
}
|
}
|
||||||
|
@ -615,7 +616,7 @@ void mmcStop(MMCDriver *mmcp) {
|
||||||
*/
|
*/
|
||||||
bool mmcConnect(MMCDriver *mmcp) {
|
bool mmcConnect(MMCDriver *mmcp) {
|
||||||
unsigned i;
|
unsigned i;
|
||||||
uint8_t r1, r1a, r1b;
|
uint8_t r1;
|
||||||
|
|
||||||
osalDbgCheck(mmcp != NULL);
|
osalDbgCheck(mmcp != NULL);
|
||||||
|
|
||||||
|
@ -661,19 +662,25 @@ bool mmcConnect(MMCDriver *mmcp) {
|
||||||
/* Switch to SDHC mode.*/
|
/* Switch to SDHC mode.*/
|
||||||
i = 0;
|
i = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (mmc_send_command_R1(mmcp, MMCSD_CMD_APP_CMD, 0, &r1a) == HAL_FAILED) {
|
i++;
|
||||||
|
|
||||||
|
if (mmc_send_command_R1(mmcp, MMCSD_CMD_APP_CMD, 0, &r1) == HAL_FAILED) {
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mmc_send_command_R3(mmcp, MMCSD_CMD_APP_OP_COND, 0x400001AAU, &r1b) == HAL_FAILED) {
|
if (r1 != 0x01U) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mmc_send_command_R3(mmcp, MMCSD_CMD_APP_OP_COND, 0x400001AAU, &r1) == HAL_FAILED) {
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((r1a <= 0x01U) && (r1b == 0x00U)) {
|
if (r1 == 0x00U) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (++i >= MMC_ACMD41_RETRY) {
|
if (i >= MMC_ACMD41_RETRY) {
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
osalThreadSleepMilliseconds(10);
|
osalThreadSleepMilliseconds(10);
|
||||||
|
@ -741,7 +748,9 @@ bool mmcConnect(MMCDriver *mmcp) {
|
||||||
/* Connection failed, state reset to BLK_ACTIVE.*/
|
/* Connection failed, state reset to BLK_ACTIVE.*/
|
||||||
failed:
|
failed:
|
||||||
spiStop(mmcp->config->spip);
|
spiStop(mmcp->config->spip);
|
||||||
|
|
||||||
mmcp->state = BLK_ACTIVE;
|
mmcp->state = BLK_ACTIVE;
|
||||||
|
|
||||||
return HAL_FAILED;
|
return HAL_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -761,21 +770,26 @@ bool mmcDisconnect(MMCDriver *mmcp) {
|
||||||
osalDbgCheck(mmcp != NULL);
|
osalDbgCheck(mmcp != NULL);
|
||||||
|
|
||||||
osalSysLock();
|
osalSysLock();
|
||||||
|
|
||||||
osalDbgAssert((mmcp->state == BLK_ACTIVE) || (mmcp->state == BLK_READY),
|
osalDbgAssert((mmcp->state == BLK_ACTIVE) || (mmcp->state == BLK_READY),
|
||||||
"invalid state");
|
"invalid state");
|
||||||
|
|
||||||
if (mmcp->state == BLK_ACTIVE) {
|
if (mmcp->state == BLK_ACTIVE) {
|
||||||
osalSysUnlock();
|
osalSysUnlock();
|
||||||
return HAL_SUCCESS;
|
return HAL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
mmcp->state = BLK_DISCONNECTING;
|
mmcp->state = BLK_DISCONNECTING;
|
||||||
|
|
||||||
osalSysUnlock();
|
osalSysUnlock();
|
||||||
|
|
||||||
/* Wait for the pending write operations to complete.*/
|
/* Wait for the pending write operations to complete.*/
|
||||||
spiStart(mmcp->config->spip, mmcp->config->hscfg);
|
spiStart(mmcp->config->spip, mmcp->config->hscfg);
|
||||||
mmc_wait_sync(mmcp);
|
mmc_wait_sync(mmcp);
|
||||||
|
|
||||||
spiStop(mmcp->config->spip);
|
spiStop(mmcp->config->spip);
|
||||||
|
|
||||||
mmcp->state = BLK_ACTIVE;
|
mmcp->state = BLK_ACTIVE;
|
||||||
|
|
||||||
return HAL_SUCCESS;
|
return HAL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -793,6 +807,7 @@ bool mmcDisconnect(MMCDriver *mmcp) {
|
||||||
*/
|
*/
|
||||||
bool mmcStartSequentialRead(MMCDriver *mmcp, uint32_t startblk) {
|
bool mmcStartSequentialRead(MMCDriver *mmcp, uint32_t startblk) {
|
||||||
uint8_t r1;
|
uint8_t r1;
|
||||||
|
bool result;
|
||||||
|
|
||||||
osalDbgCheck(mmcp != NULL);
|
osalDbgCheck(mmcp != NULL);
|
||||||
osalDbgAssert(mmcp->state == BLK_READY, "invalid state");
|
osalDbgAssert(mmcp->state == BLK_READY, "invalid state");
|
||||||
|
@ -806,10 +821,14 @@ bool mmcStartSequentialRead(MMCDriver *mmcp, uint32_t startblk) {
|
||||||
spiSelect(mmcp->config->spip);
|
spiSelect(mmcp->config->spip);
|
||||||
|
|
||||||
if (mmcp->block_addresses) {
|
if (mmcp->block_addresses) {
|
||||||
(void) mmc_send_hdr(mmcp, MMCSD_CMD_READ_MULTIPLE_BLOCK, startblk); /* todo */
|
result = mmc_send_hdr(mmcp, MMCSD_CMD_READ_MULTIPLE_BLOCK, startblk);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
(void) mmc_send_hdr(mmcp, MMCSD_CMD_READ_MULTIPLE_BLOCK, startblk * MMCSD_BLOCK_SIZE); /* todo */
|
result = mmc_send_hdr(mmcp, MMCSD_CMD_READ_MULTIPLE_BLOCK,
|
||||||
|
startblk * MMCSD_BLOCK_SIZE);
|
||||||
|
}
|
||||||
|
if (result == HAL_FAILED) {
|
||||||
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mmc_recvr1(mmcp, &r1) == HAL_FAILED) ||
|
if ((mmc_recvr1(mmcp, &r1) == HAL_FAILED) ||
|
||||||
|
@ -821,7 +840,6 @@ bool mmcStartSequentialRead(MMCDriver *mmcp, uint32_t startblk) {
|
||||||
|
|
||||||
failed:
|
failed:
|
||||||
spiUnselect(mmcp->config->spip);
|
spiUnselect(mmcp->config->spip);
|
||||||
spiStop(mmcp->config->spip);
|
|
||||||
|
|
||||||
mmcp->state = BLK_READY;
|
mmcp->state = BLK_READY;
|
||||||
|
|
||||||
|
@ -861,7 +879,6 @@ bool mmcSequentialRead(MMCDriver *mmcp, uint8_t *buffer) {
|
||||||
|
|
||||||
/* Timeout.*/
|
/* Timeout.*/
|
||||||
spiUnselect(mmcp->config->spip);
|
spiUnselect(mmcp->config->spip);
|
||||||
spiStop(mmcp->config->spip);
|
|
||||||
|
|
||||||
mmcp->state = BLK_READY;
|
mmcp->state = BLK_READY;
|
||||||
|
|
||||||
|
@ -919,6 +936,7 @@ bool mmcStopSequentialRead(MMCDriver *mmcp) {
|
||||||
*/
|
*/
|
||||||
bool mmcStartSequentialWrite(MMCDriver *mmcp, uint32_t startblk) {
|
bool mmcStartSequentialWrite(MMCDriver *mmcp, uint32_t startblk) {
|
||||||
uint8_t r1;
|
uint8_t r1;
|
||||||
|
bool result;
|
||||||
|
|
||||||
osalDbgCheck(mmcp != NULL);
|
osalDbgCheck(mmcp != NULL);
|
||||||
osalDbgAssert(mmcp->state == BLK_READY, "invalid state");
|
osalDbgAssert(mmcp->state == BLK_READY, "invalid state");
|
||||||
|
@ -929,11 +947,14 @@ bool mmcStartSequentialWrite(MMCDriver *mmcp, uint32_t startblk) {
|
||||||
spiStart(mmcp->config->spip, mmcp->config->hscfg);
|
spiStart(mmcp->config->spip, mmcp->config->hscfg);
|
||||||
spiSelect(mmcp->config->spip);
|
spiSelect(mmcp->config->spip);
|
||||||
if (mmcp->block_addresses) {
|
if (mmcp->block_addresses) {
|
||||||
(void) mmc_send_hdr(mmcp, MMCSD_CMD_WRITE_MULTIPLE_BLOCK, startblk); /* todo */
|
result = mmc_send_hdr(mmcp, MMCSD_CMD_WRITE_MULTIPLE_BLOCK, startblk);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
(void) mmc_send_hdr(mmcp, MMCSD_CMD_WRITE_MULTIPLE_BLOCK,
|
result = mmc_send_hdr(mmcp, MMCSD_CMD_WRITE_MULTIPLE_BLOCK,
|
||||||
startblk * MMCSD_BLOCK_SIZE); /* todo */
|
startblk * MMCSD_BLOCK_SIZE);
|
||||||
|
}
|
||||||
|
if (result == HAL_FAILED) {
|
||||||
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mmc_recvr1(mmcp, &r1) != HAL_SUCCESS) ||
|
if ((mmc_recvr1(mmcp, &r1) != HAL_SUCCESS) ||
|
||||||
|
@ -945,7 +966,6 @@ bool mmcStartSequentialWrite(MMCDriver *mmcp, uint32_t startblk) {
|
||||||
|
|
||||||
failed:
|
failed:
|
||||||
spiUnselect(mmcp->config->spip);
|
spiUnselect(mmcp->config->spip);
|
||||||
spiStop(mmcp->config->spip);
|
|
||||||
|
|
||||||
mmcp->state = BLK_READY;
|
mmcp->state = BLK_READY;
|
||||||
|
|
||||||
|
@ -983,7 +1003,6 @@ bool mmcSequentialWrite(MMCDriver *mmcp, const uint8_t *buffer) {
|
||||||
|
|
||||||
/* Error.*/
|
/* Error.*/
|
||||||
spiUnselect(mmcp->config->spip);
|
spiUnselect(mmcp->config->spip);
|
||||||
spiStop(mmcp->config->spip);
|
|
||||||
|
|
||||||
mmcp->state = BLK_READY;
|
mmcp->state = BLK_READY;
|
||||||
|
|
||||||
|
@ -1046,6 +1065,7 @@ bool mmcSync(MMCDriver *mmcp) {
|
||||||
|
|
||||||
/* Synchronization operation finished.*/
|
/* Synchronization operation finished.*/
|
||||||
mmcp->state = BLK_READY;
|
mmcp->state = BLK_READY;
|
||||||
|
|
||||||
return HAL_SUCCESS;
|
return HAL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1126,7 +1146,6 @@ bool mmcErase(MMCDriver *mmcp, uint32_t startblk, uint32_t endblk) {
|
||||||
/* Command failed, state reset to BLK_READY.*/
|
/* Command failed, state reset to BLK_READY.*/
|
||||||
failed:
|
failed:
|
||||||
spiUnselect(mmcp->config->spip);
|
spiUnselect(mmcp->config->spip);
|
||||||
spiStop(mmcp->config->spip);
|
|
||||||
|
|
||||||
mmcp->state = BLK_READY;
|
mmcp->state = BLK_READY;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue