BlueUSBv1 fork with no FAT file system

Dependencies:   mbed-rtos mbed

Fork of BlueUSBv1 by Phillip Nguyen

Committer:
ballaw
Date:
Tue Nov 18 18:42:28 2014 +0000
Revision:
2:7f4915fe5708
Parent:
1:12422708d6c8
Got to compile with no FAT file system. Haven't tested yet though

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>
acorness 1:12422708d6c8 28 #include <math.h>
peterbarrett1967 0:606b230e5b4a 29
peterbarrett1967 0:606b230e5b4a 30 #include "Utils.h"
peterbarrett1967 0:606b230e5b4a 31 #include "USBHost.h"
peterbarrett1967 0:606b230e5b4a 32 #include "hci.h"
acorness 1:12422708d6c8 33 #include "mbed.h"
acorness 1:12422708d6c8 34 #include "rtos.h"
acorness 1:12422708d6c8 35
acorness 1:12422708d6c8 36 DigitalOut led1(LED1);
acorness 1:12422708d6c8 37 DigitalOut led2(LED2);
acorness 1:12422708d6c8 38 DigitalOut led3(LED3);
acorness 1:12422708d6c8 39 DigitalOut led4(LED4);
acorness 1:12422708d6c8 40
acorness 1:12422708d6c8 41 typedef enum { //MAKE STATE VALUES
acorness 1:12422708d6c8 42 Left,
acorness 1:12422708d6c8 43 Right,
acorness 1:12422708d6c8 44 Up,
acorness 1:12422708d6c8 45 Down,
acorness 1:12422708d6c8 46 Nothing
acorness 1:12422708d6c8 47 } Wiistate;
acorness 1:12422708d6c8 48
acorness 1:12422708d6c8 49 Wiistate wiistate = Nothing;
acorness 1:12422708d6c8 50
acorness 1:12422708d6c8 51 float vol = 0; //VOLUME FLOAT
acorness 1:12422708d6c8 52
acorness 1:12422708d6c8 53 Mutex key;
acorness 1:12422708d6c8 54
peterbarrett1967 0:606b230e5b4a 55
peterbarrett1967 0:606b230e5b4a 56 void printf(const BD_ADDR* addr)
peterbarrett1967 0:606b230e5b4a 57 {
peterbarrett1967 0:606b230e5b4a 58 const u8* a = addr->addr;
peterbarrett1967 0:606b230e5b4a 59 printf("%02X:%02X:%02X:%02X:%02X:%02X",a[5],a[4],a[3],a[2],a[1],a[0]);
peterbarrett1967 0:606b230e5b4a 60 }
peterbarrett1967 0:606b230e5b4a 61
peterbarrett1967 0:606b230e5b4a 62 #define MAX_HCL_SIZE 260
peterbarrett1967 0:606b230e5b4a 63 #define MAX_ACL_SIZE 400
peterbarrett1967 0:606b230e5b4a 64
peterbarrett1967 0:606b230e5b4a 65 class HCITransportUSB : public HCITransport
peterbarrett1967 0:606b230e5b4a 66 {
peterbarrett1967 0:606b230e5b4a 67 int _device;
peterbarrett1967 0:606b230e5b4a 68 u8* _hciBuffer;
peterbarrett1967 0:606b230e5b4a 69 u8* _aclBuffer;
peterbarrett1967 0:606b230e5b4a 70
peterbarrett1967 0:606b230e5b4a 71 public:
peterbarrett1967 0:606b230e5b4a 72 void Open(int device, u8* hciBuffer, u8* aclBuffer)
peterbarrett1967 0:606b230e5b4a 73 {
peterbarrett1967 0:606b230e5b4a 74 _device = device;
peterbarrett1967 0:606b230e5b4a 75 _hciBuffer = hciBuffer;
peterbarrett1967 0:606b230e5b4a 76 _aclBuffer = aclBuffer;
peterbarrett1967 0:606b230e5b4a 77 USBInterruptTransfer(_device,0x81,_hciBuffer,MAX_HCL_SIZE,HciCallback,this);
peterbarrett1967 0:606b230e5b4a 78 USBBulkTransfer(_device,0x82,_aclBuffer,MAX_ACL_SIZE,AclCallback,this);
peterbarrett1967 0:606b230e5b4a 79 }
peterbarrett1967 0:606b230e5b4a 80
peterbarrett1967 0:606b230e5b4a 81 static void HciCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
peterbarrett1967 0:606b230e5b4a 82 {
peterbarrett1967 0:606b230e5b4a 83 HCI* t = ((HCITransportUSB*)userData)->_target;
peterbarrett1967 0:606b230e5b4a 84 if (t)
peterbarrett1967 0:606b230e5b4a 85 t->HCIRecv(data,len);
peterbarrett1967 0:606b230e5b4a 86 USBInterruptTransfer(device,0x81,data,MAX_HCL_SIZE,HciCallback,userData);
peterbarrett1967 0:606b230e5b4a 87 }
peterbarrett1967 0:606b230e5b4a 88
peterbarrett1967 0:606b230e5b4a 89 static void AclCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
peterbarrett1967 0:606b230e5b4a 90 {
peterbarrett1967 0:606b230e5b4a 91 HCI* t = ((HCITransportUSB*)userData)->_target;
peterbarrett1967 0:606b230e5b4a 92 if (t)
peterbarrett1967 0:606b230e5b4a 93 t->ACLRecv(data,len);
peterbarrett1967 0:606b230e5b4a 94 USBBulkTransfer(device,0x82,data,MAX_ACL_SIZE,AclCallback,userData);
peterbarrett1967 0:606b230e5b4a 95 }
peterbarrett1967 0:606b230e5b4a 96
peterbarrett1967 0:606b230e5b4a 97 virtual void HCISend(const u8* data, int len)
peterbarrett1967 0:606b230e5b4a 98 {
peterbarrett1967 0:606b230e5b4a 99 USBControlTransfer(_device,REQUEST_TYPE_CLASS, 0, 0, 0,(u8*)data,len);
peterbarrett1967 0:606b230e5b4a 100 }
peterbarrett1967 0:606b230e5b4a 101
peterbarrett1967 0:606b230e5b4a 102 virtual void ACLSend(const u8* data, int len)
peterbarrett1967 0:606b230e5b4a 103 {
peterbarrett1967 0:606b230e5b4a 104 USBBulkTransfer(_device,0x02,(u8*)data,len);
peterbarrett1967 0:606b230e5b4a 105 }
peterbarrett1967 0:606b230e5b4a 106 };
peterbarrett1967 0:606b230e5b4a 107
peterbarrett1967 0:606b230e5b4a 108
peterbarrett1967 0:606b230e5b4a 109 #define WII_REMOTE 0x042500
peterbarrett1967 0:606b230e5b4a 110
peterbarrett1967 0:606b230e5b4a 111 class HIDBluetooth
peterbarrett1967 0:606b230e5b4a 112 {
peterbarrett1967 0:606b230e5b4a 113 int _control; // Sockets for control (out) and interrupt (in)
peterbarrett1967 0:606b230e5b4a 114 int _interrupt;
peterbarrett1967 0:606b230e5b4a 115 int _devClass;
peterbarrett1967 0:606b230e5b4a 116 BD_ADDR _addr;
peterbarrett1967 0:606b230e5b4a 117 u8 _pad[2]; // Struct align
peterbarrett1967 0:606b230e5b4a 118
peterbarrett1967 0:606b230e5b4a 119 public:
peterbarrett1967 0:606b230e5b4a 120 HIDBluetooth() : _control(0),_interrupt(0),_devClass(0) {};
peterbarrett1967 0:606b230e5b4a 121
peterbarrett1967 0:606b230e5b4a 122 bool InUse()
peterbarrett1967 0:606b230e5b4a 123 {
peterbarrett1967 0:606b230e5b4a 124 return _control != 0;
peterbarrett1967 0:606b230e5b4a 125 }
peterbarrett1967 0:606b230e5b4a 126
peterbarrett1967 0:606b230e5b4a 127 static void OnHidInterrupt(int socket, SocketState state, const u8* data, int len, void* userData)
peterbarrett1967 0:606b230e5b4a 128 {
peterbarrett1967 0:606b230e5b4a 129 HIDBluetooth* t = (HIDBluetooth*)userData;
peterbarrett1967 0:606b230e5b4a 130 if (data)
peterbarrett1967 0:606b230e5b4a 131 {
peterbarrett1967 0:606b230e5b4a 132 if (t->_devClass == WII_REMOTE && data[1] == 0x30)
peterbarrett1967 0:606b230e5b4a 133 {
peterbarrett1967 0:606b230e5b4a 134 printf("================wii====================\n");
peterbarrett1967 0:606b230e5b4a 135 t->Led();
peterbarrett1967 0:606b230e5b4a 136 t->Hid(); // ask for accelerometer
peterbarrett1967 0:606b230e5b4a 137 t->_devClass = 0;
peterbarrett1967 0:606b230e5b4a 138 }
peterbarrett1967 0:606b230e5b4a 139
peterbarrett1967 0:606b230e5b4a 140 const u8* d = data;
peterbarrett1967 0:606b230e5b4a 141 switch (d[1])
peterbarrett1967 0:606b230e5b4a 142 {
peterbarrett1967 0:606b230e5b4a 143 case 0x02:
peterbarrett1967 0:606b230e5b4a 144 {
peterbarrett1967 0:606b230e5b4a 145 int x = (signed char)d[3];
peterbarrett1967 0:606b230e5b4a 146 int y = (signed char)d[4];
peterbarrett1967 0:606b230e5b4a 147 printf("Mouse %2X dx:%d dy:%d\n",d[2],x,y);
peterbarrett1967 0:606b230e5b4a 148 }
peterbarrett1967 0:606b230e5b4a 149 break;
peterbarrett1967 0:606b230e5b4a 150
peterbarrett1967 0:606b230e5b4a 151 case 0x37: // Accelerometer http://wiki.wiimoteproject.com/Reports
peterbarrett1967 0:606b230e5b4a 152 {
peterbarrett1967 0:606b230e5b4a 153 int pad = (d[2] & 0x9F) | ((d[3] & 0x9F) << 8);
peterbarrett1967 0:606b230e5b4a 154 int x = (d[2] & 0x60) >> 5 | d[4] << 2;
peterbarrett1967 0:606b230e5b4a 155 int y = (d[3] & 0x20) >> 4 | d[5] << 2;
peterbarrett1967 0:606b230e5b4a 156 int z = (d[3] & 0x40) >> 5 | d[6] << 2;
acorness 1:12422708d6c8 157 //printf("WII2 %04X %d %d %d\n",pad,x,y,z);
acorness 1:12422708d6c8 158 int resolution= 24; //SENSITIVITY OF STATES
acorness 1:12422708d6c8 159
acorness 1:12422708d6c8 160 key.lock(); //LOCK GLOBAL VAR CHANGES
acorness 1:12422708d6c8 161
acorness 1:12422708d6c8 162 if(pad==0x0800){ //CHECK FOR BUTTON A
acorness 1:12422708d6c8 163 vol= (x-420)-(x-420)%21;
acorness 1:12422708d6c8 164 vol= vol/210;
acorness 1:12422708d6c8 165 if(vol<0) vol=0;
acorness 1:12422708d6c8 166 printf("Volume= %f\n",vol);
acorness 1:12422708d6c8 167 }
acorness 1:12422708d6c8 168 else if(pad==0x0400){ //OTHERWISE CHECK B
acorness 1:12422708d6c8 169
acorness 1:12422708d6c8 170 if(x<416+resolution){ //LEFT
acorness 1:12422708d6c8 171 wiistate=Left;
acorness 1:12422708d6c8 172 led1=1;
acorness 1:12422708d6c8 173 led2=0;
acorness 1:12422708d6c8 174 led3=0;
acorness 1:12422708d6c8 175 led4=0;
acorness 1:12422708d6c8 176 }
acorness 1:12422708d6c8 177 else if(x>630-resolution){ //RIGHT
acorness 1:12422708d6c8 178 wiistate=Right;
acorness 1:12422708d6c8 179 led1=0;
acorness 1:12422708d6c8 180 led2=1;
acorness 1:12422708d6c8 181 led3=0;
acorness 1:12422708d6c8 182 led4=0;
acorness 1:12422708d6c8 183 }
acorness 1:12422708d6c8 184 else if(y<420+resolution){ //UP
acorness 1:12422708d6c8 185 wiistate=Up;
acorness 1:12422708d6c8 186 led1=0;
acorness 1:12422708d6c8 187 led2=0;
acorness 1:12422708d6c8 188 led3=1;
acorness 1:12422708d6c8 189 led4=0;
acorness 1:12422708d6c8 190 }
acorness 1:12422708d6c8 191 else if(z>630-resolution){ //DOWN
acorness 1:12422708d6c8 192 wiistate=Down;
acorness 1:12422708d6c8 193 led1=0;
acorness 1:12422708d6c8 194 led2=0;
acorness 1:12422708d6c8 195 led3=0;
acorness 1:12422708d6c8 196 led4=1;
acorness 1:12422708d6c8 197 }
acorness 1:12422708d6c8 198 else{ //NOTHING
acorness 1:12422708d6c8 199 wiistate=Nothing;
acorness 1:12422708d6c8 200 led1=0;
acorness 1:12422708d6c8 201 led2=0;
acorness 1:12422708d6c8 202 led3=0;
acorness 1:12422708d6c8 203 led4=0;
acorness 1:12422708d6c8 204 }
acorness 1:12422708d6c8 205 }
acorness 1:12422708d6c8 206
acorness 1:12422708d6c8 207 key.unlock(); //UNLOCK GLOBAL VAR CHANGES
acorness 1:12422708d6c8 208
peterbarrett1967 0:606b230e5b4a 209 }
peterbarrett1967 0:606b230e5b4a 210 break;
peterbarrett1967 0:606b230e5b4a 211 default:
peterbarrett1967 0:606b230e5b4a 212 printHex(data,len);
peterbarrett1967 0:606b230e5b4a 213 }
peterbarrett1967 0:606b230e5b4a 214 }
peterbarrett1967 0:606b230e5b4a 215 }
peterbarrett1967 0:606b230e5b4a 216
peterbarrett1967 0:606b230e5b4a 217 static void OnHidControl(int socket, SocketState state, const u8* data, int len, void* userData)
peterbarrett1967 0:606b230e5b4a 218 {
peterbarrett1967 0:606b230e5b4a 219 printf("OnHidControl\n");
peterbarrett1967 0:606b230e5b4a 220 if (data)
peterbarrett1967 0:606b230e5b4a 221 printHex(data,len);
peterbarrett1967 0:606b230e5b4a 222 }
peterbarrett1967 0:606b230e5b4a 223
peterbarrett1967 0:606b230e5b4a 224 void Open(BD_ADDR* bdAddr, inquiry_info* info)
peterbarrett1967 0:606b230e5b4a 225 {
peterbarrett1967 0:606b230e5b4a 226 printf("L2CAPAddr size %d\n",sizeof(L2CAPAddr));
peterbarrett1967 0:606b230e5b4a 227 _addr = *bdAddr;
peterbarrett1967 0:606b230e5b4a 228 L2CAPAddr sockAddr;
peterbarrett1967 0:606b230e5b4a 229 sockAddr.bdaddr = _addr;
peterbarrett1967 0:606b230e5b4a 230 sockAddr.psm = L2CAP_PSM_HID_INTR;
peterbarrett1967 0:606b230e5b4a 231 printf("Socket_Open size %d\n",sizeof(L2CAPAddr));
peterbarrett1967 0:606b230e5b4a 232 _interrupt = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidInterrupt,this);
peterbarrett1967 0:606b230e5b4a 233 sockAddr.psm = L2CAP_PSM_HID_CNTL;
peterbarrett1967 0:606b230e5b4a 234 _control = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidControl,this);
peterbarrett1967 0:606b230e5b4a 235
peterbarrett1967 0:606b230e5b4a 236 printfBytes("OPEN DEVICE CLASS",info->dev_class,3);
peterbarrett1967 0:606b230e5b4a 237 _devClass = (info->dev_class[0] << 16) | (info->dev_class[1] << 8) | info->dev_class[2];
peterbarrett1967 0:606b230e5b4a 238 }
peterbarrett1967 0:606b230e5b4a 239
peterbarrett1967 0:606b230e5b4a 240 void Close()
peterbarrett1967 0:606b230e5b4a 241 {
peterbarrett1967 0:606b230e5b4a 242 if (_control)
peterbarrett1967 0:606b230e5b4a 243 Socket_Close(_control);
peterbarrett1967 0:606b230e5b4a 244 if (_interrupt)
peterbarrett1967 0:606b230e5b4a 245 Socket_Close(_interrupt);
peterbarrett1967 0:606b230e5b4a 246 _control = _interrupt = 0;
peterbarrett1967 0:606b230e5b4a 247 }
peterbarrett1967 0:606b230e5b4a 248
peterbarrett1967 0:606b230e5b4a 249 void Led(int id = 0x10)
peterbarrett1967 0:606b230e5b4a 250 {
peterbarrett1967 0:606b230e5b4a 251 u8 led[3] = {0x52, 0x11, id};
peterbarrett1967 0:606b230e5b4a 252 if (_control)
peterbarrett1967 0:606b230e5b4a 253 Socket_Send(_control,led,3);
peterbarrett1967 0:606b230e5b4a 254 }
peterbarrett1967 0:606b230e5b4a 255
peterbarrett1967 0:606b230e5b4a 256 void Hid(int report = 0x37)
peterbarrett1967 0:606b230e5b4a 257 {
peterbarrett1967 0:606b230e5b4a 258 u8 hid[4] = { 0x52, 0x12, 0x00, report };
peterbarrett1967 0:606b230e5b4a 259 if (_control != -1)
peterbarrett1967 0:606b230e5b4a 260 Socket_Send(_control,hid,4);
peterbarrett1967 0:606b230e5b4a 261 }
peterbarrett1967 0:606b230e5b4a 262 };
peterbarrett1967 0:606b230e5b4a 263
peterbarrett1967 0:606b230e5b4a 264
peterbarrett1967 0:606b230e5b4a 265 HCI* gHCI = 0;
peterbarrett1967 0:606b230e5b4a 266
peterbarrett1967 0:606b230e5b4a 267 #define MAX_HID_DEVICES 8
peterbarrett1967 0:606b230e5b4a 268
peterbarrett1967 0:606b230e5b4a 269 int GetConsoleChar();
peterbarrett1967 0:606b230e5b4a 270 class ShellApp
peterbarrett1967 0:606b230e5b4a 271 {
peterbarrett1967 0:606b230e5b4a 272 char _line[64];
peterbarrett1967 0:606b230e5b4a 273 HIDBluetooth _hids[MAX_HID_DEVICES];
peterbarrett1967 0:606b230e5b4a 274
peterbarrett1967 0:606b230e5b4a 275 public:
peterbarrett1967 0:606b230e5b4a 276 void Ready()
peterbarrett1967 0:606b230e5b4a 277 {
peterbarrett1967 0:606b230e5b4a 278 printf("HIDBluetooth %d\n",sizeof(HIDBluetooth));
peterbarrett1967 0:606b230e5b4a 279 memset(_hids,0,sizeof(_hids));
peterbarrett1967 0:606b230e5b4a 280 Inquiry();
peterbarrett1967 0:606b230e5b4a 281
peterbarrett1967 0:606b230e5b4a 282 }
peterbarrett1967 0:606b230e5b4a 283
peterbarrett1967 0:606b230e5b4a 284 // We have connected to a device
peterbarrett1967 0:606b230e5b4a 285 void ConnectionComplete(HCI* hci, connection_info* info)
peterbarrett1967 0:606b230e5b4a 286 {
peterbarrett1967 0:606b230e5b4a 287 printf("ConnectionComplete ");
peterbarrett1967 0:606b230e5b4a 288 BD_ADDR* a = &info->bdaddr;
peterbarrett1967 0:606b230e5b4a 289 printf(a);
peterbarrett1967 0:606b230e5b4a 290 BTDevice* bt = hci->Find(a);
peterbarrett1967 0:606b230e5b4a 291 HIDBluetooth* hid = NewHIDBluetooth();
peterbarrett1967 0:606b230e5b4a 292 printf("%08x %08x\n",bt,hid);
peterbarrett1967 0:606b230e5b4a 293 if (hid)
peterbarrett1967 0:606b230e5b4a 294 hid->Open(a,&bt->_info);
peterbarrett1967 0:606b230e5b4a 295 }
peterbarrett1967 0:606b230e5b4a 296
peterbarrett1967 0:606b230e5b4a 297 HIDBluetooth* NewHIDBluetooth()
peterbarrett1967 0:606b230e5b4a 298 {
peterbarrett1967 0:606b230e5b4a 299 for (int i = 0; i < MAX_HID_DEVICES; i++)
peterbarrett1967 0:606b230e5b4a 300 if (!_hids[i].InUse())
peterbarrett1967 0:606b230e5b4a 301 return _hids+i;
peterbarrett1967 0:606b230e5b4a 302 return 0;
peterbarrett1967 0:606b230e5b4a 303 }
peterbarrett1967 0:606b230e5b4a 304
peterbarrett1967 0:606b230e5b4a 305 void ConnectDevices()
peterbarrett1967 0:606b230e5b4a 306 {
peterbarrett1967 0:606b230e5b4a 307 BTDevice* devs[8];
peterbarrett1967 0:606b230e5b4a 308 int count = gHCI->GetDevices(devs,8);
peterbarrett1967 0:606b230e5b4a 309 for (int i = 0; i < count; i++)
peterbarrett1967 0:606b230e5b4a 310 {
peterbarrett1967 0:606b230e5b4a 311 printfBytes("DEVICE CLASS",devs[i]->_info.dev_class,3);
peterbarrett1967 0:606b230e5b4a 312 if (devs[i]->_handle == 0)
peterbarrett1967 0:606b230e5b4a 313 {
peterbarrett1967 0:606b230e5b4a 314 BD_ADDR* bd = &devs[i]->_info.bdaddr;
peterbarrett1967 0:606b230e5b4a 315 printf("Connecting to ");
peterbarrett1967 0:606b230e5b4a 316 printf(bd);
peterbarrett1967 0:606b230e5b4a 317 printf("\n");
peterbarrett1967 0:606b230e5b4a 318 gHCI->CreateConnection(bd);
peterbarrett1967 0:606b230e5b4a 319 }
peterbarrett1967 0:606b230e5b4a 320 }
peterbarrett1967 0:606b230e5b4a 321 }
peterbarrett1967 0:606b230e5b4a 322
peterbarrett1967 0:606b230e5b4a 323 const char* ReadLine()
peterbarrett1967 0:606b230e5b4a 324 {
peterbarrett1967 0:606b230e5b4a 325 int i;
peterbarrett1967 0:606b230e5b4a 326 for (i = 0; i < 255; )
peterbarrett1967 0:606b230e5b4a 327 {
peterbarrett1967 0:606b230e5b4a 328 USBLoop();
peterbarrett1967 0:606b230e5b4a 329 int c = GetConsoleChar();
peterbarrett1967 0:606b230e5b4a 330 if (c == -1)
peterbarrett1967 0:606b230e5b4a 331 continue;
peterbarrett1967 0:606b230e5b4a 332 if (c == '\n' || c == 13)
peterbarrett1967 0:606b230e5b4a 333 break;
peterbarrett1967 0:606b230e5b4a 334 _line[i++] = c;
peterbarrett1967 0:606b230e5b4a 335 }
peterbarrett1967 0:606b230e5b4a 336 _line[i] = 0;
peterbarrett1967 0:606b230e5b4a 337 return _line;
peterbarrett1967 0:606b230e5b4a 338 }
peterbarrett1967 0:606b230e5b4a 339
peterbarrett1967 0:606b230e5b4a 340 void Inquiry()
peterbarrett1967 0:606b230e5b4a 341 {
peterbarrett1967 0:606b230e5b4a 342 printf("Inquiry..\n");
peterbarrett1967 0:606b230e5b4a 343 gHCI->Inquiry();
peterbarrett1967 0:606b230e5b4a 344 }
peterbarrett1967 0:606b230e5b4a 345
peterbarrett1967 0:606b230e5b4a 346 void List()
peterbarrett1967 0:606b230e5b4a 347 {
peterbarrett1967 0:606b230e5b4a 348 #if 0
peterbarrett1967 0:606b230e5b4a 349 printf("%d devices\n",_deviceCount);
peterbarrett1967 0:606b230e5b4a 350 for (int i = 0; i < _deviceCount; i++)
peterbarrett1967 0:606b230e5b4a 351 {
peterbarrett1967 0:606b230e5b4a 352 printf(&_devices[i].info.bdaddr);
peterbarrett1967 0:606b230e5b4a 353 printf("\n");
peterbarrett1967 0:606b230e5b4a 354 }
peterbarrett1967 0:606b230e5b4a 355 #endif
peterbarrett1967 0:606b230e5b4a 356 }
peterbarrett1967 0:606b230e5b4a 357
peterbarrett1967 0:606b230e5b4a 358 void Connect()
peterbarrett1967 0:606b230e5b4a 359 {
peterbarrett1967 0:606b230e5b4a 360 ConnectDevices();
peterbarrett1967 0:606b230e5b4a 361 }
peterbarrett1967 0:606b230e5b4a 362
peterbarrett1967 0:606b230e5b4a 363 void Disconnect()
peterbarrett1967 0:606b230e5b4a 364 {
peterbarrett1967 0:606b230e5b4a 365 gHCI->DisconnectAll();
peterbarrett1967 0:606b230e5b4a 366 }
peterbarrett1967 0:606b230e5b4a 367
peterbarrett1967 0:606b230e5b4a 368 void CloseMouse()
peterbarrett1967 0:606b230e5b4a 369 {
peterbarrett1967 0:606b230e5b4a 370 }
peterbarrett1967 0:606b230e5b4a 371
peterbarrett1967 0:606b230e5b4a 372 void Quit()
peterbarrett1967 0:606b230e5b4a 373 {
peterbarrett1967 0:606b230e5b4a 374 CloseMouse();
peterbarrett1967 0:606b230e5b4a 375 }
peterbarrett1967 0:606b230e5b4a 376
peterbarrett1967 0:606b230e5b4a 377 void Run()
peterbarrett1967 0:606b230e5b4a 378 {
peterbarrett1967 0:606b230e5b4a 379 for(;;)
peterbarrett1967 0:606b230e5b4a 380 {
peterbarrett1967 0:606b230e5b4a 381 const char* cmd = ReadLine();
peterbarrett1967 0:606b230e5b4a 382 if (strcmp(cmd,"scan") == 0 || strcmp(cmd,"inquiry") == 0)
peterbarrett1967 0:606b230e5b4a 383 Inquiry();
peterbarrett1967 0:606b230e5b4a 384 else if (strcmp(cmd,"ls") == 0)
peterbarrett1967 0:606b230e5b4a 385 List();
peterbarrett1967 0:606b230e5b4a 386 else if (strcmp(cmd,"connect") == 0)
peterbarrett1967 0:606b230e5b4a 387 Connect();
peterbarrett1967 0:606b230e5b4a 388 else if (strcmp(cmd,"disconnect") == 0)
peterbarrett1967 0:606b230e5b4a 389 Disconnect();
peterbarrett1967 0:606b230e5b4a 390 else if (strcmp(cmd,"q")== 0)
peterbarrett1967 0:606b230e5b4a 391 {
peterbarrett1967 0:606b230e5b4a 392 Quit();
peterbarrett1967 0:606b230e5b4a 393 break;
peterbarrett1967 0:606b230e5b4a 394 } else {
peterbarrett1967 0:606b230e5b4a 395 printf("eh? %s\n",cmd);
peterbarrett1967 0:606b230e5b4a 396 }
peterbarrett1967 0:606b230e5b4a 397 }
peterbarrett1967 0:606b230e5b4a 398 }
peterbarrett1967 0:606b230e5b4a 399 };
peterbarrett1967 0:606b230e5b4a 400
peterbarrett1967 0:606b230e5b4a 401 // Instance
peterbarrett1967 0:606b230e5b4a 402 ShellApp gApp;
peterbarrett1967 0:606b230e5b4a 403
peterbarrett1967 0:606b230e5b4a 404 static int HciCallback(HCI* hci, HCI_CALLBACK_EVENT evt, const u8* data, int len)
peterbarrett1967 0:606b230e5b4a 405 {
peterbarrett1967 0:606b230e5b4a 406 switch (evt)
peterbarrett1967 0:606b230e5b4a 407 {
peterbarrett1967 0:606b230e5b4a 408 case CALLBACK_READY:
peterbarrett1967 0:606b230e5b4a 409 printf("CALLBACK_READY\n");
peterbarrett1967 0:606b230e5b4a 410 gApp.Ready();
peterbarrett1967 0:606b230e5b4a 411 break;
peterbarrett1967 0:606b230e5b4a 412
peterbarrett1967 0:606b230e5b4a 413 case CALLBACK_INQUIRY_RESULT:
peterbarrett1967 0:606b230e5b4a 414 printf("CALLBACK_INQUIRY_RESULT ");
peterbarrett1967 0:606b230e5b4a 415 printf((BD_ADDR*)data);
peterbarrett1967 0:606b230e5b4a 416 printf("\n");
peterbarrett1967 0:606b230e5b4a 417 break;
peterbarrett1967 0:606b230e5b4a 418
peterbarrett1967 0:606b230e5b4a 419 case CALLBACK_INQUIRY_DONE:
peterbarrett1967 0:606b230e5b4a 420 printf("CALLBACK_INQUIRY_DONE\n");
peterbarrett1967 0:606b230e5b4a 421 gApp.ConnectDevices();
peterbarrett1967 0:606b230e5b4a 422 break;
peterbarrett1967 0:606b230e5b4a 423
peterbarrett1967 0:606b230e5b4a 424 case CALLBACK_REMOTE_NAME:
peterbarrett1967 0:606b230e5b4a 425 {
peterbarrett1967 0:606b230e5b4a 426 BD_ADDR* addr = (BD_ADDR*)data;
peterbarrett1967 0:606b230e5b4a 427 const char* name = (const char*)(data + 6);
peterbarrett1967 0:606b230e5b4a 428 printf(addr);
peterbarrett1967 0:606b230e5b4a 429 printf(" % s\n",name);
peterbarrett1967 0:606b230e5b4a 430 }
peterbarrett1967 0:606b230e5b4a 431 break;
peterbarrett1967 0:606b230e5b4a 432
peterbarrett1967 0:606b230e5b4a 433 case CALLBACK_CONNECTION_COMPLETE:
peterbarrett1967 0:606b230e5b4a 434 gApp.ConnectionComplete(hci,(connection_info*)data);
peterbarrett1967 0:606b230e5b4a 435 break;
peterbarrett1967 0:606b230e5b4a 436 };
peterbarrett1967 0:606b230e5b4a 437 return 0;
peterbarrett1967 0:606b230e5b4a 438 }
peterbarrett1967 0:606b230e5b4a 439
peterbarrett1967 0:606b230e5b4a 440 // these should be placed in the DMA SRAM
peterbarrett1967 0:606b230e5b4a 441 typedef struct
peterbarrett1967 0:606b230e5b4a 442 {
peterbarrett1967 0:606b230e5b4a 443 u8 _hciBuffer[MAX_HCL_SIZE];
peterbarrett1967 0:606b230e5b4a 444 u8 _aclBuffer[MAX_ACL_SIZE];
peterbarrett1967 0:606b230e5b4a 445 } SRAMPlacement;
peterbarrett1967 0:606b230e5b4a 446
peterbarrett1967 0:606b230e5b4a 447 HCITransportUSB _HCITransportUSB;
peterbarrett1967 0:606b230e5b4a 448 HCI _HCI;
peterbarrett1967 0:606b230e5b4a 449
peterbarrett1967 0:606b230e5b4a 450 u8* USBGetBuffer(u32* len);
peterbarrett1967 0:606b230e5b4a 451 int OnBluetoothInsert(int device)
peterbarrett1967 0:606b230e5b4a 452 {
peterbarrett1967 0:606b230e5b4a 453 printf("Bluetooth inserted of %d\n",device);
peterbarrett1967 0:606b230e5b4a 454 u32 sramLen;
peterbarrett1967 0:606b230e5b4a 455 u8* sram = USBGetBuffer(&sramLen);
peterbarrett1967 0:606b230e5b4a 456 sram = (u8*)(((u32)sram + 1023) & ~1023);
peterbarrett1967 0:606b230e5b4a 457 SRAMPlacement* s = (SRAMPlacement*)sram;
peterbarrett1967 0:606b230e5b4a 458 _HCITransportUSB.Open(device,s->_hciBuffer,s->_aclBuffer);
peterbarrett1967 0:606b230e5b4a 459 _HCI.Open(&_HCITransportUSB,HciCallback);
peterbarrett1967 0:606b230e5b4a 460 RegisterSocketHandler(SOCKET_L2CAP,&_HCI);
peterbarrett1967 0:606b230e5b4a 461 gHCI = &_HCI;
peterbarrett1967 0:606b230e5b4a 462 gApp.Inquiry();
peterbarrett1967 0:606b230e5b4a 463 return 0;
peterbarrett1967 0:606b230e5b4a 464 }
peterbarrett1967 0:606b230e5b4a 465
peterbarrett1967 0:606b230e5b4a 466 void TestShell()
peterbarrett1967 0:606b230e5b4a 467 {
peterbarrett1967 0:606b230e5b4a 468 USBInit();
peterbarrett1967 0:606b230e5b4a 469 gApp.Run();
peterbarrett1967 0:606b230e5b4a 470 }