PS3下の階

Dependencies:   FatFileSystem PS3_BlueUSB QEI RoboClaw_mine_ mbed

Fork of PS3_BlueUSB by Bart Janssens

Committer:
e5115026
Date:
Thu Jan 11 07:47:26 2018 +0000
Revision:
1:b2063ffa4927
Parent:
0:99a111b75cb4
???????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BartJanssens 0:99a111b75cb4 1 /*
BartJanssens 0:99a111b75cb4 2 Copyright (c) 2010 Peter Barrett
BartJanssens 0:99a111b75cb4 3
BartJanssens 0:99a111b75cb4 4 Permission is hereby granted, free of charge, to any person obtaining a copy
BartJanssens 0:99a111b75cb4 5 of this software and associated documentation files (the "Software"), to deal
BartJanssens 0:99a111b75cb4 6 in the Software without restriction, including without limitation the rights
BartJanssens 0:99a111b75cb4 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
BartJanssens 0:99a111b75cb4 8 copies of the Software, and to permit persons to whom the Software is
BartJanssens 0:99a111b75cb4 9 furnished to do so, subject to the following conditions:
BartJanssens 0:99a111b75cb4 10
BartJanssens 0:99a111b75cb4 11 The above copyright notice and this permission notice shall be included in
BartJanssens 0:99a111b75cb4 12 all copies or substantial portions of the Software.
BartJanssens 0:99a111b75cb4 13
BartJanssens 0:99a111b75cb4 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
BartJanssens 0:99a111b75cb4 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
BartJanssens 0:99a111b75cb4 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
BartJanssens 0:99a111b75cb4 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
BartJanssens 0:99a111b75cb4 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
BartJanssens 0:99a111b75cb4 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
BartJanssens 0:99a111b75cb4 20 THE SOFTWARE.
BartJanssens 0:99a111b75cb4 21 */
BartJanssens 0:99a111b75cb4 22
BartJanssens 0:99a111b75cb4 23 /*
BartJanssens 0:99a111b75cb4 24 Tue Apr 26 2011 Bart Janssens: added HCI connection accept
BartJanssens 0:99a111b75cb4 25 */
BartJanssens 0:99a111b75cb4 26
BartJanssens 0:99a111b75cb4 27 #include <stdio.h>
BartJanssens 0:99a111b75cb4 28 #include <stdlib.h>
BartJanssens 0:99a111b75cb4 29 #include <stdio.h>
BartJanssens 0:99a111b75cb4 30 #include <string.h>
BartJanssens 0:99a111b75cb4 31
BartJanssens 0:99a111b75cb4 32 #include "Utils.h"
BartJanssens 0:99a111b75cb4 33 #include "hci.h"
BartJanssens 0:99a111b75cb4 34 #include "hci_private.h"
BartJanssens 0:99a111b75cb4 35
BartJanssens 0:99a111b75cb4 36 enum hci_callback_evt
BartJanssens 0:99a111b75cb4 37 {
BartJanssens 0:99a111b75cb4 38 NONE,
BartJanssens 0:99a111b75cb4 39 CONNECT,
BartJanssens 0:99a111b75cb4 40 DISCONECT,
BartJanssens 0:99a111b75cb4 41 INQUIRYRESULT
BartJanssens 0:99a111b75cb4 42 };
BartJanssens 0:99a111b75cb4 43
BartJanssens 0:99a111b75cb4 44 #define MAX_BLUETOOTH_ADAPTERS 1
BartJanssens 0:99a111b75cb4 45
BartJanssens 0:99a111b75cb4 46 enum StateMask {
BartJanssens 0:99a111b75cb4 47 MASK_RESET = 1,
BartJanssens 0:99a111b75cb4 48 MASK_READ_BUFFER_SIZE = 2,
BartJanssens 0:99a111b75cb4 49 MASK_READ_BD_ADDR = 4,
BartJanssens 0:99a111b75cb4 50 MASK_INITED = 8,
BartJanssens 0:99a111b75cb4 51 MASK_INQUIRY = 16,
BartJanssens 0:99a111b75cb4 52 MASK_REMOTE_NAME = 32,
BartJanssens 0:99a111b75cb4 53 MASK_CREATE_CONNECTION = 64
BartJanssens 0:99a111b75cb4 54 };
BartJanssens 0:99a111b75cb4 55
BartJanssens 0:99a111b75cb4 56 int HCI::Open(HCITransport* transport, HCICallback callback)
BartJanssens 0:99a111b75cb4 57 {
BartJanssens 0:99a111b75cb4 58 _transport = transport;
BartJanssens 0:99a111b75cb4 59 _transport->Set(this);
BartJanssens 0:99a111b75cb4 60 _callback = callback;
BartJanssens 0:99a111b75cb4 61 _state = 0;
BartJanssens 0:99a111b75cb4 62 for (int i = 0; i < MAX_BTDEVICES; i++)
BartJanssens 0:99a111b75cb4 63 {
BartJanssens 0:99a111b75cb4 64 _devices[i].Init();
BartJanssens 0:99a111b75cb4 65 _devices[i]._transport = transport;
BartJanssens 0:99a111b75cb4 66 }
BartJanssens 0:99a111b75cb4 67 return SendCmd(HCI_OP_RESET);
BartJanssens 0:99a111b75cb4 68 }
BartJanssens 0:99a111b75cb4 69
BartJanssens 0:99a111b75cb4 70 void printf(const BD_ADDR* addr);
BartJanssens 0:99a111b75cb4 71
BartJanssens 0:99a111b75cb4 72 BTDevice* HCI::Find(const BD_ADDR* addr)
BartJanssens 0:99a111b75cb4 73 {
BartJanssens 0:99a111b75cb4 74 for (int i = 0; i < MAX_BTDEVICES; i++)
BartJanssens 0:99a111b75cb4 75 if (_devices[i]._state != 0 && memcmp(addr,&_devices[i]._info.bdaddr,6) == 0)
BartJanssens 0:99a111b75cb4 76 return &_devices[i];
BartJanssens 0:99a111b75cb4 77 return 0;
BartJanssens 0:99a111b75cb4 78 }
BartJanssens 0:99a111b75cb4 79
BartJanssens 0:99a111b75cb4 80 BTDevice* HCI::Find(int handle)
BartJanssens 0:99a111b75cb4 81 {
BartJanssens 0:99a111b75cb4 82 for (int i = 0; i < MAX_BTDEVICES; i++)
BartJanssens 0:99a111b75cb4 83 if (_devices[i]._state != 0 && handle == _devices[i]._handle)
BartJanssens 0:99a111b75cb4 84 return &_devices[i];
BartJanssens 0:99a111b75cb4 85 return 0;
BartJanssens 0:99a111b75cb4 86 }
BartJanssens 0:99a111b75cb4 87 //
BartJanssens 0:99a111b75cb4 88 bool HCI::Busy()
BartJanssens 0:99a111b75cb4 89 {
BartJanssens 0:99a111b75cb4 90 return (_state & (MASK_INQUIRY | MASK_REMOTE_NAME | MASK_CREATE_CONNECTION)) != 0;
BartJanssens 0:99a111b75cb4 91 }
BartJanssens 0:99a111b75cb4 92
BartJanssens 0:99a111b75cb4 93 int HCI::Inquiry(int duration)
BartJanssens 0:99a111b75cb4 94 {
BartJanssens 0:99a111b75cb4 95 _state |= MASK_INQUIRY;
BartJanssens 0:99a111b75cb4 96 u8 buf[5];
BartJanssens 0:99a111b75cb4 97 buf[0] = 0x33;
BartJanssens 0:99a111b75cb4 98 buf[1] = 0x8B;
BartJanssens 0:99a111b75cb4 99 buf[2] = 0x9E;
BartJanssens 0:99a111b75cb4 100 buf[3] = duration;
BartJanssens 0:99a111b75cb4 101 buf[4] = 5; // 5 results
BartJanssens 0:99a111b75cb4 102 SendCmd(HCI_OP_INQUIRY,buf,sizeof(buf));
BartJanssens 0:99a111b75cb4 103 return 0;
BartJanssens 0:99a111b75cb4 104 }
BartJanssens 0:99a111b75cb4 105
BartJanssens 0:99a111b75cb4 106 int HCI::WriteScanEnable()
BartJanssens 0:99a111b75cb4 107 {
e5115026 1:b2063ffa4927 108 //ライブラリをそのまま使うと使えないため修正項目です.
e5115026 1:b2063ffa4927 109 //u8 buf[2];
e5115026 1:b2063ffa4927 110 //buf[0] = 0x03;
e5115026 1:b2063ffa4927 111 //buf[1] = 0x01;
e5115026 1:b2063ffa4927 112
e5115026 1:b2063ffa4927 113 u8 buf[1];
e5115026 1:b2063ffa4927 114 buf[0]=0x03;
BartJanssens 0:99a111b75cb4 115
BartJanssens 0:99a111b75cb4 116 SendCmd(HCI_OP_WRITE_SCAN_ENABLE,buf,sizeof(buf));
BartJanssens 0:99a111b75cb4 117 return 0;
BartJanssens 0:99a111b75cb4 118 }
BartJanssens 0:99a111b75cb4 119
BartJanssens 0:99a111b75cb4 120 int HCI::AcceptConnection(const BD_ADDR* addr)
BartJanssens 0:99a111b75cb4 121 {
e5115026 1:b2063ffa4927 122 //ライブラリをそのまま使うと使えないため修正項目です.
e5115026 1:b2063ffa4927 123 //u8 buf[6+4];
e5115026 1:b2063ffa4927 124 //memset(buf,0,sizeof(buf));
e5115026 1:b2063ffa4927 125 //memcpy(buf,addr,6);
e5115026 1:b2063ffa4927 126 //buf[7] = 0;
e5115026 1:b2063ffa4927 127
e5115026 1:b2063ffa4927 128 u8 buf[6+1];
BartJanssens 0:99a111b75cb4 129 memset(buf,0,sizeof(buf));
BartJanssens 0:99a111b75cb4 130 memcpy(buf,addr,6);
e5115026 1:b2063ffa4927 131 buf[0]=0;
BartJanssens 0:99a111b75cb4 132
BartJanssens 0:99a111b75cb4 133 SendCmd(HCI_OP_ACCEPT_CONN_REQ,buf,sizeof(buf));
BartJanssens 0:99a111b75cb4 134 return 0;
BartJanssens 0:99a111b75cb4 135 }
BartJanssens 0:99a111b75cb4 136
BartJanssens 0:99a111b75cb4 137 int HCI::SendCmd(int cmd, const u8* params, int len)
BartJanssens 0:99a111b75cb4 138 {
BartJanssens 0:99a111b75cb4 139 u8 b[32];
BartJanssens 0:99a111b75cb4 140 b[0] = cmd;
BartJanssens 0:99a111b75cb4 141 b[1] = (cmd >> 8);
BartJanssens 0:99a111b75cb4 142 b[2] = len;
BartJanssens 0:99a111b75cb4 143 if (params)
BartJanssens 0:99a111b75cb4 144 memcpy(b+3,params,len);
BartJanssens 0:99a111b75cb4 145 _transport->HCISend(b,len+3);
BartJanssens 0:99a111b75cb4 146 return 0;
BartJanssens 0:99a111b75cb4 147 }
BartJanssens 0:99a111b75cb4 148
BartJanssens 0:99a111b75cb4 149 void HCI::OnCommandComplete(int cmd, const u8* data, int len)
BartJanssens 0:99a111b75cb4 150 {
BartJanssens 0:99a111b75cb4 151 // printf("%04X %s",cmd,CmdStr(cmd));
BartJanssens 0:99a111b75cb4 152 if (len < 0)
BartJanssens 0:99a111b75cb4 153 return;
BartJanssens 0:99a111b75cb4 154 //printfBytes(" complete",data,min(16,len));
BartJanssens 0:99a111b75cb4 155
BartJanssens 0:99a111b75cb4 156 switch (cmd)
BartJanssens 0:99a111b75cb4 157 {
BartJanssens 0:99a111b75cb4 158 // Init phase 0
BartJanssens 0:99a111b75cb4 159 case HCI_OP_RESET: // Reset done, init chain to HCI_OP_READ_LOCAL_NAME
BartJanssens 0:99a111b75cb4 160 SendCmd(HCI_OP_READ_BUFFER_SIZE);
BartJanssens 0:99a111b75cb4 161 _state |= MASK_RESET;
BartJanssens 0:99a111b75cb4 162 break;
BartJanssens 0:99a111b75cb4 163
BartJanssens 0:99a111b75cb4 164 // Init phase 1
BartJanssens 0:99a111b75cb4 165 case HCI_OP_READ_BUFFER_SIZE:
BartJanssens 0:99a111b75cb4 166 _acl_mtu = LE16(data);
BartJanssens 0:99a111b75cb4 167 _sco_mtu = data[2];
BartJanssens 0:99a111b75cb4 168 _acl_max_pkt = LE16(data+3);
BartJanssens 0:99a111b75cb4 169 _sco_max_pkt = LE16(data+5);
BartJanssens 0:99a111b75cb4 170 SendCmd(HCI_OP_READ_BD_ADDR);
BartJanssens 0:99a111b75cb4 171 _state |= MASK_READ_BUFFER_SIZE;
BartJanssens 0:99a111b75cb4 172 break;
BartJanssens 0:99a111b75cb4 173
BartJanssens 0:99a111b75cb4 174 // Init phase 2
BartJanssens 0:99a111b75cb4 175 case HCI_OP_READ_BD_ADDR:
BartJanssens 0:99a111b75cb4 176 _localAddr = *((BD_ADDR*)data); // Local Address
BartJanssens 0:99a111b75cb4 177 printf("Local Address: ");
BartJanssens 0:99a111b75cb4 178 printf(&_localAddr);
BartJanssens 0:99a111b75cb4 179 printf("\r\n");
BartJanssens 0:99a111b75cb4 180
BartJanssens 0:99a111b75cb4 181 _state |= MASK_READ_BD_ADDR;
BartJanssens 0:99a111b75cb4 182 _state |= MASK_INITED;
BartJanssens 0:99a111b75cb4 183 Callback(CALLBACK_READY,data,6);
BartJanssens 0:99a111b75cb4 184 break;
BartJanssens 0:99a111b75cb4 185
BartJanssens 0:99a111b75cb4 186 // 0CXX
BartJanssens 0:99a111b75cb4 187 case HCI_OP_READ_LOCAL_NAME:
BartJanssens 0:99a111b75cb4 188 break;
BartJanssens 0:99a111b75cb4 189
BartJanssens 0:99a111b75cb4 190 case HCI_OP_READ_LOCAL_VERSION:
BartJanssens 0:99a111b75cb4 191 // params
BartJanssens 0:99a111b75cb4 192 //SendCmd(HCI_OP_READ_LOCAL_NAME);
BartJanssens 0:99a111b75cb4 193 break;
BartJanssens 0:99a111b75cb4 194
BartJanssens 0:99a111b75cb4 195 case HCI_OP_READ_LOCAL_COMMANDS:
BartJanssens 0:99a111b75cb4 196 break;
BartJanssens 0:99a111b75cb4 197
BartJanssens 0:99a111b75cb4 198 case HCI_OP_READ_LOCAL_FEATURES:
BartJanssens 0:99a111b75cb4 199 //SendCmd(HCI_OP_READ_LOCAL_VERSION);
BartJanssens 0:99a111b75cb4 200 break;
BartJanssens 0:99a111b75cb4 201
BartJanssens 0:99a111b75cb4 202 case HCI_OP_READ_LOCAL_EXT_FEATURES:
BartJanssens 0:99a111b75cb4 203 break;
BartJanssens 0:99a111b75cb4 204
BartJanssens 0:99a111b75cb4 205 case HCI_OP_PIN_CODE_REPLY:
BartJanssens 0:99a111b75cb4 206 printf("Got pin reply\r\n");
BartJanssens 0:99a111b75cb4 207 break;
BartJanssens 0:99a111b75cb4 208
BartJanssens 0:99a111b75cb4 209 default:
BartJanssens 0:99a111b75cb4 210 //printf("Unrecognized Command %04X\r\n",cmd);
BartJanssens 0:99a111b75cb4 211 break;
BartJanssens 0:99a111b75cb4 212 }
BartJanssens 0:99a111b75cb4 213 }
BartJanssens 0:99a111b75cb4 214
BartJanssens 0:99a111b75cb4 215 void HCI::Callback(HCI_CALLBACK_EVENT c, const u8* data, int len)
BartJanssens 0:99a111b75cb4 216 {
BartJanssens 0:99a111b75cb4 217 _callback(this,c,data,len);
BartJanssens 0:99a111b75cb4 218 }
BartJanssens 0:99a111b75cb4 219
BartJanssens 0:99a111b75cb4 220 int HCI::RemoteNameRequest(const BD_ADDR* addr)
BartJanssens 0:99a111b75cb4 221 {
BartJanssens 0:99a111b75cb4 222 _state |= MASK_REMOTE_NAME;
BartJanssens 0:99a111b75cb4 223 u8 buf[6+4];
BartJanssens 0:99a111b75cb4 224 memset(buf,0,sizeof(buf));
BartJanssens 0:99a111b75cb4 225 memcpy(buf,addr,6);
BartJanssens 0:99a111b75cb4 226 buf[7] = 1;
BartJanssens 0:99a111b75cb4 227 return SendCmd(HCI_OP_REMOTE_NAME_REQ,buf,sizeof(buf));
BartJanssens 0:99a111b75cb4 228 }
BartJanssens 0:99a111b75cb4 229
BartJanssens 0:99a111b75cb4 230 int HCI::CreateConnection(const BD_ADDR* remoteAddr)
BartJanssens 0:99a111b75cb4 231 {
BartJanssens 0:99a111b75cb4 232 _state |= MASK_CREATE_CONNECTION;
BartJanssens 0:99a111b75cb4 233 u8 buf[6+7];
BartJanssens 0:99a111b75cb4 234 memset(buf,0,sizeof(buf));
BartJanssens 0:99a111b75cb4 235 memcpy(buf,remoteAddr,6);
BartJanssens 0:99a111b75cb4 236 buf[6] = 0x18; // DM1,DH1
BartJanssens 0:99a111b75cb4 237 buf[7] = 0xCC; // DM3, DH3, DM5, DH5
BartJanssens 0:99a111b75cb4 238 buf[8] = 1; // Page Repetition R1
BartJanssens 0:99a111b75cb4 239 return SendCmd(HCI_OP_CREATE_CONN,buf,sizeof(buf));
BartJanssens 0:99a111b75cb4 240 }
BartJanssens 0:99a111b75cb4 241
BartJanssens 0:99a111b75cb4 242 int HCI::Disconnect(const BD_ADDR* bdaddr)
BartJanssens 0:99a111b75cb4 243 {
BartJanssens 0:99a111b75cb4 244 BTDevice* d = Find(bdaddr);
BartJanssens 0:99a111b75cb4 245 if (!d)
BartJanssens 0:99a111b75cb4 246 return ERR_HCI_DEVICE_NOT_FOUND;
BartJanssens 0:99a111b75cb4 247 int handle = d->_handle;
BartJanssens 0:99a111b75cb4 248 printf("Disconnect from %d\r\n",handle);
BartJanssens 0:99a111b75cb4 249 _state |= MASK_CREATE_CONNECTION;
BartJanssens 0:99a111b75cb4 250 u8 buf[3];
BartJanssens 0:99a111b75cb4 251 buf[0] = handle;
BartJanssens 0:99a111b75cb4 252 buf[1] = (handle >> 8);
BartJanssens 0:99a111b75cb4 253 buf[2] = 0x13;
BartJanssens 0:99a111b75cb4 254 return SendCmd(HCI_OP_DISCONNECT,buf,sizeof(buf));
BartJanssens 0:99a111b75cb4 255 }
BartJanssens 0:99a111b75cb4 256
BartJanssens 0:99a111b75cb4 257 void HCI::DisconnectComplete(int handle)
BartJanssens 0:99a111b75cb4 258 {
BartJanssens 0:99a111b75cb4 259 BTDevice* d = Find(handle);
BartJanssens 0:99a111b75cb4 260 if (!d)
BartJanssens 0:99a111b75cb4 261 return;
BartJanssens 0:99a111b75cb4 262 d->_handle = 0;
BartJanssens 0:99a111b75cb4 263 }
BartJanssens 0:99a111b75cb4 264
BartJanssens 0:99a111b75cb4 265 int HCI::DisconnectAll()
BartJanssens 0:99a111b75cb4 266 {
BartJanssens 0:99a111b75cb4 267 BTDevice* devs[8];
BartJanssens 0:99a111b75cb4 268 int count = GetDevices(devs,8);
BartJanssens 0:99a111b75cb4 269 for (int i = 0; i < count; i++)
BartJanssens 0:99a111b75cb4 270 Disconnect(&devs[i]->_info.bdaddr);
BartJanssens 0:99a111b75cb4 271 return 0;
BartJanssens 0:99a111b75cb4 272 }
BartJanssens 0:99a111b75cb4 273
BartJanssens 0:99a111b75cb4 274 int HCI::PinCodeReply(const u8* data)
BartJanssens 0:99a111b75cb4 275 {
BartJanssens 0:99a111b75cb4 276 u8 b[6+1+16];
BartJanssens 0:99a111b75cb4 277 memset(b,0,sizeof(b));
BartJanssens 0:99a111b75cb4 278 memcpy(b,data,6);
BartJanssens 0:99a111b75cb4 279 b[6] = 4;
BartJanssens 0:99a111b75cb4 280 b[7] = '0';
BartJanssens 0:99a111b75cb4 281 b[8] = '0';
BartJanssens 0:99a111b75cb4 282 b[9] = '0';
BartJanssens 0:99a111b75cb4 283 b[10] = '0';
BartJanssens 0:99a111b75cb4 284 return SendCmd(HCI_OP_PIN_CODE_REPLY,b,sizeof(b));
BartJanssens 0:99a111b75cb4 285 }
BartJanssens 0:99a111b75cb4 286
BartJanssens 0:99a111b75cb4 287 void HCI::InquiryResult(const inquiry_info* info)
BartJanssens 0:99a111b75cb4 288 {
BartJanssens 0:99a111b75cb4 289 BTDevice* bt = Find(&info->bdaddr);
BartJanssens 0:99a111b75cb4 290 if (!bt) // new device
BartJanssens 0:99a111b75cb4 291 {
BartJanssens 0:99a111b75cb4 292 for (int i = 0; i < MAX_BTDEVICES; i++)
BartJanssens 0:99a111b75cb4 293 {
BartJanssens 0:99a111b75cb4 294 if (_devices[i]._state == 0)
BartJanssens 0:99a111b75cb4 295 {
BartJanssens 0:99a111b75cb4 296 bt = _devices + i;
BartJanssens 0:99a111b75cb4 297 bt->_state = 1;
BartJanssens 0:99a111b75cb4 298 break;
BartJanssens 0:99a111b75cb4 299 }
BartJanssens 0:99a111b75cb4 300 }
BartJanssens 0:99a111b75cb4 301 if (!bt)
BartJanssens 0:99a111b75cb4 302 {
BartJanssens 0:99a111b75cb4 303 printf("HCI::InquiryResult too many devices\r\n");
BartJanssens 0:99a111b75cb4 304 return; // Too many devices!
BartJanssens 0:99a111b75cb4 305 }
BartJanssens 0:99a111b75cb4 306 }
BartJanssens 0:99a111b75cb4 307
BartJanssens 0:99a111b75cb4 308 bt->_info = *info;
BartJanssens 0:99a111b75cb4 309 }
BartJanssens 0:99a111b75cb4 310
BartJanssens 0:99a111b75cb4 311 int HCI::GetDevices(BTDevice** devices, int maxDevices)
BartJanssens 0:99a111b75cb4 312 {
BartJanssens 0:99a111b75cb4 313 int j = 0;
BartJanssens 0:99a111b75cb4 314 for (int i = 0; i < MAX_BTDEVICES; i++)
BartJanssens 0:99a111b75cb4 315 {
BartJanssens 0:99a111b75cb4 316 if (_devices[i]._state != 0)
BartJanssens 0:99a111b75cb4 317 {
BartJanssens 0:99a111b75cb4 318 devices[j++] = _devices + i;
BartJanssens 0:99a111b75cb4 319 if (j == maxDevices)
BartJanssens 0:99a111b75cb4 320 break;
BartJanssens 0:99a111b75cb4 321 }
BartJanssens 0:99a111b75cb4 322 }
BartJanssens 0:99a111b75cb4 323 return j;
BartJanssens 0:99a111b75cb4 324 }
BartJanssens 0:99a111b75cb4 325
BartJanssens 0:99a111b75cb4 326 void HCI::RemoteName(const BD_ADDR* addr, const char* name)
BartJanssens 0:99a111b75cb4 327 {
BartJanssens 0:99a111b75cb4 328 BTDevice* d = Find(addr);
BartJanssens 0:99a111b75cb4 329 if (d)
BartJanssens 0:99a111b75cb4 330 {
BartJanssens 0:99a111b75cb4 331 strncpy(d->_name,name,sizeof(d->_name)-1);
BartJanssens 0:99a111b75cb4 332 d->_name[sizeof(d->_name)-1] = 0;
BartJanssens 0:99a111b75cb4 333 }
BartJanssens 0:99a111b75cb4 334 }
BartJanssens 0:99a111b75cb4 335
BartJanssens 0:99a111b75cb4 336 void HCI::ConnectComplete(const connection_info* info)
BartJanssens 0:99a111b75cb4 337 {
BartJanssens 0:99a111b75cb4 338 BTDevice* d = Find(&info->bdaddr);
BartJanssens 0:99a111b75cb4 339 if (!d)
BartJanssens 0:99a111b75cb4 340 return;
BartJanssens 0:99a111b75cb4 341 if (info->status == 0)
BartJanssens 0:99a111b75cb4 342 {
BartJanssens 0:99a111b75cb4 343 d->_handle = info->handle;
BartJanssens 0:99a111b75cb4 344 printf("Connected on %04X\r\n",info->handle);
BartJanssens 0:99a111b75cb4 345 } else
BartJanssens 0:99a111b75cb4 346 printf("Connection failed with %d\r\n",info->status);
BartJanssens 0:99a111b75cb4 347 }
BartJanssens 0:99a111b75cb4 348
BartJanssens 0:99a111b75cb4 349 void HCI::ConnectRequest(const request_info* info)
BartJanssens 0:99a111b75cb4 350 {
BartJanssens 0:99a111b75cb4 351 BTDevice* bt = Find(&info->bdaddr);
BartJanssens 0:99a111b75cb4 352 if (!bt) // new device
BartJanssens 0:99a111b75cb4 353 {
BartJanssens 0:99a111b75cb4 354 for (int i = 0; i < MAX_BTDEVICES; i++)
BartJanssens 0:99a111b75cb4 355 {
BartJanssens 0:99a111b75cb4 356 if (_devices[i]._state == 0)
BartJanssens 0:99a111b75cb4 357 {
BartJanssens 0:99a111b75cb4 358 bt = _devices + i;
BartJanssens 0:99a111b75cb4 359 bt->_state = 1;
BartJanssens 0:99a111b75cb4 360 break;
BartJanssens 0:99a111b75cb4 361 }
BartJanssens 0:99a111b75cb4 362 }
BartJanssens 0:99a111b75cb4 363 if (!bt)
BartJanssens 0:99a111b75cb4 364 {
BartJanssens 0:99a111b75cb4 365 printf("HCI::ConnectRequest too many devices\r\n");
BartJanssens 0:99a111b75cb4 366 return; // Too many devices!
BartJanssens 0:99a111b75cb4 367 }
BartJanssens 0:99a111b75cb4 368 }
BartJanssens 0:99a111b75cb4 369 bt->_info.bdaddr = info->bdaddr;
BartJanssens 0:99a111b75cb4 370 memcpy(bt->_info.dev_class,info->dev_class,3);
BartJanssens 0:99a111b75cb4 371 AcceptConnection(&info->bdaddr);
BartJanssens 0:99a111b75cb4 372 }
BartJanssens 0:99a111b75cb4 373
BartJanssens 0:99a111b75cb4 374 void HCI::HCIRecv(const u8* data, int len)
BartJanssens 0:99a111b75cb4 375 {
BartJanssens 0:99a111b75cb4 376 //printfBytes(EvtStr(data[0]),data,len);
BartJanssens 0:99a111b75cb4 377 //printfBytes(EvtStr(data[0]),data,min(len,16));
BartJanssens 0:99a111b75cb4 378 //printf("HCI Event %02X\r\n",data[0]);
BartJanssens 0:99a111b75cb4 379 switch (data[0])
BartJanssens 0:99a111b75cb4 380 {
BartJanssens 0:99a111b75cb4 381 case HCI_EV_INQUIRY_COMPLETE:
BartJanssens 0:99a111b75cb4 382 printfBytes("Inquiry Complete",data,data[1]);
BartJanssens 0:99a111b75cb4 383 _state &= ~MASK_INQUIRY;
BartJanssens 0:99a111b75cb4 384 Callback(CALLBACK_INQUIRY_DONE,0,0);
BartJanssens 0:99a111b75cb4 385 WriteScanEnable();
BartJanssens 0:99a111b75cb4 386 break;
BartJanssens 0:99a111b75cb4 387
BartJanssens 0:99a111b75cb4 388 case HCI_EV_INQUIRY_RESULT:
BartJanssens 0:99a111b75cb4 389 {
BartJanssens 0:99a111b75cb4 390 const u8* end = data[1] + data + 2;
BartJanssens 0:99a111b75cb4 391 data += 3;
BartJanssens 0:99a111b75cb4 392 while (data < end)
BartJanssens 0:99a111b75cb4 393 {
BartJanssens 0:99a111b75cb4 394 inquiry_info align;
BartJanssens 0:99a111b75cb4 395 memcpy(&align,data,sizeof(inquiry_info));
BartJanssens 0:99a111b75cb4 396 InquiryResult(&align);
BartJanssens 0:99a111b75cb4 397 Callback(CALLBACK_INQUIRY_RESULT,(u8*)&align,sizeof(inquiry_info));
BartJanssens 0:99a111b75cb4 398 data += 14;
BartJanssens 0:99a111b75cb4 399 }
BartJanssens 0:99a111b75cb4 400 }
BartJanssens 0:99a111b75cb4 401 break;
BartJanssens 0:99a111b75cb4 402
BartJanssens 0:99a111b75cb4 403 case HCI_EV_CONN_COMPLETE:
BartJanssens 0:99a111b75cb4 404 _state &= ~MASK_CREATE_CONNECTION;
BartJanssens 0:99a111b75cb4 405 {
BartJanssens 0:99a111b75cb4 406 connection_info align;
BartJanssens 0:99a111b75cb4 407 memcpy(&align,data+2,sizeof(connection_info));
BartJanssens 0:99a111b75cb4 408 ConnectComplete(&align);
BartJanssens 0:99a111b75cb4 409 Callback(CALLBACK_CONNECTION_COMPLETE,(u8*)&align,sizeof(connection_info));
BartJanssens 0:99a111b75cb4 410 }
BartJanssens 0:99a111b75cb4 411 break;
BartJanssens 0:99a111b75cb4 412
BartJanssens 0:99a111b75cb4 413 case HCI_EV_CONN_REQUEST:
BartJanssens 0:99a111b75cb4 414 {
BartJanssens 0:99a111b75cb4 415 request_info align;
BartJanssens 0:99a111b75cb4 416 memcpy(&align,data+2,sizeof(request_info));
BartJanssens 0:99a111b75cb4 417 ConnectRequest(&align);
BartJanssens 0:99a111b75cb4 418 }
BartJanssens 0:99a111b75cb4 419 break;
BartJanssens 0:99a111b75cb4 420
BartJanssens 0:99a111b75cb4 421 case HCI_EV_DISCONN_COMPLETE:
BartJanssens 0:99a111b75cb4 422 DisconnectComplete(LE16(data+3));
BartJanssens 0:99a111b75cb4 423 break;
BartJanssens 0:99a111b75cb4 424
BartJanssens 0:99a111b75cb4 425 case HCI_EV_REMOTE_NAME:
BartJanssens 0:99a111b75cb4 426 {
BartJanssens 0:99a111b75cb4 427 BD_ADDR* addr = (BD_ADDR*)(data+3);
BartJanssens 0:99a111b75cb4 428 const char* name = (const char*)(data + 9);
BartJanssens 0:99a111b75cb4 429 RemoteName(addr,name);
BartJanssens 0:99a111b75cb4 430 }
BartJanssens 0:99a111b75cb4 431 Callback(CALLBACK_REMOTE_NAME,data+3,LE16(data+1)); // addr is in here too
BartJanssens 0:99a111b75cb4 432 _state &= ~MASK_REMOTE_NAME;
BartJanssens 0:99a111b75cb4 433 break;
BartJanssens 0:99a111b75cb4 434
BartJanssens 0:99a111b75cb4 435 case HCI_EV_CMD_STATUS:
BartJanssens 0:99a111b75cb4 436 {
BartJanssens 0:99a111b75cb4 437 const char* errs = HCIErrStr(data[2]);
BartJanssens 0:99a111b75cb4 438 printf("Status %s %s\r\n",CmdStr(LE16(data+4)),errs);
BartJanssens 0:99a111b75cb4 439 }
BartJanssens 0:99a111b75cb4 440 break;
BartJanssens 0:99a111b75cb4 441
BartJanssens 0:99a111b75cb4 442 case HCI_EV_CMD_COMPLETE:
BartJanssens 0:99a111b75cb4 443 OnCommandComplete(data[3] | (data[4] << 8),data+6,data[1]-4);
BartJanssens 0:99a111b75cb4 444 break;
BartJanssens 0:99a111b75cb4 445
BartJanssens 0:99a111b75cb4 446 case HCI_EV_PIN_CODE_REQ:
BartJanssens 0:99a111b75cb4 447 PinCodeReply(data+2);
BartJanssens 0:99a111b75cb4 448 break;
BartJanssens 0:99a111b75cb4 449
BartJanssens 0:99a111b75cb4 450 case HCI_EV_LINK_KEY_REQ:
BartJanssens 0:99a111b75cb4 451 SendCmd(HCI_OP_LINK_KEY_NEG_REPLY,data+2,6);
BartJanssens 0:99a111b75cb4 452 break;
BartJanssens 0:99a111b75cb4 453
BartJanssens 0:99a111b75cb4 454 default:
BartJanssens 0:99a111b75cb4 455 ;
BartJanssens 0:99a111b75cb4 456 // printfBytes("HCI Event:",data,data[1]+2);
BartJanssens 0:99a111b75cb4 457 }
BartJanssens 0:99a111b75cb4 458 }
BartJanssens 0:99a111b75cb4 459
BartJanssens 0:99a111b75cb4 460 int HCI::Open(SocketInternal* sock, SocketAddrHdr* addr)
BartJanssens 0:99a111b75cb4 461 {
BartJanssens 0:99a111b75cb4 462 L2CAPSocket* l2capsock = (L2CAPSocket*)sock;
BartJanssens 0:99a111b75cb4 463 L2CAPAddr* l2capaddr = (L2CAPAddr*)addr;
BartJanssens 0:99a111b75cb4 464 BTDevice* bt = Find(&l2capaddr->bdaddr);
BartJanssens 0:99a111b75cb4 465 if (!bt)
BartJanssens 0:99a111b75cb4 466 {
BartJanssens 0:99a111b75cb4 467 printf("Can't open l2cap %d on ",l2capaddr->psm);
BartJanssens 0:99a111b75cb4 468 printf(&l2capaddr->bdaddr);
BartJanssens 0:99a111b75cb4 469 printf("\r\n");
BartJanssens 0:99a111b75cb4 470 return ERR_HCI_DEVICE_NOT_FOUND;
BartJanssens 0:99a111b75cb4 471 }
BartJanssens 0:99a111b75cb4 472 l2capsock->btdevice = bt;
BartJanssens 0:99a111b75cb4 473 return bt->Open(sock,addr);
BartJanssens 0:99a111b75cb4 474 }
BartJanssens 0:99a111b75cb4 475
BartJanssens 0:99a111b75cb4 476 int HCI::Create(SocketInternal* sock, SocketAddrHdr* addr)
BartJanssens 0:99a111b75cb4 477 {
BartJanssens 0:99a111b75cb4 478 L2CAPSocket* l2capsock = (L2CAPSocket*)sock;
BartJanssens 0:99a111b75cb4 479 L2CAPAddr* l2capaddr = (L2CAPAddr*)addr;
BartJanssens 0:99a111b75cb4 480 BTDevice* bt = Find(&l2capaddr->bdaddr);
BartJanssens 0:99a111b75cb4 481 if (!bt)
BartJanssens 0:99a111b75cb4 482 {
BartJanssens 0:99a111b75cb4 483 printf("HCI Create: Can't open l2cap on ");
BartJanssens 0:99a111b75cb4 484 printf(&l2capaddr->bdaddr);
BartJanssens 0:99a111b75cb4 485 printf("\r\n");
BartJanssens 0:99a111b75cb4 486 return ERR_HCI_DEVICE_NOT_FOUND;
BartJanssens 0:99a111b75cb4 487 }
BartJanssens 0:99a111b75cb4 488 l2capsock->btdevice = bt;
BartJanssens 0:99a111b75cb4 489 //return 0;
BartJanssens 0:99a111b75cb4 490 return bt->Create(sock,addr);
BartJanssens 0:99a111b75cb4 491 }
BartJanssens 0:99a111b75cb4 492
BartJanssens 0:99a111b75cb4 493
BartJanssens 0:99a111b75cb4 494 int HCI::Accept(SocketInternal* sock, SocketAddrHdr* addr)
BartJanssens 0:99a111b75cb4 495 {
BartJanssens 0:99a111b75cb4 496
BartJanssens 0:99a111b75cb4 497 printf("Call to HCI Accept \r\n");
BartJanssens 0:99a111b75cb4 498
BartJanssens 0:99a111b75cb4 499 L2CAPSocket* l2capsock = (L2CAPSocket*)sock;
BartJanssens 0:99a111b75cb4 500 L2CAPAddr* l2capaddr = (L2CAPAddr*)addr;
BartJanssens 0:99a111b75cb4 501 BTDevice* bt = Find(&l2capaddr->bdaddr);
BartJanssens 0:99a111b75cb4 502 if (!bt)
BartJanssens 0:99a111b75cb4 503 {
BartJanssens 0:99a111b75cb4 504 //printf("Can't open l2cap %d on ",l2capaddr->psm);
BartJanssens 0:99a111b75cb4 505 printf("HCI Accept: Can't open l2cap on ");
BartJanssens 0:99a111b75cb4 506 printf(&l2capaddr->bdaddr);
BartJanssens 0:99a111b75cb4 507 printf("\r\n");
BartJanssens 0:99a111b75cb4 508 return ERR_HCI_DEVICE_NOT_FOUND;
BartJanssens 0:99a111b75cb4 509 }
BartJanssens 0:99a111b75cb4 510 //l2capsock->btdevice = bt;
BartJanssens 0:99a111b75cb4 511 return bt->Open(sock,addr);
BartJanssens 0:99a111b75cb4 512
BartJanssens 0:99a111b75cb4 513 }
BartJanssens 0:99a111b75cb4 514
BartJanssens 0:99a111b75cb4 515 /**
BartJanssens 0:99a111b75cb4 516 SocketInternal* HCI::Create(SocketInternal* sock)
BartJanssens 0:99a111b75cb4 517 {
BartJanssens 0:99a111b75cb4 518 return sock;
BartJanssens 0:99a111b75cb4 519 }
BartJanssens 0:99a111b75cb4 520 **/
BartJanssens 0:99a111b75cb4 521
BartJanssens 0:99a111b75cb4 522
BartJanssens 0:99a111b75cb4 523 int HCI::Send(SocketInternal* sock, const u8* data, int len)
BartJanssens 0:99a111b75cb4 524 {
BartJanssens 0:99a111b75cb4 525 L2CAPSocket* l2capsock = (L2CAPSocket*)sock;
BartJanssens 0:99a111b75cb4 526 return l2capsock->btdevice->Send(sock,data,len); // Pointless double dispatch
BartJanssens 0:99a111b75cb4 527 }
BartJanssens 0:99a111b75cb4 528
BartJanssens 0:99a111b75cb4 529 int HCI::Close(SocketInternal* sock)
BartJanssens 0:99a111b75cb4 530 {
BartJanssens 0:99a111b75cb4 531 L2CAPSocket* l2capsock = (L2CAPSocket*)sock;
BartJanssens 0:99a111b75cb4 532 return l2capsock->btdevice->Close(sock); // Pointless double dispatch
BartJanssens 0:99a111b75cb4 533 }
BartJanssens 0:99a111b75cb4 534
BartJanssens 0:99a111b75cb4 535 void HCI::ACLRecv(const u8* data, int len)
BartJanssens 0:99a111b75cb4 536 {
BartJanssens 0:99a111b75cb4 537 int handle = LE16(data);
BartJanssens 0:99a111b75cb4 538 BD_ADDR* addr;
BartJanssens 0:99a111b75cb4 539 BTDevice* d = Find(handle & 0x0FFF);
BartJanssens 0:99a111b75cb4 540 addr = &d->_info.bdaddr;
BartJanssens 0:99a111b75cb4 541
BartJanssens 0:99a111b75cb4 542 if (d)
BartJanssens 0:99a111b75cb4 543 d->ACLRecv(addr,data,len);
BartJanssens 0:99a111b75cb4 544 }
BartJanssens 0:99a111b75cb4 545
BartJanssens 0:99a111b75cb4 546 //===================================================================
BartJanssens 0:99a111b75cb4 547 //===================================================================