added k60d100m project
[adk-bluetooth-test.git] / adk-stack / ADK.c
blobc5ae3bb3cd258df19ebbce5ffe94aac61dc347db
1 /*
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.
16 #define ADK_INTERNAL
18 #include "fwk.h"
20 #include "Audio.h"
21 #include "dbg.h"
22 #include "coop.h"
23 #include "BT.h"
24 #include "HCI.h"
25 #include "btL2CAP.h"
26 #include "btRFCOMM.h"
27 #include "btSDP.h"
28 #include "btA2DP.h"
30 #include "sgBuf.h"
32 #include "ADK.h"
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]);
47 return 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';
57 return 4;
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);
72 return 1;
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);
90 //printf("2\n");
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?");
106 return 0;
109 extern char btName[64];
110 void ADK_adkInit(void){
112 //board init
113 fwkInit();
114 coopInit();
115 /* test
116 for(int i=0; i<10; i++){
117 audioInit();
118 audioDeinit();
121 audioInit();
123 //bt init
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);
147 btA2dpUnregister(0);
148 btRfcommUnregisterL2capService(0);
149 btSdpUnregisterL2capService(0);
151 btDeinit();
152 audioDeinit();
155 void ADK_adkEventProcess(void){
156 coopYield();
159 void ADK_getUniqueId(uint32_t* ID){
161 cpuGetUniqId(ID);
164 void ADK_audioOn(int source, uint32_t samplerate){
166 audioOn(source, samplerate);
169 void ADK_audioOff(int source){
171 audioOff(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 */
182 bt_crF = crF;
183 bt_krF = krF;
184 bt_kcF = kcF;
185 bt_prF = prF;
186 bt_drF = drF;
189 void ADK_btSetSspCallback(adkBtSspDisplayF pdF){
191 bt_pdF = 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){
206 btScan();
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){
226 setVolume(vol);
229 uint8_t ADK_getVolume(void){
231 return getVolume();
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();
252 if(!buf) return;
253 if(sg_add_back(buf, data, size, SG_FLAG_MAKE_A_COPY)) l2capServiceTx(conn, remChan, buf);
254 else sg_free(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);