cleanup is31fl3729 driver; LED updates only when needed now

This commit is contained in:
true 2024-08-03 05:56:37 -07:00
parent 5adce05f84
commit 5d722f41e8
5 changed files with 28 additions and 39 deletions

View File

@ -16,20 +16,17 @@
void is31fl3729_init(uint8_t i2c_addr, uint8_t config, uint8_t global_current) void is31fl3729_init(uint8_t i2c_addr, uint8_t config, uint8_t global_current)
{ {
uint8_t buf;
// enable device // enable device
#ifdef FL3729_SDB_PORT #ifdef FL3729_SDB_PORT
FL3729_SDB_PORT->BSHR = FL3729_SDB_PIN; FL3729_SDB_PORT->BSHR = FL3729_SDB_PIN;
#endif #endif
// reset config registers // reset config registers
buf = FL3729_RESET_VALUE; i2c_write_reg_8b(i2c_addr, FL3729_REG_CONFIG, FL3729_RESET_VALUE);
i2c_write_addr1b(i2c_addr, FL3729_REG_RESET, &buf, 1);
// write initial config // write initial config
i2c_write_addr1b(i2c_addr, FL3729_REG_CONFIG, &config, 1); i2c_write_reg_8b(i2c_addr, FL3729_REG_CONFIG, config);
i2c_write_addr1b(i2c_addr, FL3729_REG_G_CURRENT, &global_current, 1); i2c_write_reg_8b(i2c_addr, FL3729_REG_G_CURRENT, global_current);
} }
uint8_t is31fl3729_get_addr(uint8_t adpin) uint8_t is31fl3729_get_addr(uint8_t adpin)
@ -40,21 +37,21 @@ uint8_t is31fl3729_get_addr(uint8_t adpin)
void is31fl3729_set_global_current(uint8_t i2c_addr, uint8_t current) void is31fl3729_set_global_current(uint8_t i2c_addr, uint8_t current)
{ {
i2c_write_addr1b(i2c_addr, FL3729_REG_G_CURRENT, &current, 1); i2c_write_reg_8b(i2c_addr, FL3729_REG_G_CURRENT, current);
} }
void is31fl3729_set_scaling_current(uint8_t i2c_addr, uint8_t cs, uint8_t current) void is31fl3729_set_scaling_current(uint8_t i2c_addr, uint8_t cs, uint8_t current)
{ {
if (cs > 0xf) return; if (cs > 0xf) return;
i2c_write_addr1b(i2c_addr, FL3729_REG_SCALING + cs, &current, 1); i2c_write_reg_8b(i2c_addr, FL3729_REG_SCALING + cs, current);
} }
/* /*
* sets current limit of multiple outputs simultaneously, starting from CS1. * sets current limit of multiple outputs simultaneously, starting from CS1.
* useful for initial register configuration. * useful for initial register configuration.
*/ */
void is31fl3729_set_scaling_current_multi(uint8_t i2c_addr, uint8_t *current, uint8_t count) void is31fl3729_set_scaling_current_multi(uint8_t i2c_addr, const uint8_t *current, uint8_t count)
{ {
if (!count) return; if (!count) return;
count &= 0xf; count &= 0xf;
@ -67,9 +64,9 @@ void is31fl3729_set_scaling_current_multi(uint8_t i2c_addr, uint8_t *current, ui
* sw: first switch segment to update. usually set this to 1 for the first switch. * sw: first switch segment to update. usually set this to 1 for the first switch.
* if set to 0, will default to 1. * if set to 0, will default to 1.
* *out: output data buffer * *out: output data buffer
* len: length of buffer * len: length of buffer. up to end user to not exceed writing beyond register 0x90.
*/ */
void is31fl3729_set_outputs(uint8_t i2c_addr, uint8_t sw, uint8_t *out, uint8_t len) void is31fl3729_set_outputs(uint8_t i2c_addr, uint8_t sw, const uint8_t *out, uint8_t len)
{ {
if (!sw) sw = 1; if (!sw) sw = 1;

View File

@ -25,24 +25,24 @@
#define FL3729_REG_OUTPUT 0x01 #define FL3729_REG_OUTPUT 0x01
#define FL3729_REG_SCALING 0x90 #define FL3729_REG_SCALING 0x90
#define FL3729_REG_CONFIG 0xA0 #define FL3729_REG_CONFIG 0xA0
#define FL3729_REG_G_CURRENT 0xA1 // global current #define FL3729_REG_G_CURRENT 0xA1 // global current
#define FL3729_REG_PUPD 0xB0 // pull up / pull down #define FL3729_REG_PUPD 0xB0 // pull up / pull down
#define FL3729_REG_SS 0xB1 // spread spectrum #define FL3729_REG_SS 0xB1 // spread spectrum
#define FL3729_REG_PWM 0xB2 #define FL3729_REG_PWM 0xB2
#define FL3729_REG_RESET 0xCF #define FL3729_REG_RESET 0xCF
#define FL3729_GCC_MAX 64 // maximum global current level #define FL3729_GCC_MAX 64 // maximum global current level
#define FL3729_CONF_SHDN_ENA 0 #define FL3729_CONF_SSD_SHDN (0 << 0) // software shutdown
#define FL3729_CONF_SHDN_DIS ((1 << 0) << 0) #define FL3729_CONF_SSD_NRML (1 << 0) // normal operation
#define FL3729_CONF_OSDE_OFF 0 #define FL3729_CONF_OSDE_OFF (0 << 1)
#define FL3729_CONF_OSDE_OPEN ((1 << 0) << 1) #define FL3729_CONF_OSDE_OPEN (1 << 1)
#define FL3729_CONF_OSDE_SHORT ((1 << 1) << 1) #define FL3729_CONF_OSDE_SHORT (2 << 1)
#define FL3729_CONF_LOGIC_LOLEV 0 #define FL3729_CONF_LOGIC_LOLEV (0 << 3)
#define FL3729_CONF_LOGIC_HILEV ((1 << 0) << 3) #define FL3729_CONF_LOGIC_HILEV (1 << 3)
#define FL3729_CONF_MATRIX_9x15 0x00 #define FL3729_CONF_MATRIX_9x15 0x00
#define FL3729_CONF_MATRIX_8x16 0x10 #define FL3729_CONF_MATRIX_8x16 0x10
@ -68,25 +68,15 @@
/*
typedef struct IS31FL3729_Conf {
uint8_t ad_pin;
uint8_t config;
uint8_t global_brightness;
} IS31FL3729_Conf;
*/
void is31fl3729_init(uint8_t i2c_addr, uint8_t config, uint8_t global_current); void is31fl3729_init(uint8_t i2c_addr, uint8_t config, uint8_t global_current);
uint8_t is31fl3729_get_addr(uint8_t adpin); uint8_t is31fl3729_get_addr(uint8_t adpin);
void is31fl3729_set_global_current(uint8_t i2c_addr, uint8_t current); void is31fl3729_set_global_current(uint8_t i2c_addr, uint8_t current);
void is31fl3729_set_scaling_current(uint8_t i2c_addr, uint8_t cs, uint8_t current); void is31fl3729_set_scaling_current(uint8_t i2c_addr, uint8_t cs, uint8_t current);
void is31fl3729_set_scaling_current_multi(uint8_t i2c_addr, uint8_t *current, uint8_t count); void is31fl3729_set_scaling_current_multi(uint8_t i2c_addr, const uint8_t *current, uint8_t count);
void is31fl3729_set_outputs(uint8_t i2c_addr, uint8_t sw, uint8_t *out, uint8_t len); void is31fl3729_set_outputs(uint8_t i2c_addr, uint8_t sw, const uint8_t *out, uint8_t len);

View File

@ -100,7 +100,7 @@ uint8_t i2c_read_reg_8b(uint8_t addr, uint8_t reg)
return dat; return dat;
} }
int8_t i2c_write_addr1b(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len) int8_t i2c_write_addr1b(uint8_t addr, uint8_t reg, const uint8_t *data, uint8_t len)
{ {
timeout = I2C_TIMEOUT; timeout = I2C_TIMEOUT;
while((I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET) && timeout--); while((I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET) && timeout--);
@ -136,7 +136,7 @@ int8_t i2c_write_addr1b(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len)
return 0; return 0;
} }
void i2c_write_reg_8b(uint8_t addr, uint8_t reg, uint8_t dat) void i2c_write_reg_8b(uint8_t addr, uint8_t reg, const uint8_t dat)
{ {
i2c_write_addr1b(addr, reg, &dat, 1); i2c_write_addr1b(addr, reg, &dat, 1);
} }

View File

@ -14,10 +14,10 @@
void i2c_init(); void i2c_init();
int8_t i2c_read_addr1b(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len); int8_t i2c_read_addr1b(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len);
int8_t i2c_write_addr1b(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len); int8_t i2c_write_addr1b(uint8_t addr, uint8_t reg, const uint8_t *data, uint8_t len);
uint8_t i2c_read_reg_8b(uint8_t addr, uint8_t reg); uint8_t i2c_read_reg_8b(uint8_t addr, uint8_t reg);
void i2c_write_reg_8b(uint8_t addr, uint8_t reg, uint8_t dat); void i2c_write_reg_8b(uint8_t addr, uint8_t reg, const uint8_t dat);
int8_t i2c_ack_poll(uint8_t devaddr); int8_t i2c_ack_poll(uint8_t devaddr);

View File

@ -48,7 +48,7 @@ void led_init()
uint8_t buf[FL3729_CS_OUTPUTS] = {0xff}; uint8_t buf[FL3729_CS_OUTPUTS] = {0xff};
is31fl3729_init(FL3729_ADDR, is31fl3729_init(FL3729_ADDR,
FL3729_CONF_SHDN_DIS | FL3729_CONF_OSDE_OFF | FL3729_CONF_MATRIX_2x16, FL3729_CONF_SSD_NRML | FL3729_CONF_OSDE_OFF | FL3729_CONF_MATRIX_2x16,
LED_INIT_CURRENT); LED_INIT_CURRENT);
for (i = 0; i < FL3729_CS_OUTPUTS; i++) buf[i] = LED_INIT_SCALING; for (i = 0; i < FL3729_CS_OUTPUTS; i++) buf[i] = LED_INIT_SCALING;
@ -83,6 +83,8 @@ void led_send()
out[cursor_map[2]] = cursor[2]; out[cursor_map[2]] = cursor[2];
is31fl3729_set_outputs(FL3729_ADDR, 1, out, 16+15); is31fl3729_set_outputs(FL3729_ADDR, 1, out, 16+15);
led_updated = 0;
} }
} }