This program uses code taken from another program called BlueUSB

Dependencies:   mbed

Committer:
madcowswe
Date:
Sat Dec 10 18:45:31 2011 +0000
Revision:
0:31713f62f35b

        

Who changed what in which revision?

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