diff --git a/boot.c b/boot.c index 3646a0a0..8b8236aa 100644 --- a/boot.c +++ b/boot.c @@ -398,7 +398,7 @@ void setup_i2c(void) __banked reg_read_m(RTL837X_PIN_MUX_1); for (uint8_t sfp = 0; sfp < machine.n_sfp; sfp++) { uint8_t i2c = machine.sfp_port[sfp].i2c; - uint8_t scl_bus = (i2c >> RTL837X_REG_I2C_SCL_SHIFT) & 0x03; + uint8_t scl_bus = (i2c >> RTL837X_REG_I2C_SCL_SHIFT) & 0x07; uint8_t sda_bus = (i2c >> RTL837X_REG_I2C_SDA_SHIFT) & 0x07; print_string("Configuring I2C for SFP idx="); print_byte(sfp); print_string(" SCL="); print_byte(scl_bus); print_string(", SDA="); print_byte(sda_bus); write_char('\n'); switch (scl_bus) { diff --git a/machine.c b/machine.c index 9ce62920..5830ff27 100644 --- a/machine.c +++ b/machine.c @@ -5,22 +5,28 @@ #include "rtl837x_regs.h" #include "rtl837x_common.h" +#define I2CBUS_INVALID (7) +// This is a MACRO to check if I2C_BUS_FROM_SDA_PIN or I2C_BUS_FROM_SCL_PIN don't return I2CBUS_INVALID. +// When I2CBUS_INVALID is returned, compiler stops with "machine.c:: error 176: sizeof applied to an incomplete type" +#define I2CBUS_VALID(bus) (0 * sizeof(char[(bus) != I2CBUS_INVALID ? 1 : 0])) #define I2CBUS(sda, scl) \ - ((uint8_t)((I2C_BUS_FROM_SCL_PIN(scl) << RTL837X_REG_I2C_SCL_SHIFT) | \ - (I2C_BUS_FROM_SDA_PIN(sda) << RTL837X_REG_I2C_SDA_SHIFT))) + ((uint8_t)((I2C_BUS_FROM_SCL_PIN(scl) << RTL837X_REG_I2C_SCL_SHIFT) | \ + (I2C_BUS_FROM_SDA_PIN(sda) << RTL837X_REG_I2C_SDA_SHIFT) | \ + I2CBUS_VALID(I2C_BUS_FROM_SCL_PIN(scl)) | \ + I2CBUS_VALID(I2C_BUS_FROM_SDA_PIN(sda)))) #define I2C_BUS_FROM_SDA_PIN(sda_pin) \ - ((sda_pin) == GPIO47_I2C_SDA0 ? (uint8_t)0 : \ - (sda_pin) == GPIO49_I2C_SDA1 ? (uint8_t)1 : \ - (sda_pin) == GPIO51_I2C_SDA2_UART1_RX ? (uint8_t)2 : \ - (sda_pin) == GPIO41_I2C_SDA3_MDIO1 ? (uint8_t)3 : \ - (sda_pin) == GPIO39_I2C_SDA4 ? (uint8_t)4 : -1) + ((sda_pin) == GPIO47_I2C_SDA0 ? 0 : \ + (sda_pin) == GPIO49_I2C_SDA1 ? 1 : \ + (sda_pin) == GPIO51_I2C_SDA2_UART1_RX ? 2 : \ + (sda_pin) == GPIO41_I2C_SDA3_MDIO1 ? 3 : \ + (sda_pin) == GPIO39_I2C_SDA4 ? 4 : I2CBUS_INVALID) #define I2C_BUS_FROM_SCL_PIN(scl_pin) \ ((scl_pin) == GPIO46_I2C_SCL0 ? 0 : \ (scl_pin) == GPIO48_I2C_SCL1 ? 1 : \ (scl_pin) == GPIO50_I2C_SCL2_UART1_TX ? 2 : \ - (scl_pin) == GPIO40_I2C_SCL3_MDC1 ? 3 : -1) + (scl_pin) == GPIO40_I2C_SCL3_MDC1 ? 3 : I2CBUS_INVALID) #if defined(MACHINE_KP_9000_6XHML_X2) || \ defined(MACHINE_KP_9000_6XH_X2_V1_1) || \