diff --git a/firmware/ec/inc/devices/led.h b/firmware/ec/inc/devices/led.h index 01d592279b..3ad1217d8c 100644 --- a/firmware/ec/inc/devices/led.h +++ b/firmware/ec/inc/devices/led.h @@ -23,6 +23,8 @@ * MACRO DEFINITIONS *****************************************************************************/ #define LED_OFF 0xFF +#define LED_RED 0xAA +#define LED_GREEN 0x55 /* ClkX = fOSC/(2^(RegMisc[6:4]-1); 0x50-125kHz, 0x40-250KHz, 0x30-500KHz, * 0x20-1MHz, 0x10-2MHz; Fading - Linear */ @@ -84,5 +86,8 @@ ReturnStatus hci_led_system_boot(const HciLedCfg *driver); ReturnStatus led_init(const HciLedCfg *driver); ePostCode led_probe(const HciLedCfg *driver, POSTData *postData); void led_configure(HciLedCfg *driver); - +ReturnStatus hci_led_backhaul_failure(const HciLedCfg *driver); +ReturnStatus hci_led_radio_failure(const HciLedCfg *driver); +ReturnStatus hci_led_system_failure(const HciLedCfg *driver); +ReturnStatus hci_led_system_running(const HciLedCfg *driver); #endif /* INA226_H_ */ diff --git a/firmware/ec/src/devices/led.c b/firmware/ec/src/devices/led.c index 31fcf7ade8..acb70f3391 100644 --- a/firmware/ec/src/devices/led.c +++ b/firmware/ec/src/devices/led.c @@ -189,15 +189,18 @@ static const hciLedData ledData[HCI_LED_TOTAL_NOS] = *****************************************************************************/ ReturnStatus hci_led_turnon_green(const HciLedCfg *driver) { - ReturnStatus status = RETURN_OK; + ReturnStatus status = RETURN_NOTOK; + if (!driver) { + return status; + } /* Turn On Left side Green LEDs */ status = ioexp_led_set_data(&driver->sx1509_dev[HCI_LED_DRIVER_LEFT], - SX1509_REG_AB, 0x55, 0x55); + SX1509_REG_AB, LED_GREEN, LED_GREEN); if (status == RETURN_OK) { /* Turn On Right side Green LEDs */ status = ioexp_led_set_data(&driver->sx1509_dev[HCI_LED_DRIVER_RIGHT], - SX1509_REG_AB, 0x55, 0x55); + SX1509_REG_AB, LED_GREEN, 0x55); } return status; } @@ -214,15 +217,18 @@ ReturnStatus hci_led_turnon_green(const HciLedCfg *driver) *****************************************************************************/ ReturnStatus hci_led_turnon_red(const HciLedCfg *driver) { - ReturnStatus status = RETURN_OK; + ReturnStatus status = RETURN_NOTOK; + if (!driver) { + return status; + } /* Turn On Left side Red LEDs */ status = ioexp_led_set_data(&driver->sx1509_dev[HCI_LED_DRIVER_LEFT], - SX1509_REG_AB, 0xAA, 0xAA); + SX1509_REG_AB, LED_RED, LED_RED); if (status == RETURN_OK) { /* Turn On Right side Red LEDs */ status = ioexp_led_set_data(&driver->sx1509_dev[HCI_LED_DRIVER_RIGHT], - SX1509_REG_AB, 0xAA, 0xAA); + SX1509_REG_AB, LED_RED, LED_RED); } return status; } @@ -239,8 +245,11 @@ ReturnStatus hci_led_turnon_red(const HciLedCfg *driver) *****************************************************************************/ ReturnStatus hci_led_turnoff_all(const HciLedCfg *driver) { - ReturnStatus status = RETURN_OK; + ReturnStatus status = RETURN_NOTOK; + if (!driver) { + return status; + } /* Turn Off Left side LEDs */ status = ioexp_led_set_data(&driver->sx1509_dev[HCI_LED_DRIVER_LEFT], SX1509_REG_AB, LED_OFF, LED_OFF); @@ -264,9 +273,12 @@ ReturnStatus hci_led_turnoff_all(const HciLedCfg *driver) *****************************************************************************/ static ReturnStatus hci_led_configure_sx1509_onofftime(const I2C_Dev *ioexpDev) { - ReturnStatus status = RETURN_OK; uint8_t index; + ReturnStatus status = RETURN_NOTOK; + if (!ioexpDev) { + return status; + } for (index = 0; index < 14; index++) { /* Configure RegTOn time of LEDs */ status = ioexp_led_set_on_time(ioexpDev, index, REG_T_ON_VALUE); @@ -282,7 +294,54 @@ static ReturnStatus hci_led_configure_sx1509_onofftime(const I2C_Dev *ioexpDev) } return status; } +/***************************************************************************** + ** FUNCTION NAME : hci_led_configure_onofftime_left + ** + ** DESCRIPTION : Configure On and Off time of left LEDs on the LED + *board. + ** + ** ARGUMENTS : None + ** + ** RETURN TYPE : Success or Failure + ** + *****************************************************************************/ +static ReturnStatus hci_led_configure_onofftime_left(const HciLedCfg *driver) +{ + ReturnStatus status = RETURN_NOTOK; + if (!driver) { + return status; + } + /* Configure LED driver parameters(RegTOn, RegOff) for Left side LEDs */ + status = hci_led_configure_sx1509_onofftime( + &driver->sx1509_dev[HCI_LED_DRIVER_LEFT]); + + return status; +} +/***************************************************************************** + ** FUNCTION NAME : hci_led_configure_onofftime_right + ** + ** DESCRIPTION : Configure On and Off time of right LEDs on the LED + *board. + ** + ** ARGUMENTS : None + ** + ** RETURN TYPE : Success or Failure + ** + *****************************************************************************/ +static ReturnStatus hci_led_configure_onofftime_right(const HciLedCfg *driver) +{ + ReturnStatus status = RETURN_NOTOK; + + if (!driver) { + return status; + } + /* Configure LED driver parameters(RegTOn, RegOff) for Left side LEDs */ + status = hci_led_configure_sx1509_onofftime( + &driver->sx1509_dev[HCI_LED_DRIVER_RIGHT]); + + return status; +} /***************************************************************************** ** FUNCTION NAME : hci_led_configure_onofftime ** @@ -295,16 +354,17 @@ static ReturnStatus hci_led_configure_sx1509_onofftime(const I2C_Dev *ioexpDev) *****************************************************************************/ static ReturnStatus hci_led_configure_onofftime(const HciLedCfg *driver) { - ReturnStatus status = RETURN_OK; + ReturnStatus status = RETURN_NOTOK; + if (!driver) { + return status; + } /* Configure LED driver parameters(RegTOn, RegOff) for Left side LEDs */ - status = hci_led_configure_sx1509_onofftime( - &driver->sx1509_dev[HCI_LED_DRIVER_LEFT]); + status = hci_led_configure_onofftime_left(driver); if (status == RETURN_OK) { /* Configure LED driver parameters(RegTOn, RegOff) for Right side LEDs */ - hci_led_configure_sx1509_onofftime( - &driver->sx1509_dev[HCI_LED_DRIVER_RIGHT]); + status = hci_led_configure_onofftime_right(driver); } return status; } @@ -322,10 +382,13 @@ static ReturnStatus hci_led_configure_onofftime(const HciLedCfg *driver) *****************************************************************************/ ReturnStatus hci_led_system_boot(const HciLedCfg *driver) { - ReturnStatus status = RETURN_OK; uint8_t index = 0; uint8_t regValue = 0; + ReturnStatus status = RETURN_NOTOK; + if (!driver) { + return status; + } /* Turn off all LEDs */ status = hci_led_turnoff_all(driver); if (status != RETURN_OK) { @@ -364,8 +427,11 @@ ReturnStatus hci_led_system_boot(const HciLedCfg *driver) *****************************************************************************/ ReturnStatus hci_led_system_running(const HciLedCfg *driver) { - ReturnStatus status = RETURN_OK; + ReturnStatus status = RETURN_NOTOK; + if (!driver) { + return status; + } /* Turn off all LEDs */ status = hci_led_turnoff_all(driver); if (status != RETURN_OK) { @@ -397,8 +463,11 @@ ReturnStatus hci_led_system_running(const HciLedCfg *driver) *****************************************************************************/ ReturnStatus hci_led_system_failure(const HciLedCfg *driver) { - ReturnStatus status = RETURN_OK; + ReturnStatus status = RETURN_NOTOK; + if (!driver) { + return status; + } /* Turn off all LEDs */ status = hci_led_turnoff_all(driver); if (status != RETURN_OK) { @@ -430,14 +499,21 @@ ReturnStatus hci_led_system_failure(const HciLedCfg *driver) *****************************************************************************/ ReturnStatus hci_led_radio_failure(const HciLedCfg *driver) { - ReturnStatus status = RETURN_OK; + ReturnStatus status = RETURN_NOTOK; + if (!driver) { + return status; + } /* Turn off all LEDs */ status = hci_led_turnoff_all(driver); + /* Enable blink for the left LEDs */ + if (status == RETURN_OK) { + status = hci_led_configure_onofftime_left(driver); + } if (status == RETURN_OK) { /* Turn On Left side Red LEDs */ - status = - ioexp_led_set_data(HCI_LED_DRIVER_LEFT, SX1509_REG_AB, 0xAA, 0xAA); + status = ioexp_led_set_data(&driver->sx1509_dev[HCI_LED_DRIVER_LEFT], + SX1509_REG_AB, LED_RED, LED_RED); } return status; @@ -456,14 +532,21 @@ ReturnStatus hci_led_radio_failure(const HciLedCfg *driver) *****************************************************************************/ ReturnStatus hci_led_backhaul_failure(const HciLedCfg *driver) { - ReturnStatus status = RETURN_OK; + ReturnStatus status = RETURN_NOTOK; + if (!driver) { + return status; + } /* Turn off all LEDs */ status = hci_led_turnoff_all(driver); + /* Enable blink for all Right LEDs */ + if (status == RETURN_OK) { + status = hci_led_configure_onofftime_right(driver); + } if (status == RETURN_OK) { /* Turn On Right side Red LEDs */ status = ioexp_led_set_data(&driver->sx1509_dev[HCI_LED_DRIVER_RIGHT], - SX1509_REG_AB, 0xAA, 0xAA); + SX1509_REG_AB, LED_RED, LED_RED); } return status; } @@ -481,15 +564,18 @@ ReturnStatus hci_led_backhaul_failure(const HciLedCfg *driver) *****************************************************************************/ ReturnStatus led_init(const HciLedCfg *driver) { - ReturnStatus status = RETURN_OK; uint8_t index; + ReturnStatus status = RETURN_NOTOK; + if (!driver) { + return status; + } /* Steps required to use the LED driver - Disable input buffer (RegInputDisable) - Disable pull-up (RegPullUp) - Enable open drain (RegOpenDrain) - - Set direction to output (RegDir) by default RegData is set high => LED - OFF + - Set direction to output (RegDir) \96 by default RegData is set high => + LED OFF - Enable oscillator (RegClock) - Configure LED driver clock and mode if relevant (RegMisc) - Enable LED driver operation (RegLEDDriverEnable) @@ -569,6 +655,9 @@ ReturnStatus led_init(const HciLedCfg *driver) void led_configure(HciLedCfg *driver) { /* Initialize IO pins */ + if (!driver) { + return; + } OcGpio_configure(&driver->pin_ec_gpio, OCGPIO_CFG_OUTPUT | OCGPIO_CFG_OUT_HIGH); } @@ -585,9 +674,12 @@ void led_configure(HciLedCfg *driver) *****************************************************************************/ ePostCode led_probe(const HciLedCfg *driver, POSTData *postData) { - ReturnStatus status = RETURN_NOTOK; + ReturnStatus status = POST_DEV_MISSING; uint8_t regValue = 0x00; + if (!(driver && postData)) { + return status; + } /* Read Test Register 1 of LED driver SX1509 of Left LED Module(RegTest1) */ status = ioexp_led_read_testregister_1( &driver->sx1509_dev[HCI_LED_DRIVER_LEFT], ®Value); diff --git a/firmware/ec/test/Makefile b/firmware/ec/test/Makefile index 1a789e8596..05cf51c475 100644 --- a/firmware/ec/test/Makefile +++ b/firmware/ec/test/Makefile @@ -196,6 +196,10 @@ $(PATHB)Test_ocmp_debugocgpio$(TARGET_EXTENSION): $(STD_FILES) $(TEST_OCMP_DEBUG TEST_OCMP_DATXXR5A_SRC=$(OCWARE_ROOT)/src/devices/ocmp_wrappers/ocmp_dat-xxr5a-pp.c $(OCWARE_ROOT)/src/drivers/PinGroup.c $(OCWARE_ROOT)/src/devices/i2cbus.c fake/fake_I2C.c fake/fake_ThreadedISR.c fake/fake_dat.c fake/fake_PCA9557.c $(OCWARE_ROOT)/src/helpers/memory.c stub/stub_GateMutex.c $(OCWARE_ROOT)/src/drivers/GpioPCA9557.c $(OCWARE_ROOT)/src/devices/pca9557.c $(OCWARE_ROOT)/platform/oc-sdr/cfg/OC_CONNECT_FE.c $(PATHB)Test_ocmp_dat-xxr5a$(TARGET_EXTENSION): $(STD_FILES) $(TEST_OCMP_DATXXR5A_SRC) + +TEST_LED_SRC=$(OCWARE_ROOT)/src/devices/led.c $(OCWARE_ROOT)/src/devices/sx1509.c $(OCWARE_ROOT)/src/devices/i2cbus.c fake/fake_GPIO.c fake/fake_I2C.c fake/fake_ThreadedISR.c fake/fake_SX1509_register.c fake/fake_led.c stub/stub_GateMutex.c $(OCWARE_ROOT)/platform/oc-sdr/cfg/OC_CONNECT_LED.c +$(PATHB)Test_led$(TARGET_EXTENSION): $(STD_FILES) $(TEST_LED_SRC) + $(PATHB)%$(TARGET_EXTENSION): $(C_COMPILER) $(CFLAGS) $(INC_DIRS) $(SYMBOLS) $^ -o $@ $(COV_CMDS) diff --git a/firmware/ec/test/fake/fake_led.c b/firmware/ec/test/fake/fake_led.c new file mode 100644 index 0000000000..e1b213ae6b --- /dev/null +++ b/firmware/ec/test/fake/fake_led.c @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +#include "include/test_led.h" + +const I2C_Dev s_sx1509_left_dev = { + .bus = OC_CONNECT1_I2C8, + .slave_addr = LED_SX1509_LEFT_ADDRESS, +}; + +const I2C_Dev s_sx1509_right_dev = { + .bus = OC_CONNECT1_I2C8, + .slave_addr = LED_SX1509_RIGHT_ADDRESS, +}; + +OcGpio_Port ec_io = { + .fn_table = &FakeGpio_fnTable, + .object_data = &(FakeGpio_Obj){}, +}; + +uint8_t SX1509_right_regs[] = { + [SX1509_REG_TEST_2] = 0x00, +}; + +uint8_t LED_GpioPins[] = { + [INPUT_BUFFER_DISABLE] = 0x00, + [OC_EC_HCI_LED_RESET] = 0x00, +}; + +uint32_t LED_GpioConfig[] = { + [INPUT_BUFFER_DISABLE] = 0x00, + [OC_EC_HCI_LED_RESET] = 0x00, +}; diff --git a/firmware/ec/test/include/test_led.h b/firmware/ec/test/include/test_led.h new file mode 100644 index 0000000000..e0183e2e2e --- /dev/null +++ b/firmware/ec/test/include/test_led.h @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +#ifndef _TEST_LED_H +#define _TEST_LED_H + +#include "fake/fake_GPIO.h" +#include "fake/fake_I2C.h" +#include "inc/devices/led.h" +#include "inc/devices/sx1509.h" +#include "include/test_sx1509.h" +#include +#include +#include "unity.h" + +#define LED_CLOCK_VALUE 0x40 +#define LED_DEFAULT_VALUE 0x00 +#define LED_DRIVER_ENABLE_B_VALUE 0xFF +#define LED_INVALID_PARAM 3 +#define LED_POST_DATA_NULL 0x00 +#define LED_POST_DEVID 0xFF +#define LED_POST_MANID 0xFF +#define LED_REG_INPUT_DISABLE_B_VALUE 0xFF +#define LED_REG_OPEN_DRAIN_B_VALUE 0xFF +#define LED_REG_PULL_UP_B_VALUE 0x00 +#define LED_SYSTEM_BOOT_DATAB 0xD5 +#define INPUT_BUFFER_DISABLE 0x01 +#define OC_CONNECT1_I2C8 7 +#define OC_EC_HCI_LED_RESET 89 +#define SX1509_SOFT_RESET_REG_VALUE_2 0x34 +#define REG_T_ON_14_15_VALUE 0x00 +#endif diff --git a/firmware/ec/test/suites/Test_led.c b/firmware/ec/test/suites/Test_led.c new file mode 100644 index 0000000000..ddaa739857 --- /dev/null +++ b/firmware/ec/test/suites/Test_led.c @@ -0,0 +1,512 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +#include "include/test_led.h" + +extern const I2C_Dev s_sx1509_left_dev; +extern const I2C_Dev s_sx1509_right_dev; +extern HciLedCfg led_hci_ioexp; +extern uint8_t LED_GpioPins[OC_EC_HCI_LED_RESET]; +extern uint8_t SX1509_regs[SX1509_REG_TEST_2]; +extern uint8_t SX1509_right_regs[SX1509_REG_TEST_2]; +extern uint32_t LED_GpioConfig[OC_EC_HCI_LED_RESET]; +HciLedCfg ledDriver; +/* ============================= Boilerplate ================================ */ +unsigned int s_task_sleep_ticks; + +xdc_Void ti_sysbios_knl_Task_sleep__E(xdc_UInt32 nticks) +{ + s_task_sleep_ticks += nticks; +} + +void post_update_POSTData(POSTData *pData, uint8_t I2CBus, uint8_t devAddress, + uint16_t manId, uint16_t devId) +{ + pData->i2cBus = I2CBus; + pData->devAddr = devAddress; + pData->manId = manId; + pData->devId = devId; +} + +void suite_setUp(void) +{ + fake_I2C_init(); + fake_I2C_registerDevSimple(OC_CONNECT1_I2C8, LED_SX1509_LEFT_ADDRESS, + SX1509_regs, sizeof(SX1509_regs), + sizeof(SX1509_regs[0]), sizeof(uint8_t), + FAKE_I2C_DEV_BIG_ENDIAN); + fake_I2C_registerDevSimple(OC_CONNECT1_I2C8, LED_SX1509_RIGHT_ADDRESS, + SX1509_right_regs, sizeof(SX1509_right_regs), + sizeof(SX1509_right_regs[0]), sizeof(uint8_t), + FAKE_I2C_DEV_BIG_ENDIAN); + FakeGpio_registerDevSimple(LED_GpioPins, LED_GpioConfig); +} + +void setUp(void) +{ + memset(SX1509_regs, 0, sizeof(SX1509_regs)); + memset(SX1509_right_regs, 0, sizeof(SX1509_right_regs)); +} + +void tearDown(void) +{ +} + +void suite_tearDown(void) +{ + fake_I2C_deinit(); /* This will automatically unregister devices */ +} + +/* ================================ Tests =================================== */ +void test_hci_led_turnon_green(void) +{ + HciLedCfg *invalidLedDriver = NULL; + SX1509_regs[SX1509_REG_DATA_A] = LED_DEFAULT_VALUE; + SX1509_regs[SX1509_REG_DATA_B] = LED_DEFAULT_VALUE; + SX1509_right_regs[SX1509_REG_DATA_A] = LED_DEFAULT_VALUE; + SX1509_right_regs[SX1509_REG_DATA_B] = LED_DEFAULT_VALUE; + + TEST_ASSERT_EQUAL(RETURN_OK, hci_led_turnon_green(&led_hci_ioexp)); + TEST_ASSERT_EQUAL_HEX8(LED_GREEN, SX1509_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_GREEN, SX1509_regs[SX1509_REG_DATA_B]); + TEST_ASSERT_EQUAL_HEX8(LED_GREEN, SX1509_right_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_GREEN, SX1509_right_regs[SX1509_REG_DATA_B]); + + /* Invalid config */ + TEST_ASSERT_EQUAL(RETURN_NOTOK, hci_led_turnon_green(invalidLedDriver)); +} + +void test_hci_led_turnon_red(void) +{ + HciLedCfg *invalidLedDriver = NULL; + SX1509_regs[SX1509_REG_DATA_A] = LED_GREEN; + SX1509_regs[SX1509_REG_DATA_B] = LED_GREEN; + SX1509_right_regs[SX1509_REG_DATA_A] = LED_GREEN; + SX1509_right_regs[SX1509_REG_DATA_B] = LED_GREEN; + + TEST_ASSERT_EQUAL(RETURN_OK, hci_led_turnon_red(&led_hci_ioexp)); + TEST_ASSERT_EQUAL_HEX8(LED_RED, SX1509_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_RED, SX1509_regs[SX1509_REG_DATA_B]); + TEST_ASSERT_EQUAL_HEX8(LED_RED, SX1509_right_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_RED, SX1509_right_regs[SX1509_REG_DATA_B]); + + /* Invalid config */ + TEST_ASSERT_EQUAL(RETURN_NOTOK, hci_led_turnon_red(invalidLedDriver)); +} + +void test_hci_led_turnoff_all(void) +{ + HciLedCfg *invalidLedDriver = NULL; + SX1509_regs[SX1509_REG_DATA_A] = LED_RED; + SX1509_regs[SX1509_REG_DATA_B] = LED_RED; + SX1509_right_regs[SX1509_REG_DATA_A] = LED_RED; + SX1509_right_regs[SX1509_REG_DATA_B] = LED_RED; + + TEST_ASSERT_EQUAL(RETURN_OK, hci_led_turnoff_all(&led_hci_ioexp)); + TEST_ASSERT_EQUAL_HEX8(LED_OFF, SX1509_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_OFF, SX1509_regs[SX1509_REG_DATA_B]); + TEST_ASSERT_EQUAL_HEX8(LED_OFF, SX1509_right_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_OFF, SX1509_right_regs[SX1509_REG_DATA_B]); + + /* Invalid config */ + TEST_ASSERT_EQUAL(RETURN_NOTOK, hci_led_turnoff_all(invalidLedDriver)); +} + +void test_hci_led_system_boot(void) +{ + HciLedCfg *invalidLedDriver = NULL; + SX1509_regs[SX1509_REG_DATA_A] = LED_DEFAULT_VALUE; + SX1509_regs[SX1509_REG_DATA_B] = LED_DEFAULT_VALUE; + SX1509_right_regs[SX1509_REG_DATA_A] = LED_DEFAULT_VALUE; + SX1509_right_regs[SX1509_REG_DATA_B] = LED_DEFAULT_VALUE; + + TEST_ASSERT_EQUAL(RETURN_OK, hci_led_system_boot(&led_hci_ioexp)); + TEST_ASSERT_EQUAL_HEX8(LED_GREEN, SX1509_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_SYSTEM_BOOT_DATAB, + SX1509_regs[SX1509_REG_DATA_B]); + TEST_ASSERT_EQUAL_HEX8(LED_GREEN, SX1509_right_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_SYSTEM_BOOT_DATAB, + SX1509_right_regs[SX1509_REG_DATA_B]); + + /* Invalid config */ + TEST_ASSERT_EQUAL(RETURN_NOTOK, hci_led_system_boot(invalidLedDriver)); +} + +void test_hci_led_system_running(void) +{ + HciLedCfg *invalidLedDriver = NULL; + SX1509_regs[SX1509_REG_DATA_A] = LED_DEFAULT_VALUE; + SX1509_regs[SX1509_REG_DATA_B] = LED_DEFAULT_VALUE; + SX1509_right_regs[SX1509_REG_DATA_A] = LED_DEFAULT_VALUE; + SX1509_right_regs[SX1509_REG_DATA_B] = LED_DEFAULT_VALUE; + + SX1509_regs[SX1509_REG_T_ON_0] = + LED_DEFAULT_VALUE, /* ON time register I/O[0] */ + SX1509_regs[SX1509_REG_T_ON_1] = + LED_DEFAULT_VALUE, /* ON time register I/O[1] */ + SX1509_regs[SX1509_REG_T_ON_2] = + LED_DEFAULT_VALUE, /* ON time register I/O[2] */ + SX1509_regs[SX1509_REG_T_ON_3] = + LED_DEFAULT_VALUE, /* ON time register I/O[3] */ + SX1509_regs[SX1509_REG_T_ON_4] = + LED_DEFAULT_VALUE, /* ON time register I/O[4] */ + SX1509_regs[SX1509_REG_T_ON_5] = + LED_DEFAULT_VALUE, /* ON time register I/O[5] */ + SX1509_regs[SX1509_REG_T_ON_6] = + LED_DEFAULT_VALUE, /* ON time register I/O[6] */ + SX1509_regs[SX1509_REG_T_ON_7] = + LED_DEFAULT_VALUE, /* ON time register I/O[7] */ + SX1509_regs[SX1509_REG_T_ON_8] = + LED_DEFAULT_VALUE, /* ON time register I/O[8] */ + SX1509_regs[SX1509_REG_T_ON_9] = + LED_DEFAULT_VALUE, /* ON time register I/O[9] */ + SX1509_regs[SX1509_REG_T_ON_10] = + LED_DEFAULT_VALUE, /* ON time register I/O[10] */ + SX1509_regs[SX1509_REG_T_ON_11] = + LED_DEFAULT_VALUE, /* ON time register I/O[11] */ + SX1509_regs[SX1509_REG_T_ON_12] = + LED_DEFAULT_VALUE, /* ON time register I/O[12] */ + SX1509_regs[SX1509_REG_T_ON_13] = + LED_DEFAULT_VALUE, /* ON time register I/O[13] */ + SX1509_regs[SX1509_REG_T_ON_14] = + LED_DEFAULT_VALUE, /* ON time register I/O[14] */ + SX1509_regs[SX1509_REG_T_ON_15] = + LED_DEFAULT_VALUE, /* ON time register I/O[15] */ + + TEST_ASSERT_EQUAL(RETURN_OK, hci_led_system_running(&led_hci_ioexp)); + TEST_ASSERT_EQUAL_HEX8(LED_GREEN, SX1509_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_GREEN, SX1509_regs[SX1509_REG_DATA_B]); + TEST_ASSERT_EQUAL_HEX8(LED_GREEN, SX1509_right_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_GREEN, SX1509_right_regs[SX1509_REG_DATA_B]); + + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_0]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_1]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_2]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_3]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_4]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_5]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_6]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_7]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_8]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_9]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_10]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_11]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_12]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_13]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_14_15_VALUE, + SX1509_regs[SX1509_REG_T_ON_14]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_14_15_VALUE, + SX1509_regs[SX1509_REG_T_ON_15]); + + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_0]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_1]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_2]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_3]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_4]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_5]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_6]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_7]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_8]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_9]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_11]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_12]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_13]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_14_15_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_14]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_14_15_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_15]); + + /* Invalid config */ + TEST_ASSERT_EQUAL(RETURN_NOTOK, hci_led_system_running(invalidLedDriver)); +} +void test_hci_led_system_failure(void) +{ + HciLedCfg *invalidLedDriver = NULL; + + TEST_ASSERT_EQUAL(RETURN_OK, hci_led_system_failure(&led_hci_ioexp)); + TEST_ASSERT_EQUAL_HEX8(LED_RED, SX1509_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_RED, SX1509_regs[SX1509_REG_DATA_B]); + TEST_ASSERT_EQUAL_HEX8(LED_RED, SX1509_right_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_RED, SX1509_right_regs[SX1509_REG_DATA_B]); + + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_0]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_1]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_2]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_3]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_4]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_5]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_6]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_7]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_8]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_9]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_11]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_12]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_13]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_14_15_VALUE, + SX1509_regs[SX1509_REG_T_ON_14]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_14_15_VALUE, + SX1509_regs[SX1509_REG_T_ON_15]); + + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_0]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_1]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_2]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_3]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_4]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_5]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_6]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_7]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_8]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_9]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_11]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_12]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_13]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_14_15_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_14]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_14_15_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_15]); + + /* Invalid config */ + TEST_ASSERT_EQUAL(RETURN_NOTOK, hci_led_system_failure(invalidLedDriver)); +} + +void test_hci_led_radio_failure(void) +{ + HciLedCfg *invalidLedDriver = NULL; + + SX1509_regs[SX1509_REG_DATA_A] = LED_GREEN; + SX1509_regs[SX1509_REG_DATA_B] = LED_GREEN; + SX1509_right_regs[SX1509_REG_DATA_A] = LED_GREEN; + SX1509_right_regs[SX1509_REG_DATA_B] = LED_GREEN; + + TEST_ASSERT_EQUAL(RETURN_OK, hci_led_radio_failure(&led_hci_ioexp)); + TEST_ASSERT_EQUAL_HEX8(LED_RED, SX1509_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_RED, SX1509_regs[SX1509_REG_DATA_B]); + TEST_ASSERT_EQUAL_HEX8(LED_OFF, SX1509_right_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_OFF, SX1509_right_regs[SX1509_REG_DATA_B]); + + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_0]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_1]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_2]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_3]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_4]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_5]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_6]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_7]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_8]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_9]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_11]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_12]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, SX1509_regs[SX1509_REG_T_ON_13]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_14_15_VALUE, + SX1509_regs[SX1509_REG_T_ON_14]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_14_15_VALUE, + SX1509_regs[SX1509_REG_T_ON_15]); + + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_0]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_1]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_2]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_3]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_4]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_5]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_6]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_7]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_8]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_9]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_11]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_12]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_13]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_14]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_15]); + + /* Invalid config */ + TEST_ASSERT_EQUAL(RETURN_NOTOK, hci_led_radio_failure(invalidLedDriver)); +} + +void test_hci_led_backhaul_failure(void) +{ + HciLedCfg *invalidLedDriver = NULL; + SX1509_regs[SX1509_REG_DATA_A] = LED_GREEN; + SX1509_regs[SX1509_REG_DATA_B] = LED_GREEN; + SX1509_right_regs[SX1509_REG_DATA_A] = LED_GREEN; + SX1509_right_regs[SX1509_REG_DATA_B] = LED_GREEN; + + TEST_ASSERT_EQUAL(RETURN_OK, hci_led_backhaul_failure(&led_hci_ioexp)); + TEST_ASSERT_EQUAL_HEX8(LED_OFF, SX1509_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_OFF, SX1509_regs[SX1509_REG_DATA_B]); + TEST_ASSERT_EQUAL_HEX8(LED_RED, SX1509_right_regs[SX1509_REG_DATA_A]); + TEST_ASSERT_EQUAL_HEX8(LED_RED, SX1509_right_regs[SX1509_REG_DATA_B]); + + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_0]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_1]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_2]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_3]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_4]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_5]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_6]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_7]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_8]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_9]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_11]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_12]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_13]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_14]); + TEST_ASSERT_EQUAL_HEX8(LED_DEFAULT_VALUE, SX1509_regs[SX1509_REG_T_ON_15]); + + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_0]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_1]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_2]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_3]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_4]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_5]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_6]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_7]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_8]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_9]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_11]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_12]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_13]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_14_15_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_14]); + TEST_ASSERT_EQUAL_HEX8(REG_T_ON_14_15_VALUE, + SX1509_right_regs[SX1509_REG_T_ON_15]); + + /* Invalid config */ + TEST_ASSERT_EQUAL(RETURN_NOTOK, hci_led_backhaul_failure(invalidLedDriver)); +} + +void test_led_configure(void) +{ + led_configure(&led_hci_ioexp); + TEST_ASSERT_EQUAL(OCGPIO_CFG_OUTPUT | OCGPIO_CFG_OUT_HIGH, + LED_GpioConfig[OC_EC_HCI_LED_RESET]); +} + +void test_led_probe(void) +{ + HciLedCfg *invalidLedDriver = NULL; + POSTData postData; + POSTData *invalidPostData = NULL; + + TEST_ASSERT_EQUAL(POST_DEV_FOUND, led_probe(&led_hci_ioexp, &postData)); + TEST_ASSERT_EQUAL(OC_CONNECT1_I2C8, postData.i2cBus); + TEST_ASSERT_EQUAL(LED_SX1509_LEFT_ADDRESS, postData.devAddr); + TEST_ASSERT_EQUAL_HEX8(LED_POST_MANID, postData.manId); + TEST_ASSERT_EQUAL_HEX8(LED_POST_DEVID, postData.devId); + + postData.i2cBus = LED_POST_DATA_NULL; + postData.devAddr = LED_POST_DATA_NULL; + postData.manId = LED_POST_DATA_NULL; + postData.devId = LED_POST_DATA_NULL; + /* Invalid config test */ + TEST_ASSERT_EQUAL(POST_DEV_MISSING, led_probe(invalidLedDriver, &postData)); + TEST_ASSERT_EQUAL(LED_POST_DATA_NULL, postData.i2cBus); + TEST_ASSERT_EQUAL_HEX8(LED_POST_DATA_NULL, postData.devAddr); + TEST_ASSERT_EQUAL_HEX8(LED_POST_DATA_NULL, postData.manId); + TEST_ASSERT_EQUAL_HEX8(LED_POST_DATA_NULL, postData.devId); + + /* Invalid post data test */ + TEST_ASSERT_EQUAL(POST_DEV_MISSING, + led_probe(&led_hci_ioexp, invalidPostData)); + TEST_ASSERT_EQUAL(LED_POST_DATA_NULL, postData.i2cBus); + TEST_ASSERT_EQUAL_HEX8(LED_POST_DATA_NULL, postData.devAddr); + TEST_ASSERT_EQUAL_HEX8(LED_POST_DATA_NULL, postData.manId); + TEST_ASSERT_EQUAL_HEX8(LED_POST_DATA_NULL, postData.devId); +} + +void test_led_init(void) +{ + HciLedCfg *invalidLedDriver = NULL; + SX1509_regs[SX1509_REG_DATA_A] = LED_DEFAULT_VALUE; + SX1509_regs[SX1509_REG_DATA_B] = LED_DEFAULT_VALUE; + SX1509_right_regs[SX1509_REG_DATA_A] = LED_DEFAULT_VALUE; + SX1509_right_regs[SX1509_REG_DATA_B] = LED_DEFAULT_VALUE; + + TEST_ASSERT_EQUAL(RETURN_OK, led_init(&led_hci_ioexp)); + TEST_ASSERT_EQUAL_HEX8(SX1509_SOFT_RESET_REG_VALUE_2, + SX1509_regs[SX1509_REG_RESET]); + TEST_ASSERT_EQUAL_HEX8(SX1509_SOFT_RESET_REG_VALUE_2, + SX1509_right_regs[SX1509_REG_RESET]); + TEST_ASSERT_EQUAL_HEX8(LED_REG_INPUT_DISABLE_B_VALUE, + SX1509_regs[SX1509_REG_INPUT_DISABLE_B]); + TEST_ASSERT_EQUAL_HEX8(LED_REG_INPUT_DISABLE_B_VALUE, + SX1509_right_regs[SX1509_REG_INPUT_DISABLE_B]); + TEST_ASSERT_EQUAL_HEX8(LED_REG_PULL_UP_B_VALUE, + SX1509_regs[SX1509_REG_PULL_UP_B]); + TEST_ASSERT_EQUAL_HEX8(LED_REG_PULL_UP_B_VALUE, + SX1509_right_regs[SX1509_REG_PULL_UP_B]); + TEST_ASSERT_EQUAL_HEX8(LED_REG_OPEN_DRAIN_B_VALUE, + SX1509_regs[SX1509_REG_OPEN_DRAIN_B]); + TEST_ASSERT_EQUAL_HEX8(LED_REG_OPEN_DRAIN_B_VALUE, + SX1509_right_regs[SX1509_REG_OPEN_DRAIN_B]); + TEST_ASSERT_EQUAL_HEX8(LED_CLOCK_VALUE, SX1509_regs[SX1509_REG_CLOCK]); + TEST_ASSERT_EQUAL_HEX8(LED_CLOCK_VALUE, + SX1509_right_regs[SX1509_REG_CLOCK]); + TEST_ASSERT_EQUAL_HEX8(REG_MISC_VALUE, SX1509_regs[SX1509_REG_MISC]); + TEST_ASSERT_EQUAL_HEX8(REG_MISC_VALUE, SX1509_right_regs[SX1509_REG_MISC]); + TEST_ASSERT_EQUAL_HEX8(LED_DRIVER_ENABLE_B_VALUE, + SX1509_regs[SX1509_REG_LED_DRIVER_ENABLE_B]); + TEST_ASSERT_EQUAL_HEX8(LED_DRIVER_ENABLE_B_VALUE, + SX1509_right_regs[SX1509_REG_LED_DRIVER_ENABLE_B]); + + /* Invalid config test */ + TEST_ASSERT_EQUAL(RETURN_NOTOK, led_init(invalidLedDriver)); +}