/*******************************************************************************
* Project:      Amped'RF Bluetooth
* File name:    GKI_io.h
* Description:  I/O abstraction layer
*
* Copyright (c) 2013 Amped'RF Inc., AR Technology  All rights reserved.
*******************************************************************************/
#ifndef _GKI_IO_H_
#define _GKI_IO_H_

//------------------------------------------------
//   Register Definitions
//------------------------------------------------
#define PA0             0x00
#define PA1             0x01
#define PA2             0x02
#define PA3             0x03
#define PA4             0x04
#define PA5             0x05
#define PA6             0x06
#define PA7             0x07
#define PA8             0x08
#define PA9             0x09
#define PA10            0x0A
#define PA11            0x0B
#define PA12            0x0C
#define PA13            0x0D
#define PA14            0x0E
#define PA15            0x0F
#define PB0             0x10
#define PB1             0x11
#define PB2             0x12
#define PB3             0x13
#define PB4             0x14
#define PB5             0x15
#define PB6             0x16
#define PB7             0x17
#define PB8             0x18
#define PB9             0x19
#define PB10            0x1A
#define PB11            0x1B
#define PB12            0x1C
#define PB13            0x1D
#define PB14            0x1E
#define PB15            0x1F
#define PC0             0x20
#define PC1             0x21
#define PC2             0x22
#define PC3             0x23
#define PC4             0x24
#define PC5             0x25
#define PC6             0x26
#define PC7             0x27
#define PC8             0x28
#define PC9             0x29
#define PC10            0x2A
#define PC11            0x2B
#define PC12            0x2C
#define PC13            0x2D
#define PC14            0x2E
#define PC15            0x2F
#define IO_UNDEFINED    0xFF

//------------------------------------------------
//   IO Definitions
//------------------------------------------------
#define IO_MAIN_TX    	            PA9
#define IO_MAIN_RX	                PA10
#define IO_MAIN_CTS                 PA11
#define IO_MAIN_RTS                 PA12
#define IO_HCI_TX	                PA2
#define IO_HCI_RX	                PA3
//#if !defined(BT24)
#define IO_HCI_CTS                  PA0
//#endif
#define IO_HCI_RTS                  PA1

//------------------------------------------------------------
#if defined(BT24)
#define IO_HCI_BT_RESET             IO_UNDEFINED
#define IO_HCI_BT_WAKE              IO_UNDEFINED
#define IO_HCI_LPCLK                PB0
#define IO_LPOCLK_EN                IO_UNDEFINED
#define IO_HCI_BT_CLK               IO_UNDEFINED
#define IO_HCI_HOST_WAKE            PA7
#define IO_HCI2C_SCL                PB6
#define IO_HCI2C_SDA                PB5
#define IO_HCI_MODE_CHK             PA8
#define IO_HCI_32KCLOCK             PC14
#define IO_SCL                      PB8
#define IO_SDA                      PB9
#define IO_JTDO_SWO                 IO_UNDEFINED
#define IO_JTRST                    IO_UNDEFINED
#define IO_JTMS_SWDIO               IO_UNDEFINED
#define IO_JTCK_SWCLK               IO_UNDEFINED
#define IO_JTDI                     IO_UNDEFINED
#define IO_PA_BIAS                  IO_UNDEFINED
#define IO_HCI_BT_PWR_ON            PA6
#define IO_BT_POWERUP               IO_UNDEFINED
#endif


#if defined(GPS)
#define IO_HCI_BT_RESET             PA6
#define IO_HCI_BT_WAKE              PB1
#define IO_HCI_LPCLK                PB0
#define IO_SCL                      PA4
#define IO_SDA                      PC12

#define IO_JTDO_SWO                 IO_UNDEFINED
#define IO_JTRST                    IO_UNDEFINED
#define IO_JTMS_SWDIO               IO_UNDEFINED
#define IO_JTCK_SWCLK               IO_UNDEFINED
#define IO_JTDI                     PA15


#if defined(RDA5876)
#define IO_HCI_BT_PWR_ON            PA8
#define IO_PA_BIAS                  IO_UNDEFINED
#define IO_LPOCLK_EN                PC9
#define IO_HCI_BT_CLK               IO_UNDEFINED
#define IO_HCI_HOST_WAKE            PA0

#else // others
#define IO_HCI_BT_PWR_ON            IO_UNDEFINED
#define IO_PA_BIAS                  IO_UNDEFINED
#define IO_LPOCLK_EN                PC9
#define IO_HCI_BT_CLK               IO_UNDEFINED
#define IO_HCI_HOST_WAKE            PA7
#endif

#ifdef BT43
#define IO_BT_POWERUP               PC4
#else
#define IO_BT_POWERUP               IO_UNDEFINED
#endif

#endif // defined(GPS)
//------------------------------------------------------------

#if !defined(GPS)
#if defined(BT43) || defined(BT53)
#ifdef TI2564
#define IO_HCI_BT_NSHUTDO           PB10   //BT53H
#define IO_HCI_LPCLK                PC14
#else
#define IO_HCI_BT_RESET             PB10
#define IO_HCI_BT_WAKE              IO_UNDEFINED
#define IO_HCI_LPCLK                PB0
#endif//TI264
//#define IO_HCI_LPCLK                PB0
#define IO_LPOCLK_EN                IO_UNDEFINED
#define IO_HCI_BT_CLK               PA8
#ifndef TI2564
#define IO_HCI_HOST_WAKE            PB6
#endif
#define IO_SCL                      PA5
#define IO_SDA                      PA4
#define IO_JTDO_SWO                 IO_UNDEFINED
#define IO_JTRST                    IO_UNDEFINED
#define IO_JTMS_SWDIO               IO_UNDEFINED
#define IO_JTCK_SWCLK               IO_UNDEFINED
#define IO_JTDI                     IO_UNDEFINED
#define IO_PA_BIAS                  IO_UNDEFINED
#define IO_HCI_BT_PWR_ON            IO_UNDEFINED
#define IO_BT_POWERUP               IO_UNDEFINED
#endif

#if defined(BT31)
#define IO_HCI_BT_RESET             PB10
#define IO_HCI_BT_WAKE              PB1
#define IO_HCI_LPCLK                PB0
#define IO_LPOCLK_EN                PC9
#define IO_HCI_BT_CLK               IO_UNDEFINED
#define IO_HCI_HOST_WAKE            PA7
#define IO_SCL                      PB8
#define IO_SDA                      PB9
#define IO_JTDO_SWO                 PB3
#define IO_JTRST                    PB4
#define IO_JTMS_SWDIO               PA13
#define IO_JTCK_SWCLK               PA14
#define IO_JTDI                     PA15
#define IO_PA_BIAS                  IO_UNDEFINED
#define IO_HCI_BT_PWR_ON            IO_UNDEFINED
#define IO_BT_POWERUP               IO_UNDEFINED
#endif // BT43
#endif // !defined(GPS)
//------------------------------------------------------------

extern void * _Port[];
#define _SOURCE(x)  (x>>4)
#define _BASE(x)    _Port[x>>4]
#define _PIN(x)     (x&0x0F)
#define _MASK(x)    ((u32)1<<_PIN(x))


typedef u16 tGKI_io;

//------------------------------------------------
//   IO IDs
//------------------------------------------------
extern u16 io_HCI_TX;
extern u16 io_HCI_RX;
extern u16 io_HCI_CTS;
extern u16 io_HCI_RTS;
extern u16 io_MAIN_TX;
extern u16 io_MAIN_RX;
extern u16 io_MAIN_CTS;
extern u16 io_MAIN_RTS;
extern u16 io_PA_BIAS;
extern u16 io_LPOCLK_EN;
extern u16 io_HCI_BT_RESET;
extern u16 io_HCI_BT_WAKE;
extern u16 io_HCI_HOST_WAKE;
extern u16 io_HCI_BT_CLK;
extern u16 io_HCI_LPCLK;
extern u16 io_HOST_WAKEUP;
extern u16 io_JTDO_SWO;
extern u16 io_JTRST;
extern u16 io_JTMS_SWDIO;
extern u16 io_JTCK_SWCLK;
extern u16 io_JTDI;

extern u16 io_I2C_SCL;
extern u16 io_I2C_SDA;
extern u16 io_SCL;
extern u16 io_SDA;


#define IO_I2C_SCL  IO_SCL
#define IO_I2C_SDA  IO_SDA


#define GKI_IO_MODE_MASK        0x0F
#define GKI_IO_IN_FLOATING      0x00
#define GKI_IO_OUT_PP           0x01
#define GKI_IO_IPD              0x02
#define GKI_IO_IPU              0x03
#define GKI_IO_AF_PP            0x04
#define GKI_IO_AIN              0x05
#define GKI_IO_OUT_OD           0x06
#define GKI_IO_AF_IN            0x07
typedef u16 tGKI_Mode;


#define GKI_IO_Speed_MASK       0xF0
#define GKI_IO_Speed_Default    0x00
#define GKI_IO_Speed_2MHz       0x10
#define GKI_IO_Speed_10MHz      0x20
#define GKI_IO_Speed_25MHz      0x30
#define GKI_IO_Speed_50MHz      0x40
#define GKI_IO_Speed_100MHz     0x50
typedef u16 tGKI_Speed;



// IO routines
void  GKI_io_Config(u16 io, u16 mode);
void  GKI_io_ConfigFast(u16 io, u16 mode);
void  GKI_io_WriteBit(u16 io, u8 val);
bool  GKI_io_ReadBit(u16 io);
void  GKI_io_Enable_Tristate_All(void);
u16   GKI_io_GetConfig(u16 io);
u16   GKI_io_GetMode(u16 io);
char *GKI_io_Text(u16 io);
char * GKI_io_ModeText(u16 io);
char * GKI_io_ValueText(u16 io);
bool  GKI_io_IsInput(u16 io);


void  GKI_WaitMicro(u32 x);
void  GKI_SystemReset(void);


#endif // _GKI_IO_H_
//--------------------------------------------------------------
//
