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 <string.h>
29 #include <fcntl.h>
30 #include <termios.h>
31 #include "bt_vendor_qcom.h"
32 #include "userial_vendor.h"
33
34 /******************************************************************************
35 ** Externs
36 ******************************************************************************/
37 extern int hw_config(int nState);
38
39 extern int is_hw_ready();
40
41 /******************************************************************************
42 ** Variables
43 ******************************************************************************/
44 int pFd[2] = {0,};
45 bt_hci_transport_device_type bt_hci_transport_device;
46
47 bt_vendor_callbacks_t *bt_vendor_cbacks = NULL;
48 uint8_t vnd_local_bd_addr[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
49
50 #if (HW_NEED_END_WITH_HCI_RESET == TRUE)
51 void hw_epilog_process(void);
52 #endif
53
54
55 /******************************************************************************
56 ** Local type definitions
57 ******************************************************************************/
58
59
60 /******************************************************************************
61 ** Functions
62 ******************************************************************************/
63
64 /*****************************************************************************
65 **
66 ** BLUETOOTH VENDOR INTERFACE LIBRARY FUNCTIONS
67 **
68 *****************************************************************************/
69
init(const bt_vendor_callbacks_t * p_cb,unsigned char * local_bdaddr)70 static int init(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr)
71 {
72 ALOGI("bt-vendor : init");
73
74 if (p_cb == NULL)
75 {
76 ALOGE("init failed with no user callbacks!");
77 return -1;
78 }
79
80 //userial_vendor_init();
81 //upio_init();
82
83 //vnd_load_conf(VENDOR_LIB_CONF_FILE);
84
85 /* store reference to user callbacks */
86 bt_vendor_cbacks = (bt_vendor_callbacks_t *) p_cb;
87
88 /* This is handed over from the stack */
89 memcpy(vnd_local_bd_addr, local_bdaddr, 6);
90
91 return 0;
92 }
93
94
95 /** Requested operations */
op(bt_vendor_opcode_t opcode,void * param)96 static int op(bt_vendor_opcode_t opcode, void *param)
97 {
98 int retval = 0;
99 int nCnt = 0;
100 int nState = -1;
101
102 ALOGV("bt-vendor : op for %d", opcode);
103
104 switch(opcode)
105 {
106 case BT_VND_OP_POWER_CTRL:
107 {
108 nState = *(int *) param;
109 retval = hw_config(nState);
110 if(nState == BT_VND_PWR_ON
111 && retval == 0
112 && is_hw_ready() == TRUE){
113 retval = 0;
114 }
115 else {
116 retval = -1;
117 }
118 }
119 break;
120
121 case BT_VND_OP_FW_CFG:
122 {
123 // call hciattach to initalize the stack
124 if(bt_vendor_cbacks){
125 ALOGI("Bluetooth Firmware and smd is initialized");
126 bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS);
127 }
128 else{
129 ALOGE("Error : hci, smd initialization Error");
130 bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL);
131 }
132 }
133 break;
134
135 case BT_VND_OP_SCO_CFG:
136 {
137 bt_vendor_cbacks->scocfg_cb(BT_VND_OP_RESULT_SUCCESS); //dummy
138 }
139 break;
140
141 case BT_VND_OP_USERIAL_OPEN:
142 {
143 if(bt_hci_init_transport(pFd) != -1){
144 int (*fd_array)[] = (int (*) []) param;
145
146 (*fd_array)[CH_CMD] = pFd[0];
147 (*fd_array)[CH_EVT] = pFd[0];
148 (*fd_array)[CH_ACL_OUT] = pFd[1];
149 (*fd_array)[CH_ACL_IN] = pFd[1];
150 }
151 else {
152 retval = -1;
153 break;
154 }
155 retval = 2;
156 }
157 break;
158
159 case BT_VND_OP_USERIAL_CLOSE:
160 {
161 bt_hci_deinit_transport(pFd);
162 }
163 break;
164
165 case BT_VND_OP_GET_LPM_IDLE_TIMEOUT:
166 break;
167
168 case BT_VND_OP_LPM_SET_MODE:
169 {
170 bt_vendor_cbacks->lpm_cb(BT_VND_OP_RESULT_SUCCESS); //dummy
171 }
172 break;
173
174 case BT_VND_OP_LPM_WAKE_SET_STATE:
175 break;
176 case BT_VND_OP_EPILOG:
177 {
178 #if (HW_NEED_END_WITH_HCI_RESET == FALSE)
179 if (bt_vendor_cbacks)
180 {
181 bt_vendor_cbacks->epilog_cb(BT_VND_OP_RESULT_SUCCESS);
182 }
183 #else
184 hw_epilog_process();
185 #endif
186 }
187 break;
188 }
189
190 return retval;
191 }
192
193 /** Closes the interface */
cleanup(void)194 static void cleanup( void )
195 {
196 ALOGI("cleanup");
197
198 //upio_cleanup();
199
200 bt_vendor_cbacks = NULL;
201 }
202
203 // Entry point of DLib
204 const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = {
205 sizeof(bt_vendor_interface_t),
206 init,
207 op,
208 cleanup
209 };
210