summaryrefslogtreecommitdiff
path: root/src/bt_vendor_brcm.c (plain)
blob: 9bd89227781e5d86e41633642be7a40936c7d594
1/******************************************************************************
2 *
3 * Copyright (C) 2009-2012 Broadcom Corporation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19/******************************************************************************
20 *
21 * Filename: bt_vendor_brcm.c
22 *
23 * Description: Broadcom vendor specific library implementation
24 *
25 ******************************************************************************/
26
27#define LOG_TAG "bt_vendor"
28
29#include <utils/Log.h>
30#include "bt_vendor_brcm.h"
31#include "upio.h"
32#include "userial_vendor.h"
33
34#ifndef BTVND_DBG
35#define BTVND_DBG FALSE
36#endif
37
38#if (BTVND_DBG == TRUE)
39#define BTVNDDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);}
40#else
41#define BTVNDDBG(param, ...) {}
42#endif
43
44/******************************************************************************
45** Externs
46******************************************************************************/
47
48void hw_config_start(void);
49uint8_t hw_lpm_enable(uint8_t turn_on);
50uint32_t hw_lpm_get_idle_timeout(void);
51void hw_lpm_set_wake_state(uint8_t wake_assert);
52#if (SCO_CFG_INCLUDED == TRUE)
53void hw_sco_config(void);
54#endif
55void vnd_load_conf(const char *p_path);
56
57/******************************************************************************
58** Variables
59******************************************************************************/
60
61bt_vendor_callbacks_t *bt_vendor_cbacks = NULL;
62uint8_t vnd_local_bd_addr[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
63
64/******************************************************************************
65** Local type definitions
66******************************************************************************/
67
68/******************************************************************************
69** Static Variables
70******************************************************************************/
71
72static const tUSERIAL_CFG userial_init_cfg =
73{
74 (USERIAL_DATABITS_8 | USERIAL_PARITY_NONE | USERIAL_STOPBITS_1),
75 USERIAL_BAUD_115200
76};
77
78/******************************************************************************
79** Functions
80******************************************************************************/
81
82/*****************************************************************************
83**
84** BLUETOOTH VENDOR INTERFACE LIBRARY FUNCTIONS
85**
86*****************************************************************************/
87
88static int init(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr)
89{
90 ALOGI("init");
91
92 if (p_cb == NULL)
93 {
94 ALOGE("init failed with no user callbacks!");
95 return -1;
96 }
97
98#if (VENDOR_LIB_RUNTIME_TUNING_ENABLED == TRUE)
99 ALOGW("*****************************************************************");
100 ALOGW("*****************************************************************");
101 ALOGW("** Warning - BT Vendor Lib is loaded in debug tuning mode!");
102 ALOGW("**");
103 ALOGW("** If this is not intentional, rebuild libbt-vendor.so ");
104 ALOGW("** with VENDOR_LIB_RUNTIME_TUNING_ENABLED=FALSE and ");
105 ALOGW("** check if any run-time tuning parameters needed to be");
106 ALOGW("** carried to the build-time configuration accordingly.");
107 ALOGW("*****************************************************************");
108 ALOGW("*****************************************************************");
109#endif
110
111 userial_vendor_init();
112 upio_init();
113
114 vnd_load_conf(VENDOR_LIB_CONF_FILE);
115
116 /* store reference to user callbacks */
117 bt_vendor_cbacks = (bt_vendor_callbacks_t *) p_cb;
118
119 /* This is handed over from the stack */
120 memcpy(vnd_local_bd_addr, local_bdaddr, 6);
121
122 return 0;
123}
124
125
126/** Requested operations */
127static int op(bt_vendor_opcode_t opcode, void *param)
128{
129 int retval = 0;
130
131 BTVNDDBG("op for %d", opcode);
132
133 switch(opcode)
134 {
135 case BT_VND_OP_POWER_CTRL:
136 {
137 int *state = (int *) param;
138 if (*state == BT_VND_PWR_OFF)
139 upio_set_bluetooth_power(UPIO_BT_POWER_OFF);
140 else if (*state == BT_VND_PWR_ON)
141 upio_set_bluetooth_power(UPIO_BT_POWER_ON);
142 }
143 break;
144
145 case BT_VND_OP_FW_CFG:
146 {
147 hw_config_start();
148 }
149 break;
150
151 case BT_VND_OP_SCO_CFG:
152 {
153#if (SCO_CFG_INCLUDED == TRUE)
154 hw_sco_config();
155#else
156 retval = -1;
157#endif
158 }
159 break;
160
161 case BT_VND_OP_USERIAL_OPEN:
162 {
163 int (*fd_array)[] = (int (*)[]) param;
164 int fd, idx;
165 fd = userial_vendor_open((tUSERIAL_CFG *) &userial_init_cfg);
166 if (fd != -1)
167 {
168 for (idx=0; idx < CH_MAX; idx++)
169 (*fd_array)[idx] = fd;
170
171 retval = 1;
172 }
173 /* retval contains numbers of open fd of HCI channels */
174 }
175 break;
176
177 case BT_VND_OP_USERIAL_CLOSE:
178 {
179 userial_vendor_close();
180 }
181 break;
182
183 case BT_VND_OP_GET_LPM_IDLE_TIMEOUT:
184 {
185 uint32_t *timeout_ms = (uint32_t *) param;
186 *timeout_ms = hw_lpm_get_idle_timeout();
187 }
188 break;
189
190 case BT_VND_OP_LPM_SET_MODE:
191 {
192 uint8_t *mode = (uint8_t *) param;
193 retval = hw_lpm_enable(*mode);
194 }
195 break;
196
197 case BT_VND_OP_LPM_WAKE_SET_STATE:
198 {
199 uint8_t *state = (uint8_t *) param;
200 uint8_t wake_assert = (*state == BT_VND_LPM_WAKE_ASSERT) ? \
201 TRUE : FALSE;
202
203 hw_lpm_set_wake_state(wake_assert);
204 }
205 break;
206 }
207
208 return retval;
209}
210
211/** Closes the interface */
212static void cleanup( void )
213{
214 BTVNDDBG("cleanup");
215
216 upio_cleanup();
217
218 bt_vendor_cbacks = NULL;
219}
220
221// Entry point of DLib
222const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = {
223 sizeof(bt_vendor_interface_t),
224 init,
225 op,
226 cleanup
227};
228