diff --git a/core/esp_spi.c b/core/esp_spi.c index 7a8704c..ab33ea4 100644 --- a/core/esp_spi.c +++ b/core/esp_spi.c @@ -23,39 +23,34 @@ #define _SPI1_SCK_GPIO 14 #define _SPI1_CS0_GPIO 15 -#define _SPI0_FUNC 1 -#define _SPI1_FUNC 2 +#define _SPI0_FUNC IOMUX_FUNC(1) +#define _SPI1_FUNC IOMUX_FUNC(2) #define _SPI_BUF_SIZE 64 static bool _minimal_pins[2] = {false, false}; -inline static void _set_pin_function(uint8_t pin, uint32_t function) -{ - iomux_set_function(gpio_to_iomux(pin), function); -} - bool spi_init(uint8_t bus, spi_mode_t mode, uint32_t freq_divider, bool msb, spi_endianness_t endianness, bool minimal_pins) { switch (bus) { case 0: - _set_pin_function(_SPI0_MISO_GPIO, _SPI0_FUNC); - _set_pin_function(_SPI0_MOSI_GPIO, _SPI0_FUNC); - _set_pin_function(_SPI0_SCK_GPIO, _SPI0_FUNC); + gpio_set_iomux_function(_SPI0_MISO_GPIO, _SPI0_FUNC); + gpio_set_iomux_function(_SPI0_MOSI_GPIO, _SPI0_FUNC); + gpio_set_iomux_function(_SPI0_SCK_GPIO, _SPI0_FUNC); if (!minimal_pins) { - _set_pin_function(_SPI0_HD_GPIO, _SPI0_FUNC); - _set_pin_function(_SPI0_WP_GPIO, _SPI0_FUNC); - _set_pin_function(_SPI0_CS0_GPIO, _SPI0_FUNC); + gpio_set_iomux_function(_SPI0_HD_GPIO, _SPI0_FUNC); + gpio_set_iomux_function(_SPI0_WP_GPIO, _SPI0_FUNC); + gpio_set_iomux_function(_SPI0_CS0_GPIO, _SPI0_FUNC); } break; case 1: - _set_pin_function(_SPI1_MISO_GPIO, _SPI1_FUNC); - _set_pin_function(_SPI1_MOSI_GPIO, _SPI1_FUNC); - _set_pin_function(_SPI1_SCK_GPIO, _SPI1_FUNC); + gpio_set_iomux_function(_SPI1_MISO_GPIO, _SPI1_FUNC); + gpio_set_iomux_function(_SPI1_MOSI_GPIO, _SPI1_FUNC); + gpio_set_iomux_function(_SPI1_SCK_GPIO, _SPI1_FUNC); if (!minimal_pins) - _set_pin_function(_SPI1_CS0_GPIO, _SPI1_FUNC); + gpio_set_iomux_function(_SPI1_CS0_GPIO, _SPI1_FUNC); break; default: return false; diff --git a/core/include/esp/gpio.h b/core/include/esp/gpio.h index 426d1ea..80fd43f 100644 --- a/core/include/esp/gpio.h +++ b/core/include/esp/gpio.h @@ -143,6 +143,16 @@ static inline gpio_inttype_t gpio_get_interrupt(const uint8_t gpio_num) return (gpio_inttype_t)FIELD2VAL(GPIO_CONF_INTTYPE, GPIO.CONF[gpio_num]); } +/* Set GPIO I/O Mux function. + * The 'func' is an IOMUX_GPIO_FUNC_ value, see iomux_regs.h + */ +inline static void gpio_set_iomux_function(const uint8_t gpio_num, uint32_t func) +{ + uint8_t iomux_num = gpio_to_iomux(gpio_num); + uint32_t prev = IOMUX.PIN[iomux_num] & ~IOMUX_PIN_FUNC_MASK; + IOMUX.PIN[iomux_num] = func | prev; +} + #ifdef __cplusplus } #endif diff --git a/core/include/esp/iomux.h b/core/include/esp/iomux.h index 7cc0860..26ae471 100644 --- a/core/include/esp/iomux.h +++ b/core/include/esp/iomux.h @@ -82,8 +82,8 @@ inline static void iomux_set_pullup_flags(uint8_t iomux_num, uint32_t pullup_fla inline static void iomux_set_gpio_function(uint8_t gpio_number, bool output_enable) { const uint8_t iomux_num = gpio_to_iomux(gpio_number); - const uint32_t func = iomux_num > 11 ? 0 : 3; - iomux_set_function(iomux_num, IOMUX_FUNC(func)); + const uint32_t func = iomux_num > 11 ? IOMUX_FUNC(0) : IOMUX_FUNC(3); + iomux_set_function(iomux_num, func); iomux_set_direction_flags(iomux_num, output_enable ? IOMUX_PIN_OUTPUT_ENABLE : 0); } diff --git a/core/include/esp/iomux_regs.h b/core/include/esp/iomux_regs.h index 7cb2cd0..aa2ac10 100644 --- a/core/include/esp/iomux_regs.h +++ b/core/include/esp/iomux_regs.h @@ -47,11 +47,6 @@ _Static_assert(sizeof(struct IOMUX_REGS) == 0x44, "IOMUX_REGS is the wrong size" /* WARNING: Macro evaluates argument twice */ #define IOMUX_FUNC(val) (VAL2FIELD_M(IOMUX_PIN_FUNC_LOW, val) | VAL2FIELD_M(IOMUX_PIN_FUNC_HIGH, val)) -/* WARNING: Macro evaluates argument twice */ -#define IOMUX_FUNC_VALUE(regbits) (FIELD2VAL(IOMUX_PIN_FUNC_LOW, regbits) | FIELD2VAL(IOMUX_PIN_FUNC_HIGH, regbits)) - -#define IOMUX_SET_FUNC(regbits, funcval) (((regbits) & ~IOMUX_PIN_FUNC_MASK) | (funcval)) - #define IOMUX_GPIO0 IOMUX.PIN[12] #define IOMUX_GPIO1 IOMUX.PIN[5] #define IOMUX_GPIO2 IOMUX.PIN[13]