Skip to content

Commit af721c7

Browse files
committed
codal_port: Correctly acquire and free I2C and SPI pins.
This makes sure that pins that are currently used for I2C and SPI are in the correct pin mode, and pins that were previously but no longer used for I2C/SPI are freed. Fixes issue #167. Signed-off-by: Damien George <[email protected]>
1 parent 4a4c4c4 commit af721c7

File tree

3 files changed

+23
-11
lines changed

3 files changed

+23
-11
lines changed

src/codal_port/microbit_i2c.c

+10-2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131

3232
typedef struct _microbit_i2c_obj_t {
3333
mp_obj_base_t base;
34+
const microbit_pin_obj_t *scl;
35+
const microbit_pin_obj_t *sda;
3436
} microbit_i2c_obj_t;
3537

3638
STATIC mp_obj_t microbit_i2c_init(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
@@ -55,8 +57,12 @@ STATIC mp_obj_t microbit_i2c_init(mp_uint_t n_args, const mp_obj_t *pos_args, mp
5557
scl = microbit_obj_get_pin(args[ARG_scl].u_obj);
5658
}
5759

60+
// Acquire new pins and free the previous ones.
61+
microbit_obj_pin_acquire_and_free(&microbit_i2c_obj.scl, scl, microbit_pin_mode_i2c);
62+
microbit_obj_pin_acquire_and_free(&microbit_i2c_obj.sda, sda, microbit_pin_mode_i2c);
63+
5864
// Initialise the I2C bus.
59-
int ret =microbit_hal_i2c_init(scl->name, sda->name, args[ARG_freq].u_int);
65+
int ret = microbit_hal_i2c_init(scl->name, sda->name, args[ARG_freq].u_int);
6066

6167
if (ret != 0) {
6268
mp_raise_OSError(ret);
@@ -149,6 +155,8 @@ STATIC MP_DEFINE_CONST_OBJ_TYPE(
149155
locals_dict, &microbit_i2c_locals_dict
150156
);
151157

152-
const microbit_i2c_obj_t microbit_i2c_obj = {
158+
microbit_i2c_obj_t microbit_i2c_obj = {
153159
{ &microbit_i2c_type },
160+
.scl = &microbit_p19_obj,
161+
.sda = &microbit_p20_obj,
154162
};

src/codal_port/microbit_spi.c

+11-7
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232

3333
typedef struct _microbit_spi_obj_t {
3434
mp_obj_base_t base;
35+
const microbit_pin_obj_t *sclk;
36+
const microbit_pin_obj_t *mosi;
37+
const microbit_pin_obj_t *miso;
3538
} microbit_spi_obj_t;
3639

3740
STATIC bool microbit_spi_initialised = false;
@@ -71,12 +74,10 @@ STATIC mp_obj_t microbit_spi_init(mp_uint_t n_args, const mp_obj_t *pos_args, mp
7174
miso = microbit_obj_get_pin(args[ARG_miso].u_obj);
7275
}
7376

74-
// Initialise the pins.
75-
// Note: the pins are not freed, so init'ing the SPI a second time on
76-
// different pins will leave the old pins still in SPI mode.
77-
microbit_obj_pin_acquire(sclk, microbit_pin_mode_spi);
78-
microbit_obj_pin_acquire(mosi, microbit_pin_mode_spi);
79-
microbit_obj_pin_acquire(miso, microbit_pin_mode_spi);
77+
// Acquire new pins and free the previous ones.
78+
microbit_obj_pin_acquire_and_free(&microbit_spi_obj.sclk, sclk, microbit_pin_mode_spi);
79+
microbit_obj_pin_acquire_and_free(&microbit_spi_obj.mosi, mosi, microbit_pin_mode_spi);
80+
microbit_obj_pin_acquire_and_free(&microbit_spi_obj.miso, miso, microbit_pin_mode_spi);
8081

8182
// Initialise the SPI bus.
8283
int ret = microbit_hal_spi_init(sclk->name, mosi->name, miso->name,
@@ -147,6 +148,9 @@ STATIC MP_DEFINE_CONST_OBJ_TYPE(
147148
locals_dict, &microbit_spi_locals_dict
148149
);
149150

150-
const microbit_spi_obj_t microbit_spi_obj = {
151+
microbit_spi_obj_t microbit_spi_obj = {
151152
{ &microbit_spi_type },
153+
.sclk = &microbit_p13_obj,
154+
.mosi = &microbit_p15_obj,
155+
.miso = &microbit_p14_obj,
152156
};

src/codal_port/modmicrobit.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,9 @@ extern const struct _microbit_pin_obj_t microbit_p20_obj;
111111
extern const struct _microbit_pin_obj_t microbit_pin_logo_obj;
112112
extern const struct _microbit_pin_obj_t microbit_pin_speaker_obj;
113113

114-
extern const struct _microbit_i2c_obj_t microbit_i2c_obj;
114+
extern struct _microbit_i2c_obj_t microbit_i2c_obj;
115115
extern const struct _microbit_uart_obj_t microbit_uart_obj;
116-
extern const struct _microbit_spi_obj_t microbit_spi_obj;
116+
extern struct _microbit_spi_obj_t microbit_spi_obj;
117117

118118
extern const struct _monochrome_5by5_t microbit_const_image_heart_obj;
119119
extern const struct _monochrome_5by5_t microbit_const_image_heart_small_obj;

0 commit comments

Comments
 (0)