From 6c8b19c7e279bf58350e1383e3d32f120e09b3af Mon Sep 17 00:00:00 2001 From: Damien George Date: Thu, 9 Mar 2023 11:30:37 +1100 Subject: [PATCH] stm32/spi: Return error code and raise exception if SPI init fails. Signed-off-by: Damien George --- ports/stm32/machine_spi.c | 10 ++++++++-- ports/stm32/pyb_spi.c | 5 ++++- ports/stm32/spi.c | 18 +++++++----------- ports/stm32/spi.h | 2 +- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/ports/stm32/machine_spi.c b/ports/stm32/machine_spi.c index 7ccff75f1c..ddbd42bf29 100644 --- a/ports/stm32/machine_spi.c +++ b/ports/stm32/machine_spi.c @@ -91,7 +91,10 @@ mp_obj_t machine_hard_spi_make_new(const mp_obj_type_t *type, size_t n_args, siz args[ARG_firstbit].u_int); // init the SPI bus - spi_init(self->spi, false); + int ret = spi_init(self->spi, false); + if (ret != 0) { + mp_raise_OSError(-ret); + } return MP_OBJ_FROM_PTR(self); } @@ -116,7 +119,10 @@ STATIC void machine_hard_spi_init(mp_obj_base_t *self_in, size_t n_args, const m args[ARG_firstbit].u_int); // re-init the SPI bus - spi_init(self->spi, false); + int ret = spi_init(self->spi, false); + if (ret != 0) { + mp_raise_OSError(-ret); + } } STATIC void machine_hard_spi_deinit(mp_obj_base_t *self_in) { diff --git a/ports/stm32/pyb_spi.c b/ports/stm32/pyb_spi.c index 54582f8e54..a612f69505 100644 --- a/ports/stm32/pyb_spi.c +++ b/ports/stm32/pyb_spi.c @@ -112,7 +112,10 @@ STATIC mp_obj_t pyb_spi_init_helper(const pyb_spi_obj_t *self, size_t n_args, co } // init the SPI bus - spi_init(self->spi, init->NSS != SPI_NSS_SOFT); + int ret = spi_init(self->spi, init->NSS != SPI_NSS_SOFT); + if (ret != 0) { + mp_raise_OSError(-ret); + } return mp_const_none; } diff --git a/ports/stm32/spi.c b/ports/stm32/spi.c index 946e83e43a..e61c837692 100644 --- a/ports/stm32/spi.c +++ b/ports/stm32/spi.c @@ -24,10 +24,8 @@ * THE SOFTWARE. */ -#include -#include - #include "py/runtime.h" +#include "py/mperrno.h" #include "py/mphal.h" #include "spi.h" #include "extmod/machine_spi.h" @@ -296,7 +294,7 @@ void spi_set_params(const spi_t *spi_obj, uint32_t prescale, int32_t baudrate, } // TODO allow to take a list of pins to use -void spi_init(const spi_t *self, bool enable_nss_pin) { +int spi_init(const spi_t *self, bool enable_nss_pin) { SPI_HandleTypeDef *spi = self->spi; uint32_t irqn = 0; const pin_obj_t *pins[4] = { NULL, NULL, NULL, NULL }; @@ -396,7 +394,7 @@ void spi_init(const spi_t *self, bool enable_nss_pin) { #endif } else { // SPI does not exist for this board (shouldn't get here, should be checked by caller) - return; + return -MP_EINVAL; } // init the GPIO lines @@ -412,10 +410,7 @@ void spi_init(const spi_t *self, bool enable_nss_pin) { // init the SPI device if (HAL_SPI_Init(spi) != HAL_OK) { // init error - // TODO should raise an exception, but this function is not necessarily going to be - // called via Python, so may not be properly wrapped in an NLR handler - printf("OSError: HAL_SPI_Init failed\n"); - return; + return -MP_EIO; } // After calling HAL_SPI_Init() it seems that the DMA gets disconnected if @@ -430,6 +425,8 @@ void spi_init(const spi_t *self, bool enable_nss_pin) { #else (void)irqn; #endif + + return 0; // success } void spi_deinit(const spi_t *spi_obj) { @@ -715,8 +712,7 @@ STATIC int spi_proto_ioctl(void *self_in, uint32_t cmd) { self->spi->spi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; spi_set_params(self->spi, 0xffffffff, self->baudrate, self->polarity, self->phase, self->bits, self->firstbit); - spi_init(self->spi, false); - break; + return spi_init(self->spi, false); case MP_SPI_IOCTL_DEINIT: spi_deinit(self->spi); diff --git a/ports/stm32/spi.h b/ports/stm32/spi.h index b2aceafbf5..fe7f2f6614 100644 --- a/ports/stm32/spi.h +++ b/ports/stm32/spi.h @@ -66,7 +66,7 @@ extern const mp_obj_type_t machine_spi_type; #define SPI_TRANSFER_TIMEOUT(len) ((len) + 100) void spi_init0(void); -void spi_init(const spi_t *spi, bool enable_nss_pin); +int spi_init(const spi_t *spi, bool enable_nss_pin); void spi_deinit(const spi_t *spi_obj); int spi_find_index(mp_obj_t id); void spi_set_params(const spi_t *spi_obj, uint32_t prescale, int32_t baudrate,