stm32/i2c: Return error code and raise exception if I2C init fails.

Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
Damien George 2023-03-09 11:14:47 +11:00
parent b981e37ccd
commit 98937dcfc2
2 changed files with 14 additions and 14 deletions

View File

@ -47,8 +47,8 @@ extern const mp_obj_type_t pyb_i2c_type;
extern const pyb_i2c_obj_t pyb_i2c_obj[4]; extern const pyb_i2c_obj_t pyb_i2c_obj[4];
void i2c_init0(void); void i2c_init0(void);
void pyb_i2c_init(I2C_HandleTypeDef *i2c); int pyb_i2c_init(I2C_HandleTypeDef *i2c);
void pyb_i2c_init_freq(const pyb_i2c_obj_t *self, mp_int_t freq); int pyb_i2c_init_freq(const pyb_i2c_obj_t *self, mp_int_t freq);
uint32_t pyb_i2c_get_baudrate(I2C_HandleTypeDef *i2c); uint32_t pyb_i2c_get_baudrate(I2C_HandleTypeDef *i2c);
void i2c_ev_irq_handler(mp_uint_t i2c_id); void i2c_ev_irq_handler(mp_uint_t i2c_id);
void i2c_er_irq_handler(mp_uint_t i2c_id); void i2c_er_irq_handler(mp_uint_t i2c_id);

View File

@ -24,10 +24,8 @@
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <stdio.h>
#include <string.h>
#include "py/runtime.h" #include "py/runtime.h"
#include "py/mperrno.h"
#include "py/mphal.h" #include "py/mphal.h"
#include "irq.h" #include "irq.h"
#include "pin.h" #include "pin.h"
@ -290,7 +288,7 @@ void i2c_init0(void) {
#endif #endif
} }
void pyb_i2c_init(I2C_HandleTypeDef *i2c) { int pyb_i2c_init(I2C_HandleTypeDef *i2c) {
int i2c_unit; int i2c_unit;
const pin_obj_t *scl_pin; const pin_obj_t *scl_pin;
const pin_obj_t *sda_pin; const pin_obj_t *sda_pin;
@ -326,7 +324,7 @@ void pyb_i2c_init(I2C_HandleTypeDef *i2c) {
#endif #endif
} else { } else {
// I2C does not exist for this board (shouldn't get here, should be checked by caller) // I2C does not exist for this board (shouldn't get here, should be checked by caller)
return; return -MP_EINVAL;
} }
// init the GPIO lines // init the GPIO lines
@ -338,10 +336,7 @@ void pyb_i2c_init(I2C_HandleTypeDef *i2c) {
// init the I2C device // init the I2C device
if (HAL_I2C_Init(i2c) != HAL_OK) { if (HAL_I2C_Init(i2c) != HAL_OK) {
// init error // init error
// TODO should raise an exception, but this function is not necessarily going to be return -MP_EIO;
// called via Python, so may not be properly wrapped in an NLR handler
printf("OSError: HAL_I2C_Init failed\n");
return;
} }
// invalidate the DMA channels so they are initialised on first use // invalidate the DMA channels so they are initialised on first use
@ -371,6 +366,8 @@ void pyb_i2c_init(I2C_HandleTypeDef *i2c) {
HAL_NVIC_EnableIRQ(I2C4_ER_IRQn); HAL_NVIC_EnableIRQ(I2C4_ER_IRQn);
#endif #endif
} }
return 0; // success
} }
void i2c_deinit(I2C_HandleTypeDef *i2c) { void i2c_deinit(I2C_HandleTypeDef *i2c) {
@ -411,7 +408,7 @@ void i2c_deinit(I2C_HandleTypeDef *i2c) {
} }
} }
void pyb_i2c_init_freq(const pyb_i2c_obj_t *self, mp_int_t freq) { int pyb_i2c_init_freq(const pyb_i2c_obj_t *self, mp_int_t freq) {
I2C_InitTypeDef *init = &self->i2c->Init; I2C_InitTypeDef *init = &self->i2c->Init;
init->AddressingMode = I2C_ADDRESSINGMODE_7BIT; init->AddressingMode = I2C_ADDRESSINGMODE_7BIT;
@ -428,7 +425,7 @@ void pyb_i2c_init_freq(const pyb_i2c_obj_t *self, mp_int_t freq) {
// init the I2C bus // init the I2C bus
i2c_deinit(self->i2c); i2c_deinit(self->i2c);
pyb_i2c_init(self->i2c); return pyb_i2c_init(self->i2c);
} }
STATIC void i2c_reset_after_error(I2C_HandleTypeDef *i2c) { STATIC void i2c_reset_after_error(I2C_HandleTypeDef *i2c) {
@ -704,7 +701,10 @@ STATIC mp_obj_t pyb_i2c_init_helper(const pyb_i2c_obj_t *self, size_t n_args, co
// init the I2C bus // init the I2C bus
i2c_deinit(self->i2c); i2c_deinit(self->i2c);
pyb_i2c_init(self->i2c); int ret = pyb_i2c_init(self->i2c);
if (ret != 0) {
mp_raise_OSError(-ret);
}
return mp_const_none; return mp_const_none;
} }