summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2023-03-09 11:30:37 +1100
committerDamien George <damien@micropython.org>2023-03-09 12:47:45 +1100
commit6c8b19c7e279bf58350e1383e3d32f120e09b3af (patch)
treeb204ed8080e93df359dfb120c45604683edb0a68
parent98937dcfc23c29d17e0d5215ade0d5a71b2c1589 (diff)
stm32/spi: Return error code and raise exception if SPI init fails.
Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--ports/stm32/machine_spi.c10
-rw-r--r--ports/stm32/pyb_spi.c5
-rw-r--r--ports/stm32/spi.c18
-rw-r--r--ports/stm32/spi.h2
4 files changed, 20 insertions, 15 deletions
diff --git a/ports/stm32/machine_spi.c b/ports/stm32/machine_spi.c
index 7ccff75f1..ddbd42bf2 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 54582f8e5..a612f6950 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 946e83e43..e61c83769 100644
--- a/ports/stm32/spi.c
+++ b/ports/stm32/spi.c
@@ -24,10 +24,8 @@
* THE SOFTWARE.
*/
-#include <stdio.h>
-#include <string.h>
-
#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 b2aceafbf..fe7f2f661 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,