From 18e3ba9558902425c91f778ccf2ffbf39053ba68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Sat, 26 May 2018 22:37:10 +0200 Subject: [PATCH] Merge recoverI2c() and recoverI2cEeprom() as recoverI2cBus(), add i2c_bus_t. --- lib/agent | 2 +- right/src/init_peripherals.c | 75 ++++++++++++++++-------------------- right/src/init_peripherals.h | 12 ++++++ 3 files changed, 46 insertions(+), 43 deletions(-) diff --git a/lib/agent b/lib/agent index 1035837..65ea786 160000 --- a/lib/agent +++ b/lib/agent @@ -1 +1 @@ -Subproject commit 1035837b3b4d02aa93b8611e24e901fe6f126d4d +Subproject commit 65ea786358c9ab1561626cc5c04bfa9dc76a30b8 diff --git a/right/src/init_peripherals.c b/right/src/init_peripherals.c index a4d6c6c..a88aed0 100644 --- a/right/src/init_peripherals.c +++ b/right/src/init_peripherals.c @@ -21,6 +21,26 @@ bool IsBusPalOn; volatile uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE; volatile uint32_t I2cMainBusActualBaudRateBps; +static i2c_bus_t i2cMainBus = { + .sdaGpio = I2C_MAIN_BUS_SDA_GPIO, + .sdaPort = I2C_MAIN_BUS_SDA_PORT, + .sdaPin = I2C_MAIN_BUS_SDA_PIN, + + .sclGpio = I2C_MAIN_BUS_SCL_GPIO, + .sclPort = I2C_MAIN_BUS_SCL_PORT, + .sclPin = I2C_MAIN_BUS_SCL_PIN, +}; + +static i2c_bus_t i2cEepromBus = { + .sdaGpio = I2C_EEPROM_BUS_SDA_GPIO, + .sdaPort = I2C_EEPROM_BUS_SDA_PORT, + .sdaPin = I2C_EEPROM_BUS_SDA_PIN, + + .sclGpio = I2C_EEPROM_BUS_SCL_GPIO, + .sclPort = I2C_EEPROM_BUS_SCL_PORT, + .sclPin = I2C_EEPROM_BUS_SCL_PIN, +}; + static void initBusPalState(void) { IsBusPalOn = Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal; if (IsBusPalOn) { @@ -45,61 +65,32 @@ static void delay(void) for (volatile uint32_t i=0; i<62; i++); } -static void recoverI2c(void) +static void recoverI2cBus(i2c_bus_t *i2cBus) { - PORT_SetPinMux(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, kPORT_MuxAsGpio); - PORT_SetPinMux(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, kPORT_MuxAsGpio); - GPIO_PinInit(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); + PORT_SetPinMux(i2cBus->sdaPort, i2cBus->sdaPin, kPORT_MuxAsGpio); + PORT_SetPinMux(i2cBus->sclPort, i2cBus->sclPin, kPORT_MuxAsGpio); + GPIO_PinInit(i2cBus->sclGpio, i2cBus->sclPin, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); bool isOn = true; for (int i=0; i<20; i++) { - GPIO_PinInit(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalInput}); - bool isSdaHigh = GPIO_ReadPinInput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN); - GPIO_PinInit(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); + GPIO_PinInit(i2cBus->sdaGpio, i2cBus->sdaPin, &(gpio_pin_config_t){kGPIO_DigitalInput}); + bool isSdaHigh = GPIO_ReadPinInput(i2cBus->sdaGpio, i2cBus->sdaPin); + GPIO_PinInit(i2cBus->sdaGpio, i2cBus->sdaPin, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); if (isSdaHigh) { return; } - GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, isOn); + GPIO_WritePinOutput(i2cBus->sclGpio, i2cBus->sclPin, isOn); delay(); isOn = !isOn; } - GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 0); + GPIO_WritePinOutput(i2cBus->sdaGpio, i2cBus->sdaPin, 0); delay(); - GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, 1); + GPIO_WritePinOutput(i2cBus->sclGpio, i2cBus->sclPin, 1); delay(); - GPIO_WritePinOutput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, 1); - delay(); -} - -static void recoverI2cEeprom(void) -{ - PORT_SetPinMux(I2C_EEPROM_BUS_SDA_PORT, I2C_EEPROM_BUS_SDA_PIN, kPORT_MuxAsGpio); - PORT_SetPinMux(I2C_EEPROM_BUS_SCL_PORT, I2C_EEPROM_BUS_SCL_PIN, kPORT_MuxAsGpio); - GPIO_PinInit(I2C_EEPROM_BUS_SCL_GPIO, I2C_EEPROM_BUS_SCL_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); - - bool isOn = true; - for (int i=0; i<20; i++) { - GPIO_PinInit(I2C_EEPROM_BUS_SDA_GPIO, I2C_EEPROM_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalInput}); - bool isSdaHigh = GPIO_ReadPinInput(I2C_EEPROM_BUS_SDA_GPIO, I2C_EEPROM_BUS_SDA_PIN); - GPIO_PinInit(I2C_EEPROM_BUS_SDA_GPIO, I2C_EEPROM_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); - - if (isSdaHigh) { - return; - } - - GPIO_WritePinOutput(I2C_EEPROM_BUS_SCL_GPIO, I2C_EEPROM_BUS_SCL_PIN, isOn); - delay(); - isOn = !isOn; - } - - GPIO_WritePinOutput(I2C_EEPROM_BUS_SDA_GPIO, I2C_EEPROM_BUS_SDA_PIN, 0); - delay(); - GPIO_WritePinOutput(I2C_EEPROM_BUS_SCL_GPIO, I2C_EEPROM_BUS_SCL_PIN, 1); - delay(); - GPIO_WritePinOutput(I2C_EEPROM_BUS_SDA_GPIO, I2C_EEPROM_BUS_SDA_PIN, 1); + GPIO_WritePinOutput(i2cBus->sdaGpio, i2cBus->sdaPin, 1); delay(); } @@ -108,7 +99,7 @@ static void initI2cMainBus(void) CLOCK_EnableClock(I2C_MAIN_BUS_SDA_CLOCK); CLOCK_EnableClock(I2C_MAIN_BUS_SCL_CLOCK); - recoverI2c(); + recoverI2cBus(&i2cMainBus); port_pin_config_t pinConfig = { .pullSelect = kPORT_PullUp, @@ -145,7 +136,7 @@ static void initI2cEepromBus(void) CLOCK_EnableClock(I2C_EEPROM_BUS_SDA_CLOCK); CLOCK_EnableClock(I2C_EEPROM_BUS_SCL_CLOCK); - recoverI2cEeprom(); + recoverI2cBus(&i2cEepromBus); PORT_SetPinConfig(I2C_EEPROM_BUS_SDA_PORT, I2C_EEPROM_BUS_SDA_PIN, &pinConfig); PORT_SetPinConfig(I2C_EEPROM_BUS_SCL_PORT, I2C_EEPROM_BUS_SCL_PIN, &pinConfig); diff --git a/right/src/init_peripherals.h b/right/src/init_peripherals.h index 0d66399..8e79f86 100644 --- a/right/src/init_peripherals.h +++ b/right/src/init_peripherals.h @@ -5,6 +5,18 @@ #include "fsl_common.h" +// Typedefs + +typedef struct { + GPIO_Type *sdaGpio; + PORT_Type *sdaPort; + uint32_t sdaPin; + + GPIO_Type *sclGpio; + PORT_Type *sclPort; + uint32_t sclPin; +} i2c_bus_t; + // Variables: extern bool IsBusPalOn;