summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/atmel-samd/common-hal/busio/I2C.c44
-rw-r--r--ports/atmel-samd/common-hal/busio/I2C.h3
2 files changed, 26 insertions, 21 deletions
diff --git a/ports/atmel-samd/common-hal/busio/I2C.c b/ports/atmel-samd/common-hal/busio/I2C.c
index 8bfa8ddd2..c0643865d 100644
--- a/ports/atmel-samd/common-hal/busio/I2C.c
+++ b/ports/atmel-samd/common-hal/busio/I2C.c
@@ -39,39 +39,41 @@
// Number of times to try to send packet if failed.
#define ATTEMPTS 2
-void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
- const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda, uint32_t frequency, uint32_t timeout) {
- #ifdef PIRKEY_M0
- mp_raise_NotImplementedError(translate("Not enough pins available"));
- return;
- #endif
- Sercom* sercom = NULL;
- uint8_t sercom_index;
- uint32_t sda_pinmux = 0;
- uint32_t scl_pinmux = 0;
+Sercom *samd_i2c_get_sercom(const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda,
+ uint8_t *sercom_index, uint32_t *sda_pinmux, uint32_t *scl_pinmux) {
+ *sda_pinmux = 0;
+ *scl_pinmux = 0;
for (int i = 0; i < NUM_SERCOMS_PER_PIN; i++) {
- sercom_index = sda->sercom[i].index;
- if (sercom_index >= SERCOM_INST_NUM) {
+ *sercom_index = sda->sercom[i].index;
+ if (*sercom_index >= SERCOM_INST_NUM) {
continue;
}
- Sercom* potential_sercom = sercom_insts[sercom_index];
+ Sercom* potential_sercom = sercom_insts[*sercom_index];
if (potential_sercom->I2CM.CTRLA.bit.ENABLE != 0 ||
sda->sercom[i].pad != 0) {
continue;
}
- sda_pinmux = PINMUX(sda->number, (i == 0) ? MUX_C : MUX_D);
+ *sda_pinmux = PINMUX(sda->number, (i == 0) ? MUX_C : MUX_D);
for (int j = 0; j < NUM_SERCOMS_PER_PIN; j++) {
- if (sercom_index == scl->sercom[j].index &&
+ if (*sercom_index == scl->sercom[j].index &&
scl->sercom[j].pad == 1) {
- scl_pinmux = PINMUX(scl->number, (j == 0) ? MUX_C : MUX_D);
- sercom = potential_sercom;
- break;
+ *scl_pinmux = PINMUX(scl->number, (j == 0) ? MUX_C : MUX_D);
+ return potential_sercom;
}
}
- if (sercom != NULL) {
- break;
- }
}
+ return NULL;
+}
+
+void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
+ const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda, uint32_t frequency, uint32_t timeout) {
+ #ifdef PIRKEY_M0
+ mp_raise_NotImplementedError(translate("Not enough pins available"));
+ return;
+ #endif
+ uint8_t sercom_index;
+ uint32_t sda_pinmux, scl_pinmux;
+ Sercom* sercom = samd_i2c_get_sercom(scl, sda, &sercom_index, &sda_pinmux, &scl_pinmux);
if (sercom == NULL) {
mp_raise_ValueError(translate("Invalid pins"));
}
diff --git a/ports/atmel-samd/common-hal/busio/I2C.h b/ports/atmel-samd/common-hal/busio/I2C.h
index 2401d9247..366c6c469 100644
--- a/ports/atmel-samd/common-hal/busio/I2C.h
+++ b/ports/atmel-samd/common-hal/busio/I2C.h
@@ -41,4 +41,7 @@ typedef struct {
uint8_t sda_pin;
} busio_i2c_obj_t;
+extern Sercom *samd_i2c_get_sercom(const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda,
+ uint8_t *sercom_index, uint32_t *sda_pinmux, uint32_t *scl_pinmux);
+
#endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_BUSIO_I2C_H