3 Copyright (C) Dean Camera, 2010.
5 dean [at] fourwalledcubicle [dot] com
6 www.fourwalledcubicle.com
10 Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
12 Permission to use, copy, modify, distribute, and sell this
13 software and its documentation for any purpose is hereby granted
14 without fee, provided that the above copyright notice appear in
15 all copies and that both that the copyright notice and this
16 permission notice and warranty disclaimer appear in supporting
17 documentation, and that the name of the author not be used in
18 advertising or publicity pertaining to distribution of the
19 software without specific, written prior permission.
21 The author disclaim all warranties with regard to this
22 software, including all implied warranties of merchantability
23 and fitness. In no event shall the author be liable for any
24 special, indirect or consequential damages or any damages
25 whatsoever resulting from loss of use, data or profits, whether
26 in an action of contract, negligence or other tortious action,
27 arising out of or in connection with the use or performance of
31 #define INCLUDE_FROM_BLUETOOTH_ACLPACKETS_C
32 #include "BluetoothACLPackets.h"
34 void Bluetooth_ACLTask(void)
36 Bluetooth_ProcessACLPackets();
38 for (uint8_t i
= 0; i
< BLUETOOTH_MAX_OPEN_CHANNELS
; i
++)
40 Bluetooth_Channel_t
* ChannelData
= &Bluetooth_Connection
.Channels
[i
];
42 bool MustSendConfigReq
= true;
44 switch (ChannelData
->State
)
46 case Channel_Config_WaitConfig
:
47 ChannelData
->State
= Channel_Config_WaitReqResp
;
49 case Channel_Config_WaitSendConfig
:
50 ChannelData
->State
= Channel_Config_WaitResp
;
53 MustSendConfigReq
= false;
57 if (MustSendConfigReq
)
61 BT_Signal_Header_t SignalCommandHeader
;
62 BT_Signal_ConfigurationReq_t ConfigurationRequest
;
66 BT_Config_Option_Header_t Header
;
71 PacketData
.SignalCommandHeader
.Code
= BT_SIGNAL_CONFIGURATION_REQUEST
;
72 PacketData
.SignalCommandHeader
.Identifier
= ++Bluetooth_Connection
.SignallingIdentifier
;
73 PacketData
.SignalCommandHeader
.Length
= sizeof(PacketData
.ConfigurationRequest
) +
74 sizeof(PacketData
.Option_LocalMTU
);
75 PacketData
.ConfigurationRequest
.DestinationChannel
= ChannelData
->RemoteNumber
;
76 PacketData
.ConfigurationRequest
.Flags
= 0;
77 PacketData
.Option_LocalMTU
.Header
.Type
= BT_CONFIG_OPTION_MTU
;
78 PacketData
.Option_LocalMTU
.Header
.Length
= sizeof(PacketData
.Option_LocalMTU
.Value
);
79 PacketData
.Option_LocalMTU
.Value
= ChannelData
->LocalMTU
;
81 Bluetooth_SendPacket(&PacketData
, sizeof(PacketData
), NULL
);
83 BT_ACL_DEBUG(1, ">> L2CAP Configuration Request", NULL
);
84 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", PacketData
.ConfigurationRequest
.DestinationChannel
);
89 static void Bluetooth_ProcessACLPackets(void)
91 BT_ACL_Header_t ACLPacketHeader
;
92 BT_DataPacket_Header_t DataHeader
;
94 Pipe_SelectPipe(BLUETOOTH_DATA_IN_PIPE
);
97 if (!(Pipe_IsReadWriteAllowed()))
103 Pipe_Read_Stream_LE(&ACLPacketHeader
, sizeof(ACLPacketHeader
));
104 Pipe_Read_Stream_LE(&DataHeader
, sizeof(DataHeader
));
106 BT_ACL_DEBUG(2, "", NULL
);
107 BT_ACL_DEBUG(2, "Packet Received", NULL
);
108 BT_ACL_DEBUG(2, "-- Connection Handle: 0x%04X", (ACLPacketHeader
.ConnectionHandle
& 0x0FFF));
109 BT_ACL_DEBUG(2, "-- Data Length: 0x%04X", ACLPacketHeader
.DataLength
);
110 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DataHeader
.DestinationChannel
);
111 BT_ACL_DEBUG(2, "-- Payload Length: 0x%04X", DataHeader
.PayloadLength
);
113 if (DataHeader
.DestinationChannel
== BT_CHANNEL_SIGNALING
)
115 BT_Signal_Header_t SignalCommandHeader
;
116 Pipe_Read_Stream_LE(&SignalCommandHeader
, sizeof(SignalCommandHeader
));
118 switch (SignalCommandHeader
.Code
)
120 case BT_SIGNAL_CONNECTION_REQUEST
:
121 Bluetooth_Signal_ConnectionReq(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
123 case BT_SIGNAL_CONNECTION_RESPONSE
:
124 Bluetooth_Signal_ConnectionResp(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
126 case BT_SIGNAL_CONFIGURATION_REQUEST
:
127 Bluetooth_Signal_ConfigurationReq(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
129 case BT_SIGNAL_CONFIGURATION_RESPONSE
:
130 Bluetooth_Signal_ConfigurationResp(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
132 case BT_SIGNAL_DISCONNECTION_REQUEST
:
133 Bluetooth_Signal_DisconnectionReq(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
135 case BT_SIGNAL_DISCONNECTION_RESPONSE
:
136 Bluetooth_Signal_DisconnectionResp(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
138 case BT_SIGNAL_ECHO_REQUEST
:
139 Bluetooth_Signal_EchoReq(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
141 case BT_SIGNAL_INFORMATION_REQUEST
:
142 Bluetooth_Signal_InformationReq(&ACLPacketHeader
, &DataHeader
, &SignalCommandHeader
);
145 BT_ACL_DEBUG(1, "<< Unknown Signaling Command 0x%02X", SignalCommandHeader
.Code
);
147 Pipe_Discard_Stream(ACLPacketHeader
.DataLength
);
155 Bluetooth_PacketReceived(&DataHeader
.PayloadLength
, Bluetooth_GetChannelData(DataHeader
.DestinationChannel
, false));
157 Pipe_SelectPipe(BLUETOOTH_DATA_IN_PIPE
);
158 Pipe_Discard_Stream(DataHeader
.PayloadLength
);
164 uint8_t Bluetooth_SendPacket(void* Data
, uint16_t DataLen
, Bluetooth_Channel_t
* Channel
)
166 BT_ACL_Header_t ACLPacketHeader
;
167 BT_DataPacket_Header_t DataHeader
;
169 if (!(Bluetooth_Connection
.IsConnected
))
170 return BT_SENDPACKET_NotConnected
;
172 if ((Channel
!= NULL
) && (Channel
->State
!= Channel_Open
))
173 return BT_SENDPACKET_ChannelNotOpen
;
175 // TODO: Add packet fragmentation here after retrieving the device's signal channel MTU
177 ACLPacketHeader
.ConnectionHandle
= (Bluetooth_Connection
.ConnectionHandle
| BT_ACL_FIRST_AUTOFLUSH
);
178 ACLPacketHeader
.DataLength
= sizeof(DataHeader
) + DataLen
;
179 DataHeader
.PayloadLength
= DataLen
;
180 DataHeader
.DestinationChannel
= (Channel
== NULL
) ? BT_CHANNEL_SIGNALING
: Channel
->RemoteNumber
;
182 Pipe_SelectPipe(BLUETOOTH_DATA_OUT_PIPE
);
185 Pipe_Write_Stream_LE(&ACLPacketHeader
, sizeof(ACLPacketHeader
));
186 Pipe_Write_Stream_LE(&DataHeader
, sizeof(DataHeader
));
187 Pipe_Write_Stream_LE(Data
, DataLen
);
192 BT_ACL_DEBUG(2, "", NULL
);
193 BT_ACL_DEBUG(2, "Packet Sent", NULL
);
194 BT_ACL_DEBUG(2, "-- Connection Handle: 0x%04X", (ACLPacketHeader
.ConnectionHandle
& 0x0FFF));
195 BT_ACL_DEBUG(2, "-- Data Length: 0x%04X", ACLPacketHeader
.DataLength
);
196 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DataHeader
.DestinationChannel
);
197 BT_ACL_DEBUG(2, "-- Payload Length: 0x%04X", DataHeader
.PayloadLength
);
199 return BT_SENDPACKET_NoError
;
202 Bluetooth_Channel_t
* Bluetooth_OpenChannel(uint16_t PSM
)
204 Bluetooth_Channel_t
* ChannelData
= NULL
;
206 for (uint8_t i
= 0; i
< BLUETOOTH_MAX_OPEN_CHANNELS
; i
++)
208 if (Bluetooth_Connection
.Channels
[i
].State
== Channel_Closed
)
210 ChannelData
= &Bluetooth_Connection
.Channels
[i
];
211 ChannelData
->LocalNumber
= (BT_CHANNELNUMBER_BASEOFFSET
+ i
);
216 if (ChannelData
== NULL
)
219 ChannelData
->RemoteNumber
= 0;
220 ChannelData
->PSM
= PSM
;
221 ChannelData
->LocalMTU
= MAXIMUM_CHANNEL_MTU
;
222 ChannelData
->State
= Channel_Config_WaitConfig
;
226 BT_Signal_Header_t SignalCommandHeader
;
227 BT_Signal_ConnectionReq_t ConnectionRequest
;
230 PacketData
.SignalCommandHeader
.Code
= BT_SIGNAL_CONNECTION_REQUEST
;
231 PacketData
.SignalCommandHeader
.Identifier
= ++Bluetooth_Connection
.SignallingIdentifier
;
232 PacketData
.SignalCommandHeader
.Length
= sizeof(PacketData
.ConnectionRequest
);
233 PacketData
.ConnectionRequest
.PSM
= PSM
;
234 PacketData
.ConnectionRequest
.SourceChannel
= ChannelData
->LocalNumber
;
236 Bluetooth_SendPacket(&PacketData
, sizeof(PacketData
), NULL
);
238 BT_ACL_DEBUG(1, ">> L2CAP Connection Request", NULL
);
239 BT_ACL_DEBUG(2, "-- PSM 0x%04X", PacketData
.ConnectionRequest
.PSM
);
240 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", PacketData
.ConnectionRequest
.SourceChannel
);
245 void Bluetooth_CloseChannel(Bluetooth_Channel_t
* Channel
)
247 if ((Channel
== NULL
) || (Channel
->State
== Channel_Closed
))
250 Channel
->State
= Channel_WaitDisconnect
;
254 BT_Signal_Header_t SignalCommandHeader
;
255 BT_Signal_DisconnectionReq_t DisconnectionRequest
;
258 PacketData
.SignalCommandHeader
.Code
= BT_SIGNAL_DISCONNECTION_REQUEST
;
259 PacketData
.SignalCommandHeader
.Identifier
= ++Bluetooth_Connection
.SignallingIdentifier
;
260 PacketData
.SignalCommandHeader
.Length
= sizeof(PacketData
.DisconnectionRequest
);
261 PacketData
.DisconnectionRequest
.DestinationChannel
= Channel
->RemoteNumber
;
262 PacketData
.DisconnectionRequest
.SourceChannel
= Channel
->LocalNumber
;
264 Bluetooth_SendPacket(&PacketData
, sizeof(PacketData
), NULL
);
266 BT_ACL_DEBUG(1, ">> L2CAP Disconnection Request", NULL
);
267 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", PacketData
.DisconnectionRequest
.DestinationChannel
);
268 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", PacketData
.DisconnectionRequest
.SourceChannel
);
271 static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t
* ACLPacketHeader
,
272 BT_DataPacket_Header_t
* DataHeader
,
273 BT_Signal_Header_t
* SignalCommandHeader
)
275 BT_Signal_ConnectionReq_t ConnectionRequest
;
277 Pipe_Read_Stream_LE(&ConnectionRequest
, sizeof(ConnectionRequest
));
282 BT_ACL_DEBUG(1, "<< L2CAP Connection Request", NULL
);
283 BT_ACL_DEBUG(2, "-- PSM: 0x%04X", ConnectionRequest
.PSM
);
284 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionRequest
.SourceChannel
);
286 Bluetooth_Channel_t
* ChannelData
= Bluetooth_GetChannelData(ConnectionRequest
.SourceChannel
, true);
288 if (ChannelData
== NULL
)
290 for (uint8_t i
= 0; i
< BLUETOOTH_MAX_OPEN_CHANNELS
; i
++)
292 if (Bluetooth_Connection
.Channels
[i
].State
== Channel_Closed
)
294 ChannelData
= &Bluetooth_Connection
.Channels
[i
];
295 ChannelData
->LocalNumber
= (BT_CHANNELNUMBER_BASEOFFSET
+ i
);
301 if (ChannelData
!= NULL
)
303 ChannelData
->RemoteNumber
= ConnectionRequest
.SourceChannel
;
304 ChannelData
->PSM
= ConnectionRequest
.PSM
;
305 ChannelData
->LocalMTU
= MAXIMUM_CHANNEL_MTU
;
306 ChannelData
->State
= Channel_Config_WaitConfig
;
311 BT_Signal_Header_t SignalCommandHeader
;
312 BT_Signal_ConnectionResp_t ConnectionResponse
;
315 ResponsePacket
.SignalCommandHeader
.Code
= BT_SIGNAL_CONNECTION_RESPONSE
;
316 ResponsePacket
.SignalCommandHeader
.Identifier
= SignalCommandHeader
->Identifier
;
317 ResponsePacket
.SignalCommandHeader
.Length
= sizeof(ResponsePacket
.ConnectionResponse
);
318 ResponsePacket
.ConnectionResponse
.Result
= (ChannelData
== NULL
) ? BT_CONNECTION_REFUSED_RESOURCES
: BT_CONNECTION_SUCCESSFUL
;
319 ResponsePacket
.ConnectionResponse
.DestinationChannel
= ChannelData
->RemoteNumber
;
320 ResponsePacket
.ConnectionResponse
.SourceChannel
= ChannelData
->LocalNumber
;
321 ResponsePacket
.ConnectionResponse
.Status
= 0x00;
323 Bluetooth_SendPacket(&ResponsePacket
, sizeof(ResponsePacket
), NULL
);
325 BT_ACL_DEBUG(1, ">> L2CAP Connection Response", NULL
);
326 BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket
.ConnectionResponse
.Result
);
327 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket
.ConnectionResponse
.DestinationChannel
);
328 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ResponsePacket
.ConnectionResponse
.SourceChannel
);
331 static inline void Bluetooth_Signal_ConnectionResp(BT_ACL_Header_t
* ACLPacketHeader
,
332 BT_DataPacket_Header_t
* DataHeader
,
333 BT_Signal_Header_t
* SignalCommandHeader
)
335 BT_Signal_ConnectionResp_t ConnectionResponse
;
337 Pipe_Read_Stream_LE(&ConnectionResponse
, sizeof(ConnectionResponse
));
342 BT_ACL_DEBUG(1, "<< L2CAP Connection Response", NULL
);
343 BT_ACL_DEBUG(2, "-- Result: 0x%02X", ConnectionResponse
.Result
);
344 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionResponse
.SourceChannel
);
345 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ConnectionResponse
.DestinationChannel
);
347 Bluetooth_Channel_t
* ChannelData
= Bluetooth_GetChannelData(ConnectionResponse
.DestinationChannel
, false);
349 if (ChannelData
!= NULL
)
351 ChannelData
->RemoteNumber
= ConnectionResponse
.SourceChannel
;
352 ChannelData
->State
= (ConnectionResponse
.Result
== BT_CONNECTION_SUCCESSFUL
) ?
353 Channel_Config_WaitConfig
: Channel_Closed
;
358 static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t
* ACLPacketHeader
,
359 BT_DataPacket_Header_t
* DataHeader
,
360 BT_Signal_Header_t
* SignalCommandHeader
)
362 BT_Signal_ConfigurationReq_t ConfigurationRequest
;
363 uint8_t OptionsLen
= (SignalCommandHeader
->Length
- sizeof(ConfigurationRequest
));
364 uint8_t Options
[OptionsLen
];
366 Pipe_Read_Stream_LE(&ConfigurationRequest
, sizeof(ConfigurationRequest
));
367 Pipe_Read_Stream_LE(&Options
, sizeof(Options
));
372 Bluetooth_Channel_t
* ChannelData
= Bluetooth_GetChannelData(ConfigurationRequest
.DestinationChannel
, false);
374 BT_ACL_DEBUG(1, "<< L2CAP Configuration Request", NULL
);
375 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ConfigurationRequest
.DestinationChannel
);
376 BT_ACL_DEBUG(2, "-- Remote MTU: 0x%04X", ChannelData
->RemoteMTU
);
377 BT_ACL_DEBUG(2, "-- Options Len: 0x%04X", OptionsLen
);
379 uint8_t OptionPos
= 0;
380 while (OptionPos
< OptionsLen
)
382 BT_Config_Option_Header_t
* OptionHeader
= (BT_Config_Option_Header_t
*)&Options
[OptionPos
];
384 BT_ACL_DEBUG(2, "-- Option Type: 0x%04X", OptionHeader
->Type
);
385 BT_ACL_DEBUG(2, "-- Option Length: 0x%04X", (sizeof(*OptionHeader
) + OptionHeader
->Length
));
387 if ((OptionHeader
->Type
== BT_CONFIG_OPTION_MTU
) && (ChannelData
!= NULL
))
388 ChannelData
->RemoteMTU
= *((uint16_t*)&Options
[OptionPos
+ sizeof(*OptionHeader
)]);
390 OptionPos
+= (sizeof(*OptionHeader
) + OptionHeader
->Length
);
395 BT_Signal_Header_t SignalCommandHeader
;
396 BT_Signal_ConfigurationResp_t ConfigurationResponse
;
399 ResponsePacket
.SignalCommandHeader
.Code
= BT_SIGNAL_CONFIGURATION_RESPONSE
;
400 ResponsePacket
.SignalCommandHeader
.Identifier
= SignalCommandHeader
->Identifier
;
401 ResponsePacket
.SignalCommandHeader
.Length
= sizeof(ResponsePacket
.ConfigurationResponse
);
402 ResponsePacket
.ConfigurationResponse
.SourceChannel
= ChannelData
->RemoteNumber
;
403 ResponsePacket
.ConfigurationResponse
.Flags
= 0x00;
404 ResponsePacket
.ConfigurationResponse
.Result
= (ChannelData
!= NULL
) ? BT_CONFIGURATION_SUCCESSFUL
: BT_CONFIGURATION_REJECTED
;
406 Bluetooth_SendPacket(&ResponsePacket
, sizeof(ResponsePacket
), NULL
);
408 if (ChannelData
!= NULL
)
410 switch (ChannelData
->State
)
412 case Channel_Config_WaitConfig
:
413 ChannelData
->State
= Channel_Config_WaitSendConfig
;
415 case Channel_Config_WaitReqResp
:
416 ChannelData
->State
= Channel_Config_WaitResp
;
418 case Channel_Config_WaitReq
:
419 ChannelData
->State
= Channel_Open
;
424 BT_ACL_DEBUG(1, ">> L2CAP Configuration Response", NULL
);
425 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ResponsePacket
.ConfigurationResponse
.SourceChannel
);
426 BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket
.ConfigurationResponse
.Result
);
429 static inline void Bluetooth_Signal_ConfigurationResp(BT_ACL_Header_t
* ACLPacketHeader
,
430 BT_DataPacket_Header_t
* DataHeader
,
431 BT_Signal_Header_t
* SignalCommandHeader
)
433 BT_Signal_ConfigurationResp_t ConfigurationResponse
;
435 Pipe_Read_Stream_LE(&ConfigurationResponse
, sizeof(ConfigurationResponse
));
440 BT_ACL_DEBUG(1, "<< L2CAP Configuration Response", NULL
);
441 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConfigurationResponse
.SourceChannel
);
442 BT_ACL_DEBUG(2, "-- Result: 0x%02X", ConfigurationResponse
.Result
);
444 if (ConfigurationResponse
.Result
== BT_CONFIGURATION_SUCCESSFUL
)
446 Bluetooth_Channel_t
* ChannelData
= Bluetooth_GetChannelData(ConfigurationResponse
.SourceChannel
, true);
448 if (ChannelData
!= NULL
)
450 switch (ChannelData
->State
)
452 case Channel_Config_WaitReqResp
:
453 ChannelData
->State
= Channel_Config_WaitReq
;
455 case Channel_Config_WaitResp
:
456 ChannelData
->State
= Channel_Open
;
463 static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t
* ACLPacketHeader
,
464 BT_DataPacket_Header_t
* DataHeader
,
465 BT_Signal_Header_t
* SignalCommandHeader
)
467 BT_Signal_DisconnectionReq_t DisconnectionRequest
;
469 Pipe_Read_Stream_LE(&DisconnectionRequest
, sizeof(DisconnectionRequest
));
471 BT_ACL_DEBUG(1, "<< L2CAP Disconnection Request", NULL
);
472 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DisconnectionRequest
.DestinationChannel
);
473 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", DisconnectionRequest
.SourceChannel
);
478 Bluetooth_Channel_t
* ChannelData
= Bluetooth_GetChannelData(DisconnectionRequest
.SourceChannel
, true);
482 BT_Signal_Header_t SignalCommandHeader
;
483 BT_Signal_DisconnectionResp_t DisconnectionResponse
;
486 ResponsePacket
.SignalCommandHeader
.Code
= BT_SIGNAL_DISCONNECTION_RESPONSE
;
487 ResponsePacket
.SignalCommandHeader
.Identifier
= SignalCommandHeader
->Identifier
;
488 ResponsePacket
.SignalCommandHeader
.Length
= sizeof(ResponsePacket
.DisconnectionResponse
);
489 ResponsePacket
.DisconnectionResponse
.DestinationChannel
= ChannelData
->RemoteNumber
;
490 ResponsePacket
.DisconnectionResponse
.SourceChannel
= ChannelData
->LocalNumber
;
492 Bluetooth_SendPacket(&ResponsePacket
, sizeof(ResponsePacket
), NULL
);
494 if (ChannelData
!= NULL
)
495 ChannelData
->State
= Channel_Closed
;
497 BT_ACL_DEBUG(1, ">> L2CAP Disconnection Response", NULL
);
498 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ResponsePacket
.DisconnectionResponse
.SourceChannel
);
499 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket
.DisconnectionResponse
.DestinationChannel
);
502 static inline void Bluetooth_Signal_DisconnectionResp(BT_ACL_Header_t
* ACLPacketHeader
,
503 BT_DataPacket_Header_t
* DataHeader
,
504 BT_Signal_Header_t
* SignalCommandHeader
)
506 BT_Signal_DisconnectionResp_t DisconnectionResponse
;
508 Pipe_Read_Stream_LE(&DisconnectionResponse
, sizeof(DisconnectionResponse
));
510 BT_ACL_DEBUG(1, "<< L2CAP Disconnection Response", NULL
);
511 BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DisconnectionResponse
.DestinationChannel
);
512 BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", DisconnectionResponse
.SourceChannel
);
517 Bluetooth_Channel_t
* ChannelData
= Bluetooth_GetChannelData(DisconnectionResponse
.SourceChannel
, true);
519 if (ChannelData
->State
== Channel_WaitDisconnect
)
520 ChannelData
->State
= Channel_Closed
;
523 static inline void Bluetooth_Signal_EchoReq(BT_ACL_Header_t
* ACLPacketHeader
,
524 BT_DataPacket_Header_t
* DataHeader
,
525 BT_Signal_Header_t
* SignalCommandHeader
)
527 BT_ACL_DEBUG(1, "<< L2CAP Echo Request", NULL
);
534 BT_Signal_Header_t SignalCommandHeader
;
537 ResponsePacket
.SignalCommandHeader
.Code
= BT_SIGNAL_ECHO_RESPONSE
;
538 ResponsePacket
.SignalCommandHeader
.Identifier
= SignalCommandHeader
->Identifier
;
539 ResponsePacket
.SignalCommandHeader
.Length
= 0;
541 Bluetooth_SendPacket(&ResponsePacket
, sizeof(ResponsePacket
), NULL
);
543 BT_ACL_DEBUG(1, ">> L2CAP Echo Response", NULL
);
546 static inline void Bluetooth_Signal_InformationReq(BT_ACL_Header_t
* ACLPacketHeader
,
547 BT_DataPacket_Header_t
* DataHeader
,
548 BT_Signal_Header_t
* SignalCommandHeader
)
550 BT_Signal_InformationReq_t InformationRequest
;
552 Pipe_Read_Stream_LE(&InformationRequest
, sizeof(InformationRequest
));
554 BT_ACL_DEBUG(1, "<< L2CAP Information Request", NULL
);
555 BT_ACL_DEBUG(2, "-- Info Type: 0x%04X", InformationRequest
.InfoType
);
562 BT_Signal_Header_t SignalCommandHeader
;
563 BT_Signal_InformationResp_t InformationResponse
;
570 switch (InformationRequest
.InfoType
)
573 ResponsePacket
.InformationResponse
.Result
= BT_INFORMATION_SUCCESSFUL
;
576 *((uint16_t*)&ResponsePacket
.Data
) = MAXIMUM_CHANNEL_MTU
;
578 case BT_INFOREQ_EXTENDEDFEATURES
:
579 ResponsePacket
.InformationResponse
.Result
= BT_INFORMATION_SUCCESSFUL
;
582 *((uint32_t*)&ResponsePacket
.Data
) = 0;
585 ResponsePacket
.InformationResponse
.Result
= BT_INFORMATION_NOTSUPPORTED
;
590 ResponsePacket
.SignalCommandHeader
.Code
= BT_SIGNAL_INFORMATION_RESPONSE
;
591 ResponsePacket
.SignalCommandHeader
.Identifier
= SignalCommandHeader
->Identifier
;
592 ResponsePacket
.SignalCommandHeader
.Length
= sizeof(ResponsePacket
.InformationResponse
) + DataLen
;
594 Bluetooth_SendPacket(&ResponsePacket
, (sizeof(ResponsePacket
) - sizeof(ResponsePacket
.Data
) + DataLen
), NULL
);
596 BT_ACL_DEBUG(1, ">> L2CAP Information Response", NULL
);
597 BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket
.InformationResponse
.Result
);