esp_err_t spi_init(spi_host_t host, spi_config_t *config) { SPI_CHECK(host < SPI_NUM_MAX, "host num error", ESP_ERR_INVALID_ARG); SPI_CHECK(host > CSPI_HOST, "CSPI_HOST can't support now", ESP_FAIL); SPI_CHECK(NULL == spi_object[host], "spi has been initialized", ESP_FAIL); spi_object[host] = (spi_object_t *)malloc(sizeof(spi_object_t)); SPI_CHECK(spi_object[host], "malloc fail", ESP_ERR_NO_MEM); spi_object[host]->trans_mux = xSemaphoreCreateMutex(); if (NULL == spi_object[host]->trans_mux) { spi_deinit(host); SPI_CHECK(false, "Semaphore create fail", ESP_ERR_NO_MEM); } uint16_t dummy_bitlen = 0; spi_set_event_callback(host, &config->event_cb); spi_set_mode(host, &config->mode); spi_set_interface(host, &config->interface); spi_set_clk_div(host, &config->clk_div); spi_set_dummy(host, &dummy_bitlen); spi_set_intr_enable(host, &config->intr_enable); spi_intr_register(spi_intr, NULL); spi_intr_enable(); if (spi_object[host]->event_cb) { spi_object[host]->event_cb(SPI_INIT_EVENT, NULL); } return ESP_OK; }
int spi_init(void) { LOG(DEBUG, "spi_nrefs=%d, spi_dev_open=%d", spi_nrefs, spi_dev_open); spi_nrefs++; if (spi_nrefs > 1) { LOG(WARN, "Superfluos call to spi_init()"); return 0; } LOG(ALL, "csr-spi-ftdi " VERSION ", git rev " GIT_REVISION "\n"); if (ftdi_init(&ftdic) < 0) { SPI_ERR("FTDI: init failed"); spi_nrefs = 0; return -1; } if (spi_enumerate_ports() < 0) { spi_deinit(); return -1; } return 0; }