This is a for debugging \\\\\\\"BLUE USB\\\\\\\". You can connect with HCI mode. How to connect White Wizard Board TANK *White Wizard Board - Motor Driver Board * p 21 - IN_R1 * p 22 - IN_R2 * p 23 - IN_L2 * p 24 - IN_L1

Dependencies:   mbed

Committer:
halfpitch
Date:
Wed Aug 31 11:10:18 2011 +0000
Revision:
1:c56059923036
Parent:
0:a6476c138e84
Rev.B

Who changed what in which revision?

UserRevisionLine numberNew contents of line
halfpitch 0:a6476c138e84 1
halfpitch 0:a6476c138e84 2 /*
halfpitch 0:a6476c138e84 3 Copyright (c) 2010 Peter Barrett
halfpitch 0:a6476c138e84 4
halfpitch 0:a6476c138e84 5 Permission is hereby granted, free of charge, to any person obtaining a copy
halfpitch 0:a6476c138e84 6 of this software and associated documentation files (the "Software"), to deal
halfpitch 0:a6476c138e84 7 in the Software without restriction, including without limitation the rights
halfpitch 0:a6476c138e84 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
halfpitch 0:a6476c138e84 9 copies of the Software, and to permit persons to whom the Software is
halfpitch 0:a6476c138e84 10 furnished to do so, subject to the following conditions:
halfpitch 0:a6476c138e84 11
halfpitch 0:a6476c138e84 12 The above copyright notice and this permission notice shall be included in
halfpitch 0:a6476c138e84 13 all copies or substantial portions of the Software.
halfpitch 0:a6476c138e84 14
halfpitch 0:a6476c138e84 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
halfpitch 0:a6476c138e84 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
halfpitch 0:a6476c138e84 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
halfpitch 0:a6476c138e84 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
halfpitch 0:a6476c138e84 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
halfpitch 0:a6476c138e84 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
halfpitch 0:a6476c138e84 21 THE SOFTWARE.
halfpitch 0:a6476c138e84 22 */
halfpitch 0:a6476c138e84 23
halfpitch 0:a6476c138e84 24 #include "mbed.h"
halfpitch 0:a6476c138e84 25
halfpitch 0:a6476c138e84 26 #include <stdio.h>
halfpitch 0:a6476c138e84 27 #include <stdlib.h>
halfpitch 0:a6476c138e84 28 #include <stdio.h>
halfpitch 0:a6476c138e84 29 #include <string.h>
halfpitch 0:a6476c138e84 30
halfpitch 0:a6476c138e84 31 #include "Utils.h"
halfpitch 0:a6476c138e84 32 #include "USBHost.h"
halfpitch 0:a6476c138e84 33 #include "hci.h"
halfpitch 0:a6476c138e84 34 //#include "hci_private.h"
halfpitch 0:a6476c138e84 35
halfpitch 0:a6476c138e84 36 DigitalOut myled1(LED1);
halfpitch 0:a6476c138e84 37 DigitalOut myled2(LED2);
halfpitch 0:a6476c138e84 38 DigitalOut myled3(LED3);
halfpitch 1:c56059923036 39 DigitalOut myled4(LED4);
halfpitch 1:c56059923036 40
halfpitch 1:c56059923036 41 DigitalOut pin11(p21);
halfpitch 1:c56059923036 42 DigitalOut pin12(p22);
halfpitch 1:c56059923036 43 DigitalOut pin13(p23);
halfpitch 1:c56059923036 44 DigitalOut pin14(p24);
halfpitch 0:a6476c138e84 45
halfpitch 0:a6476c138e84 46 void printf(const BD_ADDR* addr)
halfpitch 0:a6476c138e84 47 {
halfpitch 0:a6476c138e84 48 const u8* a = addr->addr;
halfpitch 0:a6476c138e84 49 printf("%02X:%02X:%02X:%02X:%02X:%02X",a[5],a[4],a[3],a[2],a[1],a[0]);
halfpitch 0:a6476c138e84 50 }
halfpitch 0:a6476c138e84 51
halfpitch 0:a6476c138e84 52 #define MAX_HCL_SIZE 260
halfpitch 0:a6476c138e84 53 #define MAX_ACL_SIZE 400
halfpitch 0:a6476c138e84 54
halfpitch 0:a6476c138e84 55 class HCITransportUSB : public HCITransport
halfpitch 0:a6476c138e84 56 {
halfpitch 0:a6476c138e84 57 int _device;
halfpitch 0:a6476c138e84 58 u8* _hciBuffer;
halfpitch 0:a6476c138e84 59 u8* _aclBuffer;
halfpitch 0:a6476c138e84 60
halfpitch 0:a6476c138e84 61 public:
halfpitch 0:a6476c138e84 62 void Open(int device, u8* hciBuffer, u8* aclBuffer)
halfpitch 0:a6476c138e84 63 {
halfpitch 0:a6476c138e84 64 _device = device;
halfpitch 0:a6476c138e84 65 _hciBuffer = hciBuffer;
halfpitch 0:a6476c138e84 66 _aclBuffer = aclBuffer;
halfpitch 0:a6476c138e84 67 USBInterruptTransfer(_device,0x81,_hciBuffer,MAX_HCL_SIZE,HciCallback,this);
halfpitch 0:a6476c138e84 68 USBBulkTransfer(_device,0x82,_aclBuffer,MAX_ACL_SIZE,AclCallback,this);
halfpitch 0:a6476c138e84 69 }
halfpitch 0:a6476c138e84 70
halfpitch 0:a6476c138e84 71 static void HciCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
halfpitch 0:a6476c138e84 72 {
halfpitch 0:a6476c138e84 73 HCI* t = ((HCITransportUSB*)userData)->_target;
halfpitch 0:a6476c138e84 74 if (t)
halfpitch 0:a6476c138e84 75 t->HCIRecv(data,len);
halfpitch 0:a6476c138e84 76 USBInterruptTransfer(device,0x81,data,MAX_HCL_SIZE,HciCallback,userData);
halfpitch 0:a6476c138e84 77 }
halfpitch 0:a6476c138e84 78
halfpitch 0:a6476c138e84 79 static void AclCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
halfpitch 0:a6476c138e84 80 {
halfpitch 0:a6476c138e84 81
halfpitch 0:a6476c138e84 82 //-----y.k-----
halfpitch 0:a6476c138e84 83 printf("ACLRecv ");
halfpitch 0:a6476c138e84 84 int i = 0;
halfpitch 0:a6476c138e84 85 //u8 = unsigned char
halfpitch 0:a6476c138e84 86 printf(" : data[] = ");
halfpitch 0:a6476c138e84 87
halfpitch 0:a6476c138e84 88 for(i=0;i<sizeof(data);++i){
halfpitch 0:a6476c138e84 89 printf(" 0x%x : " ,data[i]);
halfpitch 0:a6476c138e84 90 }
halfpitch 0:a6476c138e84 91
halfpitch 0:a6476c138e84 92 //-----y.k-----
halfpitch 0:a6476c138e84 93
halfpitch 0:a6476c138e84 94 printf("sizeof(data) = %d \n", sizeof(data));
halfpitch 0:a6476c138e84 95
halfpitch 0:a6476c138e84 96
halfpitch 0:a6476c138e84 97 HCI* t = ((HCITransportUSB*)userData)->_target;
halfpitch 0:a6476c138e84 98 if (t)
halfpitch 0:a6476c138e84 99 t->ACLRecv(data,len);
halfpitch 0:a6476c138e84 100 USBBulkTransfer(device,0x82,data,MAX_ACL_SIZE,AclCallback,userData);
halfpitch 0:a6476c138e84 101 }
halfpitch 0:a6476c138e84 102
halfpitch 0:a6476c138e84 103 virtual void HCISend(const u8* data, int len)
halfpitch 0:a6476c138e84 104 {
halfpitch 0:a6476c138e84 105 //-----y.k-----
halfpitch 0:a6476c138e84 106 int i = 0;
halfpitch 0:a6476c138e84 107
halfpitch 0:a6476c138e84 108 //u8 = unsigned char
halfpitch 0:a6476c138e84 109 printf("-----y.k-----\n");
halfpitch 0:a6476c138e84 110 printf("******HCISend() :\n data[] = ");
halfpitch 0:a6476c138e84 111
halfpitch 0:a6476c138e84 112 for(i=0;i<len;++i){
halfpitch 0:a6476c138e84 113 printf(" 0x%x : " ,data[i]);
halfpitch 0:a6476c138e84 114 }
halfpitch 0:a6476c138e84 115
halfpitch 0:a6476c138e84 116 printf("len = %d \n", len);
halfpitch 0:a6476c138e84 117 printf("-----y.k-----\n");
halfpitch 0:a6476c138e84 118
halfpitch 0:a6476c138e84 119 USBControlTransfer(_device,REQUEST_TYPE_CLASS, 0, 0, 0,(u8*)data,len);
halfpitch 0:a6476c138e84 120 }
halfpitch 0:a6476c138e84 121 //-----y.k-----
halfpitch 0:a6476c138e84 122
halfpitch 0:a6476c138e84 123 virtual void ACLSend(const u8* data, int len)
halfpitch 0:a6476c138e84 124 {
halfpitch 0:a6476c138e84 125 USBBulkTransfer(_device,0x02,(u8*)data,len);
halfpitch 0:a6476c138e84 126 }
halfpitch 0:a6476c138e84 127 };
halfpitch 0:a6476c138e84 128
halfpitch 0:a6476c138e84 129
halfpitch 0:a6476c138e84 130 #define WII_REMOTE 0x042500
halfpitch 0:a6476c138e84 131
halfpitch 0:a6476c138e84 132 class HIDBluetooth
halfpitch 0:a6476c138e84 133 {
halfpitch 0:a6476c138e84 134 int _control; // Sockets for control (out) and interrupt (in)
halfpitch 0:a6476c138e84 135 int _interrupt;
halfpitch 0:a6476c138e84 136 int _devClass;
halfpitch 0:a6476c138e84 137 BD_ADDR _addr;
halfpitch 0:a6476c138e84 138 u8 _pad[2]; // Struct align
halfpitch 0:a6476c138e84 139
halfpitch 0:a6476c138e84 140 public:
halfpitch 0:a6476c138e84 141 HIDBluetooth() : _control(0),_interrupt(0),_devClass(0) {};
halfpitch 0:a6476c138e84 142
halfpitch 0:a6476c138e84 143 bool InUse()
halfpitch 0:a6476c138e84 144 {
halfpitch 0:a6476c138e84 145 return _control != 0;
halfpitch 0:a6476c138e84 146 }
halfpitch 0:a6476c138e84 147
halfpitch 0:a6476c138e84 148 static void OnHidInterrupt(int socket, SocketState state, const u8* data, int len, void* userData)
halfpitch 0:a6476c138e84 149 {
halfpitch 0:a6476c138e84 150 HIDBluetooth* t = (HIDBluetooth*)userData;
halfpitch 0:a6476c138e84 151
halfpitch 0:a6476c138e84 152 if (data)
halfpitch 0:a6476c138e84 153 {
halfpitch 0:a6476c138e84 154 if (t->_devClass == WII_REMOTE && data[1] == 0x30)
halfpitch 0:a6476c138e84 155 {
halfpitch 0:a6476c138e84 156 printf("================wii====================\n");
halfpitch 0:a6476c138e84 157 t->Led();
halfpitch 0:a6476c138e84 158 t->Hid(); // ask for accelerometer
halfpitch 0:a6476c138e84 159 t->_devClass = 0;
halfpitch 0:a6476c138e84 160 }
halfpitch 0:a6476c138e84 161
halfpitch 0:a6476c138e84 162 const u8* d = data;
halfpitch 0:a6476c138e84 163
halfpitch 0:a6476c138e84 164 //-----y.k-----
halfpitch 0:a6476c138e84 165 int i = 0;
halfpitch 0:a6476c138e84 166 //u8 = unsigned char
halfpitch 0:a6476c138e84 167 printf("-----y.k-----\n");
halfpitch 0:a6476c138e84 168 printf("/////// OnHidInterrupt() :\n d[] = ");
halfpitch 0:a6476c138e84 169
halfpitch 0:a6476c138e84 170 for(i=0;i<sizeof(data)+1;++i){
halfpitch 0:a6476c138e84 171 printf(" 0x%x : " ,data[i]);
halfpitch 0:a6476c138e84 172 }
halfpitch 0:a6476c138e84 173
halfpitch 0:a6476c138e84 174 printf("len = %d \n", len);
halfpitch 0:a6476c138e84 175 printf("-----y.k-----\n");
halfpitch 0:a6476c138e84 176 //-----y.k-----
halfpitch 0:a6476c138e84 177
halfpitch 0:a6476c138e84 178 switch (d[1])
halfpitch 0:a6476c138e84 179 {
halfpitch 0:a6476c138e84 180 case 0x02:
halfpitch 0:a6476c138e84 181 {
halfpitch 0:a6476c138e84 182 int x = (signed char)d[3];
halfpitch 0:a6476c138e84 183 int y = (signed char)d[4];
halfpitch 0:a6476c138e84 184 printf("Mouse %2X dx:%d dy:%d\n",d[2],x,y);
halfpitch 0:a6476c138e84 185 }
halfpitch 0:a6476c138e84 186 break;
halfpitch 0:a6476c138e84 187
halfpitch 0:a6476c138e84 188 case 0x37: // Accelerometer http://wiki.wiimoteproject.com/Reports
halfpitch 0:a6476c138e84 189 {
halfpitch 0:a6476c138e84 190 int pad = (d[2] & 0x9F) | ((d[3] & 0x9F) << 8);
halfpitch 0:a6476c138e84 191 int x = (d[2] & 0x60) >> 5 | d[4] << 2;
halfpitch 0:a6476c138e84 192 int y = (d[3] & 0x20) >> 4 | d[5] << 2;
halfpitch 0:a6476c138e84 193 int z = (d[3] & 0x40) >> 5 | d[6] << 2;
halfpitch 0:a6476c138e84 194 printf("WII %04X %d %d %d\n",pad,x,y,z);
halfpitch 0:a6476c138e84 195 }
halfpitch 0:a6476c138e84 196 break;
halfpitch 0:a6476c138e84 197
halfpitch 0:a6476c138e84 198
halfpitch 0:a6476c138e84 199 ///---------------------------------
halfpitch 0:a6476c138e84 200
halfpitch 0:a6476c138e84 201 case 0x01: // Mini Keyboard
halfpitch 0:a6476c138e84 202 {
halfpitch 0:a6476c138e84 203 int keycode = (d[4]);
halfpitch 0:a6476c138e84 204 printf("Keycode = %02x \n",keycode);
halfpitch 0:a6476c138e84 205 switch(keycode)
halfpitch 0:a6476c138e84 206 {
halfpitch 0:a6476c138e84 207 case 0x00: // key off
halfpitch 0:a6476c138e84 208 {
halfpitch 0:a6476c138e84 209 printf("Key OFF");
halfpitch 0:a6476c138e84 210 pin11 = 1;
halfpitch 0:a6476c138e84 211 pin12 = 1;
halfpitch 0:a6476c138e84 212 pin13 = 1;
halfpitch 0:a6476c138e84 213 pin14 = 1;
halfpitch 1:c56059923036 214
halfpitch 1:c56059923036 215 myled1 = 1;
halfpitch 1:c56059923036 216 myled2 = 1;
halfpitch 1:c56059923036 217 myled3 = 1;
halfpitch 1:c56059923036 218 myled4 = 1;
halfpitch 1:c56059923036 219
halfpitch 0:a6476c138e84 220 break;
halfpitch 0:a6476c138e84 221 }
halfpitch 0:a6476c138e84 222 case 0x51: // "down"
halfpitch 0:a6476c138e84 223 {
halfpitch 0:a6476c138e84 224 printf("Key down ");
halfpitch 0:a6476c138e84 225
halfpitch 1:c56059923036 226 pin11 = 1;
halfpitch 1:c56059923036 227 pin12 = 0;
halfpitch 0:a6476c138e84 228 pin13 = 0;
halfpitch 0:a6476c138e84 229 pin14 = 1;
halfpitch 0:a6476c138e84 230
halfpitch 1:c56059923036 231 myled1 = 1;
halfpitch 1:c56059923036 232 myled2 = 0;
halfpitch 1:c56059923036 233 myled3 = 0;
halfpitch 1:c56059923036 234 myled4 = 1;
halfpitch 1:c56059923036 235
halfpitch 0:a6476c138e84 236 break;
halfpitch 0:a6476c138e84 237 }
halfpitch 0:a6476c138e84 238 case 0x52: // "up"
halfpitch 0:a6476c138e84 239 {
halfpitch 0:a6476c138e84 240 printf("Key up ");
halfpitch 0:a6476c138e84 241
halfpitch 1:c56059923036 242 pin11 = 0;
halfpitch 1:c56059923036 243 pin12 = 1;
halfpitch 0:a6476c138e84 244 pin13 = 1;
halfpitch 0:a6476c138e84 245 pin14 = 0;
halfpitch 0:a6476c138e84 246
halfpitch 1:c56059923036 247 myled1 = 0;
halfpitch 1:c56059923036 248 myled2 = 1;
halfpitch 1:c56059923036 249 myled3 = 1;
halfpitch 1:c56059923036 250 myled4 = 0;
halfpitch 1:c56059923036 251
halfpitch 0:a6476c138e84 252 break;
halfpitch 0:a6476c138e84 253 }
halfpitch 0:a6476c138e84 254
halfpitch 0:a6476c138e84 255 case 0x50: // "left"
halfpitch 0:a6476c138e84 256 {
halfpitch 0:a6476c138e84 257 printf("Key left ");
halfpitch 0:a6476c138e84 258
halfpitch 0:a6476c138e84 259 pin11 = 0;
halfpitch 0:a6476c138e84 260 pin12 = 1;
halfpitch 1:c56059923036 261 pin13 = 0;
halfpitch 1:c56059923036 262 pin14 = 1;
halfpitch 1:c56059923036 263
halfpitch 1:c56059923036 264 myled1 = 0;
halfpitch 1:c56059923036 265 myled2 = 1;
halfpitch 1:c56059923036 266 myled3 = 0;
halfpitch 1:c56059923036 267 myled4 = 1;
halfpitch 0:a6476c138e84 268
halfpitch 0:a6476c138e84 269 break;
halfpitch 0:a6476c138e84 270 }
halfpitch 0:a6476c138e84 271
halfpitch 0:a6476c138e84 272 case 0x4f: // "right"
halfpitch 0:a6476c138e84 273 {
halfpitch 0:a6476c138e84 274 printf("Key right ");
halfpitch 0:a6476c138e84 275
halfpitch 0:a6476c138e84 276 pin11 = 1;
halfpitch 0:a6476c138e84 277 pin12 = 0;
halfpitch 1:c56059923036 278 pin13 = 1;
halfpitch 1:c56059923036 279 pin14 = 0;
halfpitch 1:c56059923036 280
halfpitch 1:c56059923036 281 myled1 = 1;
halfpitch 1:c56059923036 282 myled2 = 0;
halfpitch 1:c56059923036 283 myled3 = 1;
halfpitch 1:c56059923036 284 myled4 = 0;
halfpitch 0:a6476c138e84 285
halfpitch 0:a6476c138e84 286 break;
halfpitch 0:a6476c138e84 287 }
halfpitch 0:a6476c138e84 288
halfpitch 0:a6476c138e84 289 case 0x28: // "Enter"
halfpitch 0:a6476c138e84 290 {
halfpitch 0:a6476c138e84 291 printf("Key Enter ");
halfpitch 0:a6476c138e84 292
halfpitch 0:a6476c138e84 293 pin11 = 0;
halfpitch 0:a6476c138e84 294 pin12 = 0;
halfpitch 0:a6476c138e84 295 pin13 = 0;
halfpitch 0:a6476c138e84 296 pin14 = 0;
halfpitch 0:a6476c138e84 297
halfpitch 1:c56059923036 298 myled1 = 0;
halfpitch 1:c56059923036 299 myled2 = 0;
halfpitch 1:c56059923036 300 myled3 = 0;
halfpitch 1:c56059923036 301 myled4 = 0;
halfpitch 0:a6476c138e84 302 break;
halfpitch 0:a6476c138e84 303 }
halfpitch 0:a6476c138e84 304 default:
halfpitch 0:a6476c138e84 305 printf("Key ???");
halfpitch 0:a6476c138e84 306 break;
halfpitch 0:a6476c138e84 307
halfpitch 0:a6476c138e84 308 }
halfpitch 0:a6476c138e84 309
halfpitch 0:a6476c138e84 310 }
halfpitch 0:a6476c138e84 311 break;
halfpitch 0:a6476c138e84 312 case 0x03: // Connected?
halfpitch 0:a6476c138e84 313 {
halfpitch 0:a6476c138e84 314 //pi.locate(0,1);
halfpitch 0:a6476c138e84 315 //pi.printf("Connect!");
halfpitch 0:a6476c138e84 316 break;
halfpitch 0:a6476c138e84 317
halfpitch 0:a6476c138e84 318 }
halfpitch 0:a6476c138e84 319
halfpitch 0:a6476c138e84 320
halfpitch 0:a6476c138e84 321
halfpitch 0:a6476c138e84 322 ///---------------------------------
halfpitch 0:a6476c138e84 323
halfpitch 0:a6476c138e84 324 default:
halfpitch 0:a6476c138e84 325 printHex(data,len);
halfpitch 0:a6476c138e84 326 }
halfpitch 0:a6476c138e84 327 }
halfpitch 0:a6476c138e84 328 }
halfpitch 0:a6476c138e84 329
halfpitch 0:a6476c138e84 330 static void OnHidControl(int socket, SocketState state, const u8* data, int len, void* userData)
halfpitch 0:a6476c138e84 331 {
halfpitch 0:a6476c138e84 332 printf("OnHidControl\n");
halfpitch 0:a6476c138e84 333 if (data)
halfpitch 0:a6476c138e84 334 printHex(data,len);
halfpitch 0:a6476c138e84 335 }
halfpitch 0:a6476c138e84 336
halfpitch 0:a6476c138e84 337 void Open(BD_ADDR* bdAddr, inquiry_info* info)
halfpitch 0:a6476c138e84 338 {
halfpitch 0:a6476c138e84 339 printf("L2CAPAddr size %d\n",sizeof(L2CAPAddr));
halfpitch 0:a6476c138e84 340 _addr = *bdAddr;
halfpitch 0:a6476c138e84 341 L2CAPAddr sockAddr;
halfpitch 0:a6476c138e84 342 sockAddr.bdaddr = _addr;
halfpitch 0:a6476c138e84 343 sockAddr.psm = L2CAP_PSM_HID_INTR;
halfpitch 0:a6476c138e84 344 printf("Socket_Open size %d\n",sizeof(L2CAPAddr));
halfpitch 0:a6476c138e84 345 _interrupt = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidInterrupt,this);
halfpitch 0:a6476c138e84 346 sockAddr.psm = L2CAP_PSM_HID_CNTL;
halfpitch 0:a6476c138e84 347 _control = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidControl,this);
halfpitch 0:a6476c138e84 348
halfpitch 0:a6476c138e84 349 printfBytes("OPEN DEVICE CLASS",info->dev_class,3);
halfpitch 0:a6476c138e84 350 _devClass = (info->dev_class[0] << 16) | (info->dev_class[1] << 8) | info->dev_class[2];
halfpitch 0:a6476c138e84 351 }
halfpitch 0:a6476c138e84 352
halfpitch 0:a6476c138e84 353 void Close()
halfpitch 0:a6476c138e84 354 {
halfpitch 0:a6476c138e84 355 if (_control)
halfpitch 0:a6476c138e84 356 Socket_Close(_control);
halfpitch 0:a6476c138e84 357 if (_interrupt)
halfpitch 0:a6476c138e84 358 Socket_Close(_interrupt);
halfpitch 0:a6476c138e84 359 _control = _interrupt = 0;
halfpitch 0:a6476c138e84 360 }
halfpitch 0:a6476c138e84 361
halfpitch 0:a6476c138e84 362 void Led(int id = 0x10)
halfpitch 0:a6476c138e84 363 {
halfpitch 0:a6476c138e84 364 u8 led[3] = {0x52, 0x11, id};
halfpitch 0:a6476c138e84 365 if (_control)
halfpitch 0:a6476c138e84 366 Socket_Send(_control,led,3);
halfpitch 0:a6476c138e84 367 }
halfpitch 0:a6476c138e84 368
halfpitch 0:a6476c138e84 369 void Hid(int report = 0x37)
halfpitch 0:a6476c138e84 370 {
halfpitch 0:a6476c138e84 371 u8 hid[4] = { 0x52, 0x12, 0x00, report };
halfpitch 0:a6476c138e84 372 if (_control != -1)
halfpitch 0:a6476c138e84 373 Socket_Send(_control,hid,4);
halfpitch 0:a6476c138e84 374 }
halfpitch 0:a6476c138e84 375 };
halfpitch 0:a6476c138e84 376
halfpitch 0:a6476c138e84 377
halfpitch 0:a6476c138e84 378 HCI* gHCI = 0;
halfpitch 0:a6476c138e84 379
halfpitch 0:a6476c138e84 380 #define MAX_HID_DEVICES 8
halfpitch 0:a6476c138e84 381
halfpitch 0:a6476c138e84 382 int GetConsoleChar();
halfpitch 0:a6476c138e84 383 class ShellApp
halfpitch 0:a6476c138e84 384 {
halfpitch 0:a6476c138e84 385 char _line[64];
halfpitch 0:a6476c138e84 386 HIDBluetooth _hids[MAX_HID_DEVICES];
halfpitch 0:a6476c138e84 387
halfpitch 0:a6476c138e84 388 public:
halfpitch 0:a6476c138e84 389 void Ready()
halfpitch 0:a6476c138e84 390 {
halfpitch 0:a6476c138e84 391 printf("HIDBluetooth %d\n",sizeof(HIDBluetooth));
halfpitch 0:a6476c138e84 392 memset(_hids,0,sizeof(_hids));
halfpitch 0:a6476c138e84 393 Inquiry();
halfpitch 0:a6476c138e84 394
halfpitch 0:a6476c138e84 395 }
halfpitch 0:a6476c138e84 396
halfpitch 0:a6476c138e84 397 // We have connected to a device
halfpitch 0:a6476c138e84 398 void ConnectionComplete(HCI* hci, connection_info* info)
halfpitch 0:a6476c138e84 399 {
halfpitch 0:a6476c138e84 400 printf("ConnectionComplete ");
halfpitch 0:a6476c138e84 401 BD_ADDR* a = &info->bdaddr;
halfpitch 0:a6476c138e84 402 printf(a);
halfpitch 0:a6476c138e84 403 BTDevice* bt = hci->Find(a);
halfpitch 0:a6476c138e84 404 HIDBluetooth* hid = NewHIDBluetooth();
halfpitch 0:a6476c138e84 405 printf(" %08x %08x\n",bt,hid);
halfpitch 0:a6476c138e84 406 if (hid)
halfpitch 0:a6476c138e84 407 hid->Open(a,&bt->_info);
halfpitch 0:a6476c138e84 408 }
halfpitch 0:a6476c138e84 409
halfpitch 0:a6476c138e84 410 HIDBluetooth* NewHIDBluetooth()
halfpitch 0:a6476c138e84 411 {
halfpitch 0:a6476c138e84 412 for (int i = 0; i < MAX_HID_DEVICES; i++)
halfpitch 0:a6476c138e84 413 if (!_hids[i].InUse())
halfpitch 0:a6476c138e84 414 return _hids+i;
halfpitch 0:a6476c138e84 415 return 0;
halfpitch 0:a6476c138e84 416 }
halfpitch 0:a6476c138e84 417
halfpitch 0:a6476c138e84 418 void ConnectDevices()
halfpitch 0:a6476c138e84 419 {
halfpitch 0:a6476c138e84 420 BTDevice* devs[8];
halfpitch 0:a6476c138e84 421 int count = gHCI->GetDevices(devs,8);
halfpitch 0:a6476c138e84 422 for (int i = 0; i < count; i++)
halfpitch 0:a6476c138e84 423 {
halfpitch 0:a6476c138e84 424 printfBytes("DEVICE CLASS",devs[i]->_info.dev_class,3);
halfpitch 0:a6476c138e84 425 if (devs[i]->_handle == 0)
halfpitch 0:a6476c138e84 426 {
halfpitch 0:a6476c138e84 427 BD_ADDR* bd = &devs[i]->_info.bdaddr;
halfpitch 0:a6476c138e84 428 printf("Connecting to ");
halfpitch 0:a6476c138e84 429 printf(bd);
halfpitch 0:a6476c138e84 430 printf("\n");
halfpitch 0:a6476c138e84 431 gHCI->CreateConnection(bd);
halfpitch 0:a6476c138e84 432 }
halfpitch 0:a6476c138e84 433 }
halfpitch 0:a6476c138e84 434 }
halfpitch 0:a6476c138e84 435
halfpitch 0:a6476c138e84 436 const char* ReadLine()
halfpitch 0:a6476c138e84 437 {
halfpitch 0:a6476c138e84 438 int i;
halfpitch 0:a6476c138e84 439 for (i = 0; i < 255; )
halfpitch 0:a6476c138e84 440 {
halfpitch 0:a6476c138e84 441 ///printf("--- ReadLine() -> USBLoop()---\n");
halfpitch 0:a6476c138e84 442 USBLoop();
halfpitch 0:a6476c138e84 443 int c = GetConsoleChar();
halfpitch 0:a6476c138e84 444 if (c == -1)
halfpitch 0:a6476c138e84 445 continue;
halfpitch 0:a6476c138e84 446 if (c == '\n' || c == 13)
halfpitch 0:a6476c138e84 447 break;
halfpitch 0:a6476c138e84 448 _line[i++] = c;
halfpitch 0:a6476c138e84 449 }
halfpitch 0:a6476c138e84 450 _line[i] = 0;
halfpitch 0:a6476c138e84 451 return _line;
halfpitch 0:a6476c138e84 452 }
halfpitch 0:a6476c138e84 453 /*
halfpitch 0:a6476c138e84 454 void Setlocalname(){
halfpitch 0:a6476c138e84 455 printf("Setlocalname..\n");
halfpitch 0:a6476c138e84 456 gHCI->Setlocalname();
halfpitch 0:a6476c138e84 457 }
halfpitch 0:a6476c138e84 458 */
halfpitch 0:a6476c138e84 459
halfpitch 0:a6476c138e84 460 void Inquiry()
halfpitch 0:a6476c138e84 461 {
halfpitch 0:a6476c138e84 462 printf("Inquiry..\n");
halfpitch 0:a6476c138e84 463 gHCI->Inquiry();
halfpitch 0:a6476c138e84 464 }
halfpitch 0:a6476c138e84 465
halfpitch 0:a6476c138e84 466 void List()
halfpitch 0:a6476c138e84 467 {
halfpitch 0:a6476c138e84 468 #if 0
halfpitch 0:a6476c138e84 469 printf("%d devices\n",_deviceCount);
halfpitch 0:a6476c138e84 470 for (int i = 0; i < _deviceCount; i++)
halfpitch 0:a6476c138e84 471 {
halfpitch 0:a6476c138e84 472 printf(&_devices[i].info.bdaddr);
halfpitch 0:a6476c138e84 473 printf("\n");
halfpitch 0:a6476c138e84 474 }
halfpitch 0:a6476c138e84 475 #endif
halfpitch 0:a6476c138e84 476 }
halfpitch 0:a6476c138e84 477
halfpitch 0:a6476c138e84 478 void Connect()
halfpitch 0:a6476c138e84 479 {
halfpitch 0:a6476c138e84 480 ConnectDevices();
halfpitch 0:a6476c138e84 481 }
halfpitch 0:a6476c138e84 482
halfpitch 0:a6476c138e84 483 void Disconnect()
halfpitch 0:a6476c138e84 484 {
halfpitch 0:a6476c138e84 485 gHCI->DisconnectAll();
halfpitch 0:a6476c138e84 486 }
halfpitch 0:a6476c138e84 487
halfpitch 0:a6476c138e84 488 void CloseMouse()
halfpitch 0:a6476c138e84 489 {
halfpitch 0:a6476c138e84 490 }
halfpitch 0:a6476c138e84 491
halfpitch 0:a6476c138e84 492 void Quit()
halfpitch 0:a6476c138e84 493 {
halfpitch 0:a6476c138e84 494 CloseMouse();
halfpitch 0:a6476c138e84 495 }
halfpitch 0:a6476c138e84 496
halfpitch 0:a6476c138e84 497 void Run()
halfpitch 0:a6476c138e84 498 {
halfpitch 0:a6476c138e84 499 for(;;)
halfpitch 0:a6476c138e84 500 {
halfpitch 0:a6476c138e84 501 printf("\n ---Run() for(;;) --- \n");//-----y.k-----
halfpitch 0:a6476c138e84 502 const char* cmd = ReadLine();
halfpitch 0:a6476c138e84 503 printf("\n --- END : cmd = ReadLine() --- \n");//-----y.k-----
halfpitch 0:a6476c138e84 504
halfpitch 0:a6476c138e84 505 //printf("\n --- for(;;) cmd:%s --- \n\n",cmd);
halfpitch 0:a6476c138e84 506
halfpitch 0:a6476c138e84 507 if (strcmp(cmd,"scan") == 0 || strcmp(cmd,"inquiry") == 0){
halfpitch 0:a6476c138e84 508 printf("---Inquiry();---\n");//-----y.k-----
halfpitch 0:a6476c138e84 509 Inquiry();
halfpitch 0:a6476c138e84 510 }else if (strcmp(cmd,"ls") == 0){
halfpitch 0:a6476c138e84 511 printf("---List();---\n");//-----y.k-----
halfpitch 0:a6476c138e84 512 List();
halfpitch 0:a6476c138e84 513 }else if (strcmp(cmd,"connect") == 0){
halfpitch 0:a6476c138e84 514 printf("---Connect();---\n");//-----y.k-----
halfpitch 0:a6476c138e84 515 Connect();
halfpitch 0:a6476c138e84 516 }else if (strcmp(cmd,"disconnect") == 0){
halfpitch 0:a6476c138e84 517 printf("---Disconnect();---\n");//-----y.k-----
halfpitch 0:a6476c138e84 518 Disconnect();
halfpitch 0:a6476c138e84 519 }else if (strcmp(cmd,"q")== 0)
halfpitch 0:a6476c138e84 520 {
halfpitch 0:a6476c138e84 521 Quit();
halfpitch 0:a6476c138e84 522 break;
halfpitch 0:a6476c138e84 523 } else {
halfpitch 0:a6476c138e84 524 printf("eh? %s\n",cmd);
halfpitch 0:a6476c138e84 525 }
halfpitch 0:a6476c138e84 526 }
halfpitch 0:a6476c138e84 527 }
halfpitch 0:a6476c138e84 528 };
halfpitch 0:a6476c138e84 529
halfpitch 0:a6476c138e84 530 // Instance
halfpitch 0:a6476c138e84 531 ShellApp gApp;
halfpitch 0:a6476c138e84 532
halfpitch 0:a6476c138e84 533 static int HciCallback(HCI* hci, HCI_CALLBACK_EVENT evt, const u8* data, int len)
halfpitch 0:a6476c138e84 534 {
halfpitch 0:a6476c138e84 535
halfpitch 0:a6476c138e84 536 printf("HciCallback %04X \n",evt);
halfpitch 0:a6476c138e84 537
halfpitch 0:a6476c138e84 538 switch (evt)
halfpitch 0:a6476c138e84 539 {
halfpitch 0:a6476c138e84 540 case CALLBACK_READY:
halfpitch 0:a6476c138e84 541 //gApp.Setlocalname();
halfpitch 0:a6476c138e84 542 printf("CALLBACK_READY\n");
halfpitch 0:a6476c138e84 543 gApp.Ready();
halfpitch 0:a6476c138e84 544 break;
halfpitch 0:a6476c138e84 545
halfpitch 0:a6476c138e84 546 case CALLBACK_INQUIRY_RESULT:
halfpitch 0:a6476c138e84 547 printf("CALLBACK_INQUIRY_RESULT ");
halfpitch 0:a6476c138e84 548 printf((BD_ADDR*)data);
halfpitch 0:a6476c138e84 549 printf("\n");
halfpitch 0:a6476c138e84 550
halfpitch 0:a6476c138e84 551 //Bluetooth address : BD_ADDR
halfpitch 0:a6476c138e84 552
halfpitch 0:a6476c138e84 553
halfpitch 0:a6476c138e84 554 break;
halfpitch 0:a6476c138e84 555
halfpitch 0:a6476c138e84 556 case CALLBACK_INQUIRY_DONE:
halfpitch 0:a6476c138e84 557 printf("CALLBACK_INQUIRY_DONE\n");
halfpitch 0:a6476c138e84 558 gApp.ConnectDevices();
halfpitch 0:a6476c138e84 559 break;
halfpitch 0:a6476c138e84 560
halfpitch 0:a6476c138e84 561 case CALLBACK_REMOTE_NAME:
halfpitch 0:a6476c138e84 562 {
halfpitch 0:a6476c138e84 563 BD_ADDR* addr = (BD_ADDR*)data;
halfpitch 0:a6476c138e84 564 const char* name = (const char*)(data + 6);
halfpitch 0:a6476c138e84 565 printf(addr);
halfpitch 0:a6476c138e84 566 printf(" % s\n",name);
halfpitch 0:a6476c138e84 567 }
halfpitch 0:a6476c138e84 568 break;
halfpitch 0:a6476c138e84 569
halfpitch 0:a6476c138e84 570 case CALLBACK_CONNECTION_COMPLETE:
halfpitch 0:a6476c138e84 571 gApp.ConnectionComplete(hci,(connection_info*)data);
halfpitch 0:a6476c138e84 572 break;
halfpitch 0:a6476c138e84 573 };
halfpitch 0:a6476c138e84 574 return 0;
halfpitch 0:a6476c138e84 575 }
halfpitch 0:a6476c138e84 576
halfpitch 0:a6476c138e84 577 // these should be placed in the DMA SRAM
halfpitch 0:a6476c138e84 578 typedef struct
halfpitch 0:a6476c138e84 579 {
halfpitch 0:a6476c138e84 580 u8 _hciBuffer[MAX_HCL_SIZE];
halfpitch 0:a6476c138e84 581 u8 _aclBuffer[MAX_ACL_SIZE];
halfpitch 0:a6476c138e84 582 } SRAMPlacement;
halfpitch 0:a6476c138e84 583
halfpitch 0:a6476c138e84 584 HCITransportUSB _HCITransportUSB;
halfpitch 0:a6476c138e84 585 HCI _HCI;
halfpitch 0:a6476c138e84 586
halfpitch 0:a6476c138e84 587 u8* USBGetBuffer(u32* len);
halfpitch 0:a6476c138e84 588 int OnBluetoothInsert(int device)
halfpitch 0:a6476c138e84 589 {
halfpitch 0:a6476c138e84 590 printf("Bluetooth inserted of %d\n",device);
halfpitch 0:a6476c138e84 591 u32 sramLen;
halfpitch 0:a6476c138e84 592 u8* sram = USBGetBuffer(&sramLen);
halfpitch 0:a6476c138e84 593 sram = (u8*)(((u32)sram + 1023) & ~1023);
halfpitch 0:a6476c138e84 594 SRAMPlacement* s = (SRAMPlacement*)sram;
halfpitch 0:a6476c138e84 595 _HCITransportUSB.Open(device,s->_hciBuffer,s->_aclBuffer);
halfpitch 0:a6476c138e84 596 _HCI.Open(&_HCITransportUSB,HciCallback);
halfpitch 0:a6476c138e84 597 RegisterSocketHandler(SOCKET_L2CAP,&_HCI);
halfpitch 0:a6476c138e84 598 gHCI = &_HCI;
halfpitch 0:a6476c138e84 599 gApp.Inquiry();
halfpitch 0:a6476c138e84 600 return 0;
halfpitch 0:a6476c138e84 601 }
halfpitch 0:a6476c138e84 602
halfpitch 0:a6476c138e84 603 void TestShell()
halfpitch 0:a6476c138e84 604 {
halfpitch 0:a6476c138e84 605 printf("\nTestShell()\n\n");
halfpitch 0:a6476c138e84 606 USBInit();
halfpitch 0:a6476c138e84 607
halfpitch 0:a6476c138e84 608 printf("\nUSBInit():OK --- gApp.Run()\n\n");
halfpitch 0:a6476c138e84 609 gApp.Run();
halfpitch 0:a6476c138e84 610 }