sdmmc_io: support to print CIS information

Currently only ESP slaves can be parsed correctly.
This commit is contained in:
Michael (XIAO Xufeng)
2019-07-12 13:20:04 +08:00
parent 53d1d211e7
commit b98b4c3886
4 changed files with 383 additions and 13 deletions

View File

@@ -25,6 +25,7 @@
#include "driver/sdmmc_host.h"
#include "driver/sdspi_host.h"
/*
* For SDIO master-slave board, we have 3 pins controlling power of 3 different
* slaves individially. We only enable one at a time.
@@ -134,6 +135,36 @@ static void gpio_d2_set_high()
}
#endif
static esp_err_t print_sdio_cis_information(sdmmc_card_t* card)
{
const size_t cis_buffer_size = 256;
uint8_t cis_buffer[cis_buffer_size];
size_t cis_data_len = 1024; //specify maximum searching range to avoid infinite loop
esp_err_t ret = ESP_OK;
ret = sdmmc_io_get_cis_data(card, cis_buffer, cis_buffer_size, &cis_data_len);
if (ret == ESP_ERR_INVALID_SIZE) {
int temp_buf_size = cis_data_len;
uint8_t* temp_buf = malloc(temp_buf_size);
assert(temp_buf);
ESP_LOGW(TAG, "CIS data longer than expected, temporary buffer allocated.");
ret = sdmmc_io_get_cis_data(card, temp_buf, temp_buf_size, &cis_data_len);
ESP_ERROR_CHECK(ret);
sdmmc_io_print_cis_info(temp_buf, cis_data_len, NULL);
free(temp_buf);
} else if (ret == ESP_OK) {
sdmmc_io_print_cis_info(cis_buffer, cis_data_len, NULL);
} else {
//including ESP_ERR_NOT_FOUND
ESP_LOGE(TAG, "failed to get the entire CIS data.");
abort();
}
return ESP_OK;
}
//host use this to initialize the slave card as well as SDIO registers
esp_err_t slave_init(esp_slave_context_t *context)
{
@@ -164,10 +195,10 @@ esp_err_t slave_init(esp_slave_context_t *context)
*/
//slot_config.flags = SDMMC_SLOT_FLAG_INTERNAL_PULLUP;
err = sdmmc_host_init();
assert(err==ESP_OK);
ESP_ERROR_CHECK(err);
err = sdmmc_host_init_slot(SDMMC_HOST_SLOT_1, &slot_config);
assert(err==ESP_OK);
ESP_ERROR_CHECK(err);
#else //over SPI
sdmmc_host_t config = SDSPI_HOST_DEFAULT();
@@ -179,12 +210,12 @@ esp_err_t slave_init(esp_slave_context_t *context)
slot_config.gpio_int = SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D1;
err = gpio_install_isr_service(0);
assert(err == ESP_OK);
ESP_ERROR_CHECK(err);
err = sdspi_host_init();
assert(err==ESP_OK);
ESP_ERROR_CHECK(err);
err = sdspi_host_init_slot(HSPI_HOST, &slot_config);
assert(err==ESP_OK);
ESP_ERROR_CHECK(err);
ESP_LOGI(TAG, "Probe using SPI...\n");
//we have to pull up all the slave pins even when the pin is not used
@@ -218,10 +249,14 @@ esp_err_t slave_init(esp_slave_context_t *context)
*context = ESP_SLAVE_DEFAULT_CONTEXT(card);
esp_err_t ret = esp_slave_init_io(context);
ESP_ERROR_CHECK(ret);
ret = print_sdio_cis_information(card);
ESP_ERROR_CHECK(ret);
return ret;
}
void slave_power_on()
{
#ifdef SLAVE_PWR_GPIO