#ifndef _LED_CONTROL_H
#define _LED_CONTROL_H

/*************************TYPE DEF**********************/
#define NUM_OF_LEDS 4

#define DSD_START_OFFSET			0x0200
#define EEPROM_VERSION_OFFSET			0x020E
#define EEPROM_HW_PARAM_POINTER_ADDRESS		0x0218
#define EEPROM_HW_PARAM_POINTER_ADDRRES_MAP5	0x0220
#define GPIO_SECTION_START_OFFSET		0x03

#define COMPATIBILITY_SECTION_LENGTH         42
#define COMPATIBILITY_SECTION_LENGTH_MAP5    84


#define EEPROM_MAP5_MAJORVERSION             5
#define EEPROM_MAP5_MINORVERSION             0


#define MAX_NUM_OF_BLINKS			10
#define NUM_OF_GPIO_PINS			16

#define DISABLE_GPIO_NUM			0xFF
#define EVENT_SIGNALED				1

#define MAX_FILE_NAME_BUFFER_SIZE		100

#define TURN_ON_LED(GPIO, index) do { \
							UINT gpio_val = GPIO; \
							(Adapter->LEDInfo.LEDState[index].BitPolarity == 1) ? \
							wrmaltWithLock(Adapter, BCM_GPIO_OUTPUT_SET_REG, &gpio_val, sizeof(gpio_val)) : \
							wrmaltWithLock(Adapter, BCM_GPIO_OUTPUT_CLR_REG, &gpio_val, sizeof(gpio_val)); \
						} while (0);

#define TURN_OFF_LED(GPIO, index)  do { \
							UINT gpio_val = GPIO; \
							(Adapter->LEDInfo.LEDState[index].BitPolarity == 1) ? \
							wrmaltWithLock(Adapter, BCM_GPIO_OUTPUT_CLR_REG, &gpio_val, sizeof(gpio_val)) : \
							wrmaltWithLock(Adapter, BCM_GPIO_OUTPUT_SET_REG, &gpio_val, sizeof(gpio_val));  \
						} while (0);

#define B_ULONG32 unsigned long

/*******************************************************/


typedef enum _LEDColors{
	RED_LED = 1,
	BLUE_LED = 2,
	YELLOW_LED = 3,
	GREEN_LED = 4
} LEDColors;	/*Enumerated values of different LED types*/

typedef enum LedEvents {
	SHUTDOWN_EXIT = 0x00,
	DRIVER_INIT = 0x1,
	FW_DOWNLOAD = 0x2,
	FW_DOWNLOAD_DONE = 0x4,
	NO_NETWORK_ENTRY = 0x8,
	NORMAL_OPERATION = 0x10,
	LOWPOWER_MODE_ENTER = 0x20,
	IDLEMODE_CONTINUE = 0x40,
	IDLEMODE_EXIT = 0x80,
	LED_THREAD_INACTIVE = 0x100,  /* Makes the LED thread Inactivce. It wil be equivallent to putting the thread on hold. */
	LED_THREAD_ACTIVE = 0x200,    /* Makes the LED Thread Active back. */
	DRIVER_HALT = 0xff
} LedEventInfo_t;	/* Enumerated values of different driver states */

/*
 * Structure which stores the information of different LED types
 * and corresponding LED state information of driver states
 */
typedef struct LedStateInfo_t {
	UCHAR LED_Type; /* specify GPIO number - use 0xFF if not used */
	UCHAR LED_On_State; /* Bits set or reset for different states */
	UCHAR LED_Blink_State; /* Bits set or reset for blinking LEDs for different states */
	UCHAR GPIO_Num;
	UCHAR BitPolarity; /* To represent whether H/W is normal polarity or reverse polarity */
} LEDStateInfo, *pLEDStateInfo;


typedef struct _LED_INFO_STRUCT {
	LEDStateInfo	LEDState[NUM_OF_LEDS];
	BOOLEAN		bIdleMode_tx_from_host; /* Variable to notify whether driver came out from idlemode due to Host or target*/
	BOOLEAN			bIdle_led_off;
	wait_queue_head_t   notify_led_event;
	wait_queue_head_t	idleModeSyncEvent;
	struct task_struct  *led_cntrl_threadid;
	int                 led_thread_running;
	BOOLEAN			bLedInitDone;

} LED_INFO_STRUCT, *PLED_INFO_STRUCT;
/* LED Thread state. */
#define BCM_LED_THREAD_DISABLED		0 /* LED Thread is not running. */
#define BCM_LED_THREAD_RUNNING_ACTIVELY	1 /* LED thread is running. */
#define BCM_LED_THREAD_RUNNING_INACTIVELY 2 /*LED thread has been put on hold*/



#endif

