2 * Copyright (C) 2012 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
34 static adkBtConnectionRequestF bt_crF
= 0;
35 static adkBtLinkKeyRequestF bt_krF
= 0;
36 static adkBtLinkKeyCreatedF bt_kcF
= 0;
37 static adkBtPinRequestF bt_prF
= 0;
38 static adkBtDiscoveryResultF bt_drF
= 0;
39 static adkBtSspDisplayF bt_pdF
= 0;
42 static char btLinkKeyRequest(void* userData
, const uint8_t* mac
, uint8_t* buf
){
43 /* adkBtLinkKeyRequest bt_krF, adkBtLinkKeyCreated bt_kcF , adkBtPinRequest bt_drF */
44 if(bt_krF
) return bt_krF(mac
, buf
);
46 dbgPrintf("BT Link key request from %02x:%02x:%02x:%02x:%02x:%02x -> denied due to lack of handler", mac
[5], mac
[4], mac
[3], mac
[2], mac
[1], mac
[0]);
49 static uint8_t btPinRequestF(void* userData
, const uint8_t* mac
, uint8_t* buf
){ //fill buff with PIN code, return num bytes used (16 max) return 0 to decline
50 /* adkBtPinRequest bt_drF */
52 if(bt_prF
) return bt_prF(mac
, buf
);
54 dbgPrintf("BT PIN request from %02x:%02x:%02x:%02x:%02x:%02x -> '0000' due to lack of handler", mac
[5], mac
[4], mac
[3], mac
[2], mac
[1], mac
[0]);
56 buf
[0] = buf
[1] = buf
[2] = buf
[3] = '0';
60 static void btLinkKeyCreated(void* userData
, const uint8_t* mac
, const uint8_t* buf
){
61 /* adkBtLinkKeyCreated bt_kcF , adkBtPinRequest bt_drF */
62 if(bt_kcF
) bt_kcF(mac
, buf
);
63 /* adkBtLinkKeyRequest bt_krF, adkBtLinkKeyCreated bt_kcF , adkBtPinRequest bt_drF */
66 static char btConnReqF(void* userData
, const uint8_t* mac
, uint32_t devClass
, uint8_t linkType
){ //return 1 to accept
68 if(bt_crF
) return bt_crF(mac
, devClass
, linkType
);
69 /* adkBtConnectionRequest bt_crF, adkBtLinkKeyRequest bt_krF, adkBtLinkKeyCreated bt_kcF , adkBtPinRequest bt_drF */
71 dbgPrintf("BT connection request: %s connection from %02x:%02x:%02x:%02x:%02x:%02x (class %06X) -> accepted due to lack of handler\n", linkType
? "ACL" : "SCO", mac
[5], mac
[4], mac
[3], mac
[2], mac
[1], mac
[0], devClass
);
75 static void btConnStartF(void* userData
, uint16_t conn
, const uint8_t* mac
, uint8_t linkType
, uint8_t encrMode
){
77 dbgPrintf("BT %s connection up with handle %d to %02x:%02x:%02x:%02x:%02x:%02x encryption type %d\n",
78 linkType
? "ACL" : "SCO", conn
, mac
[5], mac
[4], mac
[3], mac
[2], mac
[1], mac
[0], encrMode
);
79 l2capAclLinkUp(conn
); /* btConnStartF => l2capAclLinkUp (printf linktype,handle,and bt mac ) */
82 static void btConnEndF(void* userData
, uint16_t conn
, uint8_t reason
) {
84 dbgPrintf("BT connection with handle %d down for reason %d\n", conn
, reason
);
85 l2capAclLinkDown(conn
); /* btConnEndF => l2capAclLinkDown */
88 static void btAclDataRxF(void* userData
, uint16_t conn
, char first
, uint8_t bcastType
, const uint8_t* data
, uint16_t sz
){ /* BtAclDataRxF */
89 //printf("ACL %d\n",conn);
91 l2capAclLinkDataRx(conn
, first
, data
, sz
);
94 static void btSspShowF(void* userData
, const uint8_t* mac
, uint32_t val
){
96 if(val
== BT_SSP_DONE_VAL
) val
= ADK_BT_SSP_DONE_VAL
;
98 if(bt_pdF
) bt_pdF(mac
, val
); /* adkBtSspF */
101 static char btVerboseScanCbkF(void* userData
, BtDiscoveryResult
* dr
){
103 if(bt_drF
) return bt_drF(dr
->mac
, dr
->PSRM
, dr
->PSPM
, dr
->PSM
, dr
->co
, dr
->dc
);
105 dbgPrintf("BT: no callback for scan makes the scan useless, no?");
109 extern char btName
[64];
110 void ADK_adkInit(void){
116 for(int i=0; i<10; i++){
124 static const BtFuncs myBtFuncs
= {NULL
, btVerboseScanCbkF
, btConnReqF
, btConnStartF
, btConnEndF
, btPinRequestF
, btLinkKeyRequest
, btLinkKeyCreated
, btAclDataRxF
, btSspShowF
};
125 // todo judge btinit failed
126 btInit(&myBtFuncs
); //BT UART & HCI driver
128 btSdpRegisterL2capService(); //SDP daemon
129 btRfcommRegisterL2capService(); //RFCOMM framework
131 btA2dpRegister(); //A2DP profile
133 uint8_t mac
[BT_MAC_SIZE
];
135 if(btLocalMac(mac
)) dbgPrintf("BT MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", mac
[5], mac
[4], mac
[3], mac
[2], mac
[1], mac
[0]);
136 snprintf(btName
, sizeof( btName
), "bt-test-%02x-%02x", mac
[1], mac
[0]);
137 printf("device :%s\n",btName
);
141 void ADK_adkDeinit(void)
143 /* liutest add adversed to ADK_adkInit */
144 //l2capServiceUnregister(L2CAP_PSM_AVDTP);
145 //l2capServiceUnregister(L2CAP_PSM_RFCOMM);
146 //l2capServiceUnregister(L2CAP_PSM_SDP);
148 btRfcommUnregisterL2capService(0);
149 btSdpUnregisterL2capService(0);
155 void ADK_adkEventProcess(void){
159 void ADK_getUniqueId(uint32_t* ID
){
164 void ADK_audioOn(int source
, uint32_t samplerate
){
166 audioOn(source
, samplerate
);
169 void ADK_audioOff(int source
){
174 void ADK_audioAddBuffer(int source
, const uint16_t* samples
, uint32_t numSamples
){
176 audioAddBuffer(source
, samples
, numSamples
);
180 void ADK_btEnable(adkBtConnectionRequestF crF
, adkBtLinkKeyRequestF krF
, adkBtLinkKeyCreatedF kcF
, adkBtPinRequestF prF
, adkBtDiscoveryResultF drF
){
181 /* adkBtConnectionRequest bt_crF, adkBtLinkKeyRequest bt_krF, adkBtLinkKeyCreated bt_kcF , adkBtPinRequest bt_drF */
189 void ADK_btSetSspCallback(adkBtSspDisplayF pdF
){
194 char ADK_btSetLocalName(const char* name
){
196 return btSetLocalName(name
);
199 char ADK_btGetRemoteName(const uint8_t* mac
, uint8_t PSRM
, uint8_t PSM
, uint16_t co
, char* nameBuf
){
201 return btGetRemoteName(mac
, PSRM
, PSM
, co
, nameBuf
);
204 void ADK_btScan(void){
209 char ADK_btDiscoverable(char on
){
211 return btDiscoverable(on
);
214 char ADK_btConnectable(char on
){
216 return btConnectable(on
);
219 char ADK_btSetDeviceClass(uint32_t cls
){
221 return btSetDeviceClass(cls
);
224 void ADK_setVolume(uint8_t vol
){
229 uint8_t ADK_getVolume(void){
248 void ADK_l2capServiceTx(uint16_t conn
, uint16_t remChan
, const uint8_t* data
, uint32_t size
){ //send data over L2CAP
250 sg_buf
* buf
= sg_alloc();
253 if(sg_add_back(buf
, data
, size
, SG_FLAG_MAKE_A_COPY
)) l2capServiceTx(conn
, remChan
, buf
);
257 void ADK_l2capServiceCloseConn(uint16_t conn
, uint16_t chan
){
259 l2capServiceCloseConn(conn
, chan
);
262 char ADK_l2capServiceRegister(uint16_t PSM
, const L2capService
* svcData
){
264 return l2capServiceRegister(PSM
, svcData
);
267 char ADK_l2capServiceUnregister(uint16_t PSM
){
268 // default sendDiscPacket = 1
269 return l2capServiceUnregister(PSM
,1);
272 void ADK_btSdpServiceDescriptorAdd(const uint8_t* descriptor
, uint16_t descrLen
){
274 btSdpServiceDescriptorAdd(descriptor
, descrLen
);
277 void ADK_btSdpServiceDescriptorDel(const uint8_t* descriptor
){
279 btSdpServiceDescriptorDel(descriptor
);
282 void ADK_btRfcommRegisterPort(uint8_t dlci
, BtRfcommPortOpenF oF
, BtRfcommPortCloseF cF
, BtRfcommPortRxF rF
){
284 btRfcommRegisterPort(dlci
, oF
, cF
, rF
);
287 void ADK_btRfcommPortTx(void* port
, uint8_t dlci
, const uint8_t* data
, uint16_t size
){
289 btRfcommPortTx(port
, dlci
, data
, size
);
292 uint8_t ADK_btRfcommReserveDlci(uint8_t preference
){
294 return btRfcommReserveDlci(preference
);
297 void ADK_btRfcommReleaseDlci(uint8_t dlci
){
299 btRfcommReleaseDlci(dlci
);