| #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; |
| } |