]> granicus.if.org Git - esp-idf/commitdiff
fix(sdspi): fix issues causing the sdspi driver to work low efficiently with DMA.
authormichael <xiaoxufeng@espressif.com>
Tue, 19 Sep 2017 08:43:31 +0000 (16:43 +0800)
committermichael <xiaoxufeng@espressif.com>
Tue, 19 Sep 2017 11:00:47 +0000 (19:00 +0800)
components/driver/sdspi_host.c

index 11f702e52892ccf987f9212bbe99b3c644aad425..57cf3f99359d0a9b99f2c53266a9267858875950 100644 (file)
@@ -172,10 +172,11 @@ static void release_bus(int slot)
 /// Clock out 80 cycles (10 bytes) before GO_IDLE command\r
 static void go_idle_clockout(int slot)\r
 {\r
-    uint8_t data[10];\r
+    //actually we need 10, declare 12 to meet requirement of RXDMA\r
+    uint8_t data[12];\r
     memset(data, 0xff, sizeof(data));\r
     spi_transaction_t t = {\r
-        .length = sizeof(data) * 8,\r
+        .length = 10*8,\r
         .tx_buffer = data,\r
         .rx_buffer = data,\r
     };\r
@@ -428,22 +429,21 @@ static esp_err_t start_command_default(int slot, int flags, sdspi_hw_cmd_t *cmd)
 static esp_err_t poll_busy(int slot, spi_transaction_t* t)\r
 {\r
     uint8_t t_rx;\r
-    uint8_t rd_data;\r
     *t = (spi_transaction_t) {\r
         .tx_buffer = &t_rx,\r
-        .rx_buffer = &rd_data,\r
+        .flags = SPI_TRANS_USE_RXDATA,  //data stored in rx_data\r
         .length = 8,\r
     };\r
     esp_err_t ret;\r
 \r
     for (int i = 0; i < SDSPI_RETRY_COUNT; i++) {\r
         t_rx = SDSPI_MOSI_IDLE_VAL;\r
-        rd_data = 0;\r
+        t->rx_data[0] = 0;\r
         ret = spi_device_transmit(spi_handle(slot), t);\r
         if (ret != ESP_OK) {\r
             return ret;\r
         }\r
-        if (rd_data != 0) {\r
+        if (t->rx_data[0] != 0) {\r
             if (i < SDSPI_RETRY_COUNT - 2) {\r
                 i = SDSPI_RETRY_COUNT - 2;\r
             }\r
@@ -456,28 +456,27 @@ static esp_err_t poll_busy(int slot, spi_transaction_t* t)
 static esp_err_t poll_response_token(int slot, spi_transaction_t* t)\r
 {\r
     uint8_t t_rx;\r
-    uint8_t rd_data;\r
     *t = (spi_transaction_t) {\r
         .tx_buffer = &t_rx,\r
-        .rx_buffer = &rd_data,\r
+        .flags = SPI_TRANS_USE_RXDATA,\r
         .length = 8,\r
     };\r
     esp_err_t ret;\r
 \r
     for (int retry = 0; retry < SDSPI_RETRY_COUNT; retry++) {\r
         t_rx = SDSPI_MOSI_IDLE_VAL;\r
-        rd_data = 0;\r
+        t->rx_data[0] = 0;\r
         ret = spi_device_transmit(spi_handle(slot), t);\r
         if (ret != ESP_OK) {\r
             return ret;\r
         }\r
-        if ((rd_data & TOKEN_RSP_MASK) == TOKEN_RSP_OK) {\r
+        if ((t->rx_data[0] & TOKEN_RSP_MASK) == TOKEN_RSP_OK) {\r
             break;\r
         }\r
-        if ((rd_data & TOKEN_RSP_MASK) == TOKEN_RSP_CRC_ERR) {\r
+        if ((t->rx_data[0] & TOKEN_RSP_MASK) == TOKEN_RSP_CRC_ERR) {\r
             return ESP_ERR_INVALID_CRC;\r
         }\r
-        if ((rd_data & TOKEN_RSP_MASK) == TOKEN_RSP_WRITE_ERR) {\r
+        if ((t->rx_data[0] & TOKEN_RSP_MASK) == TOKEN_RSP_WRITE_ERR) {\r
             return ESP_ERR_INVALID_RESPONSE;\r
         }\r
         if (retry == SDSPI_RETRY_COUNT - 1) {\r