|
|
|
@ -114,7 +114,7 @@ static void Bluetooth_ProcessACLPackets(void)
|
|
|
|
|
{
|
|
|
|
|
BT_Signal_Header_t SignalCommandHeader;
|
|
|
|
|
Pipe_Read_Stream_LE(&SignalCommandHeader, sizeof(SignalCommandHeader));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (SignalCommandHeader.Code)
|
|
|
|
|
{
|
|
|
|
|
case BT_SIGNAL_CONNECTION_REQUEST:
|
|
|
|
@ -123,6 +123,9 @@ static void Bluetooth_ProcessACLPackets(void)
|
|
|
|
|
case BT_SIGNAL_CONFIGURATION_REQUEST:
|
|
|
|
|
Bluetooth_Signal_ConfigurationReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);
|
|
|
|
|
break;
|
|
|
|
|
case BT_SIGNAL_CONFIGURATION_RESPONSE:
|
|
|
|
|
Bluetooth_Signal_ConfigurationResp(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);
|
|
|
|
|
break;
|
|
|
|
|
case BT_SIGNAL_DISCONNECTION_REQUEST:
|
|
|
|
|
Bluetooth_Signal_DisconnectionReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);
|
|
|
|
|
break;
|
|
|
|
@ -143,7 +146,7 @@ static void Bluetooth_ProcessACLPackets(void)
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Bluetooth_PacketReceived(&DataHeader.PayloadLength, Bluetooth_GetChannelData(DataHeader.DestinationChannel, true));
|
|
|
|
|
Bluetooth_PacketReceived(&DataHeader.PayloadLength, Bluetooth_GetChannelData(DataHeader.DestinationChannel, false));
|
|
|
|
|
|
|
|
|
|
Pipe_SelectPipe(BLUETOOTH_DATA_IN_PIPE);
|
|
|
|
|
Pipe_Discard_Stream(DataHeader.PayloadLength);
|
|
|
|
@ -165,7 +168,7 @@ uint8_t Bluetooth_SendPacket(void* Data, uint16_t DataLen, Bluetooth_Channel_t*
|
|
|
|
|
|
|
|
|
|
// TODO: Add packet fragmentation here after retrieving the device's signal channel MTU
|
|
|
|
|
|
|
|
|
|
ACLPacketHeader.ConnectionHandle = Bluetooth_Connection.ConnectionHandle | (1 << 13);
|
|
|
|
|
ACLPacketHeader.ConnectionHandle = (Bluetooth_Connection.ConnectionHandle | BT_ACL_FIRST_AUTOFLUSH);
|
|
|
|
|
ACLPacketHeader.DataLength = sizeof(DataHeader) + DataLen;
|
|
|
|
|
DataHeader.PayloadLength = DataLen;
|
|
|
|
|
DataHeader.DestinationChannel = (Channel == NULL) ? BT_CHANNEL_SIGNALING : Channel->RemoteNumber;
|
|
|
|
@ -176,6 +179,7 @@ uint8_t Bluetooth_SendPacket(void* Data, uint16_t DataLen, Bluetooth_Channel_t*
|
|
|
|
|
Pipe_Write_Stream_LE(&ACLPacketHeader, sizeof(ACLPacketHeader));
|
|
|
|
|
Pipe_Write_Stream_LE(&DataHeader, sizeof(DataHeader));
|
|
|
|
|
Pipe_Write_Stream_LE(Data, DataLen);
|
|
|
|
|
Pipe_ClearOUT();
|
|
|
|
|
|
|
|
|
|
Pipe_Freeze();
|
|
|
|
|
|
|
|
|
@ -189,9 +193,9 @@ uint8_t Bluetooth_SendPacket(void* Data, uint16_t DataLen, Bluetooth_Channel_t*
|
|
|
|
|
return BT_SENDPACKET_NoError;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t* ACLPacketHeader,
|
|
|
|
|
static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t* ACLPacketHeader,
|
|
|
|
|
BT_DataPacket_Header_t* DataHeader,
|
|
|
|
|
BT_Signal_Header_t* SignalCommandHeader)
|
|
|
|
|
BT_Signal_Header_t* SignalCommandHeader)
|
|
|
|
|
{
|
|
|
|
|
BT_Signal_ConnectionReq_t ConnectionRequest;
|
|
|
|
|
|
|
|
|
@ -216,8 +220,8 @@ static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t* ACLPacketHead
|
|
|
|
|
ResponsePacket.SignalCommandHeader.Identifier = SignalCommandHeader->Identifier;
|
|
|
|
|
ResponsePacket.SignalCommandHeader.Length = sizeof(ResponsePacket.ConnectionResponse);
|
|
|
|
|
ResponsePacket.ConnectionResponse.Result = (ChannelData == NULL) ? BT_CONNECTION_REFUSED_RESOURCES : BT_CONNECTION_SUCCESSFUL;
|
|
|
|
|
ResponsePacket.ConnectionResponse.DestinationChannel = ChannelData->LocalNumber;
|
|
|
|
|
ResponsePacket.ConnectionResponse.SourceChannel = ChannelData->RemoteNumber;
|
|
|
|
|
ResponsePacket.ConnectionResponse.DestinationChannel = ChannelData->RemoteNumber;
|
|
|
|
|
ResponsePacket.ConnectionResponse.SourceChannel = ChannelData->LocalNumber;
|
|
|
|
|
ResponsePacket.ConnectionResponse.Status = 0x00;
|
|
|
|
|
|
|
|
|
|
Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL);
|
|
|
|
@ -228,9 +232,9 @@ static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t* ACLPacketHead
|
|
|
|
|
BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket.ConnectionResponse.DestinationChannel);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketHeader,
|
|
|
|
|
static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketHeader,
|
|
|
|
|
BT_DataPacket_Header_t* DataHeader,
|
|
|
|
|
BT_Signal_Header_t* SignalCommandHeader)
|
|
|
|
|
BT_Signal_Header_t* SignalCommandHeader)
|
|
|
|
|
{
|
|
|
|
|
BT_Signal_ConfigurationReq_t ConfigurationRequest;
|
|
|
|
|
uint8_t OptionsLen;
|
|
|
|
@ -259,7 +263,7 @@ static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketH
|
|
|
|
|
|
|
|
|
|
BT_ACL_DEBUG(1, "<< L2CAP Configuration Request", NULL);
|
|
|
|
|
BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ConfigurationRequest.DestinationChannel);
|
|
|
|
|
BT_ACL_DEBUG(2, "-- Options Len: 0x%04X", ConfigurationRequest.DestinationChannel);
|
|
|
|
|
BT_ACL_DEBUG(2, "-- Options Len: 0x%04X", (DataHeader->PayloadLength - sizeof(*SignalCommandHeader)));
|
|
|
|
|
BT_ACL_DEBUG(2, "-- Remote MTU: 0x%04X", ChannelData->RemoteMTU);
|
|
|
|
|
|
|
|
|
|
struct
|
|
|
|
@ -298,9 +302,43 @@ static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketH
|
|
|
|
|
BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket.ConfigurationResponse.Result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketHeader,
|
|
|
|
|
static inline void Bluetooth_Signal_ConfigurationResp(BT_ACL_Header_t* ACLPacketHeader,
|
|
|
|
|
BT_DataPacket_Header_t* DataHeader,
|
|
|
|
|
BT_Signal_Header_t* SignalCommandHeader)
|
|
|
|
|
{
|
|
|
|
|
BT_Signal_ConfigurationResp_t ConfigurationResponse;
|
|
|
|
|
|
|
|
|
|
Pipe_Read_Stream_LE(&ConfigurationResponse, sizeof(ConfigurationResponse));
|
|
|
|
|
|
|
|
|
|
Pipe_ClearIN();
|
|
|
|
|
Pipe_Freeze();
|
|
|
|
|
|
|
|
|
|
BT_ACL_DEBUG(1, "<< L2CAP Configuration Response", NULL);
|
|
|
|
|
BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConfigurationResponse.SourceChannel);
|
|
|
|
|
BT_ACL_DEBUG(2, "-- Result: 0x%02X", ConfigurationResponse.Result);
|
|
|
|
|
|
|
|
|
|
if (ConfigurationResponse.Result == BT_CONFIGURATION_SUCCESSFUL)
|
|
|
|
|
{
|
|
|
|
|
Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(ConfigurationResponse.SourceChannel, true);
|
|
|
|
|
|
|
|
|
|
if (ChannelData != NULL)
|
|
|
|
|
{
|
|
|
|
|
switch (ChannelData->State)
|
|
|
|
|
{
|
|
|
|
|
case Channel_Config_WaitReqResp:
|
|
|
|
|
ChannelData->State = Channel_Config_WaitReq;
|
|
|
|
|
break;
|
|
|
|
|
case Channel_Config_WaitResp:
|
|
|
|
|
ChannelData->State = Channel_Open;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketHeader,
|
|
|
|
|
BT_DataPacket_Header_t* DataHeader,
|
|
|
|
|
BT_Signal_Header_t* SignalCommandHeader)
|
|
|
|
|
BT_Signal_Header_t* SignalCommandHeader)
|
|
|
|
|
{
|
|
|
|
|
BT_Signal_DisconnectionReq_t DisconnectionRequest;
|
|
|
|
|
|
|
|
|
@ -313,7 +351,7 @@ static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketH
|
|
|
|
|
Pipe_ClearIN();
|
|
|
|
|
Pipe_Freeze();
|
|
|
|
|
|
|
|
|
|
Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(DisconnectionRequest.SourceChannel, true);
|
|
|
|
|
Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(DisconnectionRequest.SourceChannel, true);
|
|
|
|
|
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
@ -324,8 +362,8 @@ static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketH
|
|
|
|
|
ResponsePacket.SignalCommandHeader.Code = BT_SIGNAL_DISCONNECTION_RESPONSE;
|
|
|
|
|
ResponsePacket.SignalCommandHeader.Identifier = SignalCommandHeader->Identifier;
|
|
|
|
|
ResponsePacket.SignalCommandHeader.Length = sizeof(ResponsePacket.DisconnectionResponse);
|
|
|
|
|
ResponsePacket.DisconnectionResponse.DestinationChannel = ChannelData->LocalNumber;
|
|
|
|
|
ResponsePacket.DisconnectionResponse.SourceChannel = ChannelData->RemoteNumber;
|
|
|
|
|
ResponsePacket.DisconnectionResponse.DestinationChannel = ChannelData->RemoteNumber;
|
|
|
|
|
ResponsePacket.DisconnectionResponse.SourceChannel = ChannelData->LocalNumber;
|
|
|
|
|
|
|
|
|
|
Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL);
|
|
|
|
|
|
|
|
|
@ -360,9 +398,9 @@ static inline void Bluetooth_Signal_EchoReq(BT_ACL_Header_t* ACLPacketHeader,
|
|
|
|
|
BT_ACL_DEBUG(1, ">> L2CAP Echo Response", NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void Bluetooth_Signal_InformationReq(BT_ACL_Header_t* ACLPacketHeader,
|
|
|
|
|
static inline void Bluetooth_Signal_InformationReq(BT_ACL_Header_t* ACLPacketHeader,
|
|
|
|
|
BT_DataPacket_Header_t* DataHeader,
|
|
|
|
|
BT_Signal_Header_t* SignalCommandHeader)
|
|
|
|
|
BT_Signal_Header_t* SignalCommandHeader)
|
|
|
|
|
{
|
|
|
|
|
BT_Signal_InformationReq_t InformationRequest;
|
|
|
|
|
|
|
|
|
|