Committer:
hosei2
Date:
Tue Jul 10 11:36:47 2012 +0000
Revision:
0:db1ba09e8bfa
zzz

Who changed what in which revision?

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