5 #include "sw/device/lib/boards/teacup_v1_3_0/leds.h"
7 #include "sw/device/lib/base/status.h"
10 #include "sw/device/lib/testing/i2c_testutils.h"
12 static const size_t kDefaultI2cReadTimeoutMicros = 1000;
14 status_t leds_read_ctrl_reg(
const dif_i2c_t *i2c, uint8_t reg_addr,
16 TRY(i2c_testutils_write(i2c, kLedsDriverI2cAddr, 1, ®_addr,
18 TRY(i2c_testutils_read(i2c, kLedsDriverI2cAddr, 1, data_out,
19 kDefaultI2cReadTimeoutMicros));
23 status_t leds_set_color(
const dif_i2c_t *i2c, teacup_led_t led,
26 uint8_t b_pwm_low_reg;
27 uint8_t r_pwm_low_reg;
28 uint8_t g_pwm_low_reg;
31 b_pwm_low_reg = kLedBlue0LowRegAddr;
32 r_pwm_low_reg = kLedRed0LowRegAddr;
33 g_pwm_low_reg = kLedGreen0LowRegAddr;
36 b_pwm_low_reg = kLedBlue1LowRegAddr;
37 r_pwm_low_reg = kLedRed1LowRegAddr;
38 g_pwm_low_reg = kLedGreen1LowRegAddr;
41 b_pwm_low_reg = kLedBlue2LowRegAddr;
42 r_pwm_low_reg = kLedRed2LowRegAddr;
43 g_pwm_low_reg = kLedGreen2LowRegAddr;
46 b_pwm_low_reg = kLedBlue3LowRegAddr;
47 r_pwm_low_reg = kLedRed3LowRegAddr;
48 g_pwm_low_reg = kLedGreen3LowRegAddr;
56 uint8_t blue_data[2] = {b_pwm_low_reg, color.b};
57 TRY(i2c_testutils_write(i2c, kLedsDriverI2cAddr,
58 sizeof(blue_data), blue_data,
61 uint8_t red_data[2] = {r_pwm_low_reg, color.r};
62 TRY(i2c_testutils_write(i2c, kLedsDriverI2cAddr,
63 sizeof(red_data), red_data,
66 uint8_t green_data[2] = {g_pwm_low_reg, color.g};
67 TRY(i2c_testutils_write(i2c, kLedsDriverI2cAddr,
68 sizeof(green_data), green_data,
72 uint8_t data[2] = {kLedUpdateRegAddr, 0};
73 TRY(i2c_testutils_write(i2c, kLedsDriverI2cAddr,
sizeof(data),
80 status_t leds_set_all_brightness(
const dif_i2c_t *i2c, uint8_t brightness) {
81 uint8_t data[2] = {kLedGlobalCurrentControlRegAddr, brightness};
82 TRY(i2c_testutils_write(i2c, kLedsDriverI2cAddr,
sizeof(data),
88 status_t leds_i2c_controller_configure(
const dif_i2c_t *i2c) {
93 uint8_t data[2] = {kLedsControlRegAddr, 0};
95 TRY(i2c_testutils_write(i2c, kLedsDriverI2cAddr,
sizeof(data),
98 TRY(leds_read_ctrl_reg(i2c, kLedsControlRegAddr, ®_val));
99 LOG_INFO(
"Control Reg = 0x%02x", reg_val);
102 data[0] = kLedGlobalCurrentControlRegAddr;
103 data[1] = (uint8_t)((
float)0xFF * 30.0 / 100.0);
104 TRY(i2c_testutils_write(i2c, kLedsDriverI2cAddr,
sizeof(data),
107 TRY(leds_read_ctrl_reg(i2c, kLedGlobalCurrentControlRegAddr, ®_val));
108 LOG_INFO(
"Global Current Control Reg = 0x%02x", reg_val);
111 data[0] = kLedChannel0ScalingRegAddr;
113 for (
size_t i = 0; i < 12; ++i) {
114 TRY(i2c_testutils_write(i2c, kLedsDriverI2cAddr,
117 TRY(leds_read_ctrl_reg(i2c, data[0], ®_val));
118 LOG_INFO(
"LED Channel %d Scaling Reg = 0x%02x", i, reg_val);
125 status_t leds_turn_all_off(
const dif_i2c_t *i2c) {
126 LOG_INFO(
"Turning off LEDs via software shutdown bit ...");
127 uint8_t ctrl_reg_val = 0;
128 TRY(leds_read_ctrl_reg(i2c, kLedsControlRegAddr, &ctrl_reg_val));
129 uint8_t data[2] = {kLedsControlRegAddr, ctrl_reg_val & ~0x1};
130 TRY(i2c_testutils_write(i2c, kLedsDriverI2cAddr,
sizeof(data),
136 status_t leds_turn_all_on(
const dif_i2c_t *i2c) {
137 LOG_INFO(
"Turning on LEDs via software shutdown bit ...");
138 uint8_t ctrl_reg_val = 0;
139 TRY(leds_read_ctrl_reg(i2c, kLedsControlRegAddr, &ctrl_reg_val));
140 uint8_t data[2] = {kLedsControlRegAddr, ctrl_reg_val | 0x1};
141 TRY(i2c_testutils_write(i2c, kLedsDriverI2cAddr,
sizeof(data),