/*
 * Copyright (c) 2008-2009 Atheros Corporation. All rights reserved.
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation;
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * <Header file contains required data for master blaster mode>
 *
 * <masterblaster.h>
 */

#ifndef _MASTERBLASTER_H_
#define _MASTERBLASTER_H_
#include "btconfig.h"

#define INVALID_MASTERBLASTER_FIELD    (-1)
#define UNUSED(x) (x=x)
// Bluetooth Packet Type Identifiers
#define  MAX_TRANSMIT_POWER_CONTROL_ENTRIES    15

#define LC_JTAG_MODEM_REGS_ADDRESS               0x00020800
#define AGC_BYPASS_ADDRESS                       0x0000040c
#define AGC_BYPASS_ENABLE_MASK                   0x00000001
#define AGC_BYPASS_ENABLE_LSB                    0
#define AGC_BYPASS_ENABLE_SET(x)                 (((x) << AGC_BYPASS_ENABLE_LSB) & AGC_BYPASS_ENABLE_MASK)
#define LC_DEV_PARAM_CTL_ADDRESS                 0x00020010
#define LC_DEV_PARAM_CTL_FREQ_HOP_EN_MASK        0x00000001
#define LC_DEV_PARAM_CTL_RX_FREQ_MASK            0x00007f00
#define LC_DEV_PARAM_CTL_WHITEN_EN_MASK          0x00008000
#define LC_DEV_PARAM_CTL_RX_FREQ_SET(x)          (((x) << LC_DEV_PARAM_CTL_RX_FREQ_LSB) & LC_DEV_PARAM_CTL_RX_FREQ_MASK)
#define LC_DEV_PARAM_CTL_RX_FREQ_LSB             8

#define CORR_PARAM1_ADDRESS                      0x00000048
#define CORR_PARAM1_TIM_THR_MASK                 0xfc000000
#define CORR_PARAM1_TIM_THR_LSB                  26
#define CORR_PARAM1_TIM_THR_SET(x)               (((x) << CORR_PARAM1_TIM_THR_LSB) & CORR_PARAM1_TIM_THR_MASK)

typedef struct tBtHost_Interest {
  UINT16 MagicNumber;
  UINT16 Version;
  UINT32 TraceDataAddr;
  UINT32 GlobalDmaStats;   // BRM Global DMA Statistics
  UINT32 TpcTableAddr;     // SysCfg Transmit power table
  UINT32 AudioStatAddr;
  UINT32 AudioInternalAddr;
  UINT32 SysCfgAddr;
  UINT32 ReservedRamAddr;
  UINT32 HostConfigAddr;
  UINT32 RamVersionAddr;
  // Version 1.01
  UINT32 BrmGlobalDataAddr;  // BRM Global Context pointer
  UINT32 LeGlobalDataAddr;   // LE Global Context pointer
  // Version 1.02
  UINT32 MmGlobalDataAddr;
} tBtHostInterest;

typedef struct PsSysCfgTransmitPowerControlEntry {
    SINT8               TxPowerLevel;
    UINT32              RadioConfig;
    UINT32              EdrRadioConfig;
    SINT16              Slope;
    SINT16              EdrSlope;
    UINT8               TxFreqCorr;
    UINT8               EdrTxFreqCorr;
} tPsSysCfgTransmitPowerControlEntry;

typedef struct PsSysCfgTransmitPowerControlTable {
  int  NumOfEntries;
  tPsSysCfgTransmitPowerControlEntry t[MAX_TRANSMIT_POWER_CONTROL_ENTRIES];
} tPsSysCfgTransmitPowerControlTable;
typedef UCHAR tBRM_PktType;

enum {
   TxTest_PktType_NULL    = 0x00,
   TxTest_PktType_POLL    = 0x01,
   TxTest_PktType_FHS     = 0x02,
   TxTest_PktType_DM1     = 0x03,
   TxTest_PktType_DH1     = 0x04,
   TxTest_PktType_HV1     = 0x05,
   TxTest_PktType_HV2     = 0x06,
   TxTest_PktType_HV3     = 0x07,
   TxTest_PktType_DV      = 0x08,
   TxTest_PktType_AUX1    = 0x09,
   TxTest_PktType_DM3     = 0x0A,
   TxTest_PktType_DH3     = 0x0B,
   TxTest_PktType_DM5     = 0x0E,
   TxTest_PktType_DH5     = 0x0F,
   TxTest_PktType_2DH1    = 0x24,
   TxTest_PktType_2DH3    = 0x2A,
   TxTest_PktType_2DH5    = 0x2E,
   TxTest_PktType_3DH1    = 0x28,
   TxTest_PktType_3DH3    = 0x2B,
   TxTest_PktType_3DH5    = 0x2F,
   TxTest_PktType_Invalid = 0xff,
};

typedef UCHAR tBRM_eSCO_PktType;

enum {
   TxTest_PktType_EV3     = 0x17,
   TxTest_PktType_EV4     = 0x1C,
   TxTest_PktType_EV5     = 0x1D,
   TxTest_PktType_2EV3    = 0x36,
   TxTest_PktType_2EV5    = 0x3C,
   TxTest_PktType_3EV3    = 0x37,
   TxTest_PktType_3EV5    = 0x3D,
};

typedef UCHAR tBRM_PktMode;

enum {
   eBRM_Mode_Basic = 0,
   eBRM_Mode_2Mbps = 2,
   eBRM_Mode_3Mbps = 3
};

// tBRM_TestMode
enum {
   eBRM_TestMode_Pause = 0,
   eBRM_TestMode_TX_0,
   eBRM_TestMode_TX_1,
   eBRM_TestMode_TX_1010,
   eBRM_TestMode_TX_PRBS,
   eBRM_TestMode_Loop_ACL,
   eBRM_TestMode_Loop_SCO,
   eBRM_TestMode_Loop_ACL_No_Whitening,
   eBRM_TestMode_Loop_SCO_No_Whitening,
   eBRM_TestMode_TX_11110000,
   eBRM_TestMode_Rx,
   eBRM_TestMode_Exit = 255,
};
enum {
   Cont_Tx_Raw_1MHz = 0,
   Cont_Tx_Raw_2MHz,
   Cont_Tx_Raw_3MHz,
   Cont_Tx_Regular,
   CW_Single_Tone,
};
typedef UCHAR tBRM_TestMode;

typedef struct tBRM_TestControl {
   tBRM_TestMode       Mode;
   UCHAR               HopMode;
   UCHAR               TxFreq;
   UCHAR               RxFreq;
   UCHAR               Power;
// UCHAR               PollPeriod;
   UCHAR               Packet;
   UCHAR               SkipRxSlot;
   int              DataLen;
} tBRM_TestControl;

typedef struct tLE_TxParms {
   UCHAR PktPayload;
} tLE_TxParms;

typedef struct tBRM_Control_packet {
   tBRM_TestControl testCtrl;
   UCHAR bdaddr[6];
   UCHAR ContTxMode;    // Continuous TX Mode
   UCHAR ContTxType;
   UCHAR ContRxMode;    // Continuous RX Mode
   UCHAR BERType;
   UCHAR LERxMode;
   UCHAR LETxMode;
   tLE_TxParms LETxParms;
} tBRM_Control_packet;


#define DM1_MAX_PAYLOAD             17
#define DH1_MAX_PAYLOAD             27
#define DM3_MAX_PAYLOAD             121
#define DH3_MAX_PAYLOAD             183
#define DM5_MAX_PAYLOAD             224
#define DH5_MAX_PAYLOAD             339
#define AUX1_MAX_PAYLOAD            29
#define E2_DH1_MAX_PAYLOAD          54
#define E2_DH3_MAX_PAYLOAD          367
#define E2_DH5_MAX_PAYLOAD          679
#define E3_DH1_MAX_PAYLOAD          83
#define E3_DH3_MAX_PAYLOAD          552
#define E3_DH5_MAX_PAYLOAD          1021

enum E_MasterBlasterFieldID
{
   CR = 0,
   CT,
   LR,
   LT,
   LTM,
   CX,
   TM,
   HM,
   TF,
   RF,
   PT,
   DL,
   PO,
   BA,
   SB,
   GB,
   RX,
   TX,
   EN,
   ST,
   EX,
   EXX,
};

enum E_MasterBlasterTestFlag
{
   MB_NO_TEST = 0,
   MB_RX_TEST,
   MB_TX_TEST,
   MB_CONT_RX_TEST,
   MB_CONT_TX_TEST,
   MB_LE_RX_TEST,
   MB_LE_TX_TEST,
};

enum E_DisableEnable
{
   DISABLE = 0,
   ENABLE = 1,
};

#define MB_MIN_DATALEN			0
#define MB_MAX_DATALEN			1021
#define MB_MIN_FREQUENCY		0
#define MB_MAX_FREQUENCY		79
#define MB_MIN_FREQUENCY_LE		0
#define MB_MAX_FREQUENCY_LE		39
#define MB_MIN_DATALEN_LE		0
#define MB_MAX_DATALEN_LE		37
typedef struct STR_MasterBlasterOption
{
   char *Name;
   int Value;
} tMasterBlasterOption;

typedef struct STR_MasterBlasterField
{
   char *Name;
   char *Alias;
   char *Usage;
   int Default;
   tMasterBlasterOption *Options;
   int (*pFunc)(tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
} tMasterBlasterField;

static tMasterBlasterOption TestModeOption[] =
{
   {"TX_0",                   eBRM_TestMode_TX_0},
   {"TX_1",                   eBRM_TestMode_TX_1},
   {"TX_1010",                eBRM_TestMode_TX_1010},
   {"TX_PRBS",                eBRM_TestMode_TX_PRBS},
   {"TX_11110000",            eBRM_TestMode_TX_11110000},
   {"RX",                     eBRM_TestMode_Rx},
};

static tMasterBlasterOption HopModeOption[] =
{
   {"Disable",                DISABLE},
   {"Enable",                 ENABLE},
};

static tMasterBlasterOption PacketTypeOption[] =
{
   {"DM1",                    TxTest_PktType_DM1},
   {"DM3",                    TxTest_PktType_DM3},
   {"DM5",                    TxTest_PktType_DM5},
   {"DH1",                    TxTest_PktType_DH1},
   {"DH3",                    TxTest_PktType_DH3},
   {"DH5",                    TxTest_PktType_DH5},
   {"2-DH1",                  TxTest_PktType_2DH1},
   {"2-DH3",                  TxTest_PktType_2DH3},
   {"2-DH5",                  TxTest_PktType_2DH5},
   {"3-DH1",                  TxTest_PktType_3DH1},
   {"3-DH3",                  TxTest_PktType_3DH3},
   {"3-DH5",                  TxTest_PktType_3DH5},
};

static int MaxDataLenOption[] =
{
   DM1_MAX_PAYLOAD,
   DM3_MAX_PAYLOAD,
   DM5_MAX_PAYLOAD,
   DH1_MAX_PAYLOAD,
   DH3_MAX_PAYLOAD,
   DH5_MAX_PAYLOAD,
   E2_DH1_MAX_PAYLOAD,
   E2_DH3_MAX_PAYLOAD,
   E2_DH5_MAX_PAYLOAD,
   E3_DH1_MAX_PAYLOAD,
   E3_DH3_MAX_PAYLOAD,
   E3_DH5_MAX_PAYLOAD,
};

enum {
   eBRM_BERMode_ALL = 0, // ALL type
   eBRM_BERMode_ALL_DATA, // All type except dm1,dm3,dm5
   eBRM_BERMode_DM1,
   eBRM_BERMode_DM3,
   eBRM_BERMode_DM5,
   eBRM_BERMode_DH1,
   eBRM_BERMode_DH3,
   eBRM_BERMode_DH5,
   eBRM_BERMode_2DH1,
   eBRM_BERMode_2DH3,
   eBRM_BERMode_2DH5,
   eBRM_BERMode_3DH1,
   eBRM_BERMode_3DH3,
   eBRM_BERMode_3DH5,
};

static tMasterBlasterOption BERPacketTypeOption[] =
{
   {"ALL",                  eBRM_BERMode_ALL},
   {"ALL_DATA",             eBRM_BERMode_ALL_DATA},
   {"DM1",                  eBRM_BERMode_DM1},
   {"DM3",                  eBRM_BERMode_DM3},
   {"DM5",                  eBRM_BERMode_DM5},
   {"DH1",                  eBRM_BERMode_DH1},
   {"DH3",                  eBRM_BERMode_DH3},
   {"DH5",                  eBRM_BERMode_DH5},
   {"2DH1",                 eBRM_BERMode_2DH1},
   {"2DH3",                 eBRM_BERMode_2DH3},
   {"2DH5",                 eBRM_BERMode_2DH5},
   {"3DH1",                 eBRM_BERMode_3DH1},
   {"3DH3",                 eBRM_BERMode_3DH3},
   {"3DH5",                 eBRM_BERMode_3DH5},
};

static tMasterBlasterOption ContTxModeOption[] =
{
   {"Disable",                DISABLE},
   {"Enable",                 ENABLE},
};

static tMasterBlasterOption ContTxTypeOption[] =
{
   {"Raw_1MHz",                  Cont_Tx_Raw_1MHz},
   {"Raw_2MHz",                  Cont_Tx_Raw_2MHz},
   {"Raw_3MHz",                  Cont_Tx_Raw_3MHz},
   {"Regular_BT_Packet_Format",  Cont_Tx_Regular},
   {"CW_Single_Tone",		 CW_Single_Tone},
};

static tMasterBlasterOption ContRxModeOption[] =
{
   {"Disable",                DISABLE},
   {"Enable",                 ENABLE},
};

static tMasterBlasterOption LETxPktPayloadOption[] =
{
   {"Random_9",               0},
   {"11110000",               1},
   {"10101010",               2},
   {"Random_15",              3},
   {"11111111",               4},
   {"00000000",               5},
   {"00001111",               6},
   {"01010101",               7},
};

//----------------------------------------------------------------------------
// Prototypes
//----------------------------------------------------------------------------

void InitMasterBlaster (tBRM_Control_packet *MasterBlaster, bdaddr_t *BdAddr, UCHAR *SkipRxSlot);

int CheckField (tBRM_Control_packet MasterBlaster, char *FieldAlias);
int GetTestModeOptionIndex (int Mode);
int GetPacketTypeOptionIndex (int PacketType);

void PrintMasterBlasterMenu (tBRM_Control_packet *MasterBlaster);
int SetMasterBlasterTestMode (tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterHopMode (tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterPacketType (tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterTxFreq (tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterRxFreq (tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterPower (tBRM_Control_packet *MasterBlaster, char *Option);
int SetMasterBlasterDataLen (tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterBdAddr (tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterContTxMode (tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterContTxType (tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterNothing (tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterContRxMode (tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterLERxMode(tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterLETxMode(tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterLETxPktPayload(tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);
int SetMasterBlasterBERType(tBRM_Control_packet *MasterBlaster, tMasterBlasterOption *Option);

int ToggleOption (int *Value, tMasterBlasterOption *Option, tMasterBlasterOption *OptionArray,
                     int Size, int FieldID, int Step);
int MinMaxOption (int *Value, tMasterBlasterOption *Option, int Min, int Max);
int ToggleMinMaxOption (int *Value, char *Option, int FieldID, int Min, int Max, int Step);

//----------------------------------------------------------------------------
// Variables
//----------------------------------------------------------------------------

extern tMasterBlasterField MasterBlasterMenu[];
extern tPsSysCfgTransmitPowerControlTable  TpcTable;

#endif // _MASTERBLASTER_H_
