/*************************************************************************** * Copyright (c) 2003-2008, Broadcom Corporation * All Rights Reserved * Confidential Property of Broadcom Corporation * * THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE * AGREEMENT BETWEEN THE USER AND BROADCOM. YOU HAVE NO RIGHT TO USE OR * EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT. * * $brcm_Workfile: $ * $brcm_Revision: $ * $brcm_Date: $ * * Module Description: * * Revision History: * * $brcm_Log: $ * * ***************************************************************************/ #include "led.h" #include "bapp_util.h" #include "bapp_task.h" #include "bstd.h" #include "bdbg.h" #define LED_ON(ms) (0x80000000 | (ms)) #define LED_OFF(ms) (0x7FFFFFFF & (ms)) #define IS_LED_ON(x) (0 != (0x80000000 & (x))) #define END_OF_SEQ 0xFFFFFFFF unsigned on_sequence[2] = { LED_ON(0), END_OF_SEQ }; unsigned off_sequence[2] = { LED_OFF(0), END_OF_SEQ }; unsigned hunt_sequence[3] = { LED_ON(1000), LED_OFF(1000), END_OF_SEQ }; unsigned pending_sequence[5] = { LED_ON(250), LED_OFF(300), LED_ON(250), LED_OFF(1200), END_OF_SEQ }; unsigned download_sequence[7] = { LED_ON(200), LED_OFF(300), LED_ON(200), LED_OFF(300), LED_ON(200), LED_OFF(1800), END_OF_SEQ }; unsigned trouble_sequence[3] = { LED_ON(500), LED_OFF(500), END_OF_SEQ }; unsigned authorization_sequence[11] = { LED_ON(4280), LED_OFF(80), LED_ON(80), LED_OFF(80), LED_ON(80), LED_OFF(80), LED_ON(80), LED_OFF(80), LED_ON(80), LED_OFF(80), END_OF_SEQ }; struct led_state_t { enum led_mode_t mode; unsigned * sequence; unsigned seq_index; unsigned time_remains; }; static struct led_state_t led_state = {led_off_mode, off_sequence, 0,0}; static void led_control(bool on); unsigned led_set_mode(enum led_mode_t mode) { led_state.mode = mode; led_state.seq_index = 0; switch(led_state.mode){ case led_off_mode: led_state.sequence = off_sequence; break; case led_hunt_mode: led_state.sequence = hunt_sequence; break; case led_pending_init_mode: led_state.sequence = pending_sequence; break; case led_download_mode: led_state.sequence = download_sequence; break; case led_trouble_mode: led_state.sequence = trouble_sequence; break; case led_on_mode: led_state.sequence = on_sequence; break; case led_authorization_mode: led_state.sequence = authorization_sequence; break; default: BDBG_ASSERT(0); break; } led_state.time_remains = LED_OFF(led_state.sequence[led_state.seq_index]); led_control(IS_LED_ON(led_state.sequence[led_state.seq_index])); return led_state.time_remains; } unsigned led_update(unsigned elapsed_time) { if(elapsed_time > led_state.time_remains){ led_state.time_remains = 0; }else{ led_state.time_remains -= elapsed_time; } if(0 == led_state.time_remains){ ++led_state.seq_index; if(END_OF_SEQ == led_state.sequence[led_state.seq_index]){ led_state.seq_index = 0; /* restart seq */ } led_state.time_remains = LED_OFF(led_state.sequence[led_state.seq_index]); led_control(IS_LED_ON(led_state.sequence[led_state.seq_index])); } return led_state.time_remains; } void led_control(bool on) { #if 0 unsigned value; value = ReadReg32(LED_DATA_REG); if(true == on){ value |= LED_GREEN_MASK; }else{ value &= ~LED_GREEN_MASK; } WriteReg32(LED_DATA_REG, value); #endif }