Merge branch 'bugfix/spi_native_pins' into 'master'
fix several spi issues about pin configurations See merge request idf/esp-idf!2309
This commit is contained in:
commit
fcd5d0869d
3 changed files with 73 additions and 25 deletions
|
@ -547,3 +547,16 @@ esp_err_t gpio_hold_dis(gpio_num_t gpio_num)
|
||||||
}
|
}
|
||||||
return r == ESP_OK ? ESP_OK : ESP_ERR_NOT_SUPPORTED;
|
return r == ESP_OK ? ESP_OK : ESP_ERR_NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gpio_iomux_in(uint32_t gpio, uint32_t signal_idx)
|
||||||
|
{
|
||||||
|
GPIO.func_in_sel_cfg[signal_idx].sig_in_sel = 0;
|
||||||
|
PIN_INPUT_ENABLE(GPIO_PIN_MUX_REG[gpio]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gpio_iomux_out(uint8_t gpio_num, int func, bool oen_inv)
|
||||||
|
{
|
||||||
|
GPIO.func_out_sel_cfg[gpio_num].oen_sel = 0;
|
||||||
|
GPIO.func_out_sel_cfg[gpio_num].oen_inv_sel = oen_inv;
|
||||||
|
PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio_num], func);
|
||||||
|
}
|
||||||
|
|
|
@ -554,6 +554,22 @@ esp_err_t gpio_hold_en(gpio_num_t gpio_num);
|
||||||
*/
|
*/
|
||||||
esp_err_t gpio_hold_dis(gpio_num_t gpio_num);
|
esp_err_t gpio_hold_dis(gpio_num_t gpio_num);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set pad input to a peripheral signal through the IOMUX.
|
||||||
|
* @param gpio_num GPIO number of the pad.
|
||||||
|
* @param signal_idx Peripheral signal id to input. One of the ``*_IN_IDX`` signals in ``soc/gpio_sig_map.h``.
|
||||||
|
*/
|
||||||
|
void gpio_iomux_in(uint32_t gpio_num, uint32_t signal_idx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set peripheral output to an GPIO pad through the IOMUX.
|
||||||
|
* @param gpio_num gpio_num GPIO number of the pad.
|
||||||
|
* @param func The function number of the peripheral pin to output pin.
|
||||||
|
* One of the ``FUNC_X_*`` of specified pin (X) in ``soc/io_mux_reg.h``.
|
||||||
|
* @param oen_inv True if the output enable needs to be inversed, otherwise False.
|
||||||
|
*/
|
||||||
|
void gpio_iomux_out(uint8_t gpio_num, int func, bool oen_inv);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -46,6 +46,9 @@ static const char *SPI_TAG = "spi";
|
||||||
|
|
||||||
typedef struct spi_device_t spi_device_t;
|
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.
|
Stores a bunch of per-spi-peripheral data.
|
||||||
*/
|
*/
|
||||||
|
@ -291,18 +294,33 @@ esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_conf
|
||||||
//All SPI native pin selections resolve to 1, so we put that here instead of trying to figure
|
//All SPI native pin selections resolve to 1, so we put that here instead of trying to figure
|
||||||
//out which FUNC_GPIOx_xSPIxx to grab; they all are defined to 1 anyway.
|
//out which FUNC_GPIOx_xSPIxx to grab; they all are defined to 1 anyway.
|
||||||
ESP_LOGD(SPI_TAG, "SPI%d use native pins.", host );
|
ESP_LOGD(SPI_TAG, "SPI%d use native pins.", host );
|
||||||
if (bus_config->mosi_io_num >= 0) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->mosi_io_num], 1);
|
if (bus_config->mosi_io_num >= 0) {
|
||||||
if (bus_config->miso_io_num >= 0) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->miso_io_num], 1);
|
gpio_iomux_in(bus_config->mosi_io_num, io_signal[host].spid_in);
|
||||||
if (bus_config->quadwp_io_num >= 0) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->quadwp_io_num], 1);
|
gpio_iomux_out(bus_config->mosi_io_num, FUNC_SPI, false);
|
||||||
if (bus_config->quadhd_io_num >= 0) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->quadhd_io_num], 1);
|
}
|
||||||
if (bus_config->sclk_io_num >= 0) PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->sclk_io_num], 1);
|
if (bus_config->miso_io_num >= 0) {
|
||||||
|
gpio_iomux_in(bus_config->miso_io_num, io_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_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_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_out(bus_config->sclk_io_num, FUNC_SPI, false);
|
||||||
|
}
|
||||||
temp_flag |= SPICOMMON_BUSFLAG_NATIVE_PINS;
|
temp_flag |= SPICOMMON_BUSFLAG_NATIVE_PINS;
|
||||||
} else {
|
} else {
|
||||||
//Use GPIO matrix
|
//Use GPIO matrix
|
||||||
ESP_LOGD(SPI_TAG, "SPI%d use gpio matrix.", host );
|
ESP_LOGD(SPI_TAG, "SPI%d use gpio matrix.", host );
|
||||||
if (bus_config->mosi_io_num >= 0) {
|
if (bus_config->mosi_io_num >= 0) {
|
||||||
PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->mosi_io_num], PIN_FUNC_GPIO);
|
PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->mosi_io_num], FUNC_GPIO);
|
||||||
if (mosi_output) {
|
if (mosi_output || (temp_flag&SPICOMMON_BUSFLAG_DUAL)) {
|
||||||
gpio_set_direction(bus_config->mosi_io_num, GPIO_MODE_INPUT_OUTPUT);
|
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, io_signal[host].spid_out, false, false);
|
||||||
} else {
|
} else {
|
||||||
|
@ -311,8 +329,8 @@ esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_conf
|
||||||
gpio_matrix_in(bus_config->mosi_io_num, io_signal[host].spid_in, false);
|
gpio_matrix_in(bus_config->mosi_io_num, io_signal[host].spid_in, false);
|
||||||
}
|
}
|
||||||
if (bus_config->miso_io_num >= 0) {
|
if (bus_config->miso_io_num >= 0) {
|
||||||
PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->miso_io_num], PIN_FUNC_GPIO);
|
PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->miso_io_num], FUNC_GPIO);
|
||||||
if (miso_output) {
|
if (miso_output || (temp_flag&SPICOMMON_BUSFLAG_DUAL)) {
|
||||||
gpio_set_direction(bus_config->miso_io_num, GPIO_MODE_INPUT_OUTPUT);
|
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, io_signal[host].spiq_out, false, false);
|
||||||
} else {
|
} else {
|
||||||
|
@ -321,19 +339,19 @@ esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_conf
|
||||||
gpio_matrix_in(bus_config->miso_io_num, io_signal[host].spiq_in, false);
|
gpio_matrix_in(bus_config->miso_io_num, io_signal[host].spiq_in, false);
|
||||||
}
|
}
|
||||||
if (bus_config->quadwp_io_num >= 0) {
|
if (bus_config->quadwp_io_num >= 0) {
|
||||||
PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->quadwp_io_num], PIN_FUNC_GPIO);
|
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_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_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_in(bus_config->quadwp_io_num, io_signal[host].spiwp_in, false);
|
||||||
}
|
}
|
||||||
if (bus_config->quadhd_io_num >= 0) {
|
if (bus_config->quadhd_io_num >= 0) {
|
||||||
PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->quadhd_io_num], PIN_FUNC_GPIO);
|
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_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_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_in(bus_config->quadhd_io_num, io_signal[host].spihd_in, false);
|
||||||
}
|
}
|
||||||
if (bus_config->sclk_io_num >= 0) {
|
if (bus_config->sclk_io_num >= 0) {
|
||||||
PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[bus_config->sclk_io_num], PIN_FUNC_GPIO);
|
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_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_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_in(bus_config->sclk_io_num, io_signal[host].spiclk_in, false);
|
||||||
|
@ -377,10 +395,11 @@ void spicommon_cs_initialize(spi_host_device_t host, int cs_io_num, int cs_num,
|
||||||
{
|
{
|
||||||
if (!force_gpio_matrix && cs_io_num == io_signal[host].spics0_native && cs_num == 0) {
|
if (!force_gpio_matrix && cs_io_num == io_signal[host].spics0_native && cs_num == 0) {
|
||||||
//The cs0s for all SPI peripherals map to pin mux source 1, so we use that instead of a define.
|
//The cs0s for all SPI peripherals map to pin mux source 1, so we use that instead of a define.
|
||||||
PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[cs_io_num], 1);
|
gpio_iomux_in(cs_io_num, io_signal[host].spics_in);
|
||||||
|
gpio_iomux_out(cs_io_num, FUNC_SPI, false);
|
||||||
} else {
|
} else {
|
||||||
//Use GPIO matrix
|
//Use GPIO matrix
|
||||||
PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[cs_io_num], PIN_FUNC_GPIO);
|
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);
|
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);
|
if (cs_num == 0) gpio_matrix_in(cs_io_num, io_signal[host].spics_in, false);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue