summaryrefslogtreecommitdiff
path: root/common/lp5562.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/lp5562.c')
-rw-r--r--common/lp5562.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/common/lp5562.c b/common/lp5562.c
index a4c0e85fd6..09ee0df2c5 100644
--- a/common/lp5562.c
+++ b/common/lp5562.c
@@ -21,6 +21,11 @@ inline int lp5562_write(uint8_t reg, uint8_t val)
return i2c_write8(I2C_PORT_HOST, LP5562_I2C_ADDR, reg, val);
}
+inline int lp5562_read(uint8_t reg, int *val)
+{
+ return i2c_read8(I2C_PORT_HOST, LP5562_I2C_ADDR, reg, val);
+}
+
int lp5562_set_color(uint32_t rgb)
{
int ret = 0;
@@ -32,6 +37,51 @@ int lp5562_set_color(uint32_t rgb)
return ret;
}
+int lp5562_set_engine(uint8_t r, uint8_t g, uint8_t b)
+{
+ return lp5562_write(LP5562_REG_LED_MAP, (r << 4) | (g << 2) | b);
+}
+
+int lp5562_engine_load(int engine, uint8_t *program, int size)
+{
+ int prog_addr = LP5562_REG_ENG_PROG(engine);
+ int i, ret, val;
+ int shift = 6 - engine * 2;
+
+ ret = lp5562_read(LP5562_REG_OP_MODE, &val);
+ if (ret)
+ return ret;
+ val &= ~(0x3 << shift);
+ val |= 0x1 << shift;
+ ret = lp5562_write(LP5562_REG_OP_MODE, val);
+ if (ret)
+ return ret;
+
+ for (i = 0; i < size; ++i) {
+ ret = lp5562_write(prog_addr + i, program[i]);
+ if (ret)
+ return ret;
+ }
+
+ val &= ~(0x3 << shift);
+ val |= 0x2 << shift;
+ ret = lp5562_write(LP5562_REG_OP_MODE, val);
+
+ return ret;
+}
+
+int lp5562_engine_control(int eng1, int eng2, int eng3)
+{
+ int ret, val;
+
+ ret = lp5562_read(LP5562_REG_ENABLE, &val);
+ if (ret)
+ return ret;
+ val &= 0xc0;
+ val |= (eng1 << 4) | (eng2 << 2) | eng3;
+ return lp5562_write(LP5562_REG_ENABLE, val);
+}
+
int lp5562_poweron(void)
{
int ret = 0;