altos: Shorten SD initialization timeouts.
[fw/altos] / src / drivers / ao_sdcard.c
index 6073677a96745ddfbc69a37976e72e9c76a5edd2..6314a30c95f876ce4a196208693b59261cc1b25f 100644 (file)
 #include "ao.h"
 #include "ao_sdcard.h"
 
-#define ao_sdcard_get_slow()           ao_spi_get(AO_SDCARD_SPI_BUS, AO_SPI_SPEED_250kHz)
-#define ao_sdcard_get()                        ao_spi_get(AO_SDCARD_SPI_BUS, AO_SPI_SPEED_FAST)
-#define ao_sdcard_put()                        ao_spi_put(AO_SDCARD_SPI_BUS)
+extern uint8_t ao_radio_mutex;
+
+#define ao_sdcard_get_slow() do { ao_mutex_get(&ao_radio_mutex); ao_spi_get(AO_SDCARD_SPI_BUS, AO_SPI_SPEED_250kHz); } while (0)
+#define ao_sdcard_get()        do { ao_mutex_get(&ao_radio_mutex); ao_spi_get(AO_SDCARD_SPI_BUS, AO_SPI_SPEED_FAST); } while (0)
+#define ao_sdcard_put() do { ao_spi_put(AO_SDCARD_SPI_BUS); ao_mutex_put(&ao_radio_mutex); } while (0)
 #define ao_sdcard_send_fixed(d,l)      ao_spi_send_fixed((d), (l), AO_SDCARD_SPI_BUS)
 #define ao_sdcard_send(d,l)            ao_spi_send((d), (l), AO_SDCARD_SPI_BUS)
 #define ao_sdcard_recv(d,l)            ao_spi_recv((d), (l), AO_SDCARD_SPI_BUS)
@@ -28,7 +30,7 @@
 #define ao_sdcard_deselect()           ao_gpio_set(AO_SDCARD_SPI_CS_PORT,AO_SDCARD_SPI_CS_PIN,AO_SDCARD_SPI_CS,1)
 
 /* Include SD card commands */
-#define SDCARD_DEBUG   1
+#define SDCARD_DEBUG   0
 
 /* Spew SD tracing */
 #define SDCARD_TRACE   0
@@ -324,11 +326,11 @@ ao_sdcard_setup(void)
        ao_sdcard_send_fixed(0xff, 10);
 
        /* Reset the card and get it into SPI mode */
-       for (i = 0; i < SDCARD_IDLE_WAIT; i++) {
+       for (i = 0; i < SDCARD_IDLE_RETRY; i++) {
                if (ao_sdcard_go_idle_state() == SDCARD_STATUS_IDLE_STATE)
                        break;
        }
-       if (i == SDCARD_IDLE_WAIT)
+       if (i == SDCARD_IDLE_RETRY)
                goto bail;
 
        /* Figure out what kind of card we have */
@@ -344,14 +346,14 @@ ao_sdcard_setup(void)
                        sdver2 = 1;
                }
 
-               for (i = 0; i < SDCARD_IDLE_WAIT; i++) {
+               for (i = 0; i < SDCARD_IDLE_RETRY; i++) {
                        ret = ao_sdcard_app_send_op_cond(arg);
                        if (ret != SDCARD_STATUS_IDLE_STATE)
                                break;
                }
                if (ret != SDCARD_STATUS_READY_STATE) {
                        /* MMC */
-                       for (i = 0; i < SDCARD_IDLE_WAIT; i++) {
+                       for (i = 0; i < SDCARD_IDLE_RETRY; i++) {
                                ret = ao_sdcard_send_op_cond();
                                if (ret != SDCARD_STATUS_IDLE_STATE)
                                        break;
@@ -394,11 +396,11 @@ _ao_sdcard_reset(void)
        uint8_t ret;
        uint8_t response[10];
 
-       for (i = 0; i < SDCARD_IDLE_WAIT; i++) {
+       for (i = 0; i < SDCARD_IDLE_RETRY; i++) {
                if (ao_sdcard_go_idle_state() == SDCARD_STATUS_IDLE_STATE)
                        break;
        }
-       if (i == SDCARD_IDLE_WAIT) {
+       if (i == SDCARD_IDLE_RETRY) {
                ret = 0x3f;
                goto bail;
        }
@@ -416,7 +418,7 @@ _ao_sdcard_reset(void)
                        sdver2 = 1;
                }
 
-               for (i = 0; i < SDCARD_IDLE_WAIT; i++) {
+               for (i = 0; i < SDCARD_IDLE_RETRY; i++) {
                        ret = ao_sdcard_app_send_op_cond(arg);
                        if (ret != SDCARD_STATUS_IDLE_STATE)
                                break;
@@ -424,7 +426,7 @@ _ao_sdcard_reset(void)
 
                if (ret != SDCARD_STATUS_READY_STATE) {
                        /* MMC */
-                       for (i = 0; i < SDCARD_IDLE_WAIT; i++) {
+                       for (i = 0; i < SDCARD_IDLE_RETRY; i++) {
                                ret = ao_sdcard_send_op_cond();
                                if (ret != SDCARD_STATUS_IDLE_STATE)
                                        break;
@@ -686,6 +688,9 @@ static const struct ao_cmds ao_sdcard_cmds[] = {
 void
 ao_sdcard_init(void)
 {
+       stm_pupdr_set(AO_SDCARD_SPI_PORT, AO_SDCARD_SPI_SCK_PIN, STM_PUPDR_PULL_UP);
+       stm_pupdr_set(AO_SDCARD_SPI_PORT, AO_SDCARD_SPI_MISO_PIN, STM_PUPDR_PULL_UP);
+       stm_pupdr_set(AO_SDCARD_SPI_PORT, AO_SDCARD_SPI_MOSI_PIN, STM_PUPDR_PULL_UP);
        ao_spi_init_cs(AO_SDCARD_SPI_CS_PORT, (1 << AO_SDCARD_SPI_CS_PIN));
 #if SDCARD_DEBUG
        ao_cmd_register(&ao_sdcard_cmds[0]);