| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- #include "led.h"
- #include "timer.h"
- #include "gpio.h"
- #include "paras.h"
- #include "log.h"
- #ifdef BOARD_EVB_ATK
- #define LEDR_GPIO GET_PIN(F, 9)
- #define LEDG_GPIO GET_PIN(F, 10)
- #else
- #define LEDR_GPIO -1
- #define LEDG_GPIO GET_PIN(E, 6)
- #endif
- typedef struct {
- int gpio;
- int on_level;
- int off_level;
- }led_info_t;
- static led_info_t led_info[LED_ID_MAX]={
- {LEDR_GPIO, 0, 1},
- {LEDG_GPIO, 0, 1},
- };
- typedef struct {
- int io;
- led_para_t para;
- led_info_t *info;
- uint32_t cnt;
- int tmr;
- }led_data_t;
- typedef struct {
- int tmr;
- int mode;
- led_data_t data[LED_ID_MAX];
- }led_handle_t;
- static led_para_t led_para[LED_MODE_MAX]={
- #if 0
- {LED_ID_GREEN, 1000,0, -1, 0}, //LED_MODE_NORMAL
- {LED_ID_GREEN, 300, 300, -1, 0}, //LED_MODE_UPGRADING
- {LED_ID_RED, 1000, 1000, 5, 0}, //LED_MODE_WARN1,
- {LED_ID_RED, 1000, 1000, 10, 0}, //LED_MODE_WARN2,
- {LED_ID_RED, 500, 500, 10, 0}, //LED_MODE_ERROR,
- {LED_ID_RED, 200, 200, 25, 0}, //LED_MODE_FAULT
- {LED_ID_RED, 50, 50, -1, 0}, //LED_MODE_FATAL
- #else
- {LED_ID_GREEN, 0, 1000, -1, 0}, //LED_MODE_NORMAL
- {LED_ID_GREEN, 300, 1000, -1, 0}, //LED_MODE_UPGRADING
- {LED_ID_GREEN, 500, 500, 300, 0}, //LED_MODE_WARN1,
- {LED_ID_GREEN, 333, 333, 450, 0}, //LED_MODE_WARN2,
- {LED_ID_GREEN, 500, 500, 10, 0}, //LED_MODE_ERROR,
- {LED_ID_GREEN, 200, 200, 25, 0}, //LED_MODE_FAULT
- {LED_ID_GREEN, 50, 50, -1, 0}, //LED_MODE_FATAL
- #endif
- };
- static led_handle_t ledHandle={0};
- static void led_handler(void *arg, int last)
- {
- int level;
- led_data_t *h=(led_data_t*)arg;
-
- if(h->para.on_ms>0 && h->para.off_ms) {
- h->cnt++;
- if(h->cnt%2) {
- gpio_set(h->io, h->info->off_level);
- }
- else {
- gpio_set(h->io, h->info->on_level);
- }
- }
-
- if(last) {
- timer_stop(h->tmr);
- if(h->para.end_on) {
- gpio_set(h->io, h->info->on_level);
- }
- else {
- gpio_set(h->io, h->info->off_level);
- }
- led_set(LED_MODE_NORMAL);
- }
- }
- //////////////////////////////////////////////////
- int led_init(void)
- {
- int i;
- led_handle_t *h=&ledHandle;
-
- h->tmr = timer_init();
- for(i=0; i<LED_ID_MAX; i++) {
- h->data[i].info = &led_info[i];
- h->data[i].cnt = 0;
- h->data[i].tmr = h->tmr;
- h->data[i].io = led_info[i].gpio;
- gpio_init(h->data[i].io, GPIO_OUT, led_info[i].off_level);
- }
- h->mode = -1;
-
- //led_set(LED_MODE_UPGRADING);
-
- return 0;
- }
- int led_deinit(void)
- {
- int i;
- led_handle_t *h=&ledHandle;
-
- timer_deinit(h->tmr);
- for(i=0; i<LED_ID_MAX; i++) {
- gpio_deinit(h->data[i].io);
- h->data[i].io = -1;
- }
- return 0;
- }
- int led_set(int mode)
- {
- led_handle_t *h=&ledHandle;
- h->mode = mode;
- return led_set_ex(&led_para[h->mode]);
- }
- int led_set_ex(led_para_t *para)
- {
- int r=0;
- led_handle_t *h=&ledHandle;
- misc_data_t *misc=¶s_get()->misc;
-
- if(!misc->led || !para || (para->on_ms<=0 && para->off_ms<=0) || para->times==0) {
- return -1;
- }
- led_data_t *ld=&h->data[para->led_id];
-
- ld->cnt = 0;
- ld->para = *para;
- if(ld->para.on_ms>0) {
- gpio_set(ld->io, ld->info->on_level);
- if(ld->para.off_ms>0) {
- ld->para.times *= 2;
- }
- else {
- ld->para.on_ms *= ld->para.times;
- ld->para.times = 1;
- }
- r = timer_start(h->tmr, ld->para.on_ms, ld->para.times, led_handler, ld);
- }
- else {
- gpio_set(ld->io, ld->info->on_level);
- if(ld->para.off_ms>0) {
- ld->para.off_ms *= ld->para.times;
- ld->para.times = 1;
- r = timer_start(h->tmr, ld->para.off_ms, ld->para.times, led_handler, ld);
- }
- }
-
- return r;
- }
- int led_reset(void)
- {
- led_handle_t *h=&ledHandle;
- if(h->mode==-1) {
- return -1;
- }
- h->mode = -1;
- timer_stop(h->tmr);
- gpio_set(h->data[LED_ID_RED].io, led_info[LED_ID_RED].off_level);
- return 0;
- }
|