From b6822b86ac2627bb85df6fce5344a2078507d366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Date: Wed, 25 Jul 2018 22:25:18 +0200 Subject: [PATCH] busio/I2C: Split out samd_i2c_get_sercom() It will be shared with I2CSlave. --- ports/atmel-samd/common-hal/busio/I2C.c | 54 +++++++++++++------------ ports/atmel-samd/common-hal/busio/I2C.h | 3 ++ 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/ports/atmel-samd/common-hal/busio/I2C.c b/ports/atmel-samd/common-hal/busio/I2C.c index 8bfa8ddd28..c0643865d6 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 +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) { + continue; + } + 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); + for (int j = 0; j < NUM_SERCOMS_PER_PIN; j++) { + if (*sercom_index == scl->sercom[j].index && + scl->sercom[j].pad == 1) { + *scl_pinmux = PINMUX(scl->number, (j == 0) ? MUX_C : MUX_D); + return potential_sercom; + } + } + } + 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 - Sercom* sercom = NULL; uint8_t sercom_index; - uint32_t sda_pinmux = 0; - uint32_t 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) { - continue; - } - 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); - for (int j = 0; j < NUM_SERCOMS_PER_PIN; j++) { - 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; - } - } - if (sercom != NULL) { - break; - } - } + 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 2401d92471..366c6c469d 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