Based on Peter Barrett\'s work on BlueUSB, I added support for the PS3 Sixaxis controller (both USB and Bluetooth). When connecting a Sixaxis via USB, it will be paired with the (hardcoded) MAC address of my Bluetooth dongle.

Dependencies:   mbed

Dependents:   PS3_BlueUSB_downstate

Committer:
BartJanssens
Date:
Tue Apr 26 16:09:17 2011 +0000
Revision:
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 #include <stdio.h>
BartJanssens 0:99a111b75cb4 25 #include <stdlib.h>
BartJanssens 0:99a111b75cb4 26 #include <stdio.h>
BartJanssens 0:99a111b75cb4 27 #include <string.h>
BartJanssens 0:99a111b75cb4 28
BartJanssens 0:99a111b75cb4 29 #include "Utils.h"
BartJanssens 0:99a111b75cb4 30 #include "hci.h"
BartJanssens 0:99a111b75cb4 31
BartJanssens 0:99a111b75cb4 32 #define L2CAP_COMMAND_REJ 0x01
BartJanssens 0:99a111b75cb4 33 #define L2CAP_CONN_REQ 0x02
BartJanssens 0:99a111b75cb4 34 #define L2CAP_CONN_RSP 0x03
BartJanssens 0:99a111b75cb4 35 #define L2CAP_CONF_REQ 0x04
BartJanssens 0:99a111b75cb4 36 #define L2CAP_CONF_RSP 0x05
BartJanssens 0:99a111b75cb4 37 #define L2CAP_DISCONN_REQ 0x06
BartJanssens 0:99a111b75cb4 38 #define L2CAP_DISCONN_RSP 0x07
BartJanssens 0:99a111b75cb4 39 #define L2CAP_ECHO_REQ 0x08
BartJanssens 0:99a111b75cb4 40 #define L2CAP_ECHO_RSP 0x09
BartJanssens 0:99a111b75cb4 41 #define L2CAP_INFO_REQ 0x0a
BartJanssens 0:99a111b75cb4 42 #define L2CAP_INFO_RSP 0x0b
BartJanssens 0:99a111b75cb4 43
BartJanssens 0:99a111b75cb4 44
BartJanssens 0:99a111b75cb4 45 /* L2CAP command codes */
BartJanssens 0:99a111b75cb4 46 const char* L2CAP_ComandCodeStr(int c)
BartJanssens 0:99a111b75cb4 47 {
BartJanssens 0:99a111b75cb4 48 switch (c)
BartJanssens 0:99a111b75cb4 49 {
BartJanssens 0:99a111b75cb4 50 case L2CAP_COMMAND_REJ: return "L2CAP_COMMAND_REJ";
BartJanssens 0:99a111b75cb4 51 case L2CAP_CONN_REQ: return "L2CAP_CONN_REQ";
BartJanssens 0:99a111b75cb4 52 case L2CAP_CONN_RSP: return "L2CAP_CONN_RSP";
BartJanssens 0:99a111b75cb4 53 case L2CAP_CONF_REQ: return "L2CAP_CONF_REQ";
BartJanssens 0:99a111b75cb4 54 case L2CAP_CONF_RSP: return "L2CAP_CONF_RSP";
BartJanssens 0:99a111b75cb4 55 case L2CAP_DISCONN_REQ: return "L2CAP_DISCONN_REQ";
BartJanssens 0:99a111b75cb4 56 case L2CAP_DISCONN_RSP: return "L2CAP_DISCONN_RSP";
BartJanssens 0:99a111b75cb4 57 case L2CAP_ECHO_REQ: return "L2CAP_ECHO_REQ";
BartJanssens 0:99a111b75cb4 58 case L2CAP_ECHO_RSP: return "L2CAP_ECHO_RSP";
BartJanssens 0:99a111b75cb4 59 case L2CAP_INFO_REQ: return "L2CAP_INFO_REQ";
BartJanssens 0:99a111b75cb4 60 case L2CAP_INFO_RSP: return "L2CAP_INFO_RSP";
BartJanssens 0:99a111b75cb4 61 }
BartJanssens 0:99a111b75cb4 62 return "unknown";
BartJanssens 0:99a111b75cb4 63 }
BartJanssens 0:99a111b75cb4 64
BartJanssens 0:99a111b75cb4 65 typedef struct
BartJanssens 0:99a111b75cb4 66 {
BartJanssens 0:99a111b75cb4 67 u16 handle;
BartJanssens 0:99a111b75cb4 68 u16 length; // total
BartJanssens 0:99a111b75cb4 69 u16 l2capLength; // length -4
BartJanssens 0:99a111b75cb4 70 u16 cid; // Signaling packet CID = 1
BartJanssens 0:99a111b75cb4 71 u8 data[64]; // Largest thing to send!!! todo
BartJanssens 0:99a111b75cb4 72 } L2CAPData;
BartJanssens 0:99a111b75cb4 73
BartJanssens 0:99a111b75cb4 74 typedef struct
BartJanssens 0:99a111b75cb4 75 {
BartJanssens 0:99a111b75cb4 76 u16 handle;
BartJanssens 0:99a111b75cb4 77 u16 length; // total
BartJanssens 0:99a111b75cb4 78 u16 l2capLength; // length -4
BartJanssens 0:99a111b75cb4 79 u16 cid; // Signaling packet CID = 1
BartJanssens 0:99a111b75cb4 80
BartJanssens 0:99a111b75cb4 81 // Payload
BartJanssens 0:99a111b75cb4 82 u8 cmd; //
BartJanssens 0:99a111b75cb4 83 u8 id;
BartJanssens 0:99a111b75cb4 84 u16 cmdLength; // total-8
BartJanssens 0:99a111b75cb4 85 u16 params[4]; // Params
BartJanssens 0:99a111b75cb4 86 } L2CAPCmd;
BartJanssens 0:99a111b75cb4 87
BartJanssens 0:99a111b75cb4 88 void printf(const BD_ADDR* addr);
BartJanssens 0:99a111b75cb4 89
BartJanssens 0:99a111b75cb4 90 //
BartJanssens 0:99a111b75cb4 91 void BTDevice::Init()
BartJanssens 0:99a111b75cb4 92 {
BartJanssens 0:99a111b75cb4 93 memset(&_info,0,sizeof(inquiry_info));
BartJanssens 0:99a111b75cb4 94 _handle = 0;
BartJanssens 0:99a111b75cb4 95 _name[0] = 0;
BartJanssens 0:99a111b75cb4 96 _state = 0;
BartJanssens 0:99a111b75cb4 97 }
BartJanssens 0:99a111b75cb4 98
BartJanssens 0:99a111b75cb4 99 // virtual SocketHandler
BartJanssens 0:99a111b75cb4 100 int BTDevice::Open(SocketInternal* sock, SocketAddrHdr* addr)
BartJanssens 0:99a111b75cb4 101 {
BartJanssens 0:99a111b75cb4 102 printf("Call to BTDevice Open \r\n");
BartJanssens 0:99a111b75cb4 103 L2CAPSocket* s = (L2CAPSocket*)sock;
BartJanssens 0:99a111b75cb4 104 L2CAPAddr* a = (L2CAPAddr*)addr;
BartJanssens 0:99a111b75cb4 105 s->scid = 0x40 + sock->ID-1; // are these reserved?
BartJanssens 0:99a111b75cb4 106 s->dcid = 0;
BartJanssens 0:99a111b75cb4 107 Connect(s->scid,a->psm);
BartJanssens 0:99a111b75cb4 108 return sock->ID;
BartJanssens 0:99a111b75cb4 109 }
BartJanssens 0:99a111b75cb4 110
BartJanssens 0:99a111b75cb4 111 // virtual SocketHandler
BartJanssens 0:99a111b75cb4 112 int BTDevice::Create(SocketInternal* sock, SocketAddrHdr* addr)
BartJanssens 0:99a111b75cb4 113 {
BartJanssens 0:99a111b75cb4 114 printf("Call to BTDevice Create \r\n");
BartJanssens 0:99a111b75cb4 115 L2CAPSocket* s = (L2CAPSocket*)sock;
BartJanssens 0:99a111b75cb4 116 L2CAPAddr* a = (L2CAPAddr*)addr;
BartJanssens 0:99a111b75cb4 117
BartJanssens 0:99a111b75cb4 118 //Connect(s->scid,a->psm);
BartJanssens 0:99a111b75cb4 119 return sock->ID;
BartJanssens 0:99a111b75cb4 120 }
BartJanssens 0:99a111b75cb4 121
BartJanssens 0:99a111b75cb4 122 int BTDevice::Accept(SocketInternal* sock, SocketAddrHdr* addr)
BartJanssens 0:99a111b75cb4 123 {
BartJanssens 0:99a111b75cb4 124 printf("Call to BTDevice Accept \r\n");
BartJanssens 0:99a111b75cb4 125 L2CAPSocket* s = (L2CAPSocket*)sock;
BartJanssens 0:99a111b75cb4 126 L2CAPAddr* a = (L2CAPAddr*)addr;
BartJanssens 0:99a111b75cb4 127
BartJanssens 0:99a111b75cb4 128
BartJanssens 0:99a111b75cb4 129 printf("ID = %d scid = %d dcid = %d \r\n",sock->ID, s->scid, s->dcid);
BartJanssens 0:99a111b75cb4 130
BartJanssens 0:99a111b75cb4 131 return sock->ID;
BartJanssens 0:99a111b75cb4 132 }
BartJanssens 0:99a111b75cb4 133
BartJanssens 0:99a111b75cb4 134
BartJanssens 0:99a111b75cb4 135
BartJanssens 0:99a111b75cb4 136
BartJanssens 0:99a111b75cb4 137 // virtual SocketHandler
BartJanssens 0:99a111b75cb4 138 int BTDevice::Send(SocketInternal* sock, const u8* data, int len)
BartJanssens 0:99a111b75cb4 139 {
BartJanssens 0:99a111b75cb4 140 printf("Call to BTDevice Send \r\n");
BartJanssens 0:99a111b75cb4 141 L2CAPData d;
BartJanssens 0:99a111b75cb4 142 L2CAPSocket* s = (L2CAPSocket*)sock;
BartJanssens 0:99a111b75cb4 143
BartJanssens 0:99a111b75cb4 144 d.handle = _handle | 0x2000;
BartJanssens 0:99a111b75cb4 145 d.length = 4 + len;
BartJanssens 0:99a111b75cb4 146 d.l2capLength = len;
BartJanssens 0:99a111b75cb4 147 d.cid = s->dcid;
BartJanssens 0:99a111b75cb4 148
BartJanssens 0:99a111b75cb4 149 if (len > 64)
BartJanssens 0:99a111b75cb4 150 return -1;
BartJanssens 0:99a111b75cb4 151 memcpy(d.data,data,len);
BartJanssens 0:99a111b75cb4 152 return Send((u8*)&d,len+8);
BartJanssens 0:99a111b75cb4 153 }
BartJanssens 0:99a111b75cb4 154
BartJanssens 0:99a111b75cb4 155 // virtual SocketHandler
BartJanssens 0:99a111b75cb4 156 int BTDevice::Close(SocketInternal* sock)
BartJanssens 0:99a111b75cb4 157 {
BartJanssens 0:99a111b75cb4 158 printf("L2CAP close %d\r\n",sock->ID);
BartJanssens 0:99a111b75cb4 159 L2CAPSocket* s = (L2CAPSocket*)sock;
BartJanssens 0:99a111b75cb4 160 return Disconnect(s->scid,s->dcid);
BartJanssens 0:99a111b75cb4 161 }
BartJanssens 0:99a111b75cb4 162
BartJanssens 0:99a111b75cb4 163 L2CAPSocket* BTDevice::SCIDToSocket(int scid)
BartJanssens 0:99a111b75cb4 164 {
BartJanssens 0:99a111b75cb4 165 return (L2CAPSocket*)GetSocketInternal(scid-0x40+1);
BartJanssens 0:99a111b75cb4 166 }
BartJanssens 0:99a111b75cb4 167
BartJanssens 0:99a111b75cb4 168 int BTDevice::Send(const u8* data, int len)
BartJanssens 0:99a111b75cb4 169 {
BartJanssens 0:99a111b75cb4 170 printfBytes("L2CP send: ",data,len);
BartJanssens 0:99a111b75cb4 171 _transport->ACLSend(data,len);
BartJanssens 0:99a111b75cb4 172 return 0;
BartJanssens 0:99a111b75cb4 173 }
BartJanssens 0:99a111b75cb4 174
BartJanssens 0:99a111b75cb4 175 int BTDevice::Send(u8 c, u8 id, u16* params, int count)
BartJanssens 0:99a111b75cb4 176 {
BartJanssens 0:99a111b75cb4 177 L2CAPCmd cmd;
BartJanssens 0:99a111b75cb4 178 cmd.handle = _handle | 0x2000;
BartJanssens 0:99a111b75cb4 179 cmd.length = 8 + count*2;
BartJanssens 0:99a111b75cb4 180
BartJanssens 0:99a111b75cb4 181 cmd.l2capLength = cmd.length-4;
BartJanssens 0:99a111b75cb4 182 cmd.cid = 1; // Signaling packet
BartJanssens 0:99a111b75cb4 183
BartJanssens 0:99a111b75cb4 184 cmd.cmd = c;
BartJanssens 0:99a111b75cb4 185 cmd.id = id;
BartJanssens 0:99a111b75cb4 186 cmd.cmdLength = count*2;
BartJanssens 0:99a111b75cb4 187 for (int i = 0; i < count; i++)
BartJanssens 0:99a111b75cb4 188 cmd.params[i] = params[i];
BartJanssens 0:99a111b75cb4 189 return Send((u8*)&cmd,cmd.length+4);
BartJanssens 0:99a111b75cb4 190 }
BartJanssens 0:99a111b75cb4 191
BartJanssens 0:99a111b75cb4 192 int BTDevice::Connect(int scid, int psm)
BartJanssens 0:99a111b75cb4 193 {
BartJanssens 0:99a111b75cb4 194 u16 p[2];
BartJanssens 0:99a111b75cb4 195 p[0] = psm;
BartJanssens 0:99a111b75cb4 196 p[1] = scid;
BartJanssens 0:99a111b75cb4 197 return Send(L2CAP_CONN_REQ,_txid++,p,2);
BartJanssens 0:99a111b75cb4 198 }
BartJanssens 0:99a111b75cb4 199
BartJanssens 0:99a111b75cb4 200 int BTDevice::Disconnect(int scid, int dcid)
BartJanssens 0:99a111b75cb4 201 {
BartJanssens 0:99a111b75cb4 202 u16 p[2];
BartJanssens 0:99a111b75cb4 203 p[0] = dcid;
BartJanssens 0:99a111b75cb4 204 p[1] = scid;
BartJanssens 0:99a111b75cb4 205 return Send(L2CAP_DISCONN_REQ,_txid++,p,2);
BartJanssens 0:99a111b75cb4 206 }
BartJanssens 0:99a111b75cb4 207
BartJanssens 0:99a111b75cb4 208 int BTDevice::ConfigureRequest(int dcid)
BartJanssens 0:99a111b75cb4 209 {
BartJanssens 0:99a111b75cb4 210 u16 p[4];
BartJanssens 0:99a111b75cb4 211 p[0] = dcid;
BartJanssens 0:99a111b75cb4 212 p[1] = 0;
BartJanssens 0:99a111b75cb4 213 p[2] = 0x0201; // Options
BartJanssens 0:99a111b75cb4 214 p[3] = 0x02A0; // 672
BartJanssens 0:99a111b75cb4 215 return Send(L2CAP_CONF_REQ,_txid++,p,4);
BartJanssens 0:99a111b75cb4 216 }
BartJanssens 0:99a111b75cb4 217
BartJanssens 0:99a111b75cb4 218 int BTDevice::ConfigureResponse(u8 rxid, int dcid)
BartJanssens 0:99a111b75cb4 219 {
BartJanssens 0:99a111b75cb4 220 u16 p[3];
BartJanssens 0:99a111b75cb4 221 p[0] = dcid;
BartJanssens 0:99a111b75cb4 222 p[1] = 0;
BartJanssens 0:99a111b75cb4 223 p[2] = 0;
BartJanssens 0:99a111b75cb4 224 return Send(L2CAP_CONF_RSP,rxid,p,3);
BartJanssens 0:99a111b75cb4 225 }
BartJanssens 0:99a111b75cb4 226
BartJanssens 0:99a111b75cb4 227 int BTDevice::DisconnectResponse(u8 rxid, int scid, int dcid)
BartJanssens 0:99a111b75cb4 228 {
BartJanssens 0:99a111b75cb4 229 u16 p[2];
BartJanssens 0:99a111b75cb4 230 p[0] = dcid;
BartJanssens 0:99a111b75cb4 231 p[1] = scid;
BartJanssens 0:99a111b75cb4 232 return Send(L2CAP_DISCONN_RSP,rxid,p,2);
BartJanssens 0:99a111b75cb4 233 }
BartJanssens 0:99a111b75cb4 234
BartJanssens 0:99a111b75cb4 235 int BTDevice::AcceptResponse(u8 rxid, int scid, int dcid)
BartJanssens 0:99a111b75cb4 236 {
BartJanssens 0:99a111b75cb4 237 printf("Connection accepted \r\n");
BartJanssens 0:99a111b75cb4 238 u16 p[4];
BartJanssens 0:99a111b75cb4 239 p[0] = scid;
BartJanssens 0:99a111b75cb4 240 p[1] = dcid;
BartJanssens 0:99a111b75cb4 241 p[2] = L2CAP_CONN_SUCCESS;
BartJanssens 0:99a111b75cb4 242 p[3] = 0;
BartJanssens 0:99a111b75cb4 243
BartJanssens 0:99a111b75cb4 244 return Send(L2CAP_CONN_RSP,rxid,p,4);
BartJanssens 0:99a111b75cb4 245
BartJanssens 0:99a111b75cb4 246 }
BartJanssens 0:99a111b75cb4 247
BartJanssens 0:99a111b75cb4 248 int BTDevice::RefuseResponse(u8 rxid)
BartJanssens 0:99a111b75cb4 249 {
BartJanssens 0:99a111b75cb4 250 printf("Connection refused \r\n");
BartJanssens 0:99a111b75cb4 251 u16 p[2];
BartJanssens 0:99a111b75cb4 252 p[0] = L2CAP_CONN_REF_PSM;
BartJanssens 0:99a111b75cb4 253 p[1] = 0;
BartJanssens 0:99a111b75cb4 254
BartJanssens 0:99a111b75cb4 255 return Send(L2CAP_CONN_RSP,rxid,p,2);
BartJanssens 0:99a111b75cb4 256 }
BartJanssens 0:99a111b75cb4 257
BartJanssens 0:99a111b75cb4 258
BartJanssens 0:99a111b75cb4 259 //int BTDevice::InUse(int psm)
BartJanssens 0:99a111b75cb4 260 //{
BartJanssens 0:99a111b75cb4 261 // for (int i = 0; i < MAX_PORTS; i++){
BartJanssens 0:99a111b75cb4 262 // printf("Listen Q %d = %d \r\n",i, _listen[i]);
BartJanssens 0:99a111b75cb4 263 // if ( _listen[i] == psm ) {
BartJanssens 0:99a111b75cb4 264 // printf("We are listening on port %d \r\n",psm); //in use
BartJanssens 0:99a111b75cb4 265 // return 0;
BartJanssens 0:99a111b75cb4 266 // }
BartJanssens 0:99a111b75cb4 267 // }
BartJanssens 0:99a111b75cb4 268 // printf("We are not listening on port %d \r\n",psm);
BartJanssens 0:99a111b75cb4 269 // return 1;
BartJanssens 0:99a111b75cb4 270 //}
BartJanssens 0:99a111b75cb4 271
BartJanssens 0:99a111b75cb4 272
BartJanssens 0:99a111b75cb4 273
BartJanssens 0:99a111b75cb4 274
BartJanssens 0:99a111b75cb4 275 void BTDevice::Control(const BD_ADDR* addr, const u8* data, int len)
BartJanssens 0:99a111b75cb4 276 {
BartJanssens 0:99a111b75cb4 277
BartJanssens 0:99a111b75cb4 278 SocketInternal* sock;
BartJanssens 0:99a111b75cb4 279 L2CAPSocket* s;
BartJanssens 0:99a111b75cb4 280 int psm,scid,dcid,flags;
BartJanssens 0:99a111b75cb4 281
BartJanssens 0:99a111b75cb4 282 printf("From address ");
BartJanssens 0:99a111b75cb4 283 printf(addr);
BartJanssens 0:99a111b75cb4 284 printf(" : ");
BartJanssens 0:99a111b75cb4 285
BartJanssens 0:99a111b75cb4 286 int cc = data[8];
BartJanssens 0:99a111b75cb4 287 printf(L2CAP_ComandCodeStr(cc));
BartJanssens 0:99a111b75cb4 288 int result = LE16(data+16);
BartJanssens 0:99a111b75cb4 289 printf(" Result %d\r\n",result);
BartJanssens 0:99a111b75cb4 290
BartJanssens 0:99a111b75cb4 291
BartJanssens 0:99a111b75cb4 292 switch (cc)
BartJanssens 0:99a111b75cb4 293 {
BartJanssens 0:99a111b75cb4 294 case L2CAP_COMMAND_REJ:
BartJanssens 0:99a111b75cb4 295 break;
BartJanssens 0:99a111b75cb4 296 case L2CAP_CONN_REQ:
BartJanssens 0:99a111b75cb4 297 {
BartJanssens 0:99a111b75cb4 298 psm = LE16(data+12);
BartJanssens 0:99a111b75cb4 299 scid = LE16(data+14);
BartJanssens 0:99a111b75cb4 300 printf("Connection request scid = %d psm = %d \r\n",scid,psm);
BartJanssens 0:99a111b75cb4 301
BartJanssens 0:99a111b75cb4 302 // check if we listen on the port
BartJanssens 0:99a111b75cb4 303 //if ( InUse(psm) ) {
BartJanssens 0:99a111b75cb4 304 if ( Socket_InUse(SOCKET_L2CAP,psm) ) {
BartJanssens 0:99a111b75cb4 305 RefuseResponse(data[9]);
BartJanssens 0:99a111b75cb4 306
BartJanssens 0:99a111b75cb4 307
BartJanssens 0:99a111b75cb4 308 } else {
BartJanssens 0:99a111b75cb4 309 L2CAPAddr sockAddr;
BartJanssens 0:99a111b75cb4 310 sockAddr.bdaddr = *addr;
BartJanssens 0:99a111b75cb4 311 sock = Socket_Create(SOCKET_L2CAP, &sockAddr.hdr, psm);
BartJanssens 0:99a111b75cb4 312 s = (L2CAPSocket*)sock;
BartJanssens 0:99a111b75cb4 313 s->scid = 0x40 + sock->ID-1; // are these reserved?
BartJanssens 0:99a111b75cb4 314 s->dcid = scid;
BartJanssens 0:99a111b75cb4 315 AcceptResponse(data[9],s->scid,s->dcid);
BartJanssens 0:99a111b75cb4 316
BartJanssens 0:99a111b75cb4 317 ConfigureRequest(s->dcid); // handshake
BartJanssens 0:99a111b75cb4 318
BartJanssens 0:99a111b75cb4 319 sock->SetState(SocketState_Accept);
BartJanssens 0:99a111b75cb4 320 }
BartJanssens 0:99a111b75cb4 321
BartJanssens 0:99a111b75cb4 322 /**
BartJanssens 0:99a111b75cb4 323 for (int i = 0; i < MAX_PORTS; i++){
BartJanssens 0:99a111b75cb4 324 if ( _listen[i] == psm ) {
BartJanssens 0:99a111b75cb4 325 printf("We are listening on port %d \r\n",psm); //in use
BartJanssens 0:99a111b75cb4 326 RefuseResponse(data[9]);
BartJanssens 0:99a111b75cb4 327 break;
BartJanssens 0:99a111b75cb4 328 }
BartJanssens 0:99a111b75cb4 329 }
BartJanssens 0:99a111b75cb4 330 **/
BartJanssens 0:99a111b75cb4 331
BartJanssens 0:99a111b75cb4 332 //L2CAPAddr sockAddr;
BartJanssens 0:99a111b75cb4 333 //sockAddr.bdaddr = addr;
BartJanssens 0:99a111b75cb4 334 //sockAddr.psm = psm;
BartJanssens 0:99a111b75cb4 335
BartJanssens 0:99a111b75cb4 336 }
BartJanssens 0:99a111b75cb4 337 break;
BartJanssens 0:99a111b75cb4 338
BartJanssens 0:99a111b75cb4 339 // Response to our initial connect from Remote
BartJanssens 0:99a111b75cb4 340 case L2CAP_CONN_RSP:
BartJanssens 0:99a111b75cb4 341 {
BartJanssens 0:99a111b75cb4 342 if (result == 0)
BartJanssens 0:99a111b75cb4 343 {
BartJanssens 0:99a111b75cb4 344 printf("Connect succeeded\r\n");
BartJanssens 0:99a111b75cb4 345 dcid = LE16(data+12);
BartJanssens 0:99a111b75cb4 346 scid = LE16(data+14);
BartJanssens 0:99a111b75cb4 347 L2CAPSocket* s = SCIDToSocket(scid);
BartJanssens 0:99a111b75cb4 348 if (s)
BartJanssens 0:99a111b75cb4 349 {
BartJanssens 0:99a111b75cb4 350 s->dcid = dcid;
BartJanssens 0:99a111b75cb4 351 ConfigureRequest(dcid);
BartJanssens 0:99a111b75cb4 352 }
BartJanssens 0:99a111b75cb4 353 } else
BartJanssens 0:99a111b75cb4 354 printf("Connect failed?\r\n");
BartJanssens 0:99a111b75cb4 355 }
BartJanssens 0:99a111b75cb4 356 break;
BartJanssens 0:99a111b75cb4 357
BartJanssens 0:99a111b75cb4 358 case L2CAP_CONF_RSP:
BartJanssens 0:99a111b75cb4 359 {
BartJanssens 0:99a111b75cb4 360 scid = LE16(data+12);
BartJanssens 0:99a111b75cb4 361 SocketInternal* s = (SocketInternal*)SCIDToSocket(scid);
BartJanssens 0:99a111b75cb4 362 if (s)
BartJanssens 0:99a111b75cb4 363 s->SetState(SocketState_Open);
BartJanssens 0:99a111b75cb4 364 }
BartJanssens 0:99a111b75cb4 365 break;
BartJanssens 0:99a111b75cb4 366
BartJanssens 0:99a111b75cb4 367 case L2CAP_CONF_REQ:
BartJanssens 0:99a111b75cb4 368 {
BartJanssens 0:99a111b75cb4 369 u16 dcid = LE16(data+12);
BartJanssens 0:99a111b75cb4 370 u16 flags = LE16(data+14);
BartJanssens 0:99a111b75cb4 371 printf("Config request dcid = %02X flags = %02X\r\n", dcid, flags);
BartJanssens 0:99a111b75cb4 372 scid = LE16(data+12);
BartJanssens 0:99a111b75cb4 373 L2CAPSocket* s = SCIDToSocket(scid);
BartJanssens 0:99a111b75cb4 374 if (s)
BartJanssens 0:99a111b75cb4 375 ConfigureResponse(data[9],s->dcid);
BartJanssens 0:99a111b75cb4 376 }
BartJanssens 0:99a111b75cb4 377 break;
BartJanssens 0:99a111b75cb4 378 case L2CAP_DISCONN_REQ: {
BartJanssens 0:99a111b75cb4 379 int dcid = LE16(data+12);
BartJanssens 0:99a111b75cb4 380 int scid = LE16(data+14);
BartJanssens 0:99a111b75cb4 381 L2CAPSocket* s = SCIDToSocket(scid);
BartJanssens 0:99a111b75cb4 382 //s->si.SetState(SocketState_Closed);
BartJanssens 0:99a111b75cb4 383 DisconnectResponse(data[9], scid, dcid);
BartJanssens 0:99a111b75cb4 384 }
BartJanssens 0:99a111b75cb4 385 break;
BartJanssens 0:99a111b75cb4 386
BartJanssens 0:99a111b75cb4 387 }
BartJanssens 0:99a111b75cb4 388 }
BartJanssens 0:99a111b75cb4 389
BartJanssens 0:99a111b75cb4 390 void BTDevice::ACLRecv(const BD_ADDR* addr, const u8* data, int len)
BartJanssens 0:99a111b75cb4 391 {
BartJanssens 0:99a111b75cb4 392 //printfBytes("L2CP recv: ",data,16);
BartJanssens 0:99a111b75cb4 393 int handle = LE16(data);
BartJanssens 0:99a111b75cb4 394 if (handle != (0x2000 | _handle))
BartJanssens 0:99a111b75cb4 395 return;
BartJanssens 0:99a111b75cb4 396
BartJanssens 0:99a111b75cb4 397 int cid = LE16(data+6);
BartJanssens 0:99a111b75cb4 398 if (cid == 1)
BartJanssens 0:99a111b75cb4 399 {
BartJanssens 0:99a111b75cb4 400 Control(addr,data,len);
BartJanssens 0:99a111b75cb4 401 return;
BartJanssens 0:99a111b75cb4 402 }
BartJanssens 0:99a111b75cb4 403
BartJanssens 0:99a111b75cb4 404 SocketInternal* s = (SocketInternal*)SCIDToSocket(cid);
BartJanssens 0:99a111b75cb4 405 if (s)
BartJanssens 0:99a111b75cb4 406 s->Recv(data+8,LE16(data+2)-4);
BartJanssens 0:99a111b75cb4 407 else
BartJanssens 0:99a111b75cb4 408 printf("Bad event cid %d\r\n",cid);
BartJanssens 0:99a111b75cb4 409 }