/*
  * Copyright (C) 2009/2010 Motorola Inc.
  * All Rights Reserved.
  * Motorola Confidential Restricted.
  */


#ifndef MASTERCLEAR_BP_H_
#define MASTERCLEAR_BP_H_

#define CMD_ENGINE_FD_NOT_INIT -1
#define CMD_ENGINE_DEVICE        "/dev/ttyUSB3"
/* Number of times to try to connect to aux engine */
#define CMD_ENGINE_CONNECT_MAX_TRY   30
/* Delay between each aux engine connect try, in microseconds */
#define CMD_ENGINE_CONNECT_TRY_DELAY 1000000
#define CMD_CMN_DRV_BP_MASTERCLEAR_OPCODE   0x0012
#define CMD_BP_MASTER_CLEAR    0x01
#define CMD_BP_MASTER_RESET    0x00
#define CMD_BP_MASTER_RESET_DATALENTH    0x01

#define MDM_CTRL_DEVICE          "/sys/class/radio/mdm6600/command"
#define MDM_CMD_SHUTDONW         "shutdown"
#define MDM_CMD_POWERUP          "powerup"
#define MDM_CMD_FLASH_MODE       "bootmode_flash"
#define MDM_CMD_NORMAL_MODE      "bootmode_normal"

#define CMD_DEFS_RSP_FLAG_FAIL   0x04
#define TC_DBG_MAX_DUMP_COLS     16
/* CMD header values */
#define CMD_DEFS_HDR_FLAG_CMD_RSP_COMMAND       0 /**< Header indicates a command */
#define CMD_DEFS_HDR_FLAG_CMD_RSP_RESPONSE      1 /**< Header indicates a response */

#define CMD_DEFS_HDR_FLAG_RESPONSE_EXPECTED     0 /**< Header indicates a response is expected */
#define CMD_DEFS_HDR_FLAG_RESPONSE_NOT_EXPECTED 1 /**< Header indicates a response is not expected */

#define CMD_DEFS_HDR_FLAG_RESPONSE_SOLICITED    0 /**< Header indicates a solicited response */
#define CMD_DEFS_HDR_FLAG_RESPONSE_UNSOLICITED  1 /**< Header indicates a unsolicited response */

#define CMD_DEFS_HDR_FLAG_DATA_NOT_PRESENT      0 /**< Header indicates response data present */
#define CMD_DEFS_HDR_FLAG_DATA_PRESENT          1 /**< Header indicates no response data present */

#define CMD_DEFS_HDR_FLAG_CMD_NOT_FAILED        0 /**< Header indicates command did not fail */
#define CMD_DEFS_HDR_FLAG_CMD_FAILED            1 /**< Header indicates command failed */

#define CMD_DBG_MAX_DUMP_COLS 16

#define CMD_DEFS_OPCODE_T UINT16

#ifndef TRUE
    #define TRUE   1
    #define FALSE  0
#endif


static const char *USB1_SETUP_FILE = "/sys/bus/usb/devices/usb2/power/control";
static const char setup_cmd[] = "on";

typedef unsigned char        UINT8;      /**< Unsigned 8 bit integer */
typedef signed char          INT8;       /**< Signed 8 bit integer */
typedef unsigned short int   UINT16;     /**< Unsigned 16 bit integer */
typedef signed short int     INT16;      /**< Signed 16 bit integer */
typedef unsigned  int        UINT32;     /**< Unsigned 32 bit integer */
typedef signed int           INT32;      /**< Signed 32 bit integer */
typedef signed long long     INT64;      /**< Signed 64 bit integer */
typedef unsigned long long   UINT64;     /**< Unsigned 64 bit integer */
typedef unsigned char        BOOLEAN;    /**< Boolean type */
typedef BOOLEAN              BOOL;       /**< Boolean type */
typedef unsigned short       W_CHAR;     /**< Wide char */

typedef enum
{
    CMD_RSP_CODE_PAR_ERR_LENGTH       = 0x00,     /**< Parser length error        */
    CMD_RSP_CODE_PAR_ERR_SECUR        = 0x01,     /**< Parser security error      */
    CMD_RSP_CODE_PAR_ERR_PROT         = 0x02,     /**< Parser protocol error      */
    CMD_RSP_CODE_PAR_ERR_MODE         = 0x03,     /**< Parser mode error          */
    CMD_RSP_CODE_PAR_ERR_OPCODE       = 0x04,     /**< Parser opcode error        */
    CMD_RSP_CODE_PAR_ERR_PARM         = 0x05,     /**< Parser parameter error     */
    CMD_RSP_CODE_CMD_RSP_GENERIC      = 0x06,     /**< Generic Response           */
    CMD_RSP_CODE_CMD_RSP_GEN_FAIL     = 0x07,     /**< General failure            */
    CMD_RSP_CODE_CMD_MALLOC_FAIL      = 0x0A,     /**< Error allocating memory    */
    CMD_RSP_CODE_CMD_INTL_ERR         = 0x0B,     /**< Tcmd internal error        */
    CMD_RSP_CODE_CMD_RSP_TIMEOUT      = 0x0C,     /**< Timeout error              */
    CMD_RSP_CODE_CMD_PAR_ERR_SUBMODE  = 0x0D,     /**< Parser submode error       */
    CMD_RSP_CODE_CMD_TRANS_LEN_ERR    = 0x0E,     /**< Transport length error     */
    CMD_RSP_CODE_CMD_RSP_IRRE_ERR     = 0x0F,     /**< Irrecoverable error        */
    CMD_RSP_CODE_CMD_RSP_MUX_ERR      = 0x11,     /**< Open mux channel error     */

    CMD_RSP_CODE_ASCII_ERR_LENGTH     = 0x80,     /**< ASCII length error         */
    CMD_RSP_CODE_ASCII_ERR_MODE       = 0x83,     /**< ASCII mode error           */
    CMD_RSP_CODE_ASCII_ERR_OPCODE     = 0x84,     /**< ASCII opcode error         */
    CMD_RSP_CODE_ASCII_ERR_PARM       = 0x85,     /**< ASCII parameter error      */
    CMD_RSP_CODE_ASCII_RSP_GEN_FAIL   = 0x87,     /**< ASCII Generic Failure      */
    CMD_RSP_CODE_ASCII_MALLOC_FAIL    = 0x8A,     /**< ASCII allocating memory error */
    CMD_RSP_CODE_ASCII_RSP_TIMEOUT    = 0x8C,     /**< ASCII timeout error        */
    CMD_RSP_CODE_ASCII_RSP_MUX_ERR    = 0x91,     /**< ASCII mux channel error    */

    /** Add all new standard response codes before CMD_RSP_CODE_NOT_SET */
    CMD_RSP_CODE_NOT_SET
} CMD_RSP_CODE_T;

static int cmd_engine_fd = CMD_ENGINE_FD_NOT_INIT; /**< Handle to the aux engine */

typedef enum
{
    CMD_ENGINE_INIT_SUCCESS     = 0,
    CMD_ENGINE_INIT_FAIL        = 1,
    CMD_ENGINE_INIT_NOT_PRESENT = 2
} CMD_ENGINE_INIT_T;
/** The Command Protocol Header (Bulk Endpoint/12 byte) - Request Header */
typedef struct
{
    UINT8             reserved1         : 7;  /**< Reserved */
    UINT8             cmd_rsp_flag      : 1;  /**< Command/Response Flag */
    UINT8             seq_tag;                /**< Sequence Tag */
    CMD_DEFS_OPCODE_T  opcode;                 /**< Opcode */
    UINT8             reserved2;              /**< Reserved */
    UINT8             no_rsp_reqd_flag  : 1;  /**< No Response Required Flag */
    UINT8             reserved3         : 7;  /**< Reserved */
    UINT16            reserved4;              /**< Reserved */
    UINT32            length;                 /**< Data Length of Request */
} CMD_DEFS_CMD_REQ_HDR_T;

/** The  Command Protocol Header (Bulk Endpoint/12 byte) - Response Header */
typedef struct
{
    UINT8             unsol_rsp_flag  : 1;    /**< Unsolicited Response Flag */
    UINT8             data_flag       : 1;    /**< Response Data Flag */
    UINT8             fail_flag       : 1;    /**< Fail Flag */
    UINT8             cmd_version    : 4;    /**< CMD Version Number */
    UINT8             cmd_rsp_flag    : 1;    /**< Command/Response Flag */
    UINT8             seq_tag;                /**< Sequence Tag */
    CMD_DEFS_OPCODE_T  opcode;                 /**< Opcode */
    UINT8             reserved1;              /**< Reserved */
    UINT8             rsp_code;               /**< Response Code.  For real */
    UINT16            reserved2;              /**< Reserved */
    UINT32            length;                 /**< Data Length of Response */

} CMD_DEFS_CMD_RSP_HDR_T;

/*
 * BP master clear
 * BP master clear
 * Parameters:
 *    none
 * Return code:
 *    0     - BP master clear successfully
 *    other - error code
 */

int bp_master_clear(void);


#endif