1/*
2 * Copyright 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/******************************************************************************
18 *
19 *  Filename:      bt_vendor_brcm.c
20 *
21 *  Description:   Broadcom vendor specific library implementation
22 *
23 ******************************************************************************/
24
25#define LOG_TAG "bt_vendor"
26
27#include <utils/Log.h>
28#include <fcntl.h>
29#include <termios.h>
30#include "bt_vendor_qcom.h"
31#include "userial_vendor.h"
32
33/******************************************************************************
34**  Externs
35******************************************************************************/
36extern int hw_config(int nState);
37
38extern int is_hw_ready();
39
40/******************************************************************************
41**  Variables
42******************************************************************************/
43int pFd[2] = {0,};
44bt_hci_transport_device_type bt_hci_transport_device;
45
46bt_vendor_callbacks_t *bt_vendor_cbacks = NULL;
47uint8_t vnd_local_bd_addr[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
48
49#if (HW_NEED_END_WITH_HCI_RESET == TRUE)
50void hw_epilog_process(void);
51#endif
52
53
54/******************************************************************************
55**  Local type definitions
56******************************************************************************/
57
58
59/******************************************************************************
60**  Functions
61******************************************************************************/
62
63/*****************************************************************************
64**
65**   BLUETOOTH VENDOR INTERFACE LIBRARY FUNCTIONS
66**
67*****************************************************************************/
68
69static int init(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr)
70{
71    ALOGI("bt-vendor : init");
72
73    if (p_cb == NULL)
74    {
75        ALOGE("init failed with no user callbacks!");
76        return -1;
77    }
78
79    //userial_vendor_init();
80    //upio_init();
81
82    //vnd_load_conf(VENDOR_LIB_CONF_FILE);
83
84    /* store reference to user callbacks */
85    bt_vendor_cbacks = (bt_vendor_callbacks_t *) p_cb;
86
87    /* This is handed over from the stack */
88    memcpy(vnd_local_bd_addr, local_bdaddr, 6);
89
90    return 0;
91}
92
93
94/** Requested operations */
95static int op(bt_vendor_opcode_t opcode, void *param)
96{
97    int retval = 0;
98    int nCnt = 0;
99    int nState = -1;
100
101    ALOGV("bt-vendor : op for %d", opcode);
102
103    switch(opcode)
104    {
105        case BT_VND_OP_POWER_CTRL:
106            {
107                nState = *(int *) param;
108                retval = hw_config(nState);
109                if(nState == BT_VND_PWR_ON
110                   && retval == 0
111                   && is_hw_ready() == TRUE){
112                    retval = 0;
113                }
114                else {
115                    retval = -1;
116                }
117            }
118            break;
119
120        case BT_VND_OP_FW_CFG:
121            {
122                // call hciattach to initalize the stack
123                if(bt_vendor_cbacks){
124                   ALOGI("Bluetooth Firmware and smd is initialized");
125                   bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS);
126                }
127                else{
128                   ALOGE("Error : hci, smd initialization Error");
129                   bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL);
130                }
131            }
132            break;
133
134        case BT_VND_OP_SCO_CFG:
135            {
136                bt_vendor_cbacks->scocfg_cb(BT_VND_OP_RESULT_SUCCESS); //dummy
137            }
138            break;
139
140        case BT_VND_OP_USERIAL_OPEN:
141            {
142                if(bt_hci_init_transport(pFd) != -1){
143                    int (*fd_array)[] = (int (*) []) param;
144
145                        (*fd_array)[CH_CMD] = pFd[0];
146                        (*fd_array)[CH_EVT] = pFd[0];
147                        (*fd_array)[CH_ACL_OUT] = pFd[1];
148                        (*fd_array)[CH_ACL_IN] = pFd[1];
149                }
150                else {
151                    retval = -1;
152                    break;
153                }
154                retval = 2;
155            }
156            break;
157
158        case BT_VND_OP_USERIAL_CLOSE:
159            {
160                 bt_hci_deinit_transport(pFd);
161            }
162            break;
163
164        case BT_VND_OP_GET_LPM_IDLE_TIMEOUT:
165            break;
166
167        case BT_VND_OP_LPM_SET_MODE:
168            {
169                bt_vendor_cbacks->lpm_cb(BT_VND_OP_RESULT_SUCCESS); //dummy
170            }
171            break;
172
173        case BT_VND_OP_LPM_WAKE_SET_STATE:
174            break;
175        case BT_VND_OP_EPILOG:
176            {
177#if (HW_NEED_END_WITH_HCI_RESET == FALSE)
178                if (bt_vendor_cbacks)
179                {
180                    bt_vendor_cbacks->epilog_cb(BT_VND_OP_RESULT_SUCCESS);
181                }
182#else
183                hw_epilog_process();
184#endif
185            }
186            break;
187    }
188
189    return retval;
190}
191
192/** Closes the interface */
193static void cleanup( void )
194{
195    ALOGI("cleanup");
196
197    //upio_cleanup();
198
199    bt_vendor_cbacks = NULL;
200}
201
202// Entry point of DLib
203const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = {
204    sizeof(bt_vendor_interface_t),
205    init,
206    op,
207    cleanup
208};
209