手動機アーム、mbed基盤のspiをおくるだけのプログラムです(9/4)

Dependencies:   SPI_master_arm_shudouki mbed

Fork of SPI_master_arm_shudouki2 by F^3 RC 2班

Committer:
yoka06
Date:
Mon Sep 04 13:02:43 2017 +0000
Revision:
2:faa028d2f2f8
Parent:
0:76d1c7f13415
?

Who changed what in which revision?

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