Make Bluetooth signalling handler routines use the generic Bluetooth_SendPacket(...
authorDean Camera <dean@fourwalledcubicle.com>
Tue, 6 Apr 2010 13:39:18 +0000 (13:39 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Tue, 6 Apr 2010 13:39:18 +0000 (13:39 +0000)
Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c
Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.h
Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.c
Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h

index d26ba19..a35dcb1 100644 (file)
@@ -56,45 +56,32 @@ void Bluetooth_ACLTask(void)
                \r
                if (MustSendConfigReq)\r
                {\r
-                       BT_ACL_Header_t              ACLPacketHeader;\r
-                       BT_DataPacket_Header_t       DataHeader;\r
-                       BT_Signal_Header_t           SignalCommandHeader;\r
-                       BT_Signal_ConfigurationReq_t ConfigurationRequest;\r
-\r
-                       ACLPacketHeader.ConnectionHandle     = Bluetooth_Connection.ConnectionHandle;\r
-                       ACLPacketHeader.DataLength           = sizeof(DataHeader) + sizeof(SignalCommandHeader) + sizeof(ConfigurationRequest);\r
-                       DataHeader.PayloadLength             = sizeof(SignalCommandHeader) + sizeof(ConfigurationRequest);\r
-                       DataHeader.DestinationChannel        = BT_CHANNEL_SIGNALING;\r
-                       SignalCommandHeader.Code             = BT_SIGNAL_CONFIGURATION_REQUEST;\r
-                       SignalCommandHeader.Identifier       = ++Bluetooth_Connection.SignallingIdentifier;\r
-                       SignalCommandHeader.Length           = sizeof(ConfigurationRequest);\r
+                       struct\r
+                       {\r
+                               BT_Signal_Header_t           SignalCommandHeader;\r
+                               BT_Signal_ConfigurationReq_t ConfigurationRequest;\r
+                               \r
+                               struct\r
+                               {\r
+                                       BT_Config_Option_Header_t Header;\r
+                                       uint16_t Value;\r
+                               } Option_LocalMTU;\r
+                       } PacketData;\r
                        \r
-                       ConfigurationRequest.DestinationChannel = ChannelData->RemoteNumber;\r
-                       ConfigurationRequest.Flags              = 0;\r
-\r
-                       Pipe_SelectPipe(BLUETOOTH_DATA_OUT_PIPE);\r
-                       Pipe_Unfreeze();\r
+                       PacketData.SignalCommandHeader.Code            = BT_SIGNAL_CONFIGURATION_REQUEST;\r
+                       PacketData.SignalCommandHeader.Identifier      = ++Bluetooth_Connection.SignallingIdentifier;\r
+                       PacketData.SignalCommandHeader.Length          = sizeof(PacketData.ConfigurationRequest) +\r
+                                                                        sizeof(PacketData.Option_LocalMTU);\r
+                       PacketData.ConfigurationRequest.DestinationChannel = ChannelData->RemoteNumber;\r
+                       PacketData.ConfigurationRequest.Flags          = 0;\r
+                       PacketData.Option_LocalMTU.Header.Type         = BT_CONFIG_OPTION_MTU;\r
+                       PacketData.Option_LocalMTU.Header.Length       = sizeof(PacketData.Option_LocalMTU.Value);\r
+                       PacketData.Option_LocalMTU.Value               = ChannelData->LocalMTU;\r
+\r
+                       Bluetooth_SendPacket(&PacketData, sizeof(PacketData), NULL);\r
                        \r
-                       Pipe_Write_Stream_LE(&ACLPacketHeader, sizeof(ACLPacketHeader));\r
-                       Pipe_Write_Stream_LE(&DataHeader, sizeof(DataHeader));\r
-                       Pipe_Write_Stream_LE(&SignalCommandHeader, sizeof(SignalCommandHeader));\r
-                       Pipe_Write_Stream_LE(&ConfigurationRequest, sizeof(ConfigurationRequest));\r
-\r
-                       Pipe_Freeze();\r
-\r
-                       #if (ACL_DEBUG_LEVEL > 1)\r
-                       BT_ACL_DEBUG("Packet Sent", NULL);\r
-                       BT_ACL_DEBUG("-- Connection Handle: 0x%04X", (ACLPacketHeader.ConnectionHandle & 0x0FFF));\r
-                       BT_ACL_DEBUG("-- Data Length: 0x%04X", ACLPacketHeader.DataLength);\r
-                       BT_ACL_DEBUG("-- Destination Channel: 0x%04X", DataHeader.DestinationChannel);\r
-                       BT_ACL_DEBUG("-- Payload Length: 0x%04X", DataHeader.PayloadLength);                    \r
-                       #endif\r
-                       #if (ACL_DEBUG_LEVEL > 0)\r
-                       BT_ACL_DEBUG(">> L2CAP Configuration Request", NULL);\r
-                       #endif\r
-                       #if (ACL_DEBUG_LEVEL > 1)\r
-                       BT_ACL_DEBUG("-- Destination Channel: 0x%04X", ConfigurationRequest.DestinationChannel);\r
-                       #endif\r
+                       BT_ACL_DEBUG(1, ">> L2CAP Configuration Request", NULL);\r
+                       BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", PacketData.ConfigurationRequest.DestinationChannel);\r
                }\r
        }\r
 }\r
@@ -116,13 +103,12 @@ static void Bluetooth_ProcessACLPackets(void)
        Pipe_Read_Stream_LE(&ACLPacketHeader, sizeof(ACLPacketHeader));\r
        Pipe_Read_Stream_LE(&DataHeader, sizeof(DataHeader));\r
 \r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("Packet Received", NULL);\r
-       BT_ACL_DEBUG("-- Connection Handle: 0x%04X", (ACLPacketHeader.ConnectionHandle & 0x0FFF));\r
-       BT_ACL_DEBUG("-- Data Length: 0x%04X", ACLPacketHeader.DataLength);\r
-       BT_ACL_DEBUG("-- Destination Channel: 0x%04X", DataHeader.DestinationChannel);\r
-       BT_ACL_DEBUG("-- Payload Length: 0x%04X", DataHeader.PayloadLength);\r
-       #endif\r
+       BT_ACL_DEBUG(2, "", NULL);\r
+       BT_ACL_DEBUG(2, "Packet Received", NULL);\r
+       BT_ACL_DEBUG(2, "-- Connection Handle: 0x%04X", (ACLPacketHeader.ConnectionHandle & 0x0FFF));\r
+       BT_ACL_DEBUG(2, "-- Data Length: 0x%04X", ACLPacketHeader.DataLength);\r
+       BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DataHeader.DestinationChannel);\r
+       BT_ACL_DEBUG(2, "-- Payload Length: 0x%04X", DataHeader.PayloadLength);\r
 \r
        if (DataHeader.DestinationChannel == BT_CHANNEL_SIGNALING)\r
        {\r
@@ -147,9 +133,7 @@ static void Bluetooth_ProcessACLPackets(void)
                                Bluetooth_Signal_InformationReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
                                break;\r
                        default:\r
-                               #if (ACL_DEBUG_LEVEL > 0)\r
-                               BT_ACL_DEBUG("<< Unknown Signaling Command 0x%02X", SignalCommandHeader.Code);\r
-                               #endif\r
+                               BT_ACL_DEBUG(1, "<< Unknown Signaling Command 0x%02X", SignalCommandHeader.Code);\r
        \r
                                Pipe_Discard_Stream(ACLPacketHeader.DataLength);\r
                                Pipe_ClearIN();         \r
@@ -168,21 +152,23 @@ static void Bluetooth_ProcessACLPackets(void)
        }\r
 }\r
 \r
-uint8_t Bluetooth_SendPacket(uint8_t* Data, uint16_t DataLen, Bluetooth_Channel_t* Channel)\r
+uint8_t Bluetooth_SendPacket(void* Data, uint16_t DataLen, Bluetooth_Channel_t* Channel)\r
 {\r
        BT_ACL_Header_t        ACLPacketHeader;\r
        BT_DataPacket_Header_t DataHeader;\r
 \r
-       if (Bluetooth_Connection.IsConnected)\r
+       if (!(Bluetooth_Connection.IsConnected))\r
          return BT_SENDPACKET_NotConnected;\r
 \r
-       if (Channel->State != Channel_Open)\r
+       if ((Channel != NULL) && (Channel->State != Channel_Open))\r
          return BT_SENDPACKET_ChannelNotOpen;\r
 \r
-       ACLPacketHeader.ConnectionHandle      = Bluetooth_Connection.ConnectionHandle;\r
+       // TODO: Add packet fragmentation here after retrieving the device's signal channel MTU\r
+\r
+       ACLPacketHeader.ConnectionHandle      = Bluetooth_Connection.ConnectionHandle | (1 << 13);\r
        ACLPacketHeader.DataLength            = sizeof(DataHeader) + DataLen;\r
-       DataHeader.DestinationChannel         = Channel->RemoteNumber;\r
        DataHeader.PayloadLength              = DataLen;\r
+       DataHeader.DestinationChannel         = (Channel == NULL) ? BT_CHANNEL_SIGNALING : Channel->RemoteNumber;\r
 \r
        Pipe_SelectPipe(BLUETOOTH_DATA_OUT_PIPE);\r
        Pipe_Unfreeze();\r
@@ -190,9 +176,16 @@ uint8_t Bluetooth_SendPacket(uint8_t* Data, uint16_t DataLen, Bluetooth_Channel_
        Pipe_Write_Stream_LE(&ACLPacketHeader, sizeof(ACLPacketHeader));\r
        Pipe_Write_Stream_LE(&DataHeader, sizeof(DataHeader));\r
        Pipe_Write_Stream_LE(Data, DataLen);\r
-\r
+       \r
        Pipe_Freeze();\r
        \r
+       BT_ACL_DEBUG(2, "", NULL);\r
+       BT_ACL_DEBUG(2, "Packet Sent", NULL);\r
+       BT_ACL_DEBUG(2, "-- Connection Handle: 0x%04X", (ACLPacketHeader.ConnectionHandle & 0x0FFF));\r
+       BT_ACL_DEBUG(2, "-- Data Length: 0x%04X", ACLPacketHeader.DataLength);\r
+       BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DataHeader.DestinationChannel);\r
+       BT_ACL_DEBUG(2, "-- Payload Length: 0x%04X", DataHeader.PayloadLength);\r
+\r
        return BT_SENDPACKET_NoError;\r
 }\r
 \r
@@ -204,56 +197,35 @@ static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t* ACLPacketHead
        \r
        Pipe_Read_Stream_LE(&ConnectionRequest, sizeof(ConnectionRequest));\r
 \r
-       #if (ACL_DEBUG_LEVEL > 0)\r
-       BT_ACL_DEBUG("<< L2CAP Connection Request", NULL);\r
-       #endif\r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("-- PSM: 0x%04X", ConnectionRequest.PSM);\r
-       BT_ACL_DEBUG("-- Source Channel: 0x%04X", ConnectionRequest.SourceChannel);\r
-       #endif\r
-       \r
        Pipe_ClearIN();\r
        Pipe_Freeze();\r
-       Pipe_SelectPipe(BLUETOOTH_DATA_OUT_PIPE);\r
-       Pipe_Unfreeze();\r
-       \r
-       BT_Signal_ConnectionResp_t ConnectionResponse;\r
 \r
-       ACLPacketHeader->DataLength           = sizeof(*DataHeader) + sizeof(*SignalCommandHeader) + sizeof(ConnectionResponse);\r
-       DataHeader->PayloadLength             = sizeof(*SignalCommandHeader) + sizeof(ConnectionResponse);\r
-       DataHeader->DestinationChannel        = BT_CHANNEL_SIGNALING;\r
-       SignalCommandHeader->Code             = BT_SIGNAL_CONNECTION_RESPONSE;\r
-       SignalCommandHeader->Length           = sizeof(ConnectionResponse);\r
+       BT_ACL_DEBUG(1, "<< L2CAP Connection Request", NULL);\r
+       BT_ACL_DEBUG(2, "-- PSM: 0x%04X", ConnectionRequest.PSM);\r
+       BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionRequest.SourceChannel);\r
        \r
-       Bluetooth_Channel_t* ChannelData      = Bluetooth_InitChannelData(ConnectionRequest.SourceChannel, ConnectionRequest.PSM);\r
-       \r
-       ConnectionResponse.Result             = (ChannelData == NULL) ? BT_CONNECTION_REFUSED_RESOURCES : BT_CONNECTION_SUCCESSFUL;\r
-       ConnectionResponse.DestinationChannel = ChannelData->LocalNumber;\r
-       ConnectionResponse.SourceChannel      = ChannelData->RemoteNumber;\r
-       ConnectionResponse.Status             = 0x00;\r
-\r
-       Pipe_Write_Stream_LE(ACLPacketHeader, sizeof(*ACLPacketHeader));\r
-       Pipe_Write_Stream_LE(DataHeader, sizeof(*DataHeader));\r
-       Pipe_Write_Stream_LE(SignalCommandHeader, sizeof(*SignalCommandHeader));\r
-       Pipe_Write_Stream_LE(&ConnectionResponse, sizeof(ConnectionResponse));\r
-       \r
-       Pipe_ClearOUT();                \r
-       Pipe_Freeze();\r
-       \r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("Packet Sent", NULL);\r
-       BT_ACL_DEBUG("-- Connection Handle: 0x%04X", (ACLPacketHeader->ConnectionHandle & 0x0FFF));\r
-       BT_ACL_DEBUG("-- Data Length: 0x%04X", ACLPacketHeader->DataLength);\r
-       BT_ACL_DEBUG("-- Destination Channel: 0x%04X", DataHeader->DestinationChannel);\r
-       BT_ACL_DEBUG("-- Payload Length: 0x%04X", DataHeader->PayloadLength);                   \r
-       #endif\r
-       #if (ACL_DEBUG_LEVEL > 0)\r
-       BT_ACL_DEBUG(">> L2CAP Connection Response", NULL);\r
-       #endif\r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("-- Source Channel: 0x%04X", ConnectionResponse.SourceChannel);\r
-       BT_ACL_DEBUG("-- Destination Channel: 0x%04X", ConnectionResponse.DestinationChannel);\r
-       #endif\r
+       Bluetooth_Channel_t* ChannelData = Bluetooth_InitChannelData(ConnectionRequest.SourceChannel, ConnectionRequest.PSM);\r
+\r
+       struct\r
+       {\r
+               BT_Signal_Header_t         SignalCommandHeader;\r
+               BT_Signal_ConnectionResp_t ConnectionResponse;\r
+       } ResponsePacket;\r
+\r
+       ResponsePacket.SignalCommandHeader.Code              = BT_SIGNAL_CONNECTION_RESPONSE;\r
+       ResponsePacket.SignalCommandHeader.Identifier        = SignalCommandHeader->Identifier;\r
+       ResponsePacket.SignalCommandHeader.Length            = sizeof(ResponsePacket.ConnectionResponse);\r
+       ResponsePacket.ConnectionResponse.Result             = (ChannelData == NULL) ? BT_CONNECTION_REFUSED_RESOURCES : BT_CONNECTION_SUCCESSFUL;\r
+       ResponsePacket.ConnectionResponse.DestinationChannel = ChannelData->LocalNumber;\r
+       ResponsePacket.ConnectionResponse.SourceChannel      = ChannelData->RemoteNumber;\r
+       ResponsePacket.ConnectionResponse.Status             = 0x00;\r
+       \r
+       Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL);\r
+\r
+       BT_ACL_DEBUG(1, ">> L2CAP Connection Response", NULL);\r
+       BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket.ConnectionResponse.Result);\r
+       BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ResponsePacket.ConnectionResponse.SourceChannel);\r
+       BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket.ConnectionResponse.DestinationChannel);\r
 }\r
 \r
 static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketHeader,\r
@@ -261,32 +233,49 @@ static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketH
                                                      BT_Signal_Header_t* SignalCommandHeader)\r
 {\r
        BT_Signal_ConfigurationReq_t ConfigurationRequest;\r
+       uint8_t OptionsLen;\r
+\r
        Pipe_Read_Stream_LE(&ConfigurationRequest, sizeof(ConfigurationRequest));\r
+       OptionsLen = (DataHeader->PayloadLength - sizeof(*SignalCommandHeader));\r
        \r
-       // TODO: Process/Discard configuration options here\r
-       Pipe_Discard_Stream(DataHeader->PayloadLength - sizeof(*SignalCommandHeader));\r
-\r
-       #if (ACL_DEBUG_LEVEL > 0)\r
-       BT_ACL_DEBUG("<< L2CAP Configuration Request", NULL);\r
-       #endif\r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("-- Destination Channel: 0x%04X", ConfigurationRequest.DestinationChannel);\r
-       #endif\r
+       Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(ConfigurationRequest.DestinationChannel, false);\r
+\r
+       while (OptionsLen)\r
+       {\r
+               BT_Config_Option_Header_t OptionHeader;\r
+               \r
+               Pipe_Read_Stream_LE(&OptionHeader, sizeof(OptionHeader));\r
        \r
+               if ((OptionHeader.Type == BT_CONFIG_OPTION_MTU) && (ChannelData != NULL))\r
+                 Pipe_Read_Stream_LE(&ChannelData->RemoteMTU, sizeof(ChannelData->RemoteMTU));\r
+               else\r
+                 Pipe_Discard_Stream(OptionHeader.Length);\r
+\r
+               OptionsLen -= (sizeof(OptionHeader) + OptionHeader.Length);\r
+       }\r
+\r
        Pipe_ClearIN();\r
        Pipe_Freeze();\r
-       Pipe_SelectPipe(BLUETOOTH_DATA_OUT_PIPE);\r
-       Pipe_Unfreeze();\r
-       \r
-       BT_Signal_ConfigurationResp_t ConfigurationResponse;\r
 \r
-       ACLPacketHeader->DataLength           = sizeof(*DataHeader) + sizeof(*SignalCommandHeader) + sizeof(ConfigurationResponse);\r
-       DataHeader->PayloadLength             = sizeof(*SignalCommandHeader) + sizeof(ConfigurationResponse);\r
-       DataHeader->DestinationChannel        = BT_CHANNEL_SIGNALING;\r
-       SignalCommandHeader->Code             = BT_SIGNAL_CONFIGURATION_RESPONSE;\r
-       SignalCommandHeader->Length           = sizeof(ConfigurationResponse);\r
+       BT_ACL_DEBUG(1, "<< L2CAP Configuration Request", NULL);\r
+       BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ConfigurationRequest.DestinationChannel);\r
+       BT_ACL_DEBUG(2, "-- Options Len: 0x%04X", ConfigurationRequest.DestinationChannel);\r
+       BT_ACL_DEBUG(2, "-- Remote MTU: 0x%04X", ChannelData->RemoteMTU);\r
        \r
-       Bluetooth_Channel_t* ChannelData      = Bluetooth_GetChannelData(ConfigurationRequest.DestinationChannel, false);\r
+       struct\r
+       {\r
+               BT_Signal_Header_t            SignalCommandHeader;\r
+               BT_Signal_ConfigurationResp_t ConfigurationResponse;\r
+       } ResponsePacket;\r
+\r
+       ResponsePacket.SignalCommandHeader.Code              = BT_SIGNAL_CONFIGURATION_RESPONSE;\r
+       ResponsePacket.SignalCommandHeader.Identifier        = SignalCommandHeader->Identifier;\r
+       ResponsePacket.SignalCommandHeader.Length            = sizeof(ResponsePacket.ConfigurationResponse);\r
+       ResponsePacket.ConfigurationResponse.SourceChannel   = ChannelData->RemoteNumber;\r
+       ResponsePacket.ConfigurationResponse.Flags           = 0x00;\r
+       ResponsePacket.ConfigurationResponse.Result          = (ChannelData != NULL) ? BT_CONFIGURATION_SUCCESSFUL : BT_CONFIGURATION_REJECTED;\r
+\r
+       Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL);\r
 \r
        if (ChannelData != NULL)\r
        {\r
@@ -303,34 +292,10 @@ static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketH
                                break;\r
                }\r
        }\r
-         \r
-       // TODO: Add channel config data to the tail of ConfigurationResponse\r
 \r
-       ConfigurationResponse.SourceChannel   = ChannelData->RemoteNumber;\r
-       ConfigurationResponse.Flags           = 0x00;\r
-       ConfigurationResponse.Result          = (ChannelData != NULL) ? BT_CONFIGURATION_SUCCESSFUL : BT_CONFIGURATION_REJECTED;\r
-\r
-       Pipe_Write_Stream_LE(ACLPacketHeader, sizeof(*ACLPacketHeader));\r
-       Pipe_Write_Stream_LE(DataHeader, sizeof(*DataHeader));\r
-       Pipe_Write_Stream_LE(SignalCommandHeader, sizeof(*SignalCommandHeader));\r
-       Pipe_Write_Stream_LE(&ConfigurationResponse, sizeof(ConfigurationResponse));\r
-       \r
-       Pipe_ClearOUT();\r
-       Pipe_Freeze();\r
-       \r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("Packet Sent", NULL);\r
-       BT_ACL_DEBUG("-- Connection Handle: 0x%04X", (ACLPacketHeader->ConnectionHandle & 0x0FFF));\r
-       BT_ACL_DEBUG("-- Data Length: 0x%04X", ACLPacketHeader->DataLength);\r
-       BT_ACL_DEBUG("-- Destination Channel: 0x%04X", DataHeader->DestinationChannel);\r
-       BT_ACL_DEBUG("-- Payload Length: 0x%04X", DataHeader->PayloadLength);                   \r
-       #endif\r
-       #if (ACL_DEBUG_LEVEL > 0)\r
-       BT_ACL_DEBUG(">> L2CAP Configuration Response", NULL);\r
-       #endif\r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("-- Result: 0x%02X", ConfigurationResponse.Result);\r
-       #endif\r
+       BT_ACL_DEBUG(1, ">> L2CAP Configuration Response", NULL);\r
+       BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ResponsePacket.ConfigurationResponse.SourceChannel);\r
+       BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket.ConfigurationResponse.Result);\r
 }\r
 \r
 static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketHeader,\r
@@ -341,95 +306,58 @@ static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketH
        \r
        Pipe_Read_Stream_LE(&DisconnectionRequest, sizeof(DisconnectionRequest));\r
 \r
-       #if (ACL_DEBUG_LEVEL > 0)\r
-       BT_ACL_DEBUG("<< L2CAP Disconnection Request", NULL);\r
-       #endif\r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("-- Destination Channel: 0x%04X", DisconnectionRequest.DestinationChannel);\r
-       BT_ACL_DEBUG("-- Source Channel: 0x%04X", DisconnectionRequest.SourceChannel);\r
-       #endif\r
+       BT_ACL_DEBUG(1, "<< L2CAP Disconnection Request", NULL);\r
+       BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DisconnectionRequest.DestinationChannel);\r
+       BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", DisconnectionRequest.SourceChannel);\r
        \r
        Pipe_ClearIN();\r
        Pipe_Freeze();\r
-       Pipe_SelectPipe(BLUETOOTH_DATA_OUT_PIPE);\r
-       Pipe_Unfreeze();\r
-       \r
-       BT_Signal_DisconnectionResp_t DisconnectionResponse;\r
-\r
-       ACLPacketHeader->DataLength           = sizeof(*DataHeader) + sizeof(*SignalCommandHeader) + sizeof(DisconnectionResponse);\r
-       DataHeader->PayloadLength             = sizeof(*SignalCommandHeader) + sizeof(DisconnectionResponse);\r
-       DataHeader->DestinationChannel        = BT_CHANNEL_SIGNALING;\r
-       SignalCommandHeader->Code             = BT_SIGNAL_DISCONNECTION_RESPONSE;\r
-       SignalCommandHeader->Length           = sizeof(DisconnectionResponse);\r
        \r
        Bluetooth_Channel_t* ChannelData      = Bluetooth_GetChannelData(DisconnectionRequest.SourceChannel, true);\r
 \r
+       struct\r
+       {\r
+               BT_Signal_Header_t            SignalCommandHeader;\r
+               BT_Signal_DisconnectionResp_t DisconnectionResponse;\r
+       } ResponsePacket;\r
+\r
+       ResponsePacket.SignalCommandHeader.Code                 = BT_SIGNAL_DISCONNECTION_RESPONSE;\r
+       ResponsePacket.SignalCommandHeader.Identifier           = SignalCommandHeader->Identifier;\r
+       ResponsePacket.SignalCommandHeader.Length               = sizeof(ResponsePacket.DisconnectionResponse);\r
+       ResponsePacket.DisconnectionResponse.DestinationChannel = ChannelData->LocalNumber;\r
+       ResponsePacket.DisconnectionResponse.SourceChannel      = ChannelData->RemoteNumber;\r
+\r
+       Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL);\r
+\r
        if (ChannelData != NULL)\r
          ChannelData->State = Channel_Closed;\r
-       \r
-       DisconnectionResponse.DestinationChannel = ChannelData->LocalNumber;\r
-       DisconnectionResponse.SourceChannel      = ChannelData->RemoteNumber;\r
 \r
-       Pipe_Write_Stream_LE(ACLPacketHeader, sizeof(*ACLPacketHeader));\r
-       Pipe_Write_Stream_LE(DataHeader, sizeof(*DataHeader));\r
-       Pipe_Write_Stream_LE(SignalCommandHeader, sizeof(*SignalCommandHeader));\r
-       Pipe_Write_Stream_LE(&DisconnectionResponse, sizeof(DisconnectionResponse));\r
-       \r
-       Pipe_ClearOUT();\r
-       Pipe_Freeze();\r
-       \r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("Packet Sent", NULL);\r
-       BT_ACL_DEBUG("-- Connection Handle: 0x%04X", (ACLPacketHeader->ConnectionHandle & 0x0FFF));\r
-       BT_ACL_DEBUG("-- Data Length: 0x%04X", ACLPacketHeader->DataLength);\r
-       BT_ACL_DEBUG("-- Destination Channel: 0x%04X", DataHeader->DestinationChannel);\r
-       BT_ACL_DEBUG("-- Payload Length: 0x%04X", DataHeader->PayloadLength);                   \r
-       #endif\r
-       #if (ACL_DEBUG_LEVEL > 0)\r
-       BT_ACL_DEBUG(">> L2CAP Disconnection Response", NULL);\r
-       #endif\r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("-- Source Channel: 0x%04X", DisconnectionResponse.SourceChannel);\r
-       BT_ACL_DEBUG("-- Destination Channel: 0x%04X", DisconnectionResponse.DestinationChannel);\r
-       #endif\r
+       BT_ACL_DEBUG(1, ">> L2CAP Disconnection Response", NULL);\r
+       BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ResponsePacket.DisconnectionResponse.SourceChannel);\r
+       BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket.DisconnectionResponse.DestinationChannel);\r
 }\r
 \r
 static inline void Bluetooth_Signal_EchoReq(BT_ACL_Header_t* ACLPacketHeader,\r
                                             BT_DataPacket_Header_t* DataHeader,\r
                                             BT_Signal_Header_t* SignalCommandHeader)\r
 {\r
-       #if (ACL_DEBUG_LEVEL > 0)\r
-       BT_ACL_DEBUG("<< L2CAP Echo Request", NULL);\r
-       #endif\r
+       BT_ACL_DEBUG(1, "<< L2CAP Echo Request", NULL);\r
        \r
        Pipe_ClearIN();\r
        Pipe_Freeze();\r
-       Pipe_SelectPipe(BLUETOOTH_DATA_OUT_PIPE);\r
-       Pipe_Unfreeze();\r
-       \r
-       ACLPacketHeader->DataLength           = sizeof(*DataHeader) + sizeof(*SignalCommandHeader);\r
-       DataHeader->PayloadLength             = sizeof(*SignalCommandHeader);\r
-       DataHeader->DestinationChannel        = BT_CHANNEL_SIGNALING;\r
-       SignalCommandHeader->Code             = BT_SIGNAL_ECHO_RESPONSE;\r
-       SignalCommandHeader->Length           = 0;\r
        \r
-       Pipe_Write_Stream_LE(ACLPacketHeader, sizeof(*ACLPacketHeader));\r
-       Pipe_Write_Stream_LE(DataHeader, sizeof(*DataHeader));\r
-       Pipe_Write_Stream_LE(SignalCommandHeader, sizeof(*SignalCommandHeader));\r
-       \r
-       Pipe_ClearOUT();                \r
-       Pipe_Freeze();\r
+       struct\r
+       {\r
+               BT_Signal_Header_t SignalCommandHeader;\r
+       } ResponsePacket;\r
+\r
+       ResponsePacket.SignalCommandHeader.Code                 = BT_SIGNAL_ECHO_RESPONSE;\r
+       ResponsePacket.SignalCommandHeader.Identifier           = SignalCommandHeader->Identifier;\r
+       ResponsePacket.SignalCommandHeader.Length               = 0;\r
        \r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("Packet Sent", NULL);\r
-       BT_ACL_DEBUG("-- Connection Handle: 0x%04X", (ACLPacketHeader->ConnectionHandle & 0x0FFF));\r
-       BT_ACL_DEBUG("-- Data Length: 0x%04X", ACLPacketHeader->DataLength);\r
-       BT_ACL_DEBUG("-- Destination Channel: 0x%04X", DataHeader->DestinationChannel);\r
-       BT_ACL_DEBUG("-- Payload Length: 0x%04X", DataHeader->PayloadLength);                   \r
-       #endif\r
-       #if (ACL_DEBUG_LEVEL > 0)\r
-       BT_ACL_DEBUG(">> L2CAP Echo Response", NULL);\r
-       #endif\r
+       Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL);\r
+\r
+       BT_ACL_DEBUG(1, ">> L2CAP Echo Response", NULL);\r
 }\r
 \r
 static inline void Bluetooth_Signal_InformationReq(BT_ACL_Header_t* ACLPacketHeader,\r
@@ -440,69 +368,48 @@ static inline void Bluetooth_Signal_InformationReq(BT_ACL_Header_t* ACLPacketHea
 \r
        Pipe_Read_Stream_LE(&InformationRequest, sizeof(InformationRequest));\r
 \r
-       #if (ACL_DEBUG_LEVEL > 0)\r
-       BT_ACL_DEBUG("<< Information Request", NULL);\r
-       #endif\r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("-- Info Type: 0x%04X", InformationRequest.InfoType);\r
-       #endif\r
+       BT_ACL_DEBUG(1, "<< L2CAP Information Request", NULL);\r
+       BT_ACL_DEBUG(2, "-- Info Type: 0x%04X", InformationRequest.InfoType);\r
        \r
        Pipe_ClearIN();\r
        Pipe_Freeze();\r
-       Pipe_SelectPipe(BLUETOOTH_DATA_OUT_PIPE);\r
-       Pipe_Unfreeze();\r
-       \r
-       BT_Signal_InformationResp_t InformationResponse;\r
-       uint8_t ResponseData[4];\r
-       uint8_t ResponseLen;\r
 \r
+       struct\r
+       {\r
+               BT_Signal_Header_t SignalCommandHeader;\r
+               BT_Signal_InformationResp_t InformationResponse;\r
+               \r
+               uint8_t Data[4];\r
+       } ResponsePacket;\r
+       \r
+       uint8_t DataLen = 0;\r
+       \r
        switch (InformationRequest.InfoType)\r
        {\r
                case BT_INFOREQ_MTU:            \r
-                       InformationResponse.Result = BT_INFORMATION_SUCCESSFUL;\r
-                       ResponseLen = 2;\r
+                       ResponsePacket.InformationResponse.Result = BT_INFORMATION_SUCCESSFUL;\r
+                       DataLen = 2;\r
                        \r
-                       *((uint16_t*)&ResponseData) = 65533;\r
+                       *((uint16_t*)&ResponsePacket.Data) = MAXIMUM_CHANNEL_MTU;\r
                        break;\r
                case BT_INFOREQ_EXTENDEDFEATURES:\r
-                       InformationResponse.Result = BT_INFORMATION_SUCCESSFUL;\r
-                       ResponseLen = 4;\r
+                       ResponsePacket.InformationResponse.Result = BT_INFORMATION_SUCCESSFUL;\r
+                       DataLen = 4;\r
                        \r
-                       *((uint32_t*)&ResponseData) = 0;\r
+                       *((uint32_t*)&ResponsePacket.Data) = 0;\r
                        break;\r
                default:\r
-                       InformationResponse.Result = BT_INFORMATION_NOTSUPPORTED;\r
-                       ResponseLen = 0;\r
+                       ResponsePacket.InformationResponse.Result = BT_INFORMATION_NOTSUPPORTED;\r
+                       DataLen = 0;\r
                        break;\r
        }\r
        \r
-       ACLPacketHeader->DataLength           = sizeof(*DataHeader) + sizeof(*SignalCommandHeader) + sizeof(InformationResponse) +\r
-                                               ResponseLen;\r
-       DataHeader->PayloadLength             = sizeof(*SignalCommandHeader) + sizeof(InformationResponse) + ResponseLen;\r
-       DataHeader->DestinationChannel        = BT_CHANNEL_SIGNALING;\r
-       SignalCommandHeader->Code             = BT_SIGNAL_INFORMATION_RESPONSE;\r
-       SignalCommandHeader->Length           = sizeof(InformationResponse) + ResponseLen;\r
-       \r
-       Pipe_Write_Stream_LE(ACLPacketHeader, sizeof(*ACLPacketHeader));\r
-       Pipe_Write_Stream_LE(DataHeader, sizeof(*DataHeader));\r
-       Pipe_Write_Stream_LE(SignalCommandHeader, sizeof(*SignalCommandHeader));\r
-       Pipe_Write_Stream_LE(&InformationResponse, sizeof(InformationResponse));\r
-       Pipe_Write_Stream_LE(ResponseData, ResponseLen);\r
-       \r
-       Pipe_ClearOUT();                \r
-       Pipe_Freeze();\r
+       ResponsePacket.SignalCommandHeader.Code                 = BT_SIGNAL_INFORMATION_RESPONSE;\r
+       ResponsePacket.SignalCommandHeader.Identifier           = SignalCommandHeader->Identifier;\r
+       ResponsePacket.SignalCommandHeader.Length               = sizeof(ResponsePacket.InformationResponse) + DataLen;\r
+\r
+       Bluetooth_SendPacket(&ResponsePacket, (sizeof(ResponsePacket) - sizeof(ResponsePacket.Data) + DataLen), NULL);\r
 \r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("Packet Sent", NULL);\r
-       BT_ACL_DEBUG("-- Connection Handle: 0x%04X", (ACLPacketHeader->ConnectionHandle & 0x0FFF));\r
-       BT_ACL_DEBUG("-- Data Length: 0x%04X", ACLPacketHeader->DataLength);\r
-       BT_ACL_DEBUG("-- Destination Channel: 0x%04X", DataHeader->DestinationChannel);\r
-       BT_ACL_DEBUG("-- Payload Length: 0x%04X", DataHeader->PayloadLength);                   \r
-       #endif\r
-       #if (ACL_DEBUG_LEVEL > 0)\r
-       BT_ACL_DEBUG(">> L2CAP Information Response", NULL);    \r
-       #endif\r
-       #if (ACL_DEBUG_LEVEL > 1)\r
-       BT_ACL_DEBUG("-- Result: 0x%02X", InformationResponse.Result);\r
-       #endif\r
+       BT_ACL_DEBUG(1, ">> L2CAP Information Response", NULL); \r
+       BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket.InformationResponse.Result);\r
 }\r
index 6038ea4..d9d07cc 100644 (file)
@@ -41,8 +41,8 @@
                #include "BluetoothStack.h"\r
                \r
        /* Macros: */\r
-               #define BT_ACL_DEBUG(s, ...)              printf_P(PSTR("(ACL) " s "\r\n"), __VA_ARGS__)\r
-               #define ACL_DEBUG_LEVEL                   1\r
+               #define BT_ACL_DEBUG(l, s, ...)           do { if (ACL_DEBUG_LEVEL >= l) printf_P(PSTR("(ACL) " s "\r\n"), __VA_ARGS__); } while (0)\r
+               #define ACL_DEBUG_LEVEL                   2\r
 \r
                #define BT_CHANNEL_SIGNALING              0x0001\r
                #define BT_CHANNEL_CONNECTIONLESS         0x0002\r
@@ -71,6 +71,8 @@
                #define BT_CONFIGURATION_REJECTED         0x0002\r
                #define BT_CONFIGURATION_UNKNOWNOPTIONS   0x0003\r
                \r
+               #define BT_CONFIG_OPTION_MTU              1\r
+               \r
        /* Type Defines: */\r
                typedef struct\r
                {\r
                        uint16_t InfoType;\r
                        uint16_t Result;\r
                } BT_Signal_InformationResp_t;\r
+               \r
+               typedef struct\r
+               {\r
+                       uint8_t  Type;\r
+                       uint16_t Length;\r
+               } BT_Config_Option_Header_t;\r
 \r
        /* Function Prototypes: */\r
                void    Bluetooth_ACLTask(void);\r
-               uint8_t Bluetooth_SendPacket(uint8_t* Data, uint16_t DataLen, Bluetooth_Channel_t* Channel);\r
                \r
                #if defined(INCLUDE_FROM_BLUETOOTH_ACLPACKETS_C)\r
                        static void Bluetooth_ProcessACLPackets(void);\r
index 1d3d199..7989063 100644 (file)
@@ -80,6 +80,7 @@ Bluetooth_Channel_t* Bluetooth_InitChannelData(uint16_t RemoteChannelNumber, uin
                        ChannelData->RemoteNumber = RemoteChannelNumber;\r
                        ChannelData->LocalNumber  = (BLUETOOTH_CHANNELNUMBER_BASEOFFSET + i);\r
                        ChannelData->PSM          = PSM;\r
+                       ChannelData->LocalMTU     = MAXIMUM_CHANNEL_MTU;\r
                        ChannelData->State        = Channel_Config_WaitConfig;\r
                        \r
                        return ChannelData;\r
index 8d356d8..c20cd12 100644 (file)
@@ -47,6 +47,8 @@
                #define CHANNEL_PSM_SERVICEDISCOVERY             0x0001\r
                #define CHANNEL_PSM_RFCOMM                       0x0003\r
                \r
+               #define MAXIMUM_CHANNEL_MTU                      255\r
+               \r
        /* Enums: */\r
                enum BT_ChannelStates_t\r
                {\r
@@ -76,6 +78,7 @@
                        uint16_t LocalNumber;\r
                        uint16_t RemoteNumber;\r
                        uint16_t PSM;\r
+                       uint16_t LocalMTU;\r
                        uint16_t RemoteMTU;\r
                } Bluetooth_Channel_t;\r
 \r
                void Bluetooth_Stack_Init(void);\r
                void Bluetooth_Stack_USBTask(void);\r
 \r
-               bool Bluetooth_ConnectionRequest(uint8_t* RemoteAddress);\r
-               void Bluetooth_ConnectionComplete(void);\r
-               void Bluetooth_DisconnectionComplete(void);\r
-               void Bluetooth_PacketReceived(uint16_t* PacketLength, Bluetooth_Channel_t* Channel);\r
+               bool    Bluetooth_ConnectionRequest(uint8_t* RemoteAddress);\r
+               void    Bluetooth_ConnectionComplete(void);\r
+               void    Bluetooth_DisconnectionComplete(void);\r
+               void    Bluetooth_PacketReceived(uint16_t* PacketLength, Bluetooth_Channel_t* Channel);\r
+               uint8_t Bluetooth_SendPacket(void* Data, uint16_t DataLen, Bluetooth_Channel_t* Channel);\r
 \r
        /* External Variables: */\r
                extern Bluetooth_Device_t     Bluetooth_DeviceConfiguration;\r