/******************************************************************************
 *
 *  Copyright 2001-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  this file contains constants and definitions for the bte project
 *
 ******************************************************************************/
#ifndef BTE_H
#define BTE_H

#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include "bt_target.h"

/* By default on shutdown, the baud rate is reset to 115kbits. This should NOT
 * be needed for platforms that kill the BTE driver and remove/reset BT chip.
 */
#ifndef BTE_RESET_BAUD_ON_BT_DISABLE
#define BTE_RESET_BAUD_ON_BT_DISABLE TRUE
#endif

/* Target Modes (based on jumper settings on hardware [see user manual])
 *                           BTE                  BBY
 *                           J3   J4              SW3-3   SW3-2   SW3-1
 *                          --------------------------------------------
 * BTE_MODE_SERIAL_APP,      OUT  OUT             OFF     OFF     OFF
 * BTE_MODE_APPL,            IN   OUT             OFF     OFF     ON
 * BTE_MODE_RESERVED,        OUT  IN              OFF     ON      OFF
 * BTE_MODE_SAMPLE_APPS,     IN   IN              OFF     ON      ON
 * BTE_MODE_DONGLE,          not yet supported    ON      OFF     OFF
 * BTE_MODE_APPL_PROTOCOL_TRACE,     * this is a fake mode *
 * BTE_MODE_INVALID
 */
enum {
  BTE_MODE_SERIAL_APP,          /* Sample serial port application      */
  BTE_MODE_APPL,                /* Target used with Tester through RPC */
  BTE_MODE_RESERVED,            /* Reserved                            */
  BTE_MODE_SAMPLE_APPS,         /* Sample applications (ICP/HSP)       */
  BTE_MODE_DONGLE,              /* Dongle mode                         */
  BTE_MODE_APPL_PROTOCOL_TRACE, /* Allow protocol tracing without rpc */
  BTE_MODE_INVALID
};

extern volatile uint8_t
    bte_target_mode; /* indicates the mode that the board is running in */

/* Startup options */
extern uint32_t bte_startup_options; /* Switch and jumper settings at startup */
void bte_get_startup_options(
    uint32_t*
        p_options); /* Platform specific function for getting startup options */

#define BTE_OPTIONS_TARGET_MODE_MASK                                         \
  0x00000007 /* bits 2-0 indicate target mode (QuickConnect: jp3 & jp4, BBY: \
                SW3-1 & SW3-2)*/

/****************************************************************************
 * Definitions to define which type of application gets built
 ****************************************************************************/
#define BUILD_HCITOOL FALSE
#define BUILD_L2PING FALSE

#define LINUX_FM_DRIVER_INCLUDED FALSE

/* hcisu userial operations. should probably go into bt_types to avoid
 * collisions! */
#define BT_EVT_TO_HCISU_USERIAL_OP (0x0080 | BT_EVT_HCISU)
/* operation for above hcisu event */
#define BT_HCISU_USERIAL_OPEN                                                 \
  (0)                              /* open serial port calling USERIAL_Open() \
                                      */
#define BT_HCISU_USERIAL_CLOSE (1) /* close userial port */
/* options associated with close op */
#define BT_HCISU_USERIAL_CL_NO_DIS_BT \
  0 /* do not touch bt_wake and power gpio */
#define BT_HCISU_USERIAL_CL_DIS_BT                              \
  1 /* put power and bt_wake into defined off state to preserve \
       power */
/* status codes for callback */
#define BTE_HCISU_USERIAL_FAIL 0
#define BTE_HCISU_USERIAL_OK 1
typedef void(tUSERIAL_MSG_CBACK)(int status);
typedef struct tHCISU_USERIAL_MSG_tag {
  BT_HDR hdr;
  tUSERIAL_MSG_CBACK* p_cback;
  uint8_t port; /* port number */
  uint8_t op;
  uint8_t option; /* option for operation. depends on operation */
} tHCISU_USERIAL_MSG;

extern void bte_hcisu_userial_oper(tUSERIAL_MSG_CBACK* p_cback, uint8_t port,
                                   uint8_t op, uint8_t option);

/* Pointer to function for sending HCI commands and data to the HCI tranport */
extern int (*p_bte_hci_send)(uint16_t port, BT_HDR* p_msg);

// Initialize control block memory for each stack component.
extern void BTE_InitStack(void);

/* Protocol trace mask */
extern uint32_t bte_proto_trace_mask;

typedef struct tBAUD_REG_tag {
  uint8_t DHBR;
  uint8_t DLBR;
  uint8_t ExplicitBaudRate0;
  uint8_t ExplicitBaudRate1;
  uint8_t ExplicitBaudRate2;
  uint8_t ExplicitBaudRate3;
} tBAUD_REG;

extern const tBAUD_REG baud_rate_regs[];

#endif /* BTE_H */
