/******************************************************************************\
*           Copyright (C) 2000 Texas Instruments Incorporated.
*                           All Rights Reserved
*------------------------------------------------------------------------------
* FILENAME...... bsl_led.c
* DATE CREATED.. Thu 06/15/2001 
* LAST MODIFIED. Thu 06/15/2001 
*
\******************************************************************************/
#define _LED_MOD_
#define _BOARD_MOD_ 

/****************************************\
* include files
\****************************************/

#include "bsl_led.h"

#if (LED_SUPPORT)
/******************************************************************************\
*                         L O C A L   S E C T I O N
\******************************************************************************/

/****************************************\
* LED static macro declarations
\****************************************/

#if (BOARD_6711DSK | BOARD_6211DSK)
  /* LED memory mapped address */
  #define LED_PORT        _BOARD_IOPORT
  /* LED left shift */
  #define LED_SHIFT(x)    ( (LED_PORT & (~(0x0F000000))) |(x<<24) )
#endif

#if (BOARD_6201EVM)
  /* LED memory mapped address */
  #define LED_PORT        _BOARD_LED_REG
  /* LED no shift */
  #define LED_SHIFT(x)    ( (LED_PORT & (~0x0003)) | x )
#endif

/****************************************\
* LED static typedef declarations
\****************************************/

/****************************************\
* LED static function declarations
\****************************************/

/****************************************\
* LED static variable definitions
\****************************************/

static int ledVal = 0;  

/****************************************\
* LED static function definitions
\****************************************/
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/

/******************************************************************************\
*                        G L O B A L   S E C T I O N
\******************************************************************************/

/****************************************\
* LED global variable definitions
\****************************************/

/****************************************\
* LED global function definitions
\****************************************/

/*----------------------------------------------------------------------------*/

void _LED_init(){
  static int initialized = 0;
  Uint32 oldCECTL1 = EMIF_RGET(CECTL1);

  if (!initialized) {

  #if (BOARD_6711DSK | BOARD_6211DSK |BOARD_6201EVM)
    /* set CE1 space to 32-bit async mode */
    EMIF_RSET(CECTL1,(oldCECTL1 & (~0x000000F0)) | 0x00000020);
    while((EMIF_RGET(CECTL1) & 0x00F0) != 0x20) ;
  #endif

  #if (BOARD_6711DSK | BOARD_6211DSK)
    ledVal = 0xf;                                      /* LEDs off by default */
  #endif

  #if (BOARD_6201EVM)
    ledVal = 0x0;                                      /* LEDs off by default */
  #endif
  
    LED_PORT = LED_SHIFT(ledVal);                      /* shut off LEDs       */
    asm(" NOP 9");                                     /* delay slots         */
    asm(" NOP 3");
    EMIF_RSET(CECTL1,oldCECTL1);                         /* restore CE1 space   */

    _BOARD_init();
    initialized = 1;
  }
}
/*----------------------------------------------------------------------------*/

void LED_off(Uint32 ledNum){ 

  Uint32 oldCECTL1 = EMIF_RGET(CECTL1);
  
#if (BOARD_6711DSK | BOARD_6211DSK |BOARD_6201EVM)
  /* set CE1 space to 32-bit async mode */
    EMIF_RSET(CECTL1,(oldCECTL1 & (~0x000000F0)) | 0x00000020);
    while((EMIF_RGET(CECTL1) & 0x00F0) != 0x20) ;
#endif

#if (BOARD_6711DSK | BOARD_6211DSK)
  ledVal |= ledNum;
#endif

#if (BOARD_6201EVM)
  ledVal &= ~ledNum;
#endif

  LED_PORT = LED_SHIFT(ledVal);                        /* shut off LEDs       */
  asm(" NOP 9");                                       /* delay slots         */
  asm(" NOP 3");
  EMIF_RSET(CECTL1,oldCECTL1);                         /* restore CE1 space   */
}

/*----------------------------------------------------------------------------*/

void LED_on(Uint32 ledNum){
	                      
  Uint32 oldCECTL1 = EMIF_RGET(CECTL1);
 
#if (BOARD_6711DSK | BOARD_6211DSK |BOARD_6201EVM)
  /* set CE1 space to 32-bit async mode */
    EMIF_RSET(CECTL1,(oldCECTL1 & (~0x000000F0)) | 0x00000020);
    while((EMIF_RGET(CECTL1) & 0x00F0) != 0x20) ;
#endif

#if (BOARD_6711DSK | BOARD_6211DSK)
  ledVal &= ~ledNum;
#endif

#if (BOARD_6201EVM)
  ledVal |= ledNum;
#endif
  
  LED_PORT = LED_SHIFT(ledVal);                        /* shut off LEDs       */
  asm(" NOP 9");                                       /* delay slots         */
  asm(" NOP 3");
  EMIF_RSET(CECTL1,oldCECTL1);                         /* restore CE1 space   */
}

/*----------------------------------------------------------------------------*/

void LED_toggle(Uint32 ledNum){

  Uint32 oldCECTL1 = EMIF_RGET(CECTL1);

#if (BOARD_6711DSK | BOARD_6211DSK |BOARD_6201EVM)
  /* set CE1 space to 32-bit async mode */
    EMIF_RSET(CECTL1,(oldCECTL1 & (~0x000000F0)) | 0x00000020);
    while((EMIF_RGET(CECTL1) & 0x00F0) != 0x20) ;
#endif

#if (BOARD_6711DSK | BOARD_6211DSK | BOARD_6201EVM)
  ledVal ^= ledNum;
#endif

  LED_PORT = LED_SHIFT(ledVal);                        /* shut off LEDs       */
  asm(" NOP 9");                                       /* delay slots         */
  asm(" NOP 3");
  EMIF_RSET(CECTL1,oldCECTL1);                         /* restore CE1 space   */
}

/*----------------------------------------------------------------------------*/

#endif /* LED_SUPPORT */
/******************************************************************************\
* End of bsl_led.c
\******************************************************************************/