Joe Nagata / Mbed 2 deprecated BlueUSB

Dependencies:   mbed

Committer:
joenagata
Date:
Sat Feb 26 07:24:32 2011 +0000
Revision:
0:e5197e77ab57
rev.1

Who changed what in which revision?

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