Bluetooth demo can now create and maintain logical channels - need to determine why...
authorDean Camera <dean@fourwalledcubicle.com>
Sat, 10 Apr 2010 05:58:37 +0000 (05:58 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sat, 10 Apr 2010 05:58:37 +0000 (05:58 +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
LUFA/ManPages/MainPage.txt

index a35dcb1..7c238e9 100644 (file)
@@ -114,7 +114,7 @@ static void Bluetooth_ProcessACLPackets(void)
        {\r
                BT_Signal_Header_t SignalCommandHeader;\r
                Pipe_Read_Stream_LE(&SignalCommandHeader, sizeof(SignalCommandHeader));\r
        {\r
                BT_Signal_Header_t SignalCommandHeader;\r
                Pipe_Read_Stream_LE(&SignalCommandHeader, sizeof(SignalCommandHeader));\r
-\r
+               \r
                switch (SignalCommandHeader.Code)\r
                {\r
                        case BT_SIGNAL_CONNECTION_REQUEST:\r
                switch (SignalCommandHeader.Code)\r
                {\r
                        case BT_SIGNAL_CONNECTION_REQUEST:\r
@@ -123,6 +123,9 @@ static void Bluetooth_ProcessACLPackets(void)
                        case BT_SIGNAL_CONFIGURATION_REQUEST:\r
                                Bluetooth_Signal_ConfigurationReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
                                break;\r
                        case BT_SIGNAL_CONFIGURATION_REQUEST:\r
                                Bluetooth_Signal_ConfigurationReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
                                break;\r
+                       case BT_SIGNAL_CONFIGURATION_RESPONSE:\r
+                               Bluetooth_Signal_ConfigurationResp(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
+                               break;\r
                        case BT_SIGNAL_DISCONNECTION_REQUEST:\r
                                Bluetooth_Signal_DisconnectionReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
                                break;                  \r
                        case BT_SIGNAL_DISCONNECTION_REQUEST:\r
                                Bluetooth_Signal_DisconnectionReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
                                break;                  \r
@@ -143,7 +146,7 @@ static void Bluetooth_ProcessACLPackets(void)
        }\r
        else\r
        {\r
        }\r
        else\r
        {\r
-               Bluetooth_PacketReceived(&DataHeader.PayloadLength, Bluetooth_GetChannelData(DataHeader.DestinationChannel, true));\r
+               Bluetooth_PacketReceived(&DataHeader.PayloadLength, Bluetooth_GetChannelData(DataHeader.DestinationChannel, false));\r
        \r
                Pipe_SelectPipe(BLUETOOTH_DATA_IN_PIPE);\r
                Pipe_Discard_Stream(DataHeader.PayloadLength);\r
        \r
                Pipe_SelectPipe(BLUETOOTH_DATA_IN_PIPE);\r
                Pipe_Discard_Stream(DataHeader.PayloadLength);\r
@@ -165,7 +168,7 @@ uint8_t Bluetooth_SendPacket(void* Data, uint16_t DataLen, Bluetooth_Channel_t*
 \r
        // TODO: Add packet fragmentation here after retrieving the device's signal channel MTU\r
 \r
 \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.ConnectionHandle      = (Bluetooth_Connection.ConnectionHandle | BT_ACL_FIRST_AUTOFLUSH);\r
        ACLPacketHeader.DataLength            = sizeof(DataHeader) + DataLen;\r
        DataHeader.PayloadLength              = DataLen;\r
        DataHeader.DestinationChannel         = (Channel == NULL) ? BT_CHANNEL_SIGNALING : Channel->RemoteNumber;\r
        ACLPacketHeader.DataLength            = sizeof(DataHeader) + DataLen;\r
        DataHeader.PayloadLength              = DataLen;\r
        DataHeader.DestinationChannel         = (Channel == NULL) ? BT_CHANNEL_SIGNALING : Channel->RemoteNumber;\r
@@ -176,6 +179,7 @@ uint8_t Bluetooth_SendPacket(void* Data, uint16_t DataLen, Bluetooth_Channel_t*
        Pipe_Write_Stream_LE(&ACLPacketHeader, sizeof(ACLPacketHeader));\r
        Pipe_Write_Stream_LE(&DataHeader, sizeof(DataHeader));\r
        Pipe_Write_Stream_LE(Data, DataLen);\r
        Pipe_Write_Stream_LE(&ACLPacketHeader, sizeof(ACLPacketHeader));\r
        Pipe_Write_Stream_LE(&DataHeader, sizeof(DataHeader));\r
        Pipe_Write_Stream_LE(Data, DataLen);\r
+       Pipe_ClearOUT();\r
        \r
        Pipe_Freeze();\r
        \r
        \r
        Pipe_Freeze();\r
        \r
@@ -189,9 +193,9 @@ uint8_t Bluetooth_SendPacket(void* Data, uint16_t DataLen, Bluetooth_Channel_t*
        return BT_SENDPACKET_NoError;\r
 }\r
 \r
        return BT_SENDPACKET_NoError;\r
 }\r
 \r
-static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t* ACLPacketHeader,\r
+static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t*        ACLPacketHeader,\r
                                                   BT_DataPacket_Header_t* DataHeader,\r
                                                   BT_DataPacket_Header_t* DataHeader,\r
-                                                  BT_Signal_Header_t* SignalCommandHeader)\r
+                                                  BT_Signal_Header_t*     SignalCommandHeader)\r
 {\r
        BT_Signal_ConnectionReq_t ConnectionRequest;\r
        \r
 {\r
        BT_Signal_ConnectionReq_t ConnectionRequest;\r
        \r
@@ -216,8 +220,8 @@ static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t* ACLPacketHead
        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.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.DestinationChannel = ChannelData->RemoteNumber;\r
+       ResponsePacket.ConnectionResponse.SourceChannel      = ChannelData->LocalNumber;\r
        ResponsePacket.ConnectionResponse.Status             = 0x00;\r
        \r
        Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL);\r
        ResponsePacket.ConnectionResponse.Status             = 0x00;\r
        \r
        Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL);\r
@@ -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);\r
 }\r
 \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
+static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t*        ACLPacketHeader,\r
                                                      BT_DataPacket_Header_t* DataHeader,\r
                                                      BT_DataPacket_Header_t* DataHeader,\r
-                                                     BT_Signal_Header_t* SignalCommandHeader)\r
+                                                     BT_Signal_Header_t*     SignalCommandHeader)\r
 {\r
        BT_Signal_ConfigurationReq_t ConfigurationRequest;\r
        uint8_t OptionsLen;\r
 {\r
        BT_Signal_ConfigurationReq_t ConfigurationRequest;\r
        uint8_t OptionsLen;\r
@@ -259,7 +263,7 @@ static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketH
 \r
        BT_ACL_DEBUG(1, "<< L2CAP Configuration Request", NULL);\r
        BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ConfigurationRequest.DestinationChannel);\r
 \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, "-- Options Len: 0x%04X", (DataHeader->PayloadLength - sizeof(*SignalCommandHeader)));\r
        BT_ACL_DEBUG(2, "-- Remote MTU: 0x%04X", ChannelData->RemoteMTU);\r
        \r
        struct\r
        BT_ACL_DEBUG(2, "-- Remote MTU: 0x%04X", ChannelData->RemoteMTU);\r
        \r
        struct\r
@@ -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);\r
 }\r
 \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
+static inline void Bluetooth_Signal_ConfigurationResp(BT_ACL_Header_t*        ACLPacketHeader,\r
+                                                      BT_DataPacket_Header_t* DataHeader,\r
+                                                      BT_Signal_Header_t*     SignalCommandHeader)\r
+{\r
+       BT_Signal_ConfigurationResp_t ConfigurationResponse;\r
+\r
+       Pipe_Read_Stream_LE(&ConfigurationResponse, sizeof(ConfigurationResponse));\r
+\r
+       Pipe_ClearIN();\r
+       Pipe_Freeze();\r
+       \r
+       BT_ACL_DEBUG(1, "<< L2CAP Configuration Response", NULL);\r
+       BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConfigurationResponse.SourceChannel);\r
+       BT_ACL_DEBUG(2, "-- Result: 0x%02X", ConfigurationResponse.Result);\r
+\r
+       if (ConfigurationResponse.Result == BT_CONFIGURATION_SUCCESSFUL)\r
+       {\r
+               Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(ConfigurationResponse.SourceChannel, true);\r
+               \r
+               if (ChannelData != NULL)\r
+               {\r
+                       switch (ChannelData->State)\r
+                       {\r
+                               case Channel_Config_WaitReqResp:\r
+                                       ChannelData->State = Channel_Config_WaitReq;\r
+                                       break;\r
+                               case Channel_Config_WaitResp:\r
+                                       ChannelData->State = Channel_Open;\r
+                                       break;\r
+                       }\r
+               }               \r
+       }\r
+}\r
+\r
+static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t*        ACLPacketHeader,\r
                                                      BT_DataPacket_Header_t* DataHeader,\r
                                                      BT_DataPacket_Header_t* DataHeader,\r
-                                                     BT_Signal_Header_t* SignalCommandHeader)\r
+                                                     BT_Signal_Header_t*     SignalCommandHeader)\r
 {\r
        BT_Signal_DisconnectionReq_t DisconnectionRequest;\r
        \r
 {\r
        BT_Signal_DisconnectionReq_t DisconnectionRequest;\r
        \r
@@ -313,7 +351,7 @@ static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketH
        Pipe_ClearIN();\r
        Pipe_Freeze();\r
        \r
        Pipe_ClearIN();\r
        Pipe_Freeze();\r
        \r
-       Bluetooth_Channel_t* ChannelData      = Bluetooth_GetChannelData(DisconnectionRequest.SourceChannel, true);\r
+       Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(DisconnectionRequest.SourceChannel, true);\r
 \r
        struct\r
        {\r
 \r
        struct\r
        {\r
@@ -324,8 +362,8 @@ static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketH
        ResponsePacket.SignalCommandHeader.Code                 = BT_SIGNAL_DISCONNECTION_RESPONSE;\r
        ResponsePacket.SignalCommandHeader.Identifier           = SignalCommandHeader->Identifier;\r
        ResponsePacket.SignalCommandHeader.Length               = sizeof(ResponsePacket.DisconnectionResponse);\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
+       ResponsePacket.DisconnectionResponse.DestinationChannel = ChannelData->RemoteNumber;\r
+       ResponsePacket.DisconnectionResponse.SourceChannel      = ChannelData->LocalNumber;\r
 \r
        Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL);\r
 \r
 \r
        Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL);\r
 \r
@@ -360,9 +398,9 @@ static inline void Bluetooth_Signal_EchoReq(BT_ACL_Header_t* ACLPacketHeader,
        BT_ACL_DEBUG(1, ">> L2CAP Echo Response", NULL);\r
 }\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
+static inline void Bluetooth_Signal_InformationReq(BT_ACL_Header_t*        ACLPacketHeader,\r
                                                    BT_DataPacket_Header_t* DataHeader,\r
                                                    BT_DataPacket_Header_t* DataHeader,\r
-                                                   BT_Signal_Header_t* SignalCommandHeader)\r
+                                                   BT_Signal_Header_t*     SignalCommandHeader)\r
 {\r
        BT_Signal_InformationReq_t InformationRequest;\r
 \r
 {\r
        BT_Signal_InformationReq_t InformationRequest;\r
 \r
index d9d07cc..1edbfa6 100644 (file)
@@ -73,6 +73,8 @@
                \r
                #define BT_CONFIG_OPTION_MTU              1\r
                \r
                \r
                #define BT_CONFIG_OPTION_MTU              1\r
                \r
+               #define BT_ACL_FIRST_AUTOFLUSH            (1 << 13)\r
+               \r
        /* Type Defines: */\r
                typedef struct\r
                {\r
        /* Type Defines: */\r
                typedef struct\r
                {\r
                \r
                typedef struct\r
                {\r
                \r
                typedef struct\r
                {\r
-                       uint8_t  Type;\r
-                       uint16_t Length;\r
+                       uint8_t Type;\r
+                       uint8_t Length;\r
                } BT_Config_Option_Header_t;\r
 \r
        /* Function Prototypes: */\r
                } BT_Config_Option_Header_t;\r
 \r
        /* Function Prototypes: */\r
                        static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketHeader,\r
                                                                  BT_DataPacket_Header_t* DataHeader,\r
                                                                  BT_Signal_Header_t* SignalCommandHeader);\r
                        static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketHeader,\r
                                                                  BT_DataPacket_Header_t* DataHeader,\r
                                                                  BT_Signal_Header_t* SignalCommandHeader);\r
+                       static inline void Bluetooth_Signal_ConfigurationResp(BT_ACL_Header_t* ACLPacketHeader,\r
+                                                                  BT_DataPacket_Header_t* DataHeader,\r
+                                                                  BT_Signal_Header_t* SignalCommandHeader);\r
                        static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketHeader,\r
                                                                  BT_DataPacket_Header_t* DataHeader,\r
                                                                  BT_Signal_Header_t* SignalCommandHeader);\r
                        static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketHeader,\r
                                                                  BT_DataPacket_Header_t* DataHeader,\r
                                                                  BT_Signal_Header_t* SignalCommandHeader);\r
index 7989063..11b6a61 100644 (file)
@@ -54,13 +54,13 @@ void Bluetooth_Stack_USBTask(void)
        Bluetooth_ACLTask();\r
 }\r
 \r
        Bluetooth_ACLTask();\r
 }\r
 \r
-Bluetooth_Channel_t* Bluetooth_GetChannelData(uint16_t ChannelNumber, bool SearchBySource)\r
+Bluetooth_Channel_t* Bluetooth_GetChannelData(uint16_t ChannelNumber, bool SearchByRemoteChannel)\r
 {\r
        for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)\r
        {\r
                Bluetooth_Channel_t* ChannelData = &Bluetooth_Connection.Channels[i];\r
        \r
 {\r
        for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)\r
        {\r
                Bluetooth_Channel_t* ChannelData = &Bluetooth_Connection.Channels[i];\r
        \r
-               uint16_t CurrentChannelNumber = (SearchBySource) ? ChannelData->RemoteNumber : ChannelData->LocalNumber;\r
+               uint16_t CurrentChannelNumber = (SearchByRemoteChannel) ? ChannelData->RemoteNumber : ChannelData->LocalNumber;\r
        \r
                if (CurrentChannelNumber == ChannelNumber)\r
                  return ChannelData;\r
        \r
                if (CurrentChannelNumber == ChannelNumber)\r
                  return ChannelData;\r
@@ -71,21 +71,28 @@ Bluetooth_Channel_t* Bluetooth_GetChannelData(uint16_t ChannelNumber, bool Searc
 \r
 Bluetooth_Channel_t* Bluetooth_InitChannelData(uint16_t RemoteChannelNumber, uint16_t PSM)\r
 {\r
 \r
 Bluetooth_Channel_t* Bluetooth_InitChannelData(uint16_t RemoteChannelNumber, uint16_t PSM)\r
 {\r
-       for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)\r
+       Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(RemoteChannelNumber, false);\r
+\r
+       if (ChannelData == NULL)\r
        {\r
        {\r
-               Bluetooth_Channel_t* ChannelData = &Bluetooth_Connection.Channels[i];\r
-       \r
-               if (ChannelData->State == Channel_Closed)\r
+               for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)\r
                {\r
                {\r
-                       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
-               }               \r
+                       if (Bluetooth_Connection.Channels[i].State == Channel_Closed)\r
+                       {\r
+                               ChannelData = &Bluetooth_Connection.Channels[i];                                \r
+                               ChannelData->LocalNumber = (BLUETOOTH_CHANNELNUMBER_BASEOFFSET + i);\r
+                               break;\r
+                       }\r
+               }\r
        }\r
 \r
        }\r
 \r
-       return NULL;\r
+       if (ChannelData != NULL)\r
+       {\r
+               ChannelData->RemoteNumber = RemoteChannelNumber;\r
+               ChannelData->PSM          = PSM;\r
+               ChannelData->LocalMTU     = MAXIMUM_CHANNEL_MTU;\r
+               ChannelData->State        = Channel_Config_WaitConfig;\r
+       }\r
+\r
+       return ChannelData;\r
 }\r
 }\r
index c20cd12..b768bc2 100644 (file)
                #include "BluetoothACLPackets.h"                \r
                \r
        /* Function Prototypes: */\r
                #include "BluetoothACLPackets.h"                \r
                \r
        /* Function Prototypes: */\r
-               Bluetooth_Channel_t* Bluetooth_GetChannelData(uint16_t ChannelNumber, bool SearchBySource);\r
+               Bluetooth_Channel_t* Bluetooth_GetChannelData(uint16_t ChannelNumber, bool SearchByRemoteChannel);\r
                Bluetooth_Channel_t* Bluetooth_InitChannelData(uint16_t RemoteChannelNumber, uint16_t PSM);\r
                \r
                void Bluetooth_Stack_Init(void);\r
                Bluetooth_Channel_t* Bluetooth_InitChannelData(uint16_t RemoteChannelNumber, uint16_t PSM);\r
                \r
                void Bluetooth_Stack_Init(void);\r
index d7baa0d..6bf7727 100644 (file)
@@ -8,7 +8,7 @@
  *  \mainpage\r
  *\r
  *  \image html LUFA.png\r
  *  \mainpage\r
  *\r
  *  \image html LUFA.png\r
- *  <div align="center"><small><i>Logo design by <b>Ryo Yamauchi</b></i></small></div>\r
+ *  <div align="center"><small><i>Logo design by <b>Ryo</b> - http://ryophotography.wordpress.com</i></small></div>\r
  *  \n\r
  *\r
  *  <b>LUFA is donationware. For author and donation information, see \ref Page_Donating.</b>\r
  *  \n\r
  *\r
  *  <b>LUFA is donationware. For author and donation information, see \ref Page_Donating.</b>\r