]> granicus.if.org Git - esp-idf/commitdiff
refactor(spi): move pin information into soc folder
authorMichael (XIAO Xufeng) <xiaoxufeng@espressif.com>
Fri, 8 Jun 2018 07:32:43 +0000 (15:32 +0800)
committerMichael (XIAO Xufeng) <xiaoxufeng@espressif.com>
Thu, 14 Jun 2018 03:29:15 +0000 (11:29 +0800)
12 files changed:
components/driver/include/driver/periph_ctrl.h
components/driver/include/driver/spi_common.h
components/driver/include/driver/spi_slave.h
components/driver/spi_common.c
components/driver/spi_master.c
components/driver/spi_slave.c
components/driver/test/test_spi_master.c
components/esp32/test/test_intr_alloc.c
components/soc/esp32/include/soc/periph_defs.h [new file with mode: 0644]
components/soc/esp32/include/soc/spi_pins.h [moved from components/soc/esp32/include/driver/spi_pins.h with 76% similarity]
components/soc/esp32/spi_periph.c [new file with mode: 0644]
components/soc/include/soc/spi_periph.h [new file with mode: 0644]

index 82a328d6790745d1a17709d0b2151f32539e8ae8..9689a8cb21c913dcd8a8fa6d1565b663a1c9097c 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
+// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 
 #ifndef _DRIVER_PERIPH_CTRL_H_
 #define _DRIVER_PERIPH_CTRL_H_
+
 #include "esp_err.h"
 #include "soc/soc.h"
 #include "soc/dport_reg.h"
+#include "soc/periph_defs.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-typedef enum {
-    PERIPH_LEDC_MODULE = 0,
-    PERIPH_UART0_MODULE,
-    PERIPH_UART1_MODULE,
-    PERIPH_UART2_MODULE,
-    PERIPH_I2C0_MODULE,
-    PERIPH_I2C1_MODULE,
-    PERIPH_I2S0_MODULE,
-    PERIPH_I2S1_MODULE,
-    PERIPH_TIMG0_MODULE,
-    PERIPH_TIMG1_MODULE,
-    PERIPH_PWM0_MODULE,
-    PERIPH_PWM1_MODULE,
-    PERIPH_PWM2_MODULE,
-    PERIPH_PWM3_MODULE,
-    PERIPH_UHCI0_MODULE,
-    PERIPH_UHCI1_MODULE,
-    PERIPH_RMT_MODULE,
-    PERIPH_PCNT_MODULE,
-    PERIPH_SPI_MODULE,
-    PERIPH_HSPI_MODULE,
-    PERIPH_VSPI_MODULE,
-    PERIPH_SPI_DMA_MODULE,
-    PERIPH_SDMMC_MODULE,
-    PERIPH_SDIO_SLAVE_MODULE,
-    PERIPH_CAN_MODULE,
-    PERIPH_EMAC_MODULE,
-    PERIPH_RNG_MODULE,
-    PERIPH_WIFI_MODULE,
-    PERIPH_BT_MODULE,
-    PERIPH_WIFI_BT_COMMON_MODULE,
-    PERIPH_BT_BASEBAND_MODULE,
-    PERIPH_BT_LC_MODULE,
-} periph_module_t;
-
 /**
  * @brief      enable peripheral module
  *
index d81a9430b74c387dfdf328db23e80fca32d8de28..33c701ec5761962a0a4918ed9e4226aeb243ebad 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2010-2017 Espressif Systems (Shanghai) PTE LTD
+// Copyright 2010-2018 Espressif Systems (Shanghai) PTE LTD
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -19,9 +19,8 @@
 #include <stdint.h>
 #include <stdbool.h>
 #include "esp_err.h"
-#include "soc/spi_struct.h"
 #include "rom/lldesc.h"
-
+#include "soc/spi_periph.h"
 
 #ifdef __cplusplus
 extern "C"
index 1d5ea340292f0c66e415927ee0a013f661e1f964..9ad4b9126d42647062d48abc2af27f9ad67d06df 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2010-2017 Espressif Systems (Shanghai) PTE LTD
+// Copyright 2010-2018 Espressif Systems (Shanghai) PTE LTD
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
index a605f144ccf0525099aef6e43aadb6743ad63617..1eb1ebef834ea67e89a0b5044f7b20f225ab67e0 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
+// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 
 #include <string.h>
 #include "driver/spi_master.h"
-#include "soc/gpio_sig_map.h"
-#include "soc/spi_reg.h"
 #include "soc/dport_reg.h"
-#include "soc/spi_struct.h"
+#include "soc/spi_periph.h"
 #include "rom/ets_sys.h"
 #include "esp_types.h"
 #include "esp_attr.h"
@@ -32,7 +30,6 @@
 #include "driver/gpio.h"
 #include "driver/periph_ctrl.h"
 #include "esp_heap_caps.h"
-
 #include "driver/spi_common.h"
 
 static const char *SPI_TAG = "spi";
@@ -49,109 +46,6 @@ typedef struct spi_device_t spi_device_t;
 #define FUNC_SPI    1   //all pins of HSPI and VSPI shares this function number
 #define FUNC_GPIO   PIN_FUNC_GPIO
 
-/*
- Stores a bunch of per-spi-peripheral data.
-*/
-typedef struct {
-    const uint8_t spiclk_out;       //GPIO mux output signals
-    const uint8_t spiclk_in;
-    const uint8_t spid_out;
-    const uint8_t spiq_out;
-    const uint8_t spiwp_out;
-    const uint8_t spihd_out;
-    const uint8_t spid_in;          //GPIO mux input signals
-    const uint8_t spiq_in;
-    const uint8_t spiwp_in;
-    const uint8_t spihd_in;
-    const uint8_t spics_out[3];     // /CS GPIO output mux signals
-    const uint8_t spics_in;
-    const uint8_t spiclk_iomux_pin;    //IO pins of IO_MUX muxed signals
-    const uint8_t spid_iomux_pin;
-    const uint8_t spiq_iomux_pin;
-    const uint8_t spiwp_iomux_pin;
-    const uint8_t spihd_iomux_pin;
-    const uint8_t spics0_iomux_pin;
-    const uint8_t irq;              //irq source for interrupt mux
-    const uint8_t irq_dma;          //dma irq source for interrupt mux
-    const periph_module_t module;   //peripheral module, for enabling clock etc
-    spi_dev_t *hw;              //Pointer to the hardware registers
-} spi_signal_conn_t;
-
-/*
- Bunch of constants for every SPI peripheral: GPIO signals, irqs, hw addr of registers etc
-*/
-static const spi_signal_conn_t io_signal[3] = {
-    {
-        .spiclk_out = SPICLK_OUT_IDX,
-        .spiclk_in = SPICLK_IN_IDX,
-        .spid_out = SPID_OUT_IDX,
-        .spiq_out = SPIQ_OUT_IDX,
-        .spiwp_out = SPIWP_OUT_IDX,
-        .spihd_out = SPIHD_OUT_IDX,
-        .spid_in = SPID_IN_IDX,
-        .spiq_in = SPIQ_IN_IDX,
-        .spiwp_in = SPIWP_IN_IDX,
-        .spihd_in = SPIHD_IN_IDX,
-        .spics_out = {SPICS0_OUT_IDX, SPICS1_OUT_IDX, SPICS2_OUT_IDX},
-        .spics_in = SPICS0_IN_IDX,
-        .spiclk_iomux_pin = 6,
-        .spid_iomux_pin = 8,
-        .spiq_iomux_pin = 7,
-        .spiwp_iomux_pin = 10,
-        .spihd_iomux_pin = 9,
-        .spics0_iomux_pin = 11,
-        .irq = ETS_SPI1_INTR_SOURCE,
-        .irq_dma = ETS_SPI1_DMA_INTR_SOURCE,
-        .module = PERIPH_SPI_MODULE,
-        .hw = &SPI1
-    }, {
-        .spiclk_out = HSPICLK_OUT_IDX,
-        .spiclk_in = HSPICLK_IN_IDX,
-        .spid_out = HSPID_OUT_IDX,
-        .spiq_out = HSPIQ_OUT_IDX,
-        .spiwp_out = HSPIWP_OUT_IDX,
-        .spihd_out = HSPIHD_OUT_IDX,
-        .spid_in = HSPID_IN_IDX,
-        .spiq_in = HSPIQ_IN_IDX,
-        .spiwp_in = HSPIWP_IN_IDX,
-        .spihd_in = HSPIHD_IN_IDX,
-        .spics_out = {HSPICS0_OUT_IDX, HSPICS1_OUT_IDX, HSPICS2_OUT_IDX},
-        .spics_in = HSPICS0_IN_IDX,
-        .spiclk_iomux_pin = 14,
-        .spid_iomux_pin = 13,
-        .spiq_iomux_pin = 12,
-        .spiwp_iomux_pin = 2,
-        .spihd_iomux_pin = 4,
-        .spics0_iomux_pin = 15,
-        .irq = ETS_SPI2_INTR_SOURCE,
-        .irq_dma = ETS_SPI2_DMA_INTR_SOURCE,
-        .module = PERIPH_HSPI_MODULE,
-        .hw = &SPI2
-    }, {
-        .spiclk_out = VSPICLK_OUT_IDX,
-        .spiclk_in = VSPICLK_IN_IDX,
-        .spid_out = VSPID_OUT_IDX,
-        .spiq_out = VSPIQ_OUT_IDX,
-        .spiwp_out = VSPIWP_OUT_IDX,
-        .spihd_out = VSPIHD_OUT_IDX,
-        .spid_in = VSPID_IN_IDX,
-        .spiq_in = VSPIQ_IN_IDX,
-        .spiwp_in = VSPIWP_IN_IDX,
-        .spihd_in = VSPIHD_IN_IDX,
-        .spics_out = {VSPICS0_OUT_IDX, VSPICS1_OUT_IDX, VSPICS2_OUT_IDX},
-        .spics_in = VSPICS0_IN_IDX,
-        .spiclk_iomux_pin = 18,
-        .spid_iomux_pin = 23,
-        .spiq_iomux_pin = 19,
-        .spiwp_iomux_pin = 22,
-        .spihd_iomux_pin = 21,
-        .spics0_iomux_pin = 5,
-        .irq = ETS_SPI3_INTR_SOURCE,
-        .irq_dma = ETS_SPI3_DMA_INTR_SOURCE,
-        .module = PERIPH_VSPI_MODULE,
-        .hw = &SPI3
-    }
-};
 
 #define DMA_CHANNEL_ENABLED(dma_chan)    (BIT(dma_chan-1))
 
@@ -165,7 +59,7 @@ static portMUX_TYPE spi_dma_spinlock = portMUX_INITIALIZER_UNLOCKED;
 bool spicommon_periph_claim(spi_host_device_t host)
 {
     bool ret = __sync_bool_compare_and_swap(&spi_periph_claimed[host], false, true);
-    if (ret) periph_module_enable(io_signal[host].module);
+    if (ret) periph_module_enable(spi_periph_signal[host].module);
     return ret;
 }
 
@@ -173,19 +67,19 @@ bool spicommon_periph_claim(spi_host_device_t host)
 bool spicommon_periph_free(spi_host_device_t host)
 {
     bool ret = __sync_bool_compare_and_swap(&spi_periph_claimed[host], true, false);
-    if (ret) periph_module_disable(io_signal[host].module);
+    if (ret) periph_module_disable(spi_periph_signal[host].module);
     return ret;
 }
 
 
 int spicommon_irqsource_for_host(spi_host_device_t host)
 {
-    return io_signal[host].irq;
+    return spi_periph_signal[host].irq;
 }
 
 spi_dev_t *spicommon_hw_for_host(spi_host_device_t host)
 {
-    return io_signal[host].hw;
+    return spi_periph_signal[host].hw;
 }
 
 bool spicommon_dma_chan_claim (int dma_chan)
@@ -240,20 +134,20 @@ esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_conf
     if (bus_config->sclk_io_num>=0) {
         temp_flag |= SPICOMMON_BUSFLAG_SCLK;
         SPI_CHECK(GPIO_IS_VALID_OUTPUT_GPIO(bus_config->sclk_io_num), "sclk not valid", ESP_ERR_INVALID_ARG);
-        if (bus_config->sclk_io_num != io_signal[host].spiclk_iomux_pin) use_iomux = false;
+        if (bus_config->sclk_io_num != spi_periph_signal[host].spiclk_iomux_pin) use_iomux = false;
     } else {
         SPI_CHECK((flags&SPICOMMON_BUSFLAG_SCLK)==0, "sclk pin required.", ESP_ERR_INVALID_ARG);
     }
     if (bus_config->quadwp_io_num>=0) {
         SPI_CHECK(GPIO_IS_VALID_OUTPUT_GPIO(bus_config->quadwp_io_num), "spiwp not valid", ESP_ERR_INVALID_ARG);
-        if (bus_config->quadwp_io_num != io_signal[host].spiwp_iomux_pin) use_iomux = false;
+        if (bus_config->quadwp_io_num != spi_periph_signal[host].spiwp_iomux_pin) use_iomux = false;
     } else {
         quad_pins_exist = false;
         SPI_CHECK((flags&SPICOMMON_BUSFLAG_WPHD)==0, "spiwp pin required.", ESP_ERR_INVALID_ARG);
     }
     if (bus_config->quadhd_io_num>=0) {
         SPI_CHECK(GPIO_IS_VALID_OUTPUT_GPIO(bus_config->quadhd_io_num), "spihd not valid", ESP_ERR_INVALID_ARG);
-        if (bus_config->quadhd_io_num != io_signal[host].spihd_iomux_pin) use_iomux = false;
+        if (bus_config->quadhd_io_num != spi_periph_signal[host].spihd_iomux_pin) use_iomux = false;
     } else {
         quad_pins_exist = false;
         SPI_CHECK((flags&SPICOMMON_BUSFLAG_WPHD)==0, "spihd pin required.", ESP_ERR_INVALID_ARG);
@@ -265,7 +159,7 @@ esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_conf
         } else {
             SPI_CHECK(GPIO_IS_VALID_GPIO(bus_config->mosi_io_num), "mosi not valid", ESP_ERR_INVALID_ARG);
         }
-        if (bus_config->mosi_io_num != io_signal[host].spid_iomux_pin) use_iomux = false;
+        if (bus_config->mosi_io_num != spi_periph_signal[host].spid_iomux_pin) use_iomux = false;
     } else {
         SPI_CHECK((flags&SPICOMMON_BUSFLAG_MOSI)==0, "mosi pin required.", ESP_ERR_INVALID_ARG);
     }
@@ -276,7 +170,7 @@ esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_conf
         } else {
             SPI_CHECK(GPIO_IS_VALID_GPIO(bus_config->miso_io_num), "miso not valid", ESP_ERR_INVALID_ARG);
         }
-        if (bus_config->miso_io_num != io_signal[host].spiq_iomux_pin) use_iomux = false;
+        if (bus_config->miso_io_num != spi_periph_signal[host].spiq_iomux_pin) use_iomux = false;
     } else {
         SPI_CHECK((flags&SPICOMMON_BUSFLAG_MISO)==0, "miso pin required.", ESP_ERR_INVALID_ARG);
     }
@@ -295,23 +189,23 @@ esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_conf
         //out which FUNC_GPIOx_xSPIxx to grab; they all are defined to 1 anyway.
         ESP_LOGD(SPI_TAG, "SPI%d use iomux pins.", host );
         if (bus_config->mosi_io_num >= 0) {
-            gpio_iomux_in(bus_config->mosi_io_num, io_signal[host].spid_in);
+            gpio_iomux_in(bus_config->mosi_io_num, spi_periph_signal[host].spid_in);
             gpio_iomux_out(bus_config->mosi_io_num, FUNC_SPI, false);
         }
         if (bus_config->miso_io_num >= 0) {
-            gpio_iomux_in(bus_config->miso_io_num, io_signal[host].spiq_in);
+            gpio_iomux_in(bus_config->miso_io_num, spi_periph_signal[host].spiq_in);
             gpio_iomux_out(bus_config->miso_io_num, FUNC_SPI, false);
         }
         if (bus_config->quadwp_io_num >= 0) {
-            gpio_iomux_in(bus_config->quadwp_io_num, io_signal[host].spiwp_in);
+            gpio_iomux_in(bus_config->quadwp_io_num, spi_periph_signal[host].spiwp_in);
             gpio_iomux_out(bus_config->quadwp_io_num, FUNC_SPI, false);
         }
         if (bus_config->quadhd_io_num >= 0) {
-            gpio_iomux_in(bus_config->quadhd_io_num, io_signal[host].spihd_in);
+            gpio_iomux_in(bus_config->quadhd_io_num, spi_periph_signal[host].spihd_in);
             gpio_iomux_out(bus_config->quadhd_io_num, FUNC_SPI, false);
         }
         if (bus_config->sclk_io_num >= 0) {
-            gpio_iomux_in(bus_config->sclk_io_num, io_signal[host].spiclk_in);
+            gpio_iomux_in(bus_config->sclk_io_num, spi_periph_signal[host].spiclk_in);
             gpio_iomux_out(bus_config->sclk_io_num, FUNC_SPI, false);
         }
         temp_flag |= SPICOMMON_BUSFLAG_NATIVE_PINS;
@@ -322,39 +216,39 @@ esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_conf
             PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->mosi_io_num], FUNC_GPIO);
             if (mosi_output || (temp_flag&SPICOMMON_BUSFLAG_DUAL)) {
                 gpio_set_direction(bus_config->mosi_io_num, GPIO_MODE_INPUT_OUTPUT);
-                gpio_matrix_out(bus_config->mosi_io_num, io_signal[host].spid_out, false, false);
+                gpio_matrix_out(bus_config->mosi_io_num, spi_periph_signal[host].spid_out, false, false);
             } else {
                 gpio_set_direction(bus_config->mosi_io_num, GPIO_MODE_INPUT);
             }
-            gpio_matrix_in(bus_config->mosi_io_num, io_signal[host].spid_in, false);
+            gpio_matrix_in(bus_config->mosi_io_num, spi_periph_signal[host].spid_in, false);
         }
         if (bus_config->miso_io_num >= 0) {
             PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->miso_io_num], FUNC_GPIO);
             if (miso_output || (temp_flag&SPICOMMON_BUSFLAG_DUAL)) {
                 gpio_set_direction(bus_config->miso_io_num, GPIO_MODE_INPUT_OUTPUT);
-                gpio_matrix_out(bus_config->miso_io_num, io_signal[host].spiq_out, false, false);
+                gpio_matrix_out(bus_config->miso_io_num, spi_periph_signal[host].spiq_out, false, false);
             } else {
                 gpio_set_direction(bus_config->miso_io_num, GPIO_MODE_INPUT);
             }
-            gpio_matrix_in(bus_config->miso_io_num, io_signal[host].spiq_in, false);
+            gpio_matrix_in(bus_config->miso_io_num, spi_periph_signal[host].spiq_in, false);
         }
         if (bus_config->quadwp_io_num >= 0) {
             PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->quadwp_io_num], FUNC_GPIO);
             gpio_set_direction(bus_config->quadwp_io_num, GPIO_MODE_INPUT_OUTPUT);
-            gpio_matrix_out(bus_config->quadwp_io_num, io_signal[host].spiwp_out, false, false);
-            gpio_matrix_in(bus_config->quadwp_io_num, io_signal[host].spiwp_in, false);
+            gpio_matrix_out(bus_config->quadwp_io_num, spi_periph_signal[host].spiwp_out, false, false);
+            gpio_matrix_in(bus_config->quadwp_io_num, spi_periph_signal[host].spiwp_in, false);
         }
         if (bus_config->quadhd_io_num >= 0) {
             PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->quadhd_io_num], FUNC_GPIO);
             gpio_set_direction(bus_config->quadhd_io_num, GPIO_MODE_INPUT_OUTPUT);
-            gpio_matrix_out(bus_config->quadhd_io_num, io_signal[host].spihd_out, false, false);
-            gpio_matrix_in(bus_config->quadhd_io_num, io_signal[host].spihd_in, false);
+            gpio_matrix_out(bus_config->quadhd_io_num, spi_periph_signal[host].spihd_out, false, false);
+            gpio_matrix_in(bus_config->quadhd_io_num, spi_periph_signal[host].spihd_in, false);
         }
         if (bus_config->sclk_io_num >= 0) {
             PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->sclk_io_num], FUNC_GPIO);
             gpio_set_direction(bus_config->sclk_io_num, GPIO_MODE_INPUT_OUTPUT);
-            gpio_matrix_out(bus_config->sclk_io_num, io_signal[host].spiclk_out, false, false);
-            gpio_matrix_in(bus_config->sclk_io_num, io_signal[host].spiclk_in, false);
+            gpio_matrix_out(bus_config->sclk_io_num, spi_periph_signal[host].spiclk_out, false, false);
+            gpio_matrix_in(bus_config->sclk_io_num, spi_periph_signal[host].spiclk_in, false);
         }
     }
 
@@ -378,39 +272,39 @@ static void reset_func_to_gpio(int func)
 
 esp_err_t spicommon_bus_free_io(spi_host_device_t host)
 {
-    if (REG_GET_FIELD(GPIO_PIN_MUX_REG[io_signal[host].spid_iomux_pin], MCU_SEL) == 1) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[io_signal[host].spid_iomux_pin], PIN_FUNC_GPIO);
-    if (REG_GET_FIELD(GPIO_PIN_MUX_REG[io_signal[host].spiq_iomux_pin], MCU_SEL) == 1) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[io_signal[host].spiq_iomux_pin], PIN_FUNC_GPIO);
-    if (REG_GET_FIELD(GPIO_PIN_MUX_REG[io_signal[host].spiclk_iomux_pin], MCU_SEL) == 1) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[io_signal[host].spiclk_iomux_pin], PIN_FUNC_GPIO);
-    if (REG_GET_FIELD(GPIO_PIN_MUX_REG[io_signal[host].spiwp_iomux_pin], MCU_SEL) == 1) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[io_signal[host].spiwp_iomux_pin], PIN_FUNC_GPIO);
-    if (REG_GET_FIELD(GPIO_PIN_MUX_REG[io_signal[host].spihd_iomux_pin], MCU_SEL) == 1) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[io_signal[host].spihd_iomux_pin], PIN_FUNC_GPIO);
-    reset_func_to_gpio(io_signal[host].spid_out);
-    reset_func_to_gpio(io_signal[host].spiq_out);
-    reset_func_to_gpio(io_signal[host].spiclk_out);
-    reset_func_to_gpio(io_signal[host].spiwp_out);
-    reset_func_to_gpio(io_signal[host].spihd_out);
+    if (REG_GET_FIELD(GPIO_PIN_MUX_REG[spi_periph_signal[host].spid_iomux_pin], MCU_SEL) == 1) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[spi_periph_signal[host].spid_iomux_pin], PIN_FUNC_GPIO);
+    if (REG_GET_FIELD(GPIO_PIN_MUX_REG[spi_periph_signal[host].spiq_iomux_pin], MCU_SEL) == 1) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[spi_periph_signal[host].spiq_iomux_pin], PIN_FUNC_GPIO);
+    if (REG_GET_FIELD(GPIO_PIN_MUX_REG[spi_periph_signal[host].spiclk_iomux_pin], MCU_SEL) == 1) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[spi_periph_signal[host].spiclk_iomux_pin], PIN_FUNC_GPIO);
+    if (REG_GET_FIELD(GPIO_PIN_MUX_REG[spi_periph_signal[host].spiwp_iomux_pin], MCU_SEL) == 1) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[spi_periph_signal[host].spiwp_iomux_pin], PIN_FUNC_GPIO);
+    if (REG_GET_FIELD(GPIO_PIN_MUX_REG[spi_periph_signal[host].spihd_iomux_pin], MCU_SEL) == 1) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[spi_periph_signal[host].spihd_iomux_pin], PIN_FUNC_GPIO);
+    reset_func_to_gpio(spi_periph_signal[host].spid_out);
+    reset_func_to_gpio(spi_periph_signal[host].spiq_out);
+    reset_func_to_gpio(spi_periph_signal[host].spiclk_out);
+    reset_func_to_gpio(spi_periph_signal[host].spiwp_out);
+    reset_func_to_gpio(spi_periph_signal[host].spihd_out);
     return ESP_OK;
 }
 
 void spicommon_cs_initialize(spi_host_device_t host, int cs_io_num, int cs_num, int force_gpio_matrix)
 {
-    if (!force_gpio_matrix && cs_io_num == io_signal[host].spics0_iomux_pin && cs_num == 0) {
+    if (!force_gpio_matrix && cs_io_num == spi_periph_signal[host].spics0_iomux_pin && cs_num == 0) {
         //The cs0s for all SPI peripherals map to pin mux source 1, so we use that instead of a define.
-        gpio_iomux_in(cs_io_num, io_signal[host].spics_in);
+        gpio_iomux_in(cs_io_num, spi_periph_signal[host].spics_in);
         gpio_iomux_out(cs_io_num, FUNC_SPI, false);
     } else {
         //Use GPIO matrix
         PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[cs_io_num], FUNC_GPIO);
-        gpio_matrix_out(cs_io_num, io_signal[host].spics_out[cs_num], false, false);
-        if (cs_num == 0) gpio_matrix_in(cs_io_num, io_signal[host].spics_in, false);
+        gpio_matrix_out(cs_io_num, spi_periph_signal[host].spics_out[cs_num], false, false);
+        if (cs_num == 0) gpio_matrix_in(cs_io_num, spi_periph_signal[host].spics_in, false);
     }
 }
 
 void spicommon_cs_free(spi_host_device_t host, int cs_io_num)
 {
-    if (cs_io_num == 0 && REG_GET_FIELD(GPIO_PIN_MUX_REG[io_signal[host].spics0_iomux_pin], MCU_SEL) == 1) {
-        PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[io_signal[host].spics0_iomux_pin], PIN_FUNC_GPIO);
+    if (cs_io_num == 0 && REG_GET_FIELD(GPIO_PIN_MUX_REG[spi_periph_signal[host].spics0_iomux_pin], MCU_SEL) == 1) {
+        PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[spi_periph_signal[host].spics0_iomux_pin], PIN_FUNC_GPIO);
     }
-    reset_func_to_gpio(io_signal[host].spics_out[cs_io_num]);
+    reset_func_to_gpio(spi_periph_signal[host].spics_out[cs_io_num]);
 }
 
 //Set up a list of dma descriptors. dmadesc is an array of descriptors. Data is the buffer to point to.
index 02cb88455f12c1a82920ed4e3ad0e4204acb2c1c..ec54a3badeb95a808a1f8d328e79a783878c7b1b 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
+// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -36,10 +36,8 @@ queue and re-enabling the interrupt will trigger the interrupt again, which can
 #include <string.h>
 #include "driver/spi_common.h"
 #include "driver/spi_master.h"
-#include "soc/gpio_sig_map.h"
-#include "soc/spi_reg.h"
 #include "soc/dport_reg.h"
-#include "soc/spi_struct.h"
+#include "soc/spi_periph.h"
 #include "rom/ets_sys.h"
 #include "esp_types.h"
 #include "esp_attr.h"
index 7ee2222e201f4607e123de5f101e6178870f6548..7ff89e6c8af4d8ea11110580afd5840388c58a64 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
+// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 #include <string.h>
 #include "driver/spi_common.h"
 #include "driver/spi_slave.h"
-#include "soc/gpio_sig_map.h"
-#include "soc/spi_reg.h"
 #include "soc/dport_reg.h"
-#include "soc/spi_struct.h"
+#include "soc/spi_periph.h"
 #include "rom/ets_sys.h"
 #include "esp_types.h"
 #include "esp_attr.h"
index 329f3fe6a247cf251f24770911f3f7982ef20374..a86b9ccd0880b2e1e6cd3d8ac9587d7256d21a5a 100644 (file)
 #include "driver/spi_master.h"
 #include "driver/spi_slave.h"
 #include "soc/dport_reg.h"
-#include "soc/spi_reg.h"
-#include "soc/spi_struct.h"
 #include "esp_heap_caps.h"
 #include "esp_log.h"
-#include "driver/spi_pins.h"
+#include "soc/spi_periph.h"
 #include "freertos/ringbuf.h"
 
 const static char TAG[] = "test_spi";
index 00a325b1ea804decdef8a2cd744f7ec106cef66f..0112814fa7bb94a1773210214cbe7cf7331cab00 100644 (file)
@@ -231,7 +231,7 @@ TEST_CASE("Can allocate IRAM int only with an IRAM handler", "[esp32]")
 }
 
 
-#include "soc/spi_struct.h"
+#include "soc/spi_periph.h"
 typedef struct {
     bool flag1;
     bool flag2;
diff --git a/components/soc/esp32/include/soc/periph_defs.h b/components/soc/esp32/include/soc/periph_defs.h
new file mode 100644 (file)
index 0000000..7aa21fc
--- /dev/null
@@ -0,0 +1,61 @@
+// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef _SOC_PERIPH_DEFS_H_
+#define _SOC_PERIPH_DEFS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+    PERIPH_LEDC_MODULE = 0,
+    PERIPH_UART0_MODULE,
+    PERIPH_UART1_MODULE,
+    PERIPH_UART2_MODULE,
+    PERIPH_I2C0_MODULE,
+    PERIPH_I2C1_MODULE,
+    PERIPH_I2S0_MODULE,
+    PERIPH_I2S1_MODULE,
+    PERIPH_TIMG0_MODULE,
+    PERIPH_TIMG1_MODULE,
+    PERIPH_PWM0_MODULE,
+    PERIPH_PWM1_MODULE,
+    PERIPH_PWM2_MODULE,
+    PERIPH_PWM3_MODULE,
+    PERIPH_UHCI0_MODULE,
+    PERIPH_UHCI1_MODULE,
+    PERIPH_RMT_MODULE,
+    PERIPH_PCNT_MODULE,
+    PERIPH_SPI_MODULE,
+    PERIPH_HSPI_MODULE,
+    PERIPH_VSPI_MODULE,
+    PERIPH_SPI_DMA_MODULE,
+    PERIPH_SDMMC_MODULE,
+    PERIPH_SDIO_SLAVE_MODULE,
+    PERIPH_CAN_MODULE,
+    PERIPH_EMAC_MODULE,
+    PERIPH_RNG_MODULE,
+    PERIPH_WIFI_MODULE,
+    PERIPH_BT_MODULE,
+    PERIPH_WIFI_BT_COMMON_MODULE,
+    PERIPH_BT_BASEBAND_MODULE,
+    PERIPH_BT_LC_MODULE,
+} periph_module_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SOC_PERIPH_DEFS_H_ */
similarity index 76%
rename from components/soc/esp32/include/driver/spi_pins.h
rename to components/soc/esp32/include/soc/spi_pins.h
index b94c48d7fbf834d4c1e93df60ea1e08abebd7cac..49be9b7c13e0785f760a74b82faf3996d46d97ea 100644 (file)
 // See the License for the specific language governing permissions and\r
 // limitations under the License.\r
 \r
-#ifndef _DRIVER_SPI_PINS_H_\r
-#define _DRIVER_SPI_PINS_H_\r
+#ifndef _SOC_SPI_PINS_H_\r
+#define _SOC_SPI_PINS_H_\r
+\r
+#define SPI_IOMUX_PIN_NUM_MISO  7\r
+#define SPI_IOMUX_PIN_NUM_MOSI  8\r
+#define SPI_IOMUX_PIN_NUM_CLK   6\r
+#define SPI_IOMUX_PIN_NUM_CS    11\r
+#define SPI_IOMUX_PIN_NUM_WP    10\r
+#define SPI_IOMUX_PIN_NUM_HD    9\r
 \r
 #define HSPI_IOMUX_PIN_NUM_MISO 12\r
 #define HSPI_IOMUX_PIN_NUM_MOSI 13\r
@@ -29,4 +36,4 @@
 #define VSPI_IOMUX_PIN_NUM_WP   22\r
 #define VSPI_IOMUX_PIN_NUM_HD   21\r
 \r
-#endif
\ No newline at end of file
+#endif /* _SOC_SPI_PINS_H_ */
\ No newline at end of file
diff --git a/components/soc/esp32/spi_periph.c b/components/soc/esp32/spi_periph.c
new file mode 100644 (file)
index 0000000..92e748e
--- /dev/null
@@ -0,0 +1,91 @@
+// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+\r
+//     http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+#include "soc/spi_periph.h"\r
+\r
+/*\r
+ Bunch of constants for every SPI peripheral: GPIO signals, irqs, hw addr of registers etc\r
+*/\r
+const spi_signal_conn_t spi_periph_signal[3] = {\r
+    {\r
+        .spiclk_out = SPICLK_OUT_IDX,\r
+        .spiclk_in = SPICLK_IN_IDX,\r
+        .spid_out = SPID_OUT_IDX,\r
+        .spiq_out = SPIQ_OUT_IDX,\r
+        .spiwp_out = SPIWP_OUT_IDX,\r
+        .spihd_out = SPIHD_OUT_IDX,\r
+        .spid_in = SPID_IN_IDX,\r
+        .spiq_in = SPIQ_IN_IDX,\r
+        .spiwp_in = SPIWP_IN_IDX,\r
+        .spihd_in = SPIHD_IN_IDX,\r
+        .spics_out = {SPICS0_OUT_IDX, SPICS1_OUT_IDX, SPICS2_OUT_IDX},\r
+        .spics_in = SPICS0_IN_IDX,\r
+        .spiclk_iomux_pin = SPI_IOMUX_PIN_NUM_CLK,\r
+        .spid_iomux_pin = SPI_IOMUX_PIN_NUM_MOSI,\r
+        .spiq_iomux_pin = SPI_IOMUX_PIN_NUM_MISO,\r
+        .spiwp_iomux_pin = SPI_IOMUX_PIN_NUM_WP,\r
+        .spihd_iomux_pin = SPI_IOMUX_PIN_NUM_HD,\r
+        .spics0_iomux_pin = SPI_IOMUX_PIN_NUM_CS,\r
+        .irq = ETS_SPI1_INTR_SOURCE,\r
+        .irq_dma = ETS_SPI1_DMA_INTR_SOURCE,\r
+        .module = PERIPH_SPI_MODULE,\r
+        .hw = &SPI1\r
+    }, {\r
+        .spiclk_out = HSPICLK_OUT_IDX,\r
+        .spiclk_in = HSPICLK_IN_IDX,\r
+        .spid_out = HSPID_OUT_IDX,\r
+        .spiq_out = HSPIQ_OUT_IDX,\r
+        .spiwp_out = HSPIWP_OUT_IDX,\r
+        .spihd_out = HSPIHD_OUT_IDX,\r
+        .spid_in = HSPID_IN_IDX,\r
+        .spiq_in = HSPIQ_IN_IDX,\r
+        .spiwp_in = HSPIWP_IN_IDX,\r
+        .spihd_in = HSPIHD_IN_IDX,\r
+        .spics_out = {HSPICS0_OUT_IDX, HSPICS1_OUT_IDX, HSPICS2_OUT_IDX},\r
+        .spics_in = HSPICS0_IN_IDX,\r
+        .spiclk_iomux_pin = HSPI_IOMUX_PIN_NUM_CLK,\r
+        .spid_iomux_pin = HSPI_IOMUX_PIN_NUM_MOSI,\r
+        .spiq_iomux_pin = HSPI_IOMUX_PIN_NUM_MISO,\r
+        .spiwp_iomux_pin = HSPI_IOMUX_PIN_NUM_WP,\r
+        .spihd_iomux_pin = HSPI_IOMUX_PIN_NUM_HD,\r
+        .spics0_iomux_pin = HSPI_IOMUX_PIN_NUM_CS,\r
+        .irq = ETS_SPI2_INTR_SOURCE,\r
+        .irq_dma = ETS_SPI2_DMA_INTR_SOURCE,\r
+        .module = PERIPH_HSPI_MODULE,\r
+        .hw = &SPI2\r
+    }, {\r
+        .spiclk_out = VSPICLK_OUT_IDX,\r
+        .spiclk_in = VSPICLK_IN_IDX,\r
+        .spid_out = VSPID_OUT_IDX,\r
+        .spiq_out = VSPIQ_OUT_IDX,\r
+        .spiwp_out = VSPIWP_OUT_IDX,\r
+        .spihd_out = VSPIHD_OUT_IDX,\r
+        .spid_in = VSPID_IN_IDX,\r
+        .spiq_in = VSPIQ_IN_IDX,\r
+        .spiwp_in = VSPIWP_IN_IDX,\r
+        .spihd_in = VSPIHD_IN_IDX,\r
+        .spics_out = {VSPICS0_OUT_IDX, VSPICS1_OUT_IDX, VSPICS2_OUT_IDX},\r
+        .spics_in = VSPICS0_IN_IDX,\r
+        .spiclk_iomux_pin = VSPI_IOMUX_PIN_NUM_CLK,\r
+        .spid_iomux_pin = VSPI_IOMUX_PIN_NUM_MOSI,\r
+        .spiq_iomux_pin = VSPI_IOMUX_PIN_NUM_MISO,\r
+        .spiwp_iomux_pin = VSPI_IOMUX_PIN_NUM_WP,\r
+        .spihd_iomux_pin = VSPI_IOMUX_PIN_NUM_HD,\r
+        .spics0_iomux_pin = VSPI_IOMUX_PIN_NUM_CS,\r
+        .irq = ETS_SPI3_INTR_SOURCE,\r
+        .irq_dma = ETS_SPI3_DMA_INTR_SOURCE,\r
+        .module = PERIPH_VSPI_MODULE,\r
+        .hw = &SPI3\r
+    }\r
+};
\ No newline at end of file
diff --git a/components/soc/include/soc/spi_periph.h b/components/soc/include/soc/spi_periph.h
new file mode 100644 (file)
index 0000000..00c5f3e
--- /dev/null
@@ -0,0 +1,66 @@
+// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+\r
+//     http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+#ifndef _SOC_SPI_PERIPH_H_\r
+#define _SOC_SPI_PERIPH_H_\r
+\r
+#include <stdint.h>\r
+#include "soc/soc.h"\r
+#include "soc/periph_defs.h"\r
+//include soc related (generated) definitions\r
+#include "soc/spi_pins.h"\r
+#include "soc/spi_reg.h"\r
+#include "soc/spi_struct.h"\r
+#include "soc/gpio_sig_map.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C"\r
+{\r
+#endif\r
+\r
+/*\r
+ Stores a bunch of per-spi-peripheral data.\r
+*/\r
+typedef struct {\r
+    const uint8_t spiclk_out;       //GPIO mux output signals\r
+    const uint8_t spiclk_in;\r
+    const uint8_t spid_out;\r
+    const uint8_t spiq_out;\r
+    const uint8_t spiwp_out;\r
+    const uint8_t spihd_out;\r
+    const uint8_t spid_in;          //GPIO mux input signals\r
+    const uint8_t spiq_in;\r
+    const uint8_t spiwp_in;\r
+    const uint8_t spihd_in;\r
+    const uint8_t spics_out[3];     // /CS GPIO output mux signals\r
+    const uint8_t spics_in;\r
+    const uint8_t spiclk_iomux_pin;    //IO pins of IO_MUX muxed signals\r
+    const uint8_t spid_iomux_pin;\r
+    const uint8_t spiq_iomux_pin;\r
+    const uint8_t spiwp_iomux_pin;\r
+    const uint8_t spihd_iomux_pin;\r
+    const uint8_t spics0_iomux_pin;\r
+    const uint8_t irq;              //irq source for interrupt mux\r
+    const uint8_t irq_dma;          //dma irq source for interrupt mux\r
+    const periph_module_t module;   //peripheral module, for enabling clock etc\r
+    spi_dev_t *hw;              //Pointer to the hardware registers\r
+} spi_signal_conn_t;\r
+\r
+extern const spi_signal_conn_t spi_periph_signal[3];\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* _SOC_SPI_PERIPH_H_ */
\ No newline at end of file