Add LUFA-side channel open/close routines, add signalling handlers for the creation...
authorDean Camera <dean@fourwalledcubicle.com>
Sat, 10 Apr 2010 07:33:19 +0000 (07:33 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sat, 10 Apr 2010 07:33:19 +0000 (07:33 +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 7c238e9..50fba7c 100644 (file)
@@ -120,6 +120,9 @@ static void Bluetooth_ProcessACLPackets(void)
                        case BT_SIGNAL_CONNECTION_REQUEST:\r
                                Bluetooth_Signal_ConnectionReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
                                break;\r
                        case BT_SIGNAL_CONNECTION_REQUEST:\r
                                Bluetooth_Signal_ConnectionReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
                                break;\r
+                       case BT_SIGNAL_CONNECTION_RESPONSE:\r
+                               Bluetooth_Signal_ConnectionResp(&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_REQUEST:\r
                                Bluetooth_Signal_ConfigurationReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
                                break;\r
@@ -128,7 +131,10 @@ static void Bluetooth_ProcessACLPackets(void)
                                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
+                               break;\r
+                       case BT_SIGNAL_DISCONNECTION_RESPONSE:\r
+                               Bluetooth_Signal_DisconnectionResp(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
+                               break;\r
                        case BT_SIGNAL_ECHO_REQUEST:\r
                                Bluetooth_Signal_EchoReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
                                break;\r
                        case BT_SIGNAL_ECHO_REQUEST:\r
                                Bluetooth_Signal_EchoReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
                                break;\r
@@ -193,6 +199,75 @@ 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
+Bluetooth_Channel_t* Bluetooth_OpenChannel(uint16_t PSM)\r
+{\r
+       Bluetooth_Channel_t* ChannelData = NULL;\r
+\r
+       for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)\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
+       if (ChannelData == NULL)\r
+         return NULL;\r
+\r
+       ChannelData->RemoteNumber = 0;\r
+       ChannelData->PSM          = PSM;\r
+       ChannelData->LocalMTU     = MAXIMUM_CHANNEL_MTU;\r
+       ChannelData->State        = Channel_Config_WaitConfig;\r
+         \r
+       struct\r
+       {\r
+               BT_Signal_Header_t        SignalCommandHeader;\r
+               BT_Signal_ConnectionReq_t ConnectionRequest;\r
+       } PacketData;\r
+\r
+       PacketData.SignalCommandHeader.Code              = BT_SIGNAL_CONNECTION_REQUEST;\r
+       PacketData.SignalCommandHeader.Identifier        = ++Bluetooth_Connection.SignallingIdentifier;\r
+       PacketData.SignalCommandHeader.Length            = sizeof(PacketData.ConnectionRequest);\r
+       PacketData.ConnectionRequest.PSM                 = PSM;\r
+       PacketData.ConnectionRequest.SourceChannel       = ChannelData->LocalNumber;\r
+       \r
+       Bluetooth_SendPacket(&PacketData, sizeof(PacketData), NULL);\r
+\r
+       BT_ACL_DEBUG(1, ">> L2CAP Connection Request", NULL);\r
+       BT_ACL_DEBUG(2, "-- PSM 0x%04X", PacketData.ConnectionRequest.PSM);\r
+       BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", PacketData.ConnectionRequest.SourceChannel);\r
+\r
+       return ChannelData;\r
+}\r
+\r
+void Bluetooth_CloseChannel(Bluetooth_Channel_t* Channel)\r
+{\r
+       if ((Channel == NULL) || (Channel->State == Channel_Closed))\r
+         return;\r
+         \r
+       Channel->State = Channel_WaitDisconnect;\r
+\r
+       struct\r
+       {\r
+               BT_Signal_Header_t           SignalCommandHeader;\r
+               BT_Signal_DisconnectionReq_t DisconnectionRequest;\r
+       } PacketData;\r
+       \r
+       PacketData.SignalCommandHeader.Code            = BT_SIGNAL_DISCONNECTION_REQUEST;\r
+       PacketData.SignalCommandHeader.Identifier      = ++Bluetooth_Connection.SignallingIdentifier;\r
+       PacketData.SignalCommandHeader.Length          = sizeof(PacketData.DisconnectionRequest);\r
+       PacketData.DisconnectionRequest.DestinationChannel = Channel->RemoteNumber;\r
+       PacketData.DisconnectionRequest.SourceChannel = Channel->LocalNumber;\r
+\r
+       Bluetooth_SendPacket(&PacketData, sizeof(PacketData), NULL);\r
+       \r
+       BT_ACL_DEBUG(1, ">> L2CAP Disconnection Request", NULL);\r
+       BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", PacketData.DisconnectionRequest.DestinationChannel);  \r
+       BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", PacketData.DisconnectionRequest.SourceChannel);    \r
+}\r
+\r
 static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t*        ACLPacketHeader,\r
                                                   BT_DataPacket_Header_t* DataHeader,\r
                                                   BT_Signal_Header_t*     SignalCommandHeader)\r
 static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t*        ACLPacketHeader,\r
                                                   BT_DataPacket_Header_t* DataHeader,\r
                                                   BT_Signal_Header_t*     SignalCommandHeader)\r
@@ -208,8 +283,29 @@ static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t*        ACLPac
        BT_ACL_DEBUG(2, "-- PSM: 0x%04X", ConnectionRequest.PSM);\r
        BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionRequest.SourceChannel);\r
        \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
+       Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(ConnectionRequest.SourceChannel, true);\r
 \r
 \r
+       if (ChannelData == NULL)\r
+       {\r
+               for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)\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
+       if (ChannelData != NULL)\r
+       {\r
+               ChannelData->RemoteNumber = ConnectionRequest.SourceChannel;\r
+               ChannelData->PSM          = ConnectionRequest.PSM;\r
+               ChannelData->LocalMTU     = MAXIMUM_CHANNEL_MTU;\r
+               ChannelData->State        = Channel_Config_WaitConfig;\r
+       }\r
+       \r
        struct\r
        {\r
                BT_Signal_Header_t         SignalCommandHeader;\r
        struct\r
        {\r
                BT_Signal_Header_t         SignalCommandHeader;\r
@@ -228,10 +324,37 @@ static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t*        ACLPac
 \r
        BT_ACL_DEBUG(1, ">> L2CAP Connection Response", NULL);\r
        BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket.ConnectionResponse.Result);\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
        BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket.ConnectionResponse.DestinationChannel);\r
+       BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ResponsePacket.ConnectionResponse.SourceChannel);\r
+}\r
+\r
+static inline void Bluetooth_Signal_ConnectionResp(BT_ACL_Header_t* ACLPacketHeader,\r
+                                                   BT_DataPacket_Header_t* DataHeader,\r
+                                                   BT_Signal_Header_t* SignalCommandHeader)\r
+{\r
+       BT_Signal_ConnectionResp_t ConnectionResponse;\r
+       \r
+       Pipe_Read_Stream_LE(&ConnectionResponse, sizeof(ConnectionResponse));\r
+\r
+       Pipe_ClearIN();\r
+       Pipe_Freeze();\r
+\r
+       BT_ACL_DEBUG(1, "<< L2CAP Connection Response", NULL);\r
+       BT_ACL_DEBUG(2, "-- Result: 0x%02X", ConnectionResponse.Result);        \r
+       BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionResponse.SourceChannel); \r
+       BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ConnectionResponse.DestinationChannel);       \r
+\r
+       Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(ConnectionResponse.DestinationChannel, false);\r
+\r
+       if (ChannelData != NULL)\r
+       {\r
+               ChannelData->RemoteNumber = ConnectionResponse.SourceChannel;\r
+               ChannelData->State        = (ConnectionResponse.Result == BT_CONNECTION_SUCCESSFUL) ?\r
+                                            Channel_Config_WaitConfig : Channel_Closed;\r
+       }\r
 }\r
 \r
 }\r
 \r
+\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
@@ -375,6 +498,27 @@ static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t*        ACL
        BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket.DisconnectionResponse.DestinationChannel);\r
 }\r
 \r
        BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket.DisconnectionResponse.DestinationChannel);\r
 }\r
 \r
+static inline void Bluetooth_Signal_DisconnectionResp(BT_ACL_Header_t*        ACLPacketHeader,\r
+                                                      BT_DataPacket_Header_t* DataHeader,\r
+                                                      BT_Signal_Header_t*     SignalCommandHeader)\r
+{\r
+       BT_Signal_DisconnectionResp_t DisconnectionResponse;\r
+       \r
+       Pipe_Read_Stream_LE(&DisconnectionResponse, sizeof(DisconnectionResponse));\r
+\r
+       BT_ACL_DEBUG(1, "<< L2CAP Disconnection Response", NULL);\r
+       BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DisconnectionResponse.DestinationChannel);\r
+       BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", DisconnectionResponse.SourceChannel);\r
+       \r
+       Pipe_ClearIN();\r
+       Pipe_Freeze();\r
+       \r
+       Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(DisconnectionResponse.SourceChannel, true);\r
+       \r
+       if (ChannelData->State == Channel_WaitDisconnect)\r
+         ChannelData->State = Channel_Closed;\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
 static inline void Bluetooth_Signal_EchoReq(BT_ACL_Header_t* ACLPacketHeader,\r
                                             BT_DataPacket_Header_t* DataHeader,\r
                                             BT_Signal_Header_t* SignalCommandHeader)\r
index 1edbfa6..40f2bbd 100644 (file)
@@ -42,7 +42,7 @@
                \r
        /* Macros: */\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
                \r
        /* Macros: */\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
+               #define ACL_DEBUG_LEVEL                   1\r
 \r
                #define BT_CHANNEL_SIGNALING              0x0001\r
                #define BT_CHANNEL_CONNECTIONLESS         0x0002\r
 \r
                #define BT_CHANNEL_SIGNALING              0x0001\r
                #define BT_CHANNEL_CONNECTIONLESS         0x0002\r
                        static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t* ACLPacketHeader,\r
                                                               BT_DataPacket_Header_t* DataHeader,\r
                                                               BT_Signal_Header_t* SignalCommandHeader);\r
                        static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t* ACLPacketHeader,\r
                                                               BT_DataPacket_Header_t* DataHeader,\r
                                                               BT_Signal_Header_t* SignalCommandHeader);\r
+                       static inline void Bluetooth_Signal_ConnectionResp(BT_ACL_Header_t* ACLPacketHeader,\r
+                                                               BT_DataPacket_Header_t* DataHeader,\r
+                                                               BT_Signal_Header_t* SignalCommandHeader);\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
                        static inline void Bluetooth_Signal_EchoReq(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
+                       static inline void Bluetooth_Signal_DisconnectionResp(BT_ACL_Header_t* ACLPacketHeader,\r
+                                                                  BT_DataPacket_Header_t* DataHeader,\r
+                                                                  BT_Signal_Header_t* SignalCommandHeader);\r
                        static inline void Bluetooth_Signal_InformationReq(BT_ACL_Header_t* ACLPacketHeader,\r
                                                                BT_DataPacket_Header_t* DataHeader,\r
                                                                BT_Signal_Header_t* SignalCommandHeader);\r
                        static inline void Bluetooth_Signal_InformationReq(BT_ACL_Header_t* ACLPacketHeader,\r
                                                                BT_DataPacket_Header_t* DataHeader,\r
                                                                BT_Signal_Header_t* SignalCommandHeader);\r
index 11b6a61..ec1f637 100644 (file)
@@ -68,31 +68,3 @@ Bluetooth_Channel_t* Bluetooth_GetChannelData(uint16_t ChannelNumber, bool Searc
 \r
        return NULL;\r
 }\r
 \r
        return NULL;\r
 }\r
-\r
-Bluetooth_Channel_t* Bluetooth_InitChannelData(uint16_t RemoteChannelNumber, uint16_t PSM)\r
-{\r
-       Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(RemoteChannelNumber, false);\r
-\r
-       if (ChannelData == NULL)\r
-       {\r
-               for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)\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
-       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
index b768bc2..9a90cff 100644 (file)
                #include "BluetoothHCICommands.h"\r
                #include "BluetoothACLPackets.h"                \r
                \r
                #include "BluetoothHCICommands.h"\r
                #include "BluetoothACLPackets.h"                \r
                \r
-       /* Function Prototypes: */\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
+       /* Function Prototypes: */              \r
                void Bluetooth_Stack_Init(void);\r
                void Bluetooth_Stack_USBTask(void);\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
-               uint8_t Bluetooth_SendPacket(void* Data, uint16_t DataLen, 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
+               Bluetooth_Channel_t* Bluetooth_GetChannelData(uint16_t ChannelNumber, bool SearchByRemoteChannel);\r
+               Bluetooth_Channel_t* Bluetooth_OpenChannel(uint16_t PSM);\r
+               void                 Bluetooth_CloseChannel(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
 \r
        /* External Variables: */\r
                extern Bluetooth_Device_t     Bluetooth_DeviceConfiguration;\r