Skip to content

Commit ddcae19

Browse files
authored
Merge pull request #2964 from hierophect/mimxrt-busio-cleanup
mimxrt10xx: Busio cleanup and bugfixes
2 parents 7ea9545 + fe75c77 commit ddcae19

File tree

19 files changed

+184
-73
lines changed

19 files changed

+184
-73
lines changed

ports/mimxrt10xx/boards/imxrt1010_evk/board.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ void board_init(void) {
3333
// SWD Pins
3434
common_hal_never_reset_pin(&pin_GPIO_AD_13); //SWDIO
3535
common_hal_never_reset_pin(&pin_GPIO_AD_12); //SWCLK
36-
common_hal_never_reset_pin(&pin_GPIO_AD_09); //SWO
3736
// FLEX flash
3837
common_hal_never_reset_pin(&pin_GPIO_SD_12);
3938
common_hal_never_reset_pin(&pin_GPIO_SD_11);

ports/mimxrt10xx/boards/imxrt1010_evk/mpconfigboard.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77

88
#define BOARD_FLASH_SIZE (16 * 1024 * 1024)
99

10+
#define DEFAULT_SPI_BUS_SCK (&pin_GPIO_AD_06)
11+
#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO_AD_04)
12+
#define DEFAULT_SPI_BUS_MISO (&pin_GPIO_AD_03)
13+
1014
#define DEFAULT_I2C_BUS_SCL (&pin_GPIO_02)
1115
#define DEFAULT_I2C_BUS_SDA (&pin_GPIO_01)
1216

ports/mimxrt10xx/boards/imxrt1010_evk/pins.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44

55
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
66
{ MP_OBJ_NEW_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO_09) },
7-
{ MP_OBJ_NEW_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO_09) },
87
{ MP_OBJ_NEW_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO_10) },
9-
{ MP_OBJ_NEW_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO_10) },
108
{ MP_OBJ_NEW_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO_AD_05) },
119
{ MP_OBJ_NEW_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_GPIO_AD_06) },
1210
{ MP_OBJ_NEW_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO_08) },
@@ -20,9 +18,7 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
2018
{ MP_OBJ_NEW_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO_AD_03) },
2119
{ MP_OBJ_NEW_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO_AD_06) },
2220
{ MP_OBJ_NEW_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO_01) },
23-
{ MP_OBJ_NEW_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO_01) },
2421
{ MP_OBJ_NEW_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO_02) },
25-
{ MP_OBJ_NEW_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO_02) },
2622

2723
{ MP_OBJ_NEW_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO_AD_07) },
2824
{ MP_OBJ_NEW_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO_AD_09) },
@@ -31,6 +27,16 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
3127
{ MP_OBJ_NEW_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_GPIO_AD_01) },
3228
{ MP_OBJ_NEW_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_GPIO_AD_02) },
3329

30+
{ MP_OBJ_NEW_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO_09) },
31+
{ MP_OBJ_NEW_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO_10) },
32+
33+
{ MP_OBJ_NEW_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO_AD_04) },
34+
{ MP_OBJ_NEW_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO_AD_03) },
35+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO_AD_06) },
36+
37+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO_01) },
38+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO_02) },
39+
3440
{ MP_OBJ_NEW_QSTR(MP_QSTR_USER_LED), MP_ROM_PTR(&pin_GPIO_11) },
3541
{ MP_OBJ_NEW_QSTR(MP_QSTR_USER_SW), MP_ROM_PTR(&pin_GPIO_SD_05) },
3642

ports/mimxrt10xx/boards/imxrt1020_evk/board.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ void board_init(void) {
3333
// SWD Pins
3434
common_hal_never_reset_pin(&pin_GPIO_AD_B0_00);//SWDIO
3535
common_hal_never_reset_pin(&pin_GPIO_AD_B0_01);//SWCLK
36-
common_hal_never_reset_pin(&pin_GPIO_AD_B0_04);//SWO
3736

3837
// FLEX flash
3938
common_hal_never_reset_pin(&pin_GPIO_SD_B1_06);

ports/mimxrt10xx/boards/imxrt1060_evk/board.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ void board_init(void) {
3333
// SWD Pins
3434
common_hal_never_reset_pin(&pin_GPIO_AD_B0_06);//SWDIO
3535
common_hal_never_reset_pin(&pin_GPIO_AD_B0_07);//SWCLK
36-
common_hal_never_reset_pin(&pin_GPIO_AD_B0_10);//SWO
3736

3837
// FLEX flash
3938
common_hal_never_reset_pin(&pin_GPIO_SD_B1_00);

ports/mimxrt10xx/common-hal/busio/I2C.c

Lines changed: 80 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,32 @@
2727

2828
#include <stdio.h>
2929

30+
#include "shared-bindings/microcontroller/Pin.h"
31+
#include "shared-bindings/microcontroller/__init__.h"
3032
#include "shared-bindings/busio/I2C.h"
3133
#include "py/mperrno.h"
3234
#include "py/runtime.h"
3335
#include "periph.h"
3436

3537
#include "fsl_lpi2c.h"
38+
#include "fsl_gpio.h"
3639

3740
#define I2C_CLOCK_FREQ (CLOCK_GetFreq(kCLOCK_Usb1PllClk) / 8 / (1+CLOCK_GetDiv(kCLOCK_Lpi2cDiv)))
38-
41+
#define IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_ALT5 5U
42+
43+
//arrays use 0 based numbering: I2C1 is stored at index 0
44+
#define MAX_I2C 4
45+
STATIC bool reserved_i2c[MAX_I2C];
46+
STATIC bool never_reset_i2c[MAX_I2C];
47+
48+
void i2c_reset(void) {
49+
for(uint i = 0; i < MP_ARRAY_SIZE(mcu_i2c_banks); i++) {
50+
if (!never_reset_i2c[i]) {
51+
reserved_i2c[i] = false;
52+
LPI2C_MasterDeinit(mcu_i2c_banks[i]);
53+
}
54+
}
55+
}
3956

4057
static void config_periph_pin(const mcu_periph_obj_t *periph) {
4158
IOMUXC_SetPinMux(
@@ -56,11 +73,49 @@ static void config_periph_pin(const mcu_periph_obj_t *periph) {
5673
| IOMUXC_SW_PAD_CTL_PAD_SRE(0));
5774
}
5875

76+
static void i2c_check_pin_config(const mcu_pin_obj_t *pin, uint32_t pull)
77+
{
78+
IOMUXC_SetPinConfig(0, 0, 0, 0, pin->cfg_reg,
79+
IOMUXC_SW_PAD_CTL_PAD_HYS(1)
80+
| IOMUXC_SW_PAD_CTL_PAD_PUS(0) // Pulldown
81+
| IOMUXC_SW_PAD_CTL_PAD_PUE(pull) // 0=nopull (keeper), 1=pull
82+
| IOMUXC_SW_PAD_CTL_PAD_PKE(1)
83+
| IOMUXC_SW_PAD_CTL_PAD_ODE(0)
84+
| IOMUXC_SW_PAD_CTL_PAD_SPEED(2)
85+
| IOMUXC_SW_PAD_CTL_PAD_DSE(1)
86+
| IOMUXC_SW_PAD_CTL_PAD_SRE(0));
87+
}
88+
5989
void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
6090
const mcu_pin_obj_t *scl, const mcu_pin_obj_t *sda, uint32_t frequency, uint32_t timeout) {
6191

62-
const uint32_t sda_count = sizeof(mcu_i2c_sda_list) / sizeof(mcu_periph_obj_t);
63-
const uint32_t scl_count = sizeof(mcu_i2c_scl_list) / sizeof(mcu_periph_obj_t);
92+
#if CIRCUITPY_REQUIRE_I2C_PULLUPS
93+
// Test that the pins are in a high state. (Hopefully indicating they are pulled up.)
94+
IOMUXC_SetPinMux(sda->mux_reg, IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_ALT5, 0, 0, 0, 0);
95+
IOMUXC_SetPinMux(scl->mux_reg, IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_ALT5, 0, 0, 0, 0);
96+
i2c_check_pin_config(sda, 1);
97+
i2c_check_pin_config(scl, 1);
98+
const gpio_pin_config_t check_config = { kGPIO_DigitalInput, 0, kGPIO_NoIntmode };
99+
GPIO_PinInit(sda->gpio, sda->number, &check_config);
100+
GPIO_PinInit(scl->gpio, scl->number, &check_config);
101+
102+
common_hal_mcu_delay_us(10);
103+
104+
i2c_check_pin_config(sda, 0);
105+
i2c_check_pin_config(scl, 0);
106+
107+
// We must pull up within 3us to achieve 400khz.
108+
common_hal_mcu_delay_us(3);
109+
110+
if( !GPIO_PinRead(sda->gpio, sda->number) || !GPIO_PinRead(scl->gpio, scl->number)) {
111+
common_hal_reset_pin(sda);
112+
common_hal_reset_pin(scl);
113+
mp_raise_RuntimeError(translate("SDA or SCL needs a pull up"));
114+
}
115+
#endif
116+
117+
const uint32_t sda_count = MP_ARRAY_SIZE(mcu_i2c_sda_list);
118+
const uint32_t scl_count = MP_ARRAY_SIZE(mcu_i2c_scl_list);
64119

65120
for (uint32_t i = 0; i < sda_count; ++i) {
66121
if (mcu_i2c_sda_list[i].pin != sda)
@@ -73,21 +128,21 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
73128
if (mcu_i2c_scl_list[j].bank_idx != mcu_i2c_sda_list[i].bank_idx)
74129
continue;
75130

76-
self->sda_pin = &mcu_i2c_sda_list[i];
77-
self->scl_pin = &mcu_i2c_scl_list[j];
131+
self->sda = &mcu_i2c_sda_list[i];
132+
self->scl = &mcu_i2c_scl_list[j];
78133

79134
break;
80135
}
81136
}
82137

83-
if(self->sda_pin == NULL || self->scl_pin == NULL) {
84-
mp_raise_ValueError(translate("Invalid I2C pin selection"));
138+
if(self->sda == NULL || self->scl == NULL) {
139+
mp_raise_ValueError(translate("Invalid pins"));
85140
} else {
86-
self->i2c = mcu_i2c_banks[self->sda_pin->bank_idx - 1];
141+
self->i2c = mcu_i2c_banks[self->sda->bank_idx - 1];
87142
}
88143

89-
config_periph_pin(self->sda_pin);
90-
config_periph_pin(self->scl_pin);
144+
config_periph_pin(self->sda);
145+
config_periph_pin(self->scl);
91146

92147
lpi2c_master_config_t config = { 0 };
93148
LPI2C_MasterGetDefaultConfig(&config);
@@ -96,34 +151,35 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
96151

97152
LPI2C_MasterInit(self->i2c, &config, I2C_CLOCK_FREQ);
98153

99-
#if CIRCUITPY_REQUIRE_I2C_PULLUPS
100-
// if (!gpio_get_pin_level(sda->number) || !gpio_get_pin_level(scl->number)) {
101-
// reset_pin_number(sda->number);
102-
// reset_pin_number(scl->number);
103-
// mp_raise_RuntimeError(translate("SDA or SCL needs a pull up"));
104-
// }
105-
#endif
154+
claim_pin(self->sda->pin);
155+
claim_pin(self->scl->pin);
156+
}
157+
158+
void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) {
159+
never_reset_i2c[self->sda->bank_idx - 1] = true;
106160

107-
claim_pin(self->sda_pin->pin);
108-
claim_pin(self->scl_pin->pin);
161+
common_hal_never_reset_pin(self->sda->pin);
162+
common_hal_never_reset_pin(self->scl->pin);
109163
}
110164

111165
bool common_hal_busio_i2c_deinited(busio_i2c_obj_t *self) {
112-
return self->sda_pin == NULL;
166+
return self->sda == NULL;
113167
}
114168

115169
void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) {
116170
if (common_hal_busio_i2c_deinited(self)) {
117171
return;
118172
}
173+
reserved_i2c[self->sda->bank_idx - 1] = false;
174+
never_reset_i2c[self->sda->bank_idx - 1] = false;
119175

120176
LPI2C_MasterDeinit(self->i2c);
121177

122-
// reset_pin_number(self->sda_pin);
123-
// reset_pin_number(self->scl_pin);
178+
common_hal_reset_pin(self->sda->pin);
179+
common_hal_reset_pin(self->scl->pin);
124180

125-
self->sda_pin = NULL;
126-
self->scl_pin = NULL;
181+
self->sda = NULL;
182+
self->scl = NULL;
127183
}
128184

129185
bool common_hal_busio_i2c_probe(busio_i2c_obj_t *self, uint8_t addr) {
@@ -183,10 +239,3 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr,
183239

184240
return MP_EIO;
185241
}
186-
187-
void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) {
188-
// never_reset_sercom(self->i2c_desc.device.hw);
189-
//
190-
// never_reset_pin_number(self->scl_pin);
191-
// never_reset_pin_number(self->sda_pin);
192-
}

ports/mimxrt10xx/common-hal/busio/I2C.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ typedef struct {
3737
mp_obj_base_t base;
3838
LPI2C_Type *i2c;
3939
bool has_lock;
40-
const mcu_periph_obj_t *scl_pin;
41-
const mcu_periph_obj_t *sda_pin;
40+
const mcu_periph_obj_t *scl;
41+
const mcu_periph_obj_t *sda;
4242
} busio_i2c_obj_t;
4343

4444
#endif // MICROPY_INCLUDED_MIMXRT10XX_COMMON_HAL_BUSIO_I2C_H

ports/mimxrt10xx/common-hal/busio/SPI.c

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
* THE SOFTWARE.
2626
*/
2727

28+
#include "shared-bindings/microcontroller/Pin.h"
29+
#include "shared-bindings/microcontroller/__init__.h"
2830
#include "shared-bindings/busio/SPI.h"
2931
#include "py/mperrno.h"
3032
#include "py/runtime.h"
@@ -34,6 +36,8 @@
3436

3537
#include <stdio.h>
3638

39+
#define LPSPI_MASTER_CLK_FREQ (CLOCK_GetFreq(kCLOCK_Usb1PllPfd0Clk) / (CLOCK_GetDiv(kCLOCK_LpspiDiv) + 1))
40+
3741
//arrays use 0 based numbering: SPI1 is stored at index 0
3842
#define MAX_SPI 4
3943
STATIC bool reserved_spi[MAX_SPI];
@@ -58,11 +62,12 @@ STATIC void config_periph_pin(const mcu_periph_obj_t *periph) {
5862
| IOMUXC_SW_PAD_CTL_PAD_SRE(0));
5963
}
6064

61-
#define LPSPI_MASTER_CLK_FREQ (CLOCK_GetFreq(kCLOCK_Usb1PllPfd0Clk) / (CLOCK_GetDiv(kCLOCK_LpspiDiv) + 1))
62-
6365
void spi_reset(void) {
64-
for (int i = 0; i < MAX_SPI; i++) {
65-
reserved_spi[i] = false;
66+
for (uint i = 0; i < MP_ARRAY_SIZE(mcu_spi_banks); i++) {
67+
if (!never_reset_spi[i]) {
68+
reserved_spi[i] = false;
69+
LPSPI_Deinit(mcu_spi_banks[i]);
70+
}
6671
}
6772
}
6873

@@ -192,7 +197,14 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
192197
}
193198

194199
void common_hal_busio_spi_never_reset(busio_spi_obj_t *self) {
195-
// TODO
200+
never_reset_spi[self->clock->bank_idx - 1] = true;
201+
common_hal_never_reset_pin(self->clock->pin);
202+
if (self->mosi != NULL) {
203+
common_hal_never_reset_pin(self->mosi->pin);
204+
}
205+
if (self->miso != NULL) {
206+
common_hal_never_reset_pin(self->miso->pin);
207+
}
196208
}
197209

198210
bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) {
@@ -203,8 +215,20 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) {
203215
if (common_hal_busio_spi_deinited(self)) {
204216
return;
205217
}
218+
LPSPI_Deinit(self->spi);
219+
reserved_spi[self->clock->bank_idx - 1] = false;
220+
never_reset_spi[self->clock->bank_idx - 1] = false;
206221

222+
common_hal_reset_pin(self->clock->pin);
223+
if (self->mosi != NULL) {
224+
common_hal_reset_pin(self->mosi->pin);
225+
}
226+
if (self->miso != NULL) {
227+
common_hal_reset_pin(self->miso->pin);
228+
}
207229
self->clock = NULL;
230+
self->mosi = NULL;
231+
self->miso = NULL;
208232
}
209233

210234
bool common_hal_busio_spi_configure(busio_spi_obj_t *self,

ports/mimxrt10xx/common-hal/busio/UART.c

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
* THE SOFTWARE.
2626
*/
2727

28+
#include "shared-bindings/microcontroller/Pin.h"
2829
#include "shared-bindings/microcontroller/__init__.h"
2930
#include "shared-bindings/busio/UART.h"
3031

@@ -73,6 +74,13 @@ void LPUART_UserCallback(LPUART_Type *base, lpuart_handle_t *handle, status_t st
7374
}
7475
}
7576

77+
void uart_reset(void) {
78+
for(uint i = 0; i < MP_ARRAY_SIZE(mcu_uart_banks); i++) {
79+
reserved_uart[i] = false;
80+
LPUART_Deinit(mcu_uart_banks[i]);
81+
}
82+
}
83+
7684
void common_hal_busio_uart_construct(busio_uart_obj_t *self,
7785
const mcu_pin_obj_t * tx, const mcu_pin_obj_t * rx,
7886
const mcu_pin_obj_t * rts, const mcu_pin_obj_t * cts,
@@ -278,13 +286,21 @@ void common_hal_busio_uart_deinit(busio_uart_obj_t *self) {
278286
if (common_hal_busio_uart_deinited(self)) {
279287
return;
280288
}
281-
289+
if (self->rx) {
290+
reserved_uart[self->rx->bank_idx - 1] = false;
291+
} else {
292+
reserved_uart[self->tx->bank_idx - 1] = false;
293+
}
294+
282295
LPUART_Deinit(self->uart);
283-
284296
gc_free(self->ringbuf);
285297

286-
// reset_pin_number(self->rx);
287-
// reset_pin_number(self->tx);
298+
if (self->rx) {
299+
common_hal_reset_pin(self->rx->pin);
300+
}
301+
if (self->tx) {
302+
common_hal_reset_pin(self->tx->pin);
303+
}
288304

289305
self->rx = NULL;
290306
self->tx = NULL;

ports/mimxrt10xx/common-hal/microcontroller/Pin.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*
66
* Copyright (c) 2016 Scott Shawcroft for Adafruit Industries
77
* Copyright (c) 2019 Artur Pacholec
8+
* Copyright (c) 2020 Lucian Copeland for Adafruit Industries
89
*
910
* Permission is hereby granted, free of charge, to any person obtaining a copy
1011
* of this software and associated documentation files (the "Software"), to deal

0 commit comments

Comments
 (0)