blob: 210535627d2e4d38fadeced477f94f0ee2f6873c [file] [log] [blame]
#include <common.h>
#include <i2c_driver.h>
#include "i2c_led_driver.h"
LED *g_leds = NULL;
int led_nums = 0;
extern int i2c_master_init(int id, int speed, int b_10bit_addr);
extern int diag_i2c_led_detect_driver(int master_id, unsigned char slave_addr, int led_driver_type);
extern int diag_i2c_led_init(int master_id, unsigned char slave_addr, int led_type);
extern int diag_i2c_led_set_frame(int master_id, unsigned char slave_addr, int led_type,
unsigned char *frame, size_t size);
static int single_led_init(int index);
int i2c_led_detect_driver(LED *leds, int num, int *led_driver_type) {
int ret = -1;
int i;
for (i = 0; i < num; i++) {
lgpl_printf("%s: initializing i2c: master_id: %x index: %d\n", __func__, leds[i].master_id, i);
i2c_master_init(leds[i].master_id, 100 /*Speed*/, 0 /*Use 7 bit address*/);
ret = diag_i2c_led_detect_driver(leds[i].master_id, leds[i].slave_addr, leds[i].led_driver_type);
if (0 == ret) {
*led_driver_type = leds[i].led_driver_type;
return ret;
}
}
return ret;
}
int i2c_led_init(LED *leds, int nums) {
if (g_leds) {
lgpl_printf("led has been inited\n");
return -1;
}
led_nums = nums;
g_leds = malloc(nums * sizeof(LED));
memcpy(g_leds, leds, nums * sizeof(LED));
int i = 0;
for (i = 0; i < nums; i++) {
if (0 != single_led_init(i)) {
lgpl_printf("led_init %d fail\n", i);
free(g_leds);
g_leds = NULL;
return -1;
}
}
return 0;
}
static int single_led_init(int index) {
int ret;
if (index < 0 || index > led_nums) {
lgpl_printf("led_init error index %d out of range [0, %d]\n", index, 0, led_nums - 1);
return -1;
}
if (0 == g_leds[index].inited) {
lgpl_printf("%s: initializing i2c: master_id: %x index: %d\n", __func__, g_leds[index].master_id, index);
i2c_master_init(g_leds[index].master_id, 100 /*Speed*/, 0 /*Use 7 bit address*/);
ret = diag_i2c_led_init(g_leds[index].master_id, g_leds[index].slave_addr, g_leds[index].led_driver_type);
if (0 == ret) {;
g_leds[index].inited = 1;
} else {
return ret;
}
}
return 0;
}
int i2c_led_show_frame(int index, unsigned char *frame, size_t size) {
if (index < 0 || index > led_nums) {
lgpl_printf("led_init error index %d out of range [0, %d]\n", index, 0, led_nums - 1);
return -1;
}
if (0 == g_leds[index].inited) {
lgpl_printf("led_init error index %d not inited\n", index);
return -1;
}
diag_i2c_led_set_frame(g_leds[index].master_id, g_leds[index].slave_addr, g_leds[index].led_driver_type, frame, size);
return 0;
}