mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-26 17:57:16 +00:00
338 lines
12 KiB
C
338 lines
12 KiB
C
/**
|
|
* 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 "unity.h"
|
|
#include "inc/devices/powerSource.h"
|
|
|
|
#include "drivers/GpioSX1509.h"
|
|
#include "drivers/OcGpio.h"
|
|
#include "helpers/array.h"
|
|
#include "helpers/attribute.h"
|
|
#include "helpers/memory.h"
|
|
|
|
#include "fake/fake_GPIO.h"
|
|
#include "fake/fake_I2C.h"
|
|
#include "fake/fake_ThreadedISR.h"
|
|
|
|
#include <string.h>
|
|
|
|
/* ======================== Constants & variables =========================== */
|
|
#define I2C_BUS 5
|
|
#define I2C_ADDR 0x71
|
|
|
|
static uint8_t SX1509_regs[] = {
|
|
[0x00] = 0x00, /* Input buffer disable register B */
|
|
[0x01] = 0x00, /* Input buffer disable register A */
|
|
[0x02] = 0x00, /* Output buffer long slew register B */
|
|
[0x03] = 0x00, /* Output buffer long slew register A */
|
|
[0x04] = 0x00, /* Output buffer low drive register B */
|
|
[0x05] = 0x00, /* Output buffer low drive register A */
|
|
[0x06] = 0x00, /* Pull Up register B */
|
|
[0x07] = 0x00, /* Pull Up register A */
|
|
[0x08] = 0x00, /* Pull Down register B */
|
|
[0x09] = 0x00, /* Pull Down register A */
|
|
[0x0A] = 0x00, /* Open drain register B */
|
|
[0x0B] = 0x00, /* Open drain register A */
|
|
[0x0C] = 0x00, /* Polarity register B */
|
|
[0x0D] = 0x00, /* Polarity register A */
|
|
[0x0E] = 0x00, /* Direction register B */
|
|
[0x0F] = 0x00, /* Direction register A */
|
|
[0x10] = 0x00, /* Data register B */
|
|
[0x11] = 0x00, /* Data register A */
|
|
[0x12] = 0x00, /* Interrupt mask register B */
|
|
[0x13] = 0x00, /* Interrupt mask register A */
|
|
[0x14] = 0x00, /* Sense High register B */
|
|
[0x15] = 0x00, /* Sense Low register B */
|
|
[0x16] = 0x00, /* Sense High register A */
|
|
[0x17] = 0x00, /* Sense Low register A */
|
|
[0x18] = 0x00, /* Interrupt source register B */
|
|
[0x19] = 0x00, /* Interrupt source register A */
|
|
[0x1A] = 0x00, /* Event status register B */
|
|
[0x1B] = 0x00, /* Event status register A */
|
|
[0x1C] = 0x00, /* Level shifter register 1 */
|
|
[0x1D] = 0x00, /* Level shifter register 2 */
|
|
[0x1E] = 0x00, /* Clock management register */
|
|
[0x1F] = 0x00, /* Miscellaneous device settings register */
|
|
[0x20] = 0x00, /* LED driver enable register B */
|
|
[0x21] = 0x00, /* LED driver enable register A */
|
|
|
|
[0x22] = 0x00, /* Debounce configuration register */
|
|
[0x23] = 0x00, /* Debounce enable register B */
|
|
[0x24] = 0x00, /* Debounce enable register A */
|
|
[0x25] = 0x00, /* Key scan configuration register 1 */
|
|
[0x26] = 0x00, /* Key scan configuration register 2 */
|
|
[0x27] = 0x00, /* Key value (column) 1 */
|
|
[0x28] = 0x00, /* Key value (row) 2 */
|
|
|
|
[0x29] = 0x00, /* ON time register I/O[0] */
|
|
[0x2A] = 0x00, /* ON intensity register I/O[0] */
|
|
[0x2B] = 0x00, /* OFF time/intensity register I/O[0] */
|
|
[0x2C] = 0x00, /* ON time register I/O[1] */
|
|
[0x2D] = 0x00, /* ON intensity register I/O[1] */
|
|
[0x2E] = 0x00, /* OFF time/intensity register I/O[1] */
|
|
[0x2F] = 0x00, /* ON time register I/O[2] */
|
|
[0x30] = 0x00, /* ON intensity register I/O[2] */
|
|
[0x31] = 0x00, /* OFF time/intensity register I/O[2] */
|
|
[0x32] = 0x00, /* ON time register I/O[3] */
|
|
[0x33] = 0x00, /* ON intensity register I/O[3] */
|
|
[0x34] = 0x00, /* OFF time/intensity register I/O[3] */
|
|
[0x35] = 0x00, /* ON time register I/O[4] */
|
|
[0x36] = 0x00, /* ON intensity register I/O[4] */
|
|
[0x37] = 0x00, /* OFF time/intensity register I/O[4] */
|
|
[0x38] = 0x00, /* Fade in register I/O[4] */
|
|
[0x39] = 0x00, /* Fade out register I/O[4] */
|
|
[0x3A] = 0x00, /* ON time register I/O[5] */
|
|
[0x3B] = 0x00, /* ON intensity register I/O[5] */
|
|
[0x3C] = 0x00, /* OFF time/intensity register I/O[5] */
|
|
[0x3D] = 0x00, /* Fade in register I/O[5] */
|
|
[0x3E] = 0x00, /* Fade out register I/O[5] */
|
|
[0x3F] = 0x00, /* ON time register I/O[6] */
|
|
[0x40] = 0x00, /* ON intensity register I/O[6] */
|
|
[0x41] = 0x00, /* OFF time/intensity register I/O[6] */
|
|
[0x42] = 0x00, /* Fade in register I/O[6] */
|
|
[0x43] = 0x00, /* Fade out register I/O[6] */
|
|
[0x44] = 0x00, /* ON time register I/O[6] */
|
|
[0x45] = 0x00, /* ON intensity register I/O[7] */
|
|
[0x46] = 0x00, /* OFF time/intensity register I/O[7] */
|
|
[0x47] = 0x00, /* Fade in register I/O[7] */
|
|
[0x48] = 0x00, /* Fade out register I/O[7] */
|
|
[0x49] = 0x00, /* ON time register I/O[8] */
|
|
[0x4A] = 0x00, /* ON intensity register I/O[8] */
|
|
[0x4B] = 0x00, /* OFF time/intensity register I/O[8] */
|
|
[0x4C] = 0x00, /* ON time register I/O[9] */
|
|
[0x4D] = 0x00, /* ON intensity register I/O[9] */
|
|
[0x4E] = 0x00, /* OFF time/intensity register I/O[9] */
|
|
[0x4F] = 0x00, /* ON time register I/O[10] */
|
|
[0x50] = 0x00, /* ON intensity register I/O[10] */
|
|
[0x51] = 0x00, /* OFF time/intensity register I/O[10] */
|
|
[0x52] = 0x00, /* ON time register I/O[11] */
|
|
[0x53] = 0x00, /* ON intensity register I/O[11] */
|
|
[0x54] = 0x00, /* OFF time/intensity register I/O[11] */
|
|
[0x55] = 0x00, /* ON time register I/O[12] */
|
|
[0x56] = 0x00, /* ON intensity register I/O[12] */
|
|
[0x57] = 0x00, /* OFF time/intensity register I/O[12] */
|
|
[0x58] = 0x00, /* Fade in register I/O[12] */
|
|
[0x59] = 0x00, /* Fade out register I/O[12] */
|
|
[0x5A] = 0x00, /* ON time register I/O[13] */
|
|
[0x5B] = 0x00, /* ON intensity register I/O[13] */
|
|
[0x5C] = 0x00, /* OFF time/intensity register I/O[13] */
|
|
[0x5D] = 0x00, /* Fade in register I/O[13] */
|
|
[0x5E] = 0x00, /* Fade out register I/O[13] */
|
|
[0x5F] = 0x00, /* ON time register I/O[14] */
|
|
[0x60] = 0x00, /* ON intensity register I/O[14] */
|
|
[0x61] = 0x00, /* OFF time/intensity register I/O[14] */
|
|
[0x62] = 0x00, /* Fade in register I/O[14] */
|
|
[0x63] = 0x00, /* Fade out register I/O[14] */
|
|
[0x64] = 0x00, /* ON time register I/O[15] */
|
|
[0x65] = 0x00, /* ON intensity register I/O[15] */
|
|
[0x66] = 0x00, /* OFF time/intensity register I/O[15] */
|
|
[0x67] = 0x00, /* Fade in register I/O[115] */
|
|
[0x68] = 0x00, /* Fade out register I/O[15] */
|
|
|
|
[0x69] = 0x00, /* */
|
|
[0x6A] = 0x00, /* */
|
|
|
|
[0x7D] = 0x00, /* */
|
|
[0x7E] = 0x00, /* */
|
|
[0x7F] = 0x00, /* */
|
|
};
|
|
|
|
extern const OcGpio_FnTable GpioSX1509_fnTable;
|
|
|
|
static bool PWR_GpioPins[] = {
|
|
[0x1E] = 0x1, /* pin_solar_aux_prsnt_n =30*/
|
|
[0x55] = 0x1, /* pin_poe_prsnt_n = 85 */
|
|
};
|
|
|
|
static uint32_t PWR_GpioConfig[] = {
|
|
[0x1E] = OCGPIO_CFG_INPUT,
|
|
[0x55] = OCGPIO_CFG_INPUT,
|
|
};
|
|
|
|
/* ============================= Boilerplate ================================ */
|
|
static OcGpio_Port s_fake_io_port = {
|
|
.fn_table = &FakeGpio_fnTable,
|
|
.object_data = &(FakeGpio_Obj){},
|
|
};
|
|
|
|
static OcGpio_Port s_fake_io_exp = {
|
|
.fn_table = &GpioSX1509_fnTable,
|
|
.cfg =
|
|
&(SX1509_Cfg){
|
|
.i2c_dev = { I2C_BUS, I2C_ADDR },
|
|
},
|
|
.object_data = &(SX1509_Obj){},
|
|
};
|
|
|
|
void suite_setUp(void)
|
|
{
|
|
FakeGpio_registerDevSimple(PWR_GpioPins, PWR_GpioConfig);
|
|
fake_I2C_init();
|
|
fake_I2C_registerDevSimple(I2C_BUS, I2C_ADDR, SX1509_regs,
|
|
sizeof(SX1509_regs), sizeof(SX1509_regs[0]),
|
|
sizeof(uint8_t), FAKE_I2C_DEV_LITTLE_ENDIAN);
|
|
}
|
|
|
|
void setUp(void)
|
|
{
|
|
memset(SX1509_regs, 0, sizeof(SX1509_regs));
|
|
OcGpio_init(&s_fake_io_exp);
|
|
}
|
|
|
|
void tearDown(void)
|
|
{
|
|
}
|
|
|
|
void suite_tearDown(void)
|
|
{
|
|
fake_I2C_deinit();
|
|
}
|
|
|
|
static PWRSRC_Dev p_dev = {
|
|
.cfg =
|
|
{
|
|
/* SOLAR_AUX_PRSNT_N */
|
|
.pin_solar_aux_prsnt_n = { &s_fake_io_port, 0x1E },
|
|
/* POE_PRSNT_N */
|
|
.pin_poe_prsnt_n = { &s_fake_io_port, 0x55 },
|
|
/* INT_BAT_PRSNT */
|
|
.pin_int_bat_prsnt = { &s_fake_io_exp, 11 },
|
|
/* EXT_BAT_PRSNT */
|
|
.pin_ext_bat_prsnt = { &s_fake_io_exp, 12 },
|
|
},
|
|
};
|
|
/* ================================ Tests =================================== */
|
|
|
|
void test_pwr_process_get_status_parameters_data_poeavailable(void)
|
|
{
|
|
uint8_t powerStatus = 0;
|
|
uint8_t index = 0x00; // PoE Availability
|
|
PWR_GpioPins[0x55] = 0x0; // PoE Enable
|
|
PWR_GpioPins[0x1E] = 0x1; // Aux/solar Disable
|
|
SX1509_regs[0x10] = 0x18; // Int/Ext Battery Disable
|
|
SX1509_regs[0x11] = 0x00;
|
|
|
|
pwr_source_init();
|
|
pwr_get_source_info(&p_dev);
|
|
pwr_process_get_status_parameters_data(index, &powerStatus);
|
|
|
|
TEST_ASSERT_EQUAL(1, powerStatus);
|
|
}
|
|
|
|
void test_pwr_process_get_status_parameters_data_poeaccessible(void)
|
|
{
|
|
uint8_t powerStatus = 0;
|
|
uint8_t index = 0x01; // PoE Accessibility
|
|
PWR_GpioPins[0x55] = 0x0; // PoE Enable
|
|
PWR_GpioPins[0x1E] = 0x1; // Aux/solar Disable
|
|
SX1509_regs[0x10] = 0x18; // Int/Ext Battery Disable
|
|
SX1509_regs[0x11] = 0x00;
|
|
|
|
pwr_source_init();
|
|
pwr_get_source_info(&p_dev);
|
|
pwr_process_get_status_parameters_data(index, &powerStatus);
|
|
|
|
TEST_ASSERT_EQUAL(1, powerStatus);
|
|
}
|
|
|
|
void test_pwr_process_get_status_parameters_data_solaravailable(void)
|
|
{
|
|
uint8_t powerStatus = 0;
|
|
uint8_t index = 0x02; // SOLAR Availability
|
|
PWR_GpioPins[0x55] = 0x1; // PoE Disable
|
|
PWR_GpioPins[0x1E] = 0x0; // Aux/solar Enable
|
|
SX1509_regs[0x10] = 0x18; // Int/Ext Battery Disable
|
|
SX1509_regs[0x11] = 0x00;
|
|
|
|
pwr_source_init();
|
|
pwr_get_source_info(&p_dev);
|
|
pwr_process_get_status_parameters_data(index, &powerStatus);
|
|
|
|
TEST_ASSERT_EQUAL(1, powerStatus);
|
|
}
|
|
|
|
void test_pwr_process_get_status_parameters_data_solaraccessible(void)
|
|
{
|
|
uint8_t powerStatus = 0;
|
|
uint8_t index = 0x03; // SOLAR Accessibility
|
|
PWR_GpioPins[0x55] = 0x1; // PoE Disable
|
|
PWR_GpioPins[0x1E] = 0x0; // Aux/solar Enable
|
|
SX1509_regs[0x10] = 0x18; // Int/Ext Battery Disable
|
|
SX1509_regs[0x11] = 0x00;
|
|
|
|
pwr_source_init();
|
|
pwr_get_source_info(&p_dev);
|
|
pwr_process_get_status_parameters_data(index, &powerStatus);
|
|
|
|
TEST_ASSERT_EQUAL(1, powerStatus);
|
|
}
|
|
|
|
void test_pwr_process_get_status_parameters_data_extavailable(void)
|
|
{
|
|
uint8_t powerStatus = 0;
|
|
uint8_t index = 0x04; // Ext Batt availability
|
|
PWR_GpioPins[0x55] = 0x1; // PoE Disable
|
|
PWR_GpioPins[0x1E] = 0x1; // Aux/solar Disable
|
|
SX1509_regs[0x10] = 0x08; // Int Batt OFF, Ext batt ON
|
|
SX1509_regs[0x11] = 0x00;
|
|
|
|
pwr_source_init();
|
|
pwr_get_source_info(&p_dev);
|
|
pwr_process_get_status_parameters_data(index, &powerStatus);
|
|
|
|
TEST_ASSERT_EQUAL(1, powerStatus);
|
|
}
|
|
|
|
void test_pwr_process_get_status_parameters_data_extaccessible(void)
|
|
{
|
|
uint8_t powerStatus = 0;
|
|
uint8_t index = 0x05; // Ext Batt accessibility
|
|
PWR_GpioPins[0x55] = 0x1; // PoE Disable
|
|
PWR_GpioPins[0x1E] = 0x1; // Aux/solar Disable
|
|
SX1509_regs[0x10] = 0x08; // Int Batt OFF, Ext batt ON
|
|
SX1509_regs[0x11] = 0x00;
|
|
|
|
pwr_source_init();
|
|
pwr_get_source_info(&p_dev);
|
|
pwr_process_get_status_parameters_data(index, &powerStatus);
|
|
|
|
TEST_ASSERT_EQUAL(1, powerStatus);
|
|
}
|
|
|
|
void test_pwr_process_get_status_parameters_data_intavailable(void)
|
|
{
|
|
uint8_t powerStatus = 0;
|
|
uint8_t index = 0x06; // Int Batt Availability
|
|
PWR_GpioPins[0x55] = 0x1; // PoE Disable
|
|
PWR_GpioPins[0x1E] = 0x1; // Aux/solar Disable
|
|
SX1509_regs[0x10] = 0x10; // Ext Batt OFF, Int batt ON
|
|
SX1509_regs[0x11] = 0x00;
|
|
|
|
pwr_source_init();
|
|
pwr_get_source_info(&p_dev);
|
|
pwr_process_get_status_parameters_data(index, &powerStatus);
|
|
|
|
TEST_ASSERT_EQUAL(1, powerStatus);
|
|
}
|
|
|
|
void test_pwr_process_get_status_parameters_data_intaccessible(void)
|
|
{
|
|
uint8_t powerStatus = 0;
|
|
uint8_t index = 0x07; // Int Batt Accessibility
|
|
PWR_GpioPins[0x55] = 0x1; // PoE Disable
|
|
PWR_GpioPins[0x1E] = 0x1; // Aux/solar Disable
|
|
SX1509_regs[0x10] = 0x10; // Ext Batt OFF, Int batt ON
|
|
SX1509_regs[0x11] = 0x00;
|
|
|
|
pwr_source_init();
|
|
pwr_get_source_info(&p_dev);
|
|
pwr_process_get_status_parameters_data(index, &powerStatus);
|
|
|
|
TEST_ASSERT_EQUAL(1, powerStatus);
|
|
}
|