Test Ver

Dependencies:   mbed FatFileSystem

Committer:
jksoft
Date:
Sat Nov 17 13:22:00 2012 +0000
Revision:
0:269589d8d2c2
Test Program

Who changed what in which revision?

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