Henk Bouwman / Mbed 2 deprecated BlueUSB

Dependencies:   mbed

Committer:
meathome
Date:
Tue Mar 01 12:00:17 2011 +0000
Revision:
0:a1f905acca78

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
meathome 0:a1f905acca78 1
meathome 0:a1f905acca78 2 /*
meathome 0:a1f905acca78 3 Copyright (c) 2010 Peter Barrett
meathome 0:a1f905acca78 4
meathome 0:a1f905acca78 5 Permission is hereby granted, free of charge, to any person obtaining a copy
meathome 0:a1f905acca78 6 of this software and associated documentation files (the "Software"), to deal
meathome 0:a1f905acca78 7 in the Software without restriction, including without limitation the rights
meathome 0:a1f905acca78 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
meathome 0:a1f905acca78 9 copies of the Software, and to permit persons to whom the Software is
meathome 0:a1f905acca78 10 furnished to do so, subject to the following conditions:
meathome 0:a1f905acca78 11
meathome 0:a1f905acca78 12 The above copyright notice and this permission notice shall be included in
meathome 0:a1f905acca78 13 all copies or substantial portions of the Software.
meathome 0:a1f905acca78 14
meathome 0:a1f905acca78 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
meathome 0:a1f905acca78 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
meathome 0:a1f905acca78 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
meathome 0:a1f905acca78 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
meathome 0:a1f905acca78 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
meathome 0:a1f905acca78 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
meathome 0:a1f905acca78 21 THE SOFTWARE.
meathome 0:a1f905acca78 22 */
meathome 0:a1f905acca78 23
meathome 0:a1f905acca78 24 #include <stdio.h>
meathome 0:a1f905acca78 25 #include <stdlib.h>
meathome 0:a1f905acca78 26 #include <stdio.h>
meathome 0:a1f905acca78 27 #include <string.h>
meathome 0:a1f905acca78 28
meathome 0:a1f905acca78 29 #include "Utils.h"
meathome 0:a1f905acca78 30 #include "USBHost.h"
meathome 0:a1f905acca78 31 #include "hci.h"
meathome 0:a1f905acca78 32
meathome 0:a1f905acca78 33 void printf(const BD_ADDR* addr)
meathome 0:a1f905acca78 34 {
meathome 0:a1f905acca78 35 const u8* a = addr->addr;
meathome 0:a1f905acca78 36 printf("%02X:%02X:%02X:%02X:%02X:%02X",a[5],a[4],a[3],a[2],a[1],a[0]);
meathome 0:a1f905acca78 37 }
meathome 0:a1f905acca78 38
meathome 0:a1f905acca78 39 #define MAX_HCL_SIZE 260
meathome 0:a1f905acca78 40 #define MAX_ACL_SIZE 400
meathome 0:a1f905acca78 41
meathome 0:a1f905acca78 42 class HCITransportUSB : public HCITransport
meathome 0:a1f905acca78 43 {
meathome 0:a1f905acca78 44 int _device;
meathome 0:a1f905acca78 45 u8* _hciBuffer;
meathome 0:a1f905acca78 46 u8* _aclBuffer;
meathome 0:a1f905acca78 47
meathome 0:a1f905acca78 48 public:
meathome 0:a1f905acca78 49 void Open(int device, u8* hciBuffer, u8* aclBuffer)
meathome 0:a1f905acca78 50 {
meathome 0:a1f905acca78 51 _device = device;
meathome 0:a1f905acca78 52 _hciBuffer = hciBuffer;
meathome 0:a1f905acca78 53 _aclBuffer = aclBuffer;
meathome 0:a1f905acca78 54 USBInterruptTransfer(_device,0x81,_hciBuffer,MAX_HCL_SIZE,HciCallback,this);
meathome 0:a1f905acca78 55 USBBulkTransfer(_device,0x82,_aclBuffer,MAX_ACL_SIZE,AclCallback,this);
meathome 0:a1f905acca78 56 }
meathome 0:a1f905acca78 57
meathome 0:a1f905acca78 58 static void HciCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
meathome 0:a1f905acca78 59 {
meathome 0:a1f905acca78 60 HCI* t = ((HCITransportUSB*)userData)->_target;
meathome 0:a1f905acca78 61 if (t)
meathome 0:a1f905acca78 62 t->HCIRecv(data,len);
meathome 0:a1f905acca78 63 USBInterruptTransfer(device,0x81,data,MAX_HCL_SIZE,HciCallback,userData);
meathome 0:a1f905acca78 64 }
meathome 0:a1f905acca78 65
meathome 0:a1f905acca78 66 static void AclCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
meathome 0:a1f905acca78 67 {
meathome 0:a1f905acca78 68 HCI* t = ((HCITransportUSB*)userData)->_target;
meathome 0:a1f905acca78 69 if (t)
meathome 0:a1f905acca78 70 t->ACLRecv(data,len);
meathome 0:a1f905acca78 71 USBBulkTransfer(device,0x82,data,MAX_ACL_SIZE,AclCallback,userData);
meathome 0:a1f905acca78 72 }
meathome 0:a1f905acca78 73
meathome 0:a1f905acca78 74 virtual void HCISend(const u8* data, int len)
meathome 0:a1f905acca78 75 {
meathome 0:a1f905acca78 76 USBControlTransfer(_device,REQUEST_TYPE_CLASS, 0, 0, 0,(u8*)data,len);
meathome 0:a1f905acca78 77 }
meathome 0:a1f905acca78 78
meathome 0:a1f905acca78 79 virtual void ACLSend(const u8* data, int len)
meathome 0:a1f905acca78 80 {
meathome 0:a1f905acca78 81 USBBulkTransfer(_device,0x02,(u8*)data,len);
meathome 0:a1f905acca78 82 }
meathome 0:a1f905acca78 83 };
meathome 0:a1f905acca78 84
meathome 0:a1f905acca78 85
meathome 0:a1f905acca78 86 #define WII_REMOTE 0x042500
meathome 0:a1f905acca78 87
meathome 0:a1f905acca78 88 class HIDBluetooth
meathome 0:a1f905acca78 89 {
meathome 0:a1f905acca78 90 int _control; // Sockets for control (out) and interrupt (in)
meathome 0:a1f905acca78 91 int _interrupt;
meathome 0:a1f905acca78 92 int _devClass;
meathome 0:a1f905acca78 93 BD_ADDR _addr;
meathome 0:a1f905acca78 94 u8 _pad[2]; // Struct align
meathome 0:a1f905acca78 95
meathome 0:a1f905acca78 96 public:
meathome 0:a1f905acca78 97 HIDBluetooth() : _control(0),_interrupt(0),_devClass(0) {};
meathome 0:a1f905acca78 98
meathome 0:a1f905acca78 99 bool InUse()
meathome 0:a1f905acca78 100 {
meathome 0:a1f905acca78 101 return _control != 0;
meathome 0:a1f905acca78 102 }
meathome 0:a1f905acca78 103
meathome 0:a1f905acca78 104 static void OnHidInterrupt(int socket, SocketState state, const u8* data, int len, void* userData)
meathome 0:a1f905acca78 105 {
meathome 0:a1f905acca78 106 HIDBluetooth* t = (HIDBluetooth*)userData;
meathome 0:a1f905acca78 107 if (data)
meathome 0:a1f905acca78 108 {
meathome 0:a1f905acca78 109 if (t->_devClass == WII_REMOTE && data[1] == 0x30)
meathome 0:a1f905acca78 110 {
meathome 0:a1f905acca78 111 printf("================wii====================\n");
meathome 0:a1f905acca78 112 t->Led();
meathome 0:a1f905acca78 113 t->Hid(); // ask for accelerometer
meathome 0:a1f905acca78 114 t->_devClass = 0;
meathome 0:a1f905acca78 115 }
meathome 0:a1f905acca78 116
meathome 0:a1f905acca78 117 const u8* d = data;
meathome 0:a1f905acca78 118 switch (d[1])
meathome 0:a1f905acca78 119 {
meathome 0:a1f905acca78 120 case 0x02:
meathome 0:a1f905acca78 121 {
meathome 0:a1f905acca78 122 int x = (signed char)d[3];
meathome 0:a1f905acca78 123 int y = (signed char)d[4];
meathome 0:a1f905acca78 124 printf("Mouse %2X dx:%d dy:%d\n",d[2],x,y);
meathome 0:a1f905acca78 125 }
meathome 0:a1f905acca78 126 break;
meathome 0:a1f905acca78 127
meathome 0:a1f905acca78 128 case 0x37: // Accelerometer http://wiki.wiimoteproject.com/Reports
meathome 0:a1f905acca78 129 {
meathome 0:a1f905acca78 130 int pad = (d[2] & 0x9F) | ((d[3] & 0x9F) << 8);
meathome 0:a1f905acca78 131 int x = (d[2] & 0x60) >> 5 | d[4] << 2;
meathome 0:a1f905acca78 132 int y = (d[3] & 0x20) >> 4 | d[5] << 2;
meathome 0:a1f905acca78 133 int z = (d[3] & 0x40) >> 5 | d[6] << 2;
meathome 0:a1f905acca78 134 printf("WII %04X %d %d %d\n",pad,x,y,z);
meathome 0:a1f905acca78 135 }
meathome 0:a1f905acca78 136 break;
meathome 0:a1f905acca78 137 default:
meathome 0:a1f905acca78 138 printHex(data,len);
meathome 0:a1f905acca78 139 }
meathome 0:a1f905acca78 140 }
meathome 0:a1f905acca78 141 }
meathome 0:a1f905acca78 142
meathome 0:a1f905acca78 143 static void OnHidControl(int socket, SocketState state, const u8* data, int len, void* userData)
meathome 0:a1f905acca78 144 {
meathome 0:a1f905acca78 145 printf("OnHidControl\n");
meathome 0:a1f905acca78 146 if (data)
meathome 0:a1f905acca78 147 printHex(data,len);
meathome 0:a1f905acca78 148 }
meathome 0:a1f905acca78 149
meathome 0:a1f905acca78 150 void Open(BD_ADDR* bdAddr, inquiry_info* info)
meathome 0:a1f905acca78 151 {
meathome 0:a1f905acca78 152 printf("L2CAPAddr size %d\n",sizeof(L2CAPAddr));
meathome 0:a1f905acca78 153 _addr = *bdAddr;
meathome 0:a1f905acca78 154 L2CAPAddr sockAddr;
meathome 0:a1f905acca78 155 sockAddr.bdaddr = _addr;
meathome 0:a1f905acca78 156 sockAddr.psm = L2CAP_PSM_HID_INTR;
meathome 0:a1f905acca78 157 printf("Socket_Open size %d\n",sizeof(L2CAPAddr));
meathome 0:a1f905acca78 158 _interrupt = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidInterrupt,this);
meathome 0:a1f905acca78 159 sockAddr.psm = L2CAP_PSM_HID_CNTL;
meathome 0:a1f905acca78 160 _control = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidControl,this);
meathome 0:a1f905acca78 161
meathome 0:a1f905acca78 162 printfBytes("OPEN DEVICE CLASS",info->dev_class,3);
meathome 0:a1f905acca78 163 _devClass = (info->dev_class[0] << 16) | (info->dev_class[1] << 8) | info->dev_class[2];
meathome 0:a1f905acca78 164 }
meathome 0:a1f905acca78 165
meathome 0:a1f905acca78 166 void Close()
meathome 0:a1f905acca78 167 {
meathome 0:a1f905acca78 168 if (_control)
meathome 0:a1f905acca78 169 Socket_Close(_control);
meathome 0:a1f905acca78 170 if (_interrupt)
meathome 0:a1f905acca78 171 Socket_Close(_interrupt);
meathome 0:a1f905acca78 172 _control = _interrupt = 0;
meathome 0:a1f905acca78 173 }
meathome 0:a1f905acca78 174
meathome 0:a1f905acca78 175 void Led(int id = 0x10)
meathome 0:a1f905acca78 176 {
meathome 0:a1f905acca78 177 u8 led[3] = {0x52, 0x11, id};
meathome 0:a1f905acca78 178 if (_control)
meathome 0:a1f905acca78 179 Socket_Send(_control,led,3);
meathome 0:a1f905acca78 180 }
meathome 0:a1f905acca78 181
meathome 0:a1f905acca78 182 void Hid(int report = 0x37)
meathome 0:a1f905acca78 183 {
meathome 0:a1f905acca78 184 u8 hid[4] = { 0x52, 0x12, 0x00, report };
meathome 0:a1f905acca78 185 if (_control != -1)
meathome 0:a1f905acca78 186 Socket_Send(_control,hid,4);
meathome 0:a1f905acca78 187 }
meathome 0:a1f905acca78 188 };
meathome 0:a1f905acca78 189
meathome 0:a1f905acca78 190
meathome 0:a1f905acca78 191 HCI* gHCI = 0;
meathome 0:a1f905acca78 192
meathome 0:a1f905acca78 193 #define MAX_HID_DEVICES 8
meathome 0:a1f905acca78 194
meathome 0:a1f905acca78 195 int GetConsoleChar();
meathome 0:a1f905acca78 196 class ShellApp
meathome 0:a1f905acca78 197 {
meathome 0:a1f905acca78 198 char _line[64];
meathome 0:a1f905acca78 199 HIDBluetooth _hids[MAX_HID_DEVICES];
meathome 0:a1f905acca78 200
meathome 0:a1f905acca78 201 public:
meathome 0:a1f905acca78 202 void Ready()
meathome 0:a1f905acca78 203 {
meathome 0:a1f905acca78 204 printf("HIDBluetooth %d\n",sizeof(HIDBluetooth));
meathome 0:a1f905acca78 205 memset(_hids,0,sizeof(_hids));
meathome 0:a1f905acca78 206 Inquiry();
meathome 0:a1f905acca78 207
meathome 0:a1f905acca78 208 }
meathome 0:a1f905acca78 209
meathome 0:a1f905acca78 210 // We have connected to a device
meathome 0:a1f905acca78 211 void ConnectionComplete(HCI* hci, connection_info* info)
meathome 0:a1f905acca78 212 {
meathome 0:a1f905acca78 213 printf("ConnectionComplete ");
meathome 0:a1f905acca78 214 BD_ADDR* a = &info->bdaddr;
meathome 0:a1f905acca78 215 printf(a);
meathome 0:a1f905acca78 216 BTDevice* bt = hci->Find(a);
meathome 0:a1f905acca78 217 HIDBluetooth* hid = NewHIDBluetooth();
meathome 0:a1f905acca78 218 printf("%08x %08x\n",bt,hid);
meathome 0:a1f905acca78 219 if (hid)
meathome 0:a1f905acca78 220 hid->Open(a,&bt->_info);
meathome 0:a1f905acca78 221 }
meathome 0:a1f905acca78 222
meathome 0:a1f905acca78 223 HIDBluetooth* NewHIDBluetooth()
meathome 0:a1f905acca78 224 {
meathome 0:a1f905acca78 225 for (int i = 0; i < MAX_HID_DEVICES; i++)
meathome 0:a1f905acca78 226 if (!_hids[i].InUse())
meathome 0:a1f905acca78 227 return _hids+i;
meathome 0:a1f905acca78 228 return 0;
meathome 0:a1f905acca78 229 }
meathome 0:a1f905acca78 230
meathome 0:a1f905acca78 231 void ConnectDevices()
meathome 0:a1f905acca78 232 {
meathome 0:a1f905acca78 233 BTDevice* devs[8];
meathome 0:a1f905acca78 234 int count = gHCI->GetDevices(devs,8);
meathome 0:a1f905acca78 235 for (int i = 0; i < count; i++)
meathome 0:a1f905acca78 236 {
meathome 0:a1f905acca78 237 printfBytes("DEVICE CLASS",devs[i]->_info.dev_class,3);
meathome 0:a1f905acca78 238 if (devs[i]->_handle == 0)
meathome 0:a1f905acca78 239 {
meathome 0:a1f905acca78 240 BD_ADDR* bd = &devs[i]->_info.bdaddr;
meathome 0:a1f905acca78 241 printf("Connecting to ");
meathome 0:a1f905acca78 242 printf(bd);
meathome 0:a1f905acca78 243 printf("\n");
meathome 0:a1f905acca78 244 gHCI->CreateConnection(bd);
meathome 0:a1f905acca78 245 }
meathome 0:a1f905acca78 246 }
meathome 0:a1f905acca78 247 }
meathome 0:a1f905acca78 248
meathome 0:a1f905acca78 249 const char* ReadLine()
meathome 0:a1f905acca78 250 {
meathome 0:a1f905acca78 251 int i;
meathome 0:a1f905acca78 252 for (i = 0; i < 255; )
meathome 0:a1f905acca78 253 {
meathome 0:a1f905acca78 254 USBLoop();
meathome 0:a1f905acca78 255 int c = GetConsoleChar();
meathome 0:a1f905acca78 256 if (c == -1)
meathome 0:a1f905acca78 257 continue;
meathome 0:a1f905acca78 258 if (c == '\n' || c == 13)
meathome 0:a1f905acca78 259 break;
meathome 0:a1f905acca78 260 _line[i++] = c;
meathome 0:a1f905acca78 261 }
meathome 0:a1f905acca78 262 _line[i] = 0;
meathome 0:a1f905acca78 263 return _line;
meathome 0:a1f905acca78 264 }
meathome 0:a1f905acca78 265
meathome 0:a1f905acca78 266 void Inquiry()
meathome 0:a1f905acca78 267 {
meathome 0:a1f905acca78 268 printf("Inquiry..\n");
meathome 0:a1f905acca78 269 gHCI->Inquiry();
meathome 0:a1f905acca78 270 }
meathome 0:a1f905acca78 271
meathome 0:a1f905acca78 272 void List()
meathome 0:a1f905acca78 273 {
meathome 0:a1f905acca78 274 #if 0
meathome 0:a1f905acca78 275 printf("%d devices\n",_deviceCount);
meathome 0:a1f905acca78 276 for (int i = 0; i < _deviceCount; i++)
meathome 0:a1f905acca78 277 {
meathome 0:a1f905acca78 278 printf(&_devices[i].info.bdaddr);
meathome 0:a1f905acca78 279 printf("\n");
meathome 0:a1f905acca78 280 }
meathome 0:a1f905acca78 281 #endif
meathome 0:a1f905acca78 282 }
meathome 0:a1f905acca78 283
meathome 0:a1f905acca78 284 void Connect()
meathome 0:a1f905acca78 285 {
meathome 0:a1f905acca78 286 ConnectDevices();
meathome 0:a1f905acca78 287 }
meathome 0:a1f905acca78 288
meathome 0:a1f905acca78 289 void Disconnect()
meathome 0:a1f905acca78 290 {
meathome 0:a1f905acca78 291 gHCI->DisconnectAll();
meathome 0:a1f905acca78 292 }
meathome 0:a1f905acca78 293
meathome 0:a1f905acca78 294 void CloseMouse()
meathome 0:a1f905acca78 295 {
meathome 0:a1f905acca78 296 }
meathome 0:a1f905acca78 297
meathome 0:a1f905acca78 298 void Quit()
meathome 0:a1f905acca78 299 {
meathome 0:a1f905acca78 300 CloseMouse();
meathome 0:a1f905acca78 301 }
meathome 0:a1f905acca78 302
meathome 0:a1f905acca78 303 void Run()
meathome 0:a1f905acca78 304 {
meathome 0:a1f905acca78 305 for(;;)
meathome 0:a1f905acca78 306 {
meathome 0:a1f905acca78 307 const char* cmd = ReadLine();
meathome 0:a1f905acca78 308 if (strcmp(cmd,"scan") == 0 || strcmp(cmd,"inquiry") == 0)
meathome 0:a1f905acca78 309 Inquiry();
meathome 0:a1f905acca78 310 else if (strcmp(cmd,"ls") == 0)
meathome 0:a1f905acca78 311 List();
meathome 0:a1f905acca78 312 else if (strcmp(cmd,"connect") == 0)
meathome 0:a1f905acca78 313 Connect();
meathome 0:a1f905acca78 314 else if (strcmp(cmd,"disconnect") == 0)
meathome 0:a1f905acca78 315 Disconnect();
meathome 0:a1f905acca78 316 else if (strcmp(cmd,"q")== 0)
meathome 0:a1f905acca78 317 {
meathome 0:a1f905acca78 318 Quit();
meathome 0:a1f905acca78 319 break;
meathome 0:a1f905acca78 320 } else {
meathome 0:a1f905acca78 321 printf("eh? %s\n",cmd);
meathome 0:a1f905acca78 322 }
meathome 0:a1f905acca78 323 }
meathome 0:a1f905acca78 324 }
meathome 0:a1f905acca78 325 };
meathome 0:a1f905acca78 326
meathome 0:a1f905acca78 327 // Instance
meathome 0:a1f905acca78 328 ShellApp gApp;
meathome 0:a1f905acca78 329
meathome 0:a1f905acca78 330 static int HciCallback(HCI* hci, HCI_CALLBACK_EVENT evt, const u8* data, int len)
meathome 0:a1f905acca78 331 {
meathome 0:a1f905acca78 332 switch (evt)
meathome 0:a1f905acca78 333 {
meathome 0:a1f905acca78 334 case CALLBACK_READY:
meathome 0:a1f905acca78 335 printf("CALLBACK_READY\n");
meathome 0:a1f905acca78 336 gApp.Ready();
meathome 0:a1f905acca78 337 break;
meathome 0:a1f905acca78 338
meathome 0:a1f905acca78 339 case CALLBACK_INQUIRY_RESULT:
meathome 0:a1f905acca78 340 printf("CALLBACK_INQUIRY_RESULT ");
meathome 0:a1f905acca78 341 printf((BD_ADDR*)data);
meathome 0:a1f905acca78 342 printf("\n");
meathome 0:a1f905acca78 343 break;
meathome 0:a1f905acca78 344
meathome 0:a1f905acca78 345 case CALLBACK_INQUIRY_DONE:
meathome 0:a1f905acca78 346 printf("CALLBACK_INQUIRY_DONE\n");
meathome 0:a1f905acca78 347 gApp.ConnectDevices();
meathome 0:a1f905acca78 348 break;
meathome 0:a1f905acca78 349
meathome 0:a1f905acca78 350 case CALLBACK_REMOTE_NAME:
meathome 0:a1f905acca78 351 {
meathome 0:a1f905acca78 352 BD_ADDR* addr = (BD_ADDR*)data;
meathome 0:a1f905acca78 353 const char* name = (const char*)(data + 6);
meathome 0:a1f905acca78 354 printf(addr);
meathome 0:a1f905acca78 355 printf(" % s\n",name);
meathome 0:a1f905acca78 356 }
meathome 0:a1f905acca78 357 break;
meathome 0:a1f905acca78 358
meathome 0:a1f905acca78 359 case CALLBACK_CONNECTION_COMPLETE:
meathome 0:a1f905acca78 360 gApp.ConnectionComplete(hci,(connection_info*)data);
meathome 0:a1f905acca78 361 break;
meathome 0:a1f905acca78 362 };
meathome 0:a1f905acca78 363 return 0;
meathome 0:a1f905acca78 364 }
meathome 0:a1f905acca78 365
meathome 0:a1f905acca78 366 // these should be placed in the DMA SRAM
meathome 0:a1f905acca78 367 typedef struct
meathome 0:a1f905acca78 368 {
meathome 0:a1f905acca78 369 u8 _hciBuffer[MAX_HCL_SIZE];
meathome 0:a1f905acca78 370 u8 _aclBuffer[MAX_ACL_SIZE];
meathome 0:a1f905acca78 371 } SRAMPlacement;
meathome 0:a1f905acca78 372
meathome 0:a1f905acca78 373 HCITransportUSB _HCITransportUSB;
meathome 0:a1f905acca78 374 HCI _HCI;
meathome 0:a1f905acca78 375
meathome 0:a1f905acca78 376 u8* USBGetBuffer(u32* len);
meathome 0:a1f905acca78 377 int OnBluetoothInsert(int device)
meathome 0:a1f905acca78 378 {
meathome 0:a1f905acca78 379 printf("Bluetooth inserted of %d\n",device);
meathome 0:a1f905acca78 380 u32 sramLen;
meathome 0:a1f905acca78 381 u8* sram = USBGetBuffer(&sramLen);
meathome 0:a1f905acca78 382 sram = (u8*)(((u32)sram + 1023) & ~1023);
meathome 0:a1f905acca78 383 SRAMPlacement* s = (SRAMPlacement*)sram;
meathome 0:a1f905acca78 384 _HCITransportUSB.Open(device,s->_hciBuffer,s->_aclBuffer);
meathome 0:a1f905acca78 385 _HCI.Open(&_HCITransportUSB,HciCallback);
meathome 0:a1f905acca78 386 RegisterSocketHandler(SOCKET_L2CAP,&_HCI);
meathome 0:a1f905acca78 387 gHCI = &_HCI;
meathome 0:a1f905acca78 388 gApp.Inquiry();
meathome 0:a1f905acca78 389 return 0;
meathome 0:a1f905acca78 390 }
meathome 0:a1f905acca78 391
meathome 0:a1f905acca78 392 void TestShell()
meathome 0:a1f905acca78 393 {
meathome 0:a1f905acca78 394 USBInit();
meathome 0:a1f905acca78 395 gApp.Run();
meathome 0:a1f905acca78 396 }