Bluetooth support for MBED with $2 Bluetooth dongles. Includes a USB host and built in support for bluetooth HID devices such as mice, keyboards and wii controllers.

Dependencies:   mbed

Committer:
peterbarrett1967
Date:
Sat Apr 10 00:30:24 2010 +0000
Revision:
0:606b230e5b4a

        

Who changed what in which revision?

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