Peter Barrett氏のBlueUSBにMIDI USB HOST機能を加えたサンプルプログラムです。KORG nanoKEYなどのUSB MIDIストリームをシリアルMIDI(Serial TX p9)にブリッジします。動作確認はKORG nanoKEY、AKAI LPK-25、EDIROL PC-50のみです。

Dependencies:   mbed

Committer:
radiojunkbox
Date:
Fri May 11 10:05:40 2012 +0000
Revision:
0:79620c558b0c
Rev. 1.0

Who changed what in which revision?

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