diff options
Diffstat (limited to 'Demos/Host/Incomplete/BluetoothHost/Lib')
15 files changed, 384 insertions, 369 deletions
diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c index 939b2ae5f..35b1e920d 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -50,14 +50,14 @@ void Bluetooth_ACLTask(void) { /* Process incoming ACL packets, if any */ Bluetooth_ProcessIncomingACLPackets(); - + /* Check for any half-open channels, send configuration details to the remote device if found */ for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++) { Bluetooth_Channel_t* ChannelData = &Bluetooth_Connection.Channels[i]; - + bool MustSendConfigReq = true; - + /* Check if we are in a channel state which requires a configuration request to be sent */ switch (ChannelData->State) { @@ -71,7 +71,7 @@ void Bluetooth_ACLTask(void) MustSendConfigReq = false; break; } - + /* Only send a configuration request if it the channel was in a state which required it */ if (MustSendConfigReq) { @@ -79,14 +79,14 @@ void Bluetooth_ACLTask(void) { BT_Signal_Header_t SignalCommandHeader; BT_Signal_ConfigurationReq_t ConfigurationRequest; - + struct { BT_Config_Option_Header_t Header; uint16_t Value; } Option_LocalMTU; } PacketData; - + /* Fill out the Signal Command header in the response packet */ PacketData.SignalCommandHeader.Code = BT_SIGNAL_CONFIGURATION_REQUEST; PacketData.SignalCommandHeader.Identifier = ++Bluetooth_Connection.SignalingIdentifier; @@ -101,7 +101,7 @@ void Bluetooth_ACLTask(void) PacketData.Option_LocalMTU.Value = ChannelData->LocalMTU; Bluetooth_SendPacket(&PacketData, sizeof(PacketData), NULL); - + BT_ACL_DEBUG(1, ">> L2CAP Configuration Request"); BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", PacketData.ConfigurationRequest.DestinationChannel); } @@ -119,13 +119,13 @@ static void Bluetooth_ProcessIncomingACLPackets(void) Pipe_SelectPipe(BLUETOOTH_DATA_IN_PIPE); Pipe_Unfreeze(); - + if (!(Pipe_IsReadWriteAllowed())) { Pipe_Freeze(); return; } - + /* Read in the received ACL packet headers when it has been discovered that a packet has been received */ Pipe_Read_Stream_LE(&ACLPacketHeader, sizeof(ACLPacketHeader)); Pipe_Read_Stream_LE(&DataHeader, sizeof(DataHeader)); @@ -143,7 +143,7 @@ static void Bluetooth_ProcessIncomingACLPackets(void) /* Read in the Signal Command header of the incoming packet */ BT_Signal_Header_t SignalCommandHeader; Pipe_Read_Stream_LE(&SignalCommandHeader, sizeof(SignalCommandHeader)); - + /* Dispatch to the appropriate handler function based on the Signal message code */ switch (SignalCommandHeader.Code) { @@ -173,20 +173,20 @@ static void Bluetooth_ProcessIncomingACLPackets(void) break; case BT_SIGNAL_COMMAND_REJECT: BT_ACL_DEBUG(1, "<< Command Reject"); - + uint16_t RejectReason; Pipe_Read_Stream_LE(&RejectReason, sizeof(RejectReason)); Pipe_Discard_Stream(ACLPacketHeader.DataLength - sizeof(RejectReason)); Pipe_ClearIN(); - Pipe_Freeze(); - + Pipe_Freeze(); + BT_ACL_DEBUG(2, "-- Reason: %d", RejectReason); break; default: BT_ACL_DEBUG(1, "<< Unknown Signaling Command 0x%02X", SignalCommandHeader.Code); - + Pipe_Discard_Stream(ACLPacketHeader.DataLength); - Pipe_ClearIN(); + Pipe_ClearIN(); Pipe_Freeze(); break; } @@ -198,7 +198,7 @@ static void Bluetooth_ProcessIncomingACLPackets(void) Pipe_Read_Stream_LE(PacketData, DataHeader.PayloadLength); Pipe_ClearIN(); Pipe_Freeze(); - + Bluetooth_PacketReceived(PacketData, DataHeader.PayloadLength, Bluetooth_GetChannelData(DataHeader.DestinationChannel, CHANNEL_SEARCH_LOCALNUMBER)); } @@ -221,9 +221,9 @@ Bluetooth_Channel_t* Bluetooth_GetChannelData(const uint16_t SearchValue, /* Closed channels should be ignored as they are not considered valid data */ if (ChannelData->State == BT_Channel_Closed) continue; - + bool FoundMatch = false; - + /* Search the current channel for the search key to see if it matches */ switch (SearchKey) { @@ -237,7 +237,7 @@ Bluetooth_Channel_t* Bluetooth_GetChannelData(const uint16_t SearchValue, FoundMatch = (SearchValue == ChannelData->PSM); break; } - + if (FoundMatch) return ChannelData; } @@ -285,9 +285,9 @@ uint8_t Bluetooth_SendPacket(void* Data, Pipe_Write_Stream_LE(&DataHeader, sizeof(DataHeader)); Pipe_Write_Stream_LE(Data, DataLen); Pipe_ClearOUT(); - + Pipe_Freeze(); - + BT_ACL_DEBUG(2, ""); BT_ACL_DEBUG(2, "Packet Sent"); BT_ACL_DEBUG(2, "-- Connection Handle: 0x%04X", (ACLPacketHeader.ConnectionHandle & 0x0FFF)); @@ -319,7 +319,7 @@ Bluetooth_Channel_t* Bluetooth_OpenChannel(const uint16_t PSM) if (Bluetooth_Connection.Channels[i].State == BT_Channel_Closed) { ChannelData = &Bluetooth_Connection.Channels[i]; - + /* Set the new channel structure's local channel number to a unique value within the connection orientated channel address space */ ChannelData->LocalNumber = (BT_CHANNELNUMBER_BASEOFFSET + i); @@ -336,7 +336,7 @@ Bluetooth_Channel_t* Bluetooth_OpenChannel(const uint16_t PSM) ChannelData->PSM = PSM; ChannelData->LocalMTU = MAXIMUM_CHANNEL_MTU; ChannelData->State = BT_Channel_WaitConnectRsp; - + struct { BT_Signal_Header_t SignalCommandHeader; @@ -347,11 +347,11 @@ Bluetooth_Channel_t* Bluetooth_OpenChannel(const uint16_t PSM) PacketData.SignalCommandHeader.Code = BT_SIGNAL_CONNECTION_REQUEST; PacketData.SignalCommandHeader.Identifier = ++Bluetooth_Connection.SignalingIdentifier; PacketData.SignalCommandHeader.Length = sizeof(PacketData.ConnectionRequest); - + /* Fill out the Connection Request in the response packet */ PacketData.ConnectionRequest.PSM = PSM; PacketData.ConnectionRequest.SourceChannel = ChannelData->LocalNumber; - + Bluetooth_SendPacket(&PacketData, sizeof(PacketData), NULL); BT_ACL_DEBUG(1, ">> L2CAP Connection Request"); @@ -385,7 +385,7 @@ void Bluetooth_CloseChannel(Bluetooth_Channel_t* const ACLChannel) BT_Signal_Header_t SignalCommandHeader; BT_Signal_DisconnectionReq_t DisconnectionRequest; } PacketData; - + /* Fill out the Signal Command header in the response packet */ PacketData.SignalCommandHeader.Code = BT_SIGNAL_DISCONNECTION_REQUEST; PacketData.SignalCommandHeader.Identifier = ++Bluetooth_Connection.SignalingIdentifier; @@ -396,10 +396,10 @@ void Bluetooth_CloseChannel(Bluetooth_Channel_t* const ACLChannel) PacketData.DisconnectionRequest.SourceChannel = ACLChannel->LocalNumber; Bluetooth_SendPacket(&PacketData, sizeof(PacketData), NULL); - + BT_ACL_DEBUG(1, ">> L2CAP Disconnection Request"); - BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", PacketData.DisconnectionRequest.DestinationChannel); - BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", PacketData.DisconnectionRequest.SourceChannel); + BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", PacketData.DisconnectionRequest.DestinationChannel); + BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", PacketData.DisconnectionRequest.SourceChannel); } /** Internal Bluetooth stack Signal Command processing routine for a Connection Request command. @@ -409,12 +409,12 @@ void Bluetooth_CloseChannel(Bluetooth_Channel_t* const ACLChannel) static inline void Bluetooth_Signal_ConnectionReq(const BT_Signal_Header_t* const SignalCommandHeader) { BT_Signal_ConnectionReq_t ConnectionRequest; - + Pipe_Read_Stream_LE(&ConnectionRequest, sizeof(ConnectionRequest)); Pipe_ClearIN(); Pipe_Freeze(); - + BT_ACL_DEBUG(1, "<< L2CAP Connection Request"); BT_ACL_DEBUG(2, "-- PSM: 0x%04X", ConnectionRequest.PSM); BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionRequest.SourceChannel); @@ -439,7 +439,7 @@ static inline void Bluetooth_Signal_ConnectionReq(const BT_Signal_Header_t* cons } } } - + uint8_t ChannelStatus = BT_CONNECTION_REFUSED_RESOURCES; /* Reset the channel item contents only if a channel entry was found for it */ @@ -452,15 +452,15 @@ static inline void Bluetooth_Signal_ConnectionReq(const BT_Signal_Header_t* cons ChannelData->PSM = ConnectionRequest.PSM; ChannelData->LocalMTU = MAXIMUM_CHANNEL_MTU; ChannelData->State = BT_Channel_Config_WaitConfig; - + ChannelStatus = BT_CONNECTION_SUCCESSFUL; } else { - ChannelStatus = BT_CONNECTION_REFUSED_PSM; + ChannelStatus = BT_CONNECTION_REFUSED_PSM; } } - + struct { BT_Signal_Header_t SignalCommandHeader; @@ -477,7 +477,7 @@ static inline void Bluetooth_Signal_ConnectionReq(const BT_Signal_Header_t* cons ResponsePacket.ConnectionResponse.SourceChannel = ChannelData->RemoteNumber; ResponsePacket.ConnectionResponse.Result = ChannelStatus; ResponsePacket.ConnectionResponse.Status = 0x00; - + Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL); BT_ACL_DEBUG(1, ">> L2CAP Connection Response"); @@ -493,16 +493,16 @@ static inline void Bluetooth_Signal_ConnectionReq(const BT_Signal_Header_t* cons static inline void Bluetooth_Signal_ConnectionResp(const BT_Signal_Header_t* const SignalCommandHeader) { BT_Signal_ConnectionResp_t ConnectionResponse; - + Pipe_Read_Stream_LE(&ConnectionResponse, sizeof(ConnectionResponse)); Pipe_ClearIN(); Pipe_Freeze(); BT_ACL_DEBUG(1, "<< L2CAP Connection Response"); - BT_ACL_DEBUG(2, "-- Result: 0x%02X", ConnectionResponse.Result); - BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionResponse.SourceChannel); - BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ConnectionResponse.DestinationChannel); + BT_ACL_DEBUG(2, "-- Result: 0x%02X", ConnectionResponse.Result); + BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionResponse.SourceChannel); + BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ConnectionResponse.DestinationChannel); /* Search for the referenced channel in the channel information list */ Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(ConnectionResponse.SourceChannel, CHANNEL_SEARCH_LOCALNUMBER); @@ -524,12 +524,12 @@ static inline void Bluetooth_Signal_ConnectionResp(const BT_Signal_Header_t* con static inline void Bluetooth_Signal_ConfigurationReq(const BT_Signal_Header_t* const SignalCommandHeader) { BT_Signal_ConfigurationReq_t ConfigurationRequest; - + /* Allocate a buffer large enough to hold the variable number of configuration options in the request */ uint8_t OptionsLen = (SignalCommandHeader->Length - sizeof(ConfigurationRequest)); uint8_t Options[OptionsLen]; - Pipe_Read_Stream_LE(&ConfigurationRequest, sizeof(ConfigurationRequest)); + Pipe_Read_Stream_LE(&ConfigurationRequest, sizeof(ConfigurationRequest)); Pipe_Read_Stream_LE(&Options, sizeof(Options)); Pipe_ClearIN(); @@ -554,7 +554,7 @@ static inline void Bluetooth_Signal_ConfigurationReq(const BT_Signal_Header_t* c BT_ACL_DEBUG(2, "-- Option Type: 0x%04X", OptionHeader->Type); BT_ACL_DEBUG(2, "-- Option Length: 0x%04X", (sizeof(BT_Config_Option_Header_t) + OptionHeader->Length)); - + /* Store the remote MTU option's value if present */ if (OptionHeader->Type == BT_CONFIG_OPTION_MTU) ChannelData->RemoteMTU = *((uint16_t*)OptionData); @@ -563,7 +563,7 @@ static inline void Bluetooth_Signal_ConfigurationReq(const BT_Signal_Header_t* c OptionPos += (sizeof(BT_Config_Option_Header_t) + OptionHeader->Length); } } - + struct { BT_Signal_Header_t SignalCommandHeader; @@ -616,14 +616,14 @@ static inline void Bluetooth_Signal_ConfigurationResp(const BT_Signal_Header_t* Pipe_ClearIN(); Pipe_Freeze(); - + BT_ACL_DEBUG(1, "<< L2CAP Configuration Response"); BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConfigurationResponse.SourceChannel); BT_ACL_DEBUG(2, "-- Result: 0x%02X", ConfigurationResponse.Result); /* Search for the referenced channel in the channel information list */ Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(ConfigurationResponse.SourceChannel, CHANNEL_SEARCH_REMOTENUMBER); - + /* Only update the channel's state if it was found in the channel list */ if (ChannelData != NULL) { @@ -639,7 +639,7 @@ static inline void Bluetooth_Signal_ConfigurationResp(const BT_Signal_Header_t* ChannelData->State = BT_Channel_Open; Bluetooth_ChannelOpened(ChannelData); break; - } + } } else { @@ -656,16 +656,16 @@ static inline void Bluetooth_Signal_ConfigurationResp(const BT_Signal_Header_t* static inline void Bluetooth_Signal_DisconnectionReq(const BT_Signal_Header_t* const SignalCommandHeader) { BT_Signal_DisconnectionReq_t DisconnectionRequest; - + Pipe_Read_Stream_LE(&DisconnectionRequest, sizeof(DisconnectionRequest)); BT_ACL_DEBUG(1, "<< L2CAP Disconnection Request"); BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DisconnectionRequest.DestinationChannel); BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", DisconnectionRequest.SourceChannel); - + Pipe_ClearIN(); Pipe_Freeze(); - + /* Search for the referenced channel in the channel information list */ Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(DisconnectionRequest.SourceChannel, CHANNEL_SEARCH_REMOTENUMBER); @@ -702,20 +702,20 @@ static inline void Bluetooth_Signal_DisconnectionReq(const BT_Signal_Header_t* c static inline void Bluetooth_Signal_DisconnectionResp(const BT_Signal_Header_t* const SignalCommandHeader) { BT_Signal_DisconnectionResp_t DisconnectionResponse; - + Pipe_Read_Stream_LE(&DisconnectionResponse, sizeof(DisconnectionResponse)); BT_ACL_DEBUG(1, "<< L2CAP Disconnection Response"); BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DisconnectionResponse.DestinationChannel); BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", DisconnectionResponse.SourceChannel); - + Pipe_ClearIN(); Pipe_Freeze(); - + /* Search for the referenced channel in the channel information list */ Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(DisconnectionResponse.SourceChannel, CHANNEL_SEARCH_REMOTENUMBER); - - /* If the channel was found in the channel list, close it */ + + /* If the channel was found in the channel list, close it */ if (ChannelData != NULL) ChannelData->State = BT_Channel_Closed; } @@ -727,10 +727,10 @@ static inline void Bluetooth_Signal_DisconnectionResp(const BT_Signal_Header_t* static inline void Bluetooth_Signal_EchoReq(const BT_Signal_Header_t* const SignalCommandHeader) { BT_ACL_DEBUG(1, "<< L2CAP Echo Request"); - + Pipe_ClearIN(); Pipe_Freeze(); - + struct { BT_Signal_Header_t SignalCommandHeader; @@ -740,7 +740,7 @@ static inline void Bluetooth_Signal_EchoReq(const BT_Signal_Header_t* const Sign ResponsePacket.SignalCommandHeader.Code = BT_SIGNAL_ECHO_RESPONSE; ResponsePacket.SignalCommandHeader.Identifier = SignalCommandHeader->Identifier; ResponsePacket.SignalCommandHeader.Length = 0; - + Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL); BT_ACL_DEBUG(1, ">> L2CAP Echo Response"); @@ -758,7 +758,7 @@ static inline void Bluetooth_Signal_InformationReq(const BT_Signal_Header_t* con BT_ACL_DEBUG(1, "<< L2CAP Information Request"); BT_ACL_DEBUG(2, "-- Info Type: 0x%04X", InformationRequest.InfoType); - + Pipe_ClearIN(); Pipe_Freeze(); @@ -766,25 +766,25 @@ static inline void Bluetooth_Signal_InformationReq(const BT_Signal_Header_t* con { BT_Signal_Header_t SignalCommandHeader; BT_Signal_InformationResp_t InformationResponse; - + uint8_t Data[4]; } ResponsePacket; - + uint8_t DataLen = 0; - + /* Retrieve the requested information and store it in the outgoing packet, if found */ switch (InformationRequest.InfoType) { - case BT_INFOREQ_MTU: + case BT_INFOREQ_MTU: ResponsePacket.InformationResponse.Result = BT_INFORMATION_SUCCESSFUL; DataLen = 2; - + *((uint16_t*)&ResponsePacket.Data) = MAXIMUM_CHANNEL_MTU; break; case BT_INFOREQ_EXTENDEDFEATURES: ResponsePacket.InformationResponse.Result = BT_INFORMATION_SUCCESSFUL; DataLen = 4; - + *((uint32_t*)&ResponsePacket.Data) = 0; break; default: @@ -792,7 +792,7 @@ static inline void Bluetooth_Signal_InformationReq(const BT_Signal_Header_t* con DataLen = 0; break; } - + /* Fill out the Signal Command header in the response packet */ ResponsePacket.SignalCommandHeader.Code = BT_SIGNAL_INFORMATION_RESPONSE; ResponsePacket.SignalCommandHeader.Identifier = SignalCommandHeader->Identifier; @@ -800,9 +800,10 @@ static inline void Bluetooth_Signal_InformationReq(const BT_Signal_Header_t* con /* Fill out the Information Response in the response packet */ ResponsePacket.InformationResponse.InfoType = InformationRequest.InfoType; - + Bluetooth_SendPacket(&ResponsePacket, (sizeof(ResponsePacket) - sizeof(ResponsePacket.Data) + DataLen), NULL); - BT_ACL_DEBUG(1, ">> L2CAP Information Response"); + BT_ACL_DEBUG(1, ">> L2CAP Information Response"); BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket.InformationResponse.Result); } + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.h b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.h index efe9d39f6..4c587d597 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -44,13 +44,13 @@ #include <LUFA/Drivers/USB/USB.h> #include <LUFA/Drivers/Peripheral/SerialStream.h> - + #include "BluetoothStack.h" - + /* Macros: */ #define BT_ACL_DEBUG(l, s, ...) do { if (ACL_DEBUG_LEVEL >= l) printf_P(PSTR("(ACL) " s "\r\n"), ##__VA_ARGS__); } while (0) #define ACL_DEBUG_LEVEL 0 - + /** Lowest possible channel number for L2CAP data channels. */ #define BT_CHANNELNUMBER_BASEOFFSET 0x0040 @@ -59,7 +59,7 @@ /** Bluetooth specification defined channel number for connectionless data. */ #define BT_CHANNEL_CONNECTIONLESS 0x0002 - + #define BT_ACL_FIRST_AUTOFLUSH (1 << 13) #define BT_SIGNAL_COMMAND_REJECT 0x01 @@ -73,23 +73,23 @@ #define BT_SIGNAL_ECHO_RESPONSE 0x09 #define BT_SIGNAL_INFORMATION_REQUEST 0x0A #define BT_SIGNAL_INFORMATION_RESPONSE 0x0B - + #define BT_INFOREQ_MTU 0x0001 #define BT_INFOREQ_EXTENDEDFEATURES 0x0002 - + #define BT_INFORMATION_SUCCESSFUL 0x0000 #define BT_INFORMATION_NOTSUPPORTED 0x0001 - + #define BT_CONNECTION_SUCCESSFUL 0x0000 #define BT_CONNECTION_REFUSED_PSM 0x0002 #define BT_CONNECTION_REFUSED_RESOURCES 0x0004 - + #define BT_CONFIGURATION_SUCCESSFUL 0x0000 #define BT_CONFIGURATION_REJECTED 0x0002 #define BT_CONFIGURATION_UNKNOWNOPTIONS 0x0003 - + #define BT_CONFIG_OPTION_MTU 1 - + /* Type Defines: */ /** Bluetooth ACL header structure, common to all ACL data packets. */ typedef struct @@ -104,7 +104,7 @@ uint16_t PayloadLength; /**< Size of the data payload, in bytes */ uint16_t DestinationChannel; /**< Destination channel in the device the data is directed to */ } BT_DataPacket_Header_t; - + /** Bluetooth signaling command header structure, for all ACL packets containing a signaling command. */ typedef struct { @@ -112,7 +112,7 @@ uint8_t Identifier; /**< Unique signal command identifier to link requests and responses */ uint16_t Length; /**< Length of the signaling command data, in bytes */ } BT_Signal_Header_t; - + /** Connection Request signaling command structure, for channel connection requests. */ typedef struct { @@ -135,13 +135,13 @@ uint16_t DestinationChannel; /**< Destination channel address which is to be disconnected */ uint16_t SourceChannel; /**< Source channel address which is to be disconnected */ } BT_Signal_DisconnectionReq_t; - + /** Disconnection response signaling command structure, for responses to channel disconnection requests. */ typedef struct { uint16_t DestinationChannel; /**< Destination channel address which was disconnected */ uint16_t SourceChannel; /**< Source channel address which was disconnected */ - } BT_Signal_DisconnectionResp_t; + } BT_Signal_DisconnectionResp_t; /** Configuration Request signaling command structure, for channel configuration requests. */ typedef struct @@ -163,14 +163,14 @@ { uint16_t InfoType; /**< Data type that is being requested, a BT_INFOREQ_* mask value */ } BT_Signal_InformationReq_t; - + /** Information Response signaling command structure, for responses to information requests. */ typedef struct { uint16_t InfoType; /**< Data type that was requested, a BT_INFOREQ_* mask value */ uint16_t Result; /**< Result of the request, a BT_INFORMATION_* mask value */ } BT_Signal_InformationResp_t; - + /** Configuration Option header structure, placed at the start of each option in a Channel Configuration * request's options list. */ @@ -182,7 +182,7 @@ /* Function Prototypes: */ void Bluetooth_ACLTask(void); - + #if defined(INCLUDE_FROM_BLUETOOTH_ACLPACKETS_C) static void Bluetooth_ProcessIncomingACLPackets(void); @@ -195,5 +195,6 @@ static inline void Bluetooth_Signal_EchoReq(const BT_Signal_Header_t* const SignalCommandHeader); static inline void Bluetooth_Signal_InformationReq(const BT_Signal_Header_t* const SignalCommandHeader); #endif - + #endif + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothClassCodes.h b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothClassCodes.h index c4690f4a8..f0699373d 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothClassCodes.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothClassCodes.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -46,7 +46,7 @@ #define DEVICE_CLASS_SERVICE_AUDIO (1UL << 21) #define DEVICE_CLASS_SERVICE_TELEPHONY (1UL << 22) #define DEVICE_CLASS_SERVICE_INFORMATION (1UL << 23) - + #define DEVICE_CLASS_MAJOR_MISC (0x00 << 8) #define DEVICE_CLASS_MAJOR_COMPUTER (0x01 << 8) #define DEVICE_CLASS_MAJOR_PHONE (0x02 << 8) @@ -63,7 +63,7 @@ #define DEVICE_CLASS_MINOR_COMPUTER_HANDHELD (0x04 << 2) #define DEVICE_CLASS_MINOR_COMPUTER_PALM (0x05 << 2) #define DEVICE_CLASS_MINOR_COMPUTER_WEARABLE (0x06 << 2) - + #define DEVICE_CLASS_MINOR_PHONE_UNCATEGORIZED (0x00 << 2) #define DEVICE_CLASS_MINOR_PHONE_CELLULAR (0x01 << 2) #define DEVICE_CLASS_MINOR_PHONE_CORDLESS (0x02 << 2) @@ -79,7 +79,7 @@ #define DEVICE_CLASS_MINOR_LAN_67_TO_83_PC_UTILIZED (0x05 << 5) #define DEVICE_CLASS_MINOR_LAN_83_TO_99_PC_UTILIZED (0x06 << 5) #define DEVICE_CLASS_MINOR_LAN_NO_SERVICE_AVAILABLE (0x07 << 5) - + #define DEVICE_CLASS_MINOR_AV_UNCATEGORIZED (0x00 << 2) #define DEVICE_CLASS_MINOR_AV_HEADSET (0x01 << 2) #define DEVICE_CLASS_MINOR_AV_HANDSFREE (0x02 << 2) @@ -97,7 +97,7 @@ #define DEVICE_CLASS_MINOR_AV_DISPLAY_AND_LOUDSPEAKER (0x0F << 2) #define DEVICE_CLASS_MINOR_AV_VIDEO_CONFERENCING (0x10 << 2) #define DEVICE_CLASS_MINOR_AV_GAMING_TOY (0x12 << 2) - + #define DEVICE_CLASS_MINOR_PERIPHERAL_KEYBOARD (0x01 << 6) #define DEVICE_CLASS_MINOR_PERIPHERAL_POINTING (0x02 << 6) #define DEVICE_CLASS_MINOR_PERIPHERAL_COMBO (0x03 << 6) @@ -115,3 +115,4 @@ #define DEVICE_CLASS_MINOR_IMAGING_PRINTER (1 << 7) #endif + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.c b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.c index 7f6f8b78d..0cf18f21c 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -59,28 +59,28 @@ void Bluetooth_HCITask(void) case Bluetooth_ProcessEvents: Pipe_SelectPipe(BLUETOOTH_EVENTS_PIPE); Pipe_Unfreeze(); - + if (Pipe_IsReadWriteAllowed()) { BT_HCIEvent_Header_t HCIEventHeader; /* Read in the event header to fetch the event code and payload length */ Pipe_Read_Stream_LE(&HCIEventHeader, sizeof(HCIEventHeader)); - + /* Create a temporary buffer for the event parameters */ uint8_t EventParams[HCIEventHeader.ParameterLength]; /* Read in the event parameters into the temporary buffer */ Pipe_Read_Stream_LE(&EventParams, HCIEventHeader.ParameterLength); Pipe_ClearIN(); - + BT_HCI_DEBUG(1, "Event Received (0x%02X)", HCIEventHeader.EventCode); switch (HCIEventHeader.EventCode) { case EVENT_COMMAND_COMPLETE: BT_HCI_DEBUG(1, "<< Command Complete"); - + /* Check which operation was completed in case we need to process the even parameters */ switch (((BT_HCIEvent_CommandComplete_t*)&EventParams)->Opcode) { @@ -91,7 +91,7 @@ void Bluetooth_HCITask(void) sizeof(Bluetooth_State.LocalBDADDR)); break; } - + Bluetooth_State.CurrentHCIState = Bluetooth_State.NextHCIState; break; case EVENT_COMMAND_STATUS: @@ -110,7 +110,7 @@ void Bluetooth_HCITask(void) memcpy(Bluetooth_TempDeviceAddress, &((BT_HCIEvent_ConnectionRequest_t*)&EventParams)->RemoteAddress, sizeof(Bluetooth_TempDeviceAddress)); - + bool IsACLConnection = (((BT_HCIEvent_ConnectionRequest_t*)&EventParams)->LinkType == 0x01); /* Only accept the connection if it is a ACL (data) connection, a device is not already connected @@ -135,12 +135,12 @@ void Bluetooth_HCITask(void) break; case EVENT_LINK_KEY_REQUEST: BT_HCI_DEBUG(1, "<< Link Key Request"); - + /* Need to store the remote device's BT address in a temporary buffer for later use */ memcpy(Bluetooth_TempDeviceAddress, &((BT_HCIEvent_LinkKeyReq_t*)&EventParams)->RemoteAddress, - sizeof(Bluetooth_TempDeviceAddress)); - + sizeof(Bluetooth_TempDeviceAddress)); + Bluetooth_State.CurrentHCIState = Bluetooth_Conn_SendLinkKeyNAK; break; case EVENT_CONNECTION_COMPLETE: @@ -155,22 +155,22 @@ void Bluetooth_HCITask(void) /* Store the created connection handle and indicate that the connection has been established */ Bluetooth_Connection.ConnectionHandle = ((BT_HCIEvent_ConnectionComplete_t*)&EventParams)->ConnectionHandle; Bluetooth_Connection.IsConnected = true; - - Bluetooth_ConnectionComplete(); + + Bluetooth_ConnectionComplete(); break; case EVENT_DISCONNECTION_COMPLETE: BT_HCI_DEBUG(1, "<< Disconnection Complete"); /* Device disconnected, indicate connection information no longer valid */ Bluetooth_Connection.IsConnected = false; - + Bluetooth_DisconnectionComplete(); break; } } - + Pipe_Freeze(); - + break; case Bluetooth_Init: BT_HCI_DEBUG(1, "# Init"); @@ -180,7 +180,7 @@ void Bluetooth_HCITask(void) /* Reset the connection information structure to destroy any previous connection state */ memset(&Bluetooth_Connection, 0x00, sizeof(Bluetooth_Connection)); - Bluetooth_State.CurrentHCIState = Bluetooth_Init_Reset; + Bluetooth_State.CurrentHCIState = Bluetooth_Init_Reset; break; case Bluetooth_Init_Reset: BT_HCI_DEBUG(1, "# Reset"); @@ -193,13 +193,13 @@ void Bluetooth_HCITask(void) /* Send the command to reset the Bluetooth dongle controller */ Bluetooth_SendHCICommand(&HCICommandHeader, NULL, 0); - + Bluetooth_State.NextHCIState = Bluetooth_Init_ReadBufferSize; Bluetooth_State.CurrentHCIState = Bluetooth_ProcessEvents; break; case Bluetooth_Init_ReadBufferSize: BT_HCI_DEBUG(1, "# Read Buffer Size"); - + HCICommandHeader = (BT_HCICommand_Header_t) { OpCode: (OGF_CTRLR_INFORMATIONAL | OCF_CTRLR_INFORMATIONAL_READBUFFERSIZE), @@ -214,7 +214,7 @@ void Bluetooth_HCITask(void) break; case Bluetooth_Init_GetBDADDR: BT_HCI_DEBUG(1, "# Get BDADDR"); - + HCICommandHeader = (BT_HCICommand_Header_t) { OpCode: (OGF_CTRLR_INFORMATIONAL | OCF_CTRLR_INFORMATIONAL_READBDADDR), @@ -267,10 +267,10 @@ void Bluetooth_HCITask(void) }; uint8_t Interval = BT_SCANMODE_InquiryAndPageScans; - + /* Send the command to set the remote device scanning mode */ Bluetooth_SendHCICommand(&HCICommandHeader, &Interval, 1); - + Bluetooth_State.NextHCIState = Bluetooth_Init_FinalizeInit; Bluetooth_State.CurrentHCIState = Bluetooth_ProcessEvents; break; @@ -301,7 +301,7 @@ void Bluetooth_HCITask(void) /* Send the command to accept the remote connection request */ Bluetooth_SendHCICommand(&HCICommandHeader, &AcceptConnectionParams, sizeof(BT_HCICommand_AcceptConnectionReq_t)); - + Bluetooth_State.CurrentHCIState = Bluetooth_ProcessEvents; break; case Bluetooth_Conn_RejectConnection: @@ -321,7 +321,7 @@ void Bluetooth_HCITask(void) /* Send the command to reject the remote connection request */ Bluetooth_SendHCICommand(&HCICommandHeader, &RejectConnectionParams, sizeof(BT_HCICommand_RejectConnectionReq_t)); - + Bluetooth_State.CurrentHCIState = Bluetooth_ProcessEvents; break; case Bluetooth_Conn_SendPINCode: @@ -339,7 +339,7 @@ void Bluetooth_HCITask(void) memcpy(PINCodeRequestParams.RemoteAddress, Bluetooth_TempDeviceAddress, sizeof(PINCodeRequestParams.RemoteAddress)); PINCodeRequestParams.PINCodeLength = strlen(Bluetooth_DeviceConfiguration.PINCode); memcpy(PINCodeRequestParams.PINCode, Bluetooth_DeviceConfiguration.PINCode, sizeof(PINCodeRequestParams.PINCode)); - + /* Send the command to transmit the device's local PIN number for authentication */ Bluetooth_SendHCICommand(&HCICommandHeader, &PINCodeRequestParams, sizeof(BT_HCICommand_PinCodeResp_t)); @@ -392,14 +392,15 @@ static uint8_t Bluetooth_SendHCICommand(const BT_HCICommand_Header_t* const HCIC /* Copy over the HCI command header to the allocated buffer */ memcpy(CommandBuffer, HCICommandHeader, sizeof(BT_HCICommand_Header_t)); - + /* Zero out the parameter section of the response so that all padding bytes are known to be zero */ memset(&CommandBuffer[sizeof(BT_HCICommand_Header_t)], 0x00, HCICommandHeader->ParameterLength); /* Copy over the command parameters (if any) to the command buffer - note, the number of actual source parameter bytes may differ to those in the header; any difference in length is filled with 0x00 padding bytes */ memcpy(&CommandBuffer[sizeof(BT_HCICommand_Header_t)], Parameters, ParameterLength); - + Pipe_SelectPipe(PIPE_CONTROLPIPE); return USB_Host_SendControlRequest(CommandBuffer); } + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.h b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.h index 9476446f6..90074e841 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -82,7 +82,7 @@ #define OCF_CTRLR_BASEBAND_WRITE_AUTHENTICATION_ENABLE 0x0020 #define OCF_CTRLR_INFORMATIONAL_READBUFFERSIZE 0x0005 #define OCF_CTRLR_INFORMATIONAL_READBDADDR 0x0009 - + #define EVENT_COMMAND_STATUS 0x0F #define EVENT_COMMAND_COMPLETE 0x0E #define EVENT_CONNECTION_COMPLETE 0x03 @@ -91,10 +91,10 @@ #define EVENT_REMOTE_NAME_REQUEST_COMPLETE 0x07 #define EVENT_PIN_CODE_REQUEST 0x16 #define EVENT_LINK_KEY_REQUEST 0x17 - + #define ERROR_LIMITED_RESOURCES 0x0D #define ERROR_UNACCEPTABLE_BDADDR 0x0F - + /* Type Defines: */ typedef struct { @@ -115,7 +115,7 @@ uint8_t Packets; uint16_t OpCode; } BT_HCIEvent_CommandStatus_t; - + typedef struct { uint8_t HCIPacketsAllowable; @@ -139,7 +139,7 @@ uint8_t LinkType; uint8_t EncryptionEnabled; } BT_HCIEvent_ConnectionComplete_t; - + typedef struct { uint8_t RemoteAddress[6]; @@ -149,7 +149,7 @@ { uint8_t RemoteAddress[6]; } BT_HCIEvent_LinkKeyReq_t; - + typedef struct { uint8_t RemoteAddress[6]; @@ -161,18 +161,18 @@ uint8_t PINCodeLength; char PINCode[16]; } BT_HCICommand_PinCodeResp_t; - + typedef struct { uint8_t RemoteAddress[6]; uint8_t SlaveRole; } BT_HCICommand_AcceptConnectionReq_t; - + typedef struct { uint8_t RemoteAddress[6]; uint8_t Reason; - } BT_HCICommand_RejectConnectionReq_t; + } BT_HCICommand_RejectConnectionReq_t; /* Enums: */ enum BT_ScanEnable_Modes_t @@ -199,14 +199,15 @@ Bluetooth_Conn_SendPINCode = 11, Bluetooth_Conn_SendLinkKeyNAK = 12, }; - + /* Function Prototypes: */ void Bluetooth_HCITask(void); - + #if defined(INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C) static uint8_t Bluetooth_SendHCICommand(const BT_HCICommand_Header_t* const HCICommandHeader, const void* Parameters, const uint16_t ParameterLength); #endif - + #endif + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.c b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.c index 1fa8079f3..d85b1f983 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -71,3 +71,4 @@ void Bluetooth_Stack_USBTask(void) Bluetooth_HCITask(); Bluetooth_ACLTask(); } + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h index e434e6c4f..9483198c7 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -38,12 +38,12 @@ /* Includes: */ #include <LUFA/Drivers/USB/USB.h> - + #include "../ConfigDescriptor.h" - + /* Macros: */ #define BLUETOOTH_MAX_OPEN_CHANNELS 6 - + #define CHANNEL_PSM_SDP 0x0001 #define CHANNEL_PSM_UDP 0x0002 #define CHANNEL_PSM_RFCOMM 0x0003 @@ -53,13 +53,13 @@ #define CHANNEL_PSM_HTTP 0x000C #define CHANNEL_PSM_UPNP 0x0010 #define CHANNEL_PSM_HIDP 0x0011 - + #define CHANNEL_SEARCH_LOCALNUMBER 0 #define CHANNEL_SEARCH_REMOTENUMBER 1 #define CHANNEL_SEARCH_PSM 2 - + #define MAXIMUM_CHANNEL_MTU 255 - + /* Enums: */ /** Enum for the possible states for a Bluetooth ACL channel. */ enum BT_ChannelStates_t @@ -117,7 +117,7 @@ Bluetooth_Channel_t Channels[BLUETOOTH_MAX_OPEN_CHANNELS]; /**< Channel information structures for the connection. */ uint8_t SignalingIdentifier; /**< Next Signaling Channel unique command sequence identifier. */ } Bluetooth_Connection_t; - + /** Local Bluetooth device information structure, for the defining of local device characteristics for the Bluetooth stack. */ typedef struct { @@ -125,7 +125,7 @@ char PINCode[16]; /**< Pin code required to send or receive in order to authenticate with a remote device. */ char Name[]; /**< Name of the local Bluetooth device, up to 248 characters. */ } Bluetooth_Device_t; - + /** Bluetooth stack state information structure, for the containment of the Bluetooth stack state. The values in * this structure are set by the Bluetooth stack internally, and should all be treated as read only by the user * application. @@ -139,12 +139,12 @@ */ uint8_t LocalBDADDR[6]; /**< Local Bluetooth adapter's BDADDR, valid when the stack is fully initialized. */ } Bluetooth_Stack_State_t; - + /* Includes: */ #include "BluetoothHCICommands.h" - #include "BluetoothACLPackets.h" - - /* Function Prototypes: */ + #include "BluetoothACLPackets.h" + + /* Function Prototypes: */ void Bluetooth_Stack_Init(void); void Bluetooth_Stack_USBTask(void); @@ -171,3 +171,4 @@ extern Bluetooth_Stack_State_t Bluetooth_State; #endif + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c index 2638dee35..636b5a454 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -124,7 +124,7 @@ void RFCOMM_ProcessPacket(void* Data, const RFCOMM_Header_t* FrameHeader = (const RFCOMM_Header_t*)Data; const uint8_t* FrameData = (const uint8_t*)Data + sizeof(RFCOMM_Header_t); uint16_t FrameDataLen = RFCOMM_GetVariableFieldValue(&FrameData); - + /* Decode the RFCOMM frame type from the header */ switch (FrameHeader->Control & ~FRAME_POLL_FINAL) { @@ -167,7 +167,7 @@ void RFCOMM_SendChannelSignals(const RFCOMM_Channel_t* const RFCOMMChannel, uint8_t Length; RFCOMM_MSC_Parameters_t Params; } MSCommand; - + MSCommand.CommandHeader = (RFCOMM_Command_t){.Command = RFCOMM_Control_ModemStatus, .EA = true, .CR = true}; MSCommand.Length = (sizeof(MSCommand.Params) << 1) | 0x01; MSCommand.Params.Channel = (RFCOMM_Address_t){.DLCI = RFCOMMChannel->DLCI, .EA = true, .CR = true}; @@ -175,7 +175,7 @@ void RFCOMM_SendChannelSignals(const RFCOMM_Channel_t* const RFCOMMChannel, MSCommand.Params.BreakSignal = RFCOMMChannel->Local.BreakSignal; /* Send the MSC command to the remote device */ - RFCOMM_SendFrame(RFCOMM_CONTROL_DLCI, true, RFCOMM_Frame_UIH, sizeof(MSCommand), &MSCommand, ACLChannel); + RFCOMM_SendFrame(RFCOMM_CONTROL_DLCI, true, RFCOMM_Frame_UIH, sizeof(MSCommand), &MSCommand, ACLChannel); } /** Sends new data through an open logical RFCOMM channel. This should be used to transmit data through a @@ -193,12 +193,12 @@ void RFCOMM_SendData(const uint16_t DataLen, { if (RFCOMMChannel->State != RFCOMM_Channel_Open) return; - + BT_RFCOMM_DEBUG(1, ">> UIH Frame"); BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", RFCOMMChannel->DLCI); /* Send the MSC command to the remote device */ - RFCOMM_SendFrame(RFCOMMChannel->DLCI, false, RFCOMM_Frame_UIH, DataLen, Data, ACLChannel); + RFCOMM_SendFrame(RFCOMMChannel->DLCI, false, RFCOMM_Frame_UIH, DataLen, Data, ACLChannel); } RFCOMM_Channel_t* RFCOMM_GetFreeChannelEntry(const uint8_t DLCI) @@ -220,11 +220,11 @@ RFCOMM_Channel_t* RFCOMM_GetFreeChannelEntry(const uint8_t DLCI) RFCOMMChannel->Local.Signals = RFCOMM_SIGNAL_RTC | RFCOMM_SIGNAL_RTR | RFCOMM_SIGNAL_DV | (1 << 0); RFCOMMChannel->Local.BreakSignal = 0 | (1 << 0); RFCOMMChannel->ConfigFlags = 0; - + return RFCOMMChannel; } } - + return NULL; } @@ -234,7 +234,7 @@ RFCOMM_Channel_t* RFCOMM_GetChannelData(const uint8_t DLCI) for (uint8_t i = 0; i < RFCOMM_MAX_OPEN_CHANNELS; i++) { RFCOMM_Channel_t* CurrRFCOMMChannel = &RFCOMM_Channels[i]; - + /* If the current non-closed channel's DLCI matches the search DLCI, return it to the caller */ if ((CurrRFCOMMChannel->State != RFCOMM_Channel_Closed) && (CurrRFCOMMChannel->DLCI == DLCI)) return CurrRFCOMMChannel; @@ -248,10 +248,10 @@ uint16_t RFCOMM_GetVariableFieldValue(const uint8_t** BufferPos) { uint8_t FirstOctet; uint8_t SecondOctet = 0; - + FirstOctet = **BufferPos; (*BufferPos)++; - + /* If the field size is more than a single byte, fetch the next byte in the variable length field */ if (!(FirstOctet & 0x01)) { @@ -281,30 +281,30 @@ void RFCOMM_SendFrame(const uint8_t DLCI, uint8_t Data[DataLen]; uint8_t FCS; } ResponsePacket; - + /* Set the frame header values to the specified address and frame type */ ResponsePacket.FrameHeader.Control = Control; ResponsePacket.FrameHeader.Address = (RFCOMM_Address_t){.DLCI = DLCI, .EA = true, .CR = CommandResponse}; - + /* Set the lower 7 bits of the packet length */ ResponsePacket.Size[0] = (DataLen << 1); - + /* Terminate the size field if size is 7 bits or lower, otherwise set the upper 8 bits of the length */ if (DataLen < 128) ResponsePacket.Size[0] |= 0x01; else ResponsePacket.Size[1] = (DataLen >> 7); - + /* Copy over the packet data from the source buffer to the response packet buffer */ memcpy(ResponsePacket.Data, Data, DataLen); - + /* Determine the length of the frame which is to be used to calculate the CRC value */ uint8_t CRCLength = sizeof(ResponsePacket.FrameHeader); /* UIH frames do not have the CRC calculated on the Size field in the response, all other frames do */ if ((Control & ~FRAME_POLL_FINAL) != RFCOMM_Frame_UIH) CRCLength += sizeof(ResponsePacket.Size); - + /* Calculate the frame checksum from the appropriate fields */ ResponsePacket.FCS = RFCOMM_GetFCSValue(&ResponsePacket, CRCLength); @@ -316,7 +316,7 @@ static uint8_t RFCOMM_GetFCSValue(const void* FrameStart, uint8_t Length) { uint8_t FCS = 0xFF; - + /* Calculate new Frame CRC value via the given data bytes and the CRC table */ for (uint8_t i = 0; i < Length; i++) FCS = pgm_read_byte(&CRC8_Table[FCS ^ ((const uint8_t*)FrameStart)[i]]); @@ -338,7 +338,7 @@ static void RFCOMM_ProcessDISC(const RFCOMM_Address_t* const FrameAddress, BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameAddress->DLCI); RFCOMM_Channel_t* RFCOMMChannel = RFCOMM_GetChannelData(FrameAddress->DLCI); - + /* If the requested channel is currently open, destroy it */ if (RFCOMMChannel != NULL) RFCOMMChannel->State = RFCOMM_Channel_Closed; @@ -356,7 +356,7 @@ static void RFCOMM_ProcessSABM(const RFCOMM_Address_t* const FrameAddress, if (FrameAddress->DLCI == RFCOMM_CONTROL_DLCI) { BT_RFCOMM_DEBUG(1, ">> UA Sent"); - + /* Free channel found, or request was to the control channel - accept SABM by sending a UA frame */ RFCOMM_SendFrame(FrameAddress->DLCI, true, (RFCOMM_Frame_UA | FRAME_POLL_FINAL), 0, NULL, ACLChannel); @@ -365,7 +365,7 @@ static void RFCOMM_ProcessSABM(const RFCOMM_Address_t* const FrameAddress, /* Find the existing channel's entry in the channel table */ RFCOMM_Channel_t* RFCOMMChannel = RFCOMM_GetChannelData(FrameAddress->DLCI); - + /* Existing entry not found, create a new entry for the channel */ if (RFCOMMChannel == NULL) RFCOMMChannel = RFCOMM_GetFreeChannelEntry(FrameAddress->DLCI); @@ -374,7 +374,7 @@ static void RFCOMM_ProcessSABM(const RFCOMM_Address_t* const FrameAddress, if (RFCOMMChannel != NULL) { BT_RFCOMM_DEBUG(1, ">> UA Sent"); - + /* Free channel found, or request was to the control channel - accept SABM by sending a UA frame */ RFCOMM_SendFrame(FrameAddress->DLCI, true, (RFCOMM_Frame_UA | FRAME_POLL_FINAL), 0, NULL, ACLChannel); } @@ -395,7 +395,7 @@ static void RFCOMM_ProcessUA(const RFCOMM_Address_t* const FrameAddress, } static void RFCOMM_ProcessUIH(const RFCOMM_Address_t* const FrameAddress, - const uint16_t FrameLength, + const uint16_t FrameLength, const uint8_t* FrameData, Bluetooth_Channel_t* const ACLChannel) { @@ -408,9 +408,10 @@ static void RFCOMM_ProcessUIH(const RFCOMM_Address_t* const FrameAddress, BT_RFCOMM_DEBUG(1, "<< UIH Received"); BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameAddress->DLCI); BT_RFCOMM_DEBUG(2, "-- Length 0x%02X", FrameLength); - + RFCOMM_Channel_t* RFCOMMChannel = RFCOMM_GetChannelData(FrameAddress->DLCI); - + if (RFCOMMChannel != NULL) RFCOMM_DataReceived(RFCOMMChannel, FrameLength, FrameData); } + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.h b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.h index 7b74f4fab..be862a2b3 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -48,13 +48,13 @@ #include "BluetoothStack.h" #include "RFCOMMControl.h" - + /* Macros: */ #define BT_RFCOMM_DEBUG(l, s, ...) do { if (RFCOMM_DEBUG_LEVEL >= l) printf_P(PSTR("(RFCOMM) " s "\r\n"), ##__VA_ARGS__); } while (0) #define RFCOMM_DEBUG_LEVEL 0 - + #define FRAME_POLL_FINAL (1 << 4) - + #define RFCOMM_CONTROL_DLCI 0 #define RFCOMM_MAX_OPEN_CHANNELS 5 @@ -68,14 +68,14 @@ RFCOMM_Frame_UA = 0x63, /**< Unnumbered Acknowledgement Field */ RFCOMM_Frame_UIH = 0xEF, /**< Unnumbered Information with Header check Field */ }; - + enum RFCOMM_Channel_States_t { RFCOMM_Channel_Closed = 0, RFCOMM_Channel_Configure = 1, RFCOMM_Channel_Open = 2, }; - + /* Type Defines: */ typedef struct { @@ -95,7 +95,7 @@ uint8_t BreakSignal; } Local; } RFCOMM_Channel_t; - + /* External Variables: */ extern RFCOMM_Channel_t RFCOMM_Channels[RFCOMM_MAX_OPEN_CHANNELS]; @@ -104,7 +104,7 @@ void RFCOMM_ServiceChannels(Bluetooth_Channel_t* const ACLChannel); void RFCOMM_ProcessPacket(void* Data, Bluetooth_Channel_t* const ACLChannel); - + void RFCOMM_SendChannelSignals(const RFCOMM_Channel_t* const RFCOMMChannel, Bluetooth_Channel_t* const ACLChannel); void RFCOMM_SendData(const uint16_t DataLen, @@ -141,9 +141,10 @@ static void RFCOMM_ProcessUA(const RFCOMM_Address_t* const FrameAddress, Bluetooth_Channel_t* const ACLChannel); static void RFCOMM_ProcessUIH(const RFCOMM_Address_t* const FrameAddress, - const uint16_t FrameLength, + const uint16_t FrameLength, const uint8_t* FrameData, Bluetooth_Channel_t* const ACLChannel); #endif - + #endif + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMMControl.c b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMMControl.c index 5bd884572..871d3627f 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMMControl.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMMControl.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -69,7 +69,7 @@ void RFCOMM_ProcessControlCommand(const uint8_t* Command, RFCOMM_ProcessDPNCommand(CommandHeader, CommandData, ACLChannel); break; default: - BT_RFCOMM_DEBUG(1, "<< Unknown Command"); + BT_RFCOMM_DEBUG(1, "<< Unknown Command"); break; } } @@ -82,7 +82,7 @@ static void RFCOMM_ProcessTestCommand(const RFCOMM_Command_t* const CommandHeade const uint8_t* Params = (const uint8_t*)CommandData; BT_RFCOMM_DEBUG(1, "<< TEST Command"); - + struct { RFCOMM_Command_t CommandHeader; @@ -94,7 +94,7 @@ static void RFCOMM_ProcessTestCommand(const RFCOMM_Command_t* const CommandHeade TestResponse.CommandHeader = (RFCOMM_Command_t){.Command = RFCOMM_Control_Test, .EA = true, .CR = false}; TestResponse.Length = (CommandDataLen << 1) | 0x01; memcpy(TestResponse.TestData, Params, CommandDataLen); - + BT_RFCOMM_DEBUG(1, ">> TEST Response"); /* Send the PDN response to acknowledge the command */ @@ -124,14 +124,14 @@ static void RFCOMM_ProcessMSCCommand(const RFCOMM_Command_t* const CommandHeader BT_RFCOMM_DEBUG(1, "<< MSC %s", (CommandHeader->CR) ? "Command" : "Response"); BT_RFCOMM_DEBUG(2, "-- DLCI: 0x%02X", Params->Channel.DLCI); - + /* Ignore status flags sent to the control channel */ if (Params->Channel.DLCI == RFCOMM_CONTROL_DLCI) return; - + /* Retrieve existing channel configuration data, if already opened */ - RFCOMM_Channel_t* RFCOMMChannel = RFCOMM_GetChannelData(Params->Channel.DLCI); - + RFCOMM_Channel_t* RFCOMMChannel = RFCOMM_GetChannelData(Params->Channel.DLCI); + /* If the channel does not exist, abort */ if (RFCOMMChannel == NULL) return; @@ -140,16 +140,16 @@ static void RFCOMM_ProcessMSCCommand(const RFCOMM_Command_t* const CommandHeader if (CommandHeader->CR) { /* Save the new channel signals to the channel state structure */ - RFCOMMChannel->Remote.Signals = Params->Signals; + RFCOMMChannel->Remote.Signals = Params->Signals; RFCOMMChannel->ConfigFlags |= RFCOMM_CONFIG_REMOTESIGNALS; - + /* If the command contains the optional break signals field, store the value */ if (CommandDataLen == sizeof(RFCOMM_MSC_Parameters_t)) RFCOMMChannel->Remote.BreakSignal = Params->BreakSignal; /* Notify the user application that the signals have been received */ RFCOMM_ChannelSignalsReceived(RFCOMMChannel); - + struct { RFCOMM_Command_t CommandHeader; @@ -172,7 +172,7 @@ static void RFCOMM_ProcessMSCCommand(const RFCOMM_Command_t* const CommandHeader { /* Indicate that the remote device has acknowledged the sent signals */ RFCOMMChannel->ConfigFlags |= RFCOMM_CONFIG_LOCALSIGNALS; - } + } } static void RFCOMM_ProcessRPNCommand(const RFCOMM_Command_t* const CommandHeader, @@ -197,20 +197,20 @@ static void RFCOMM_ProcessDPNCommand(const RFCOMM_Command_t* const CommandHeader BT_RFCOMM_DEBUG(1, "<< DPN Command"); BT_RFCOMM_DEBUG(2, "-- DLCI: 0x%02X", Params->DLCI); - + /* Ignore parameter negotiations to the control channel */ if (Params->DLCI == RFCOMM_CONTROL_DLCI) return; - + /* Retrieve existing channel configuration data, if already opened */ RFCOMM_Channel_t* RFCOMMChannel = RFCOMM_GetChannelData(Params->DLCI); - + /* Check if the channel has no corresponding entry - remote did not open it first */ if (RFCOMMChannel == NULL) { /* Create a new entry in the channel table for the new channel */ RFCOMMChannel = RFCOMM_GetFreeChannelEntry(Params->DLCI); - + /* No free entry was found, discard the request */ if (RFCOMMChannel == NULL) { @@ -218,27 +218,28 @@ static void RFCOMM_ProcessDPNCommand(const RFCOMM_Command_t* const CommandHeader return; } } - + /* Save the new channel configuration */ RFCOMMChannel->State = RFCOMM_Channel_Configure; RFCOMMChannel->Priority = Params->Priority; RFCOMMChannel->MTU = Params->MaximumFrameSize; - + struct { RFCOMM_Command_t CommandHeader; uint8_t Length; RFCOMM_DPN_Parameters_t Params; } DPNResponse; - + /* Fill out the DPN response data */ DPNResponse.CommandHeader = (RFCOMM_Command_t){.Command = RFCOMM_Control_DLCParameterNegotiation, .EA = true, .CR = false}; DPNResponse.Length = (sizeof(DPNResponse.Params) << 1) | 0x01; memcpy(&DPNResponse.Params, Params, sizeof(RFCOMM_DPN_Parameters_t)); DPNResponse.Params.ConvergenceLayer = 0x00; // TODO: Enable credit based transaction support - + BT_RFCOMM_DEBUG(1, ">> DPN Response"); /* Send the DPN response to acknowledge the command */ RFCOMM_SendFrame(RFCOMM_CONTROL_DLCI, false, RFCOMM_Frame_UIH, sizeof(DPNResponse), &DPNResponse, ACLChannel); } + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMMControl.h b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMMControl.h index b527bfa7c..b65e0d5a0 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMMControl.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMMControl.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -48,14 +48,14 @@ #include "BluetoothStack.h" #include "RFCOMM.h" - + /* Macros: */ #define RFCOMM_SIGNAL_FC (1 << 1) #define RFCOMM_SIGNAL_RTC (1 << 2) #define RFCOMM_SIGNAL_RTR (1 << 3) #define RFCOMM_SIGNAL_IC (1 << 6) #define RFCOMM_SIGNAL_DV (1 << 7) - + #define RFCOMM_CONFIG_REMOTESIGNALS (1 << 0) #define RFCOMM_CONFIG_LOCALSIGNALS (1 << 1) #define RFCOMM_CONFIG_LOCALSIGNALSSENT (1 << 2) @@ -73,7 +73,7 @@ RFCOMM_Control_DLCParameterNegotiation = (0x80 >> 2), RFCOMM_Control_NonSupportedCommand = (0x10 >> 2), }; - + /* Type Defines: */ typedef struct { @@ -94,7 +94,7 @@ unsigned char CR : 1; unsigned char Command : 6; } RFCOMM_Command_t; - + typedef struct { uint8_t DLCI; @@ -104,9 +104,9 @@ uint8_t ACKTimerTicks; uint16_t MaximumFrameSize; uint8_t MaxRetransmissions; - uint8_t RecoveryWindowSize; + uint8_t RecoveryWindowSize; } RFCOMM_DPN_Parameters_t; - + typedef struct { RFCOMM_Address_t Channel; @@ -120,7 +120,7 @@ #if defined(INCLUDE_FROM_RFCOMM_CONTROL_C) static void RFCOMM_ProcessTestCommand(const RFCOMM_Command_t* const CommandHeader, - const uint8_t CommandDataLen, + const uint8_t CommandDataLen, const uint8_t* CommandData, Bluetooth_Channel_t* const ACLChannel); static void RFCOMM_ProcessFCECommand(const RFCOMM_Command_t* const CommandHeader, @@ -143,5 +143,6 @@ const uint8_t* CommandData, Bluetooth_Channel_t* const ACLChannel); #endif - + #endif + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.c b/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.c index 19d42e264..3c1acfe28 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -73,7 +73,7 @@ void SDP_ProcessPacket(void* Data, Bluetooth_Channel_t* const Channel) { case SDP_PDU_SERVICESEARCHREQUEST: SDP_ProcessServiceSearch(SDPHeader, Channel); - break; + break; case SDP_PDU_SERVICEATTRIBUTEREQUEST: SDP_ProcessServiceAttribute(SDPHeader, Channel); break; @@ -99,11 +99,11 @@ static void SDP_ProcessServiceSearch(const SDP_PDUHeader_t* const SDPHeader, uint8_t UUIDList[12][UUID_SIZE_BYTES]; uint8_t TotalUUIDs = SDP_GetUUIDList(UUIDList, &CurrentParameter); BT_SDP_DEBUG(2, "-- Total UUIDs: %d", TotalUUIDs); - + /* Retrieve the maximum service record response count from the request */ uint16_t MaxServiceRecordCount = SDP_ReadData16(&CurrentParameter); BT_SDP_DEBUG(2, "-- Max Return Service Count: 0x%04X", MaxServiceRecordCount); - + struct { SDP_PDUHeader_t SDPHeader; @@ -111,7 +111,7 @@ static void SDP_ProcessServiceSearch(const SDP_PDUHeader_t* const SDPHeader, uint16_t CurrentServiceRecordCount; uint8_t ResponseData[100]; } ResponsePacket; - + uint8_t AddedServiceHandles = 0; /* Create a pointer to the buffer to indicate the current location for response data to be added */ @@ -136,7 +136,7 @@ static void SDP_ProcessServiceSearch(const SDP_PDUHeader_t* const SDPHeader, uint8_t AttrSize = SDP_GetLocalAttributeContainerSize(AttributeValue, &AttrHeaderSize); memcpy_P(CurrResponsePos, AttributeValue + AttrHeaderSize, AttrSize); CurrResponsePos += AttrHeaderSize + AttrSize; - + AddedServiceHandles++; } @@ -180,11 +180,11 @@ static void SDP_ProcessServiceAttribute(const SDP_PDUHeader_t* const SDPHeader, /* Retrieve the service handle whose attributes are to be examined */ uint32_t ServiceHandle = SDP_ReadData32(&CurrentParameter); BT_SDP_DEBUG(2, "-- Service Handle: 0x%08lX", ServiceHandle); - + /* Retrieve the maximum Attribute response size from the request */ uint16_t MaxAttributeSize = SDP_ReadData16(&CurrentParameter); BT_SDP_DEBUG(2, "-- Max Return Attribute Bytes: 0x%04X", MaxAttributeSize); - + /* Retrieve the list of Attributes from the request */ uint16_t AttributeList[8][2]; uint8_t TotalAttributes = SDP_GetAttributeList(AttributeList, &CurrentParameter); @@ -211,24 +211,24 @@ static void SDP_ProcessServiceAttribute(const SDP_PDUHeader_t* const SDPHeader, { /* Read in a pointer to the current UUID table entry's Attribute table */ ServiceAttributeTable_t* CurrAttributeTable = pgm_read_ptr(&SDP_Services_Table[CurrTableItem]); - + /* Retrieve a PROGMEM pointer to the value of the Service Record Handle */ const void* ServiceRecord = SDP_GetAttributeValue(CurrAttributeTable, SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE); - + /* Get the size of the header for the Service Record Handle */ uint8_t AttrHeaderSize; SDP_GetLocalAttributeContainerSize(ServiceRecord, &AttrHeaderSize); - + /* Retrieve the endian-swapped service handle of the current service being examined */ uint32_t CurrServiceHandle = SwapEndian_32(pgm_read_dword(ServiceRecord + AttrHeaderSize)); - + /* Check if the current service in the service table has the requested service handle */ if (ServiceHandle == CurrServiceHandle) { /* Add the listed attributes for the found UUID to the response */ TotalResponseSize = SDP_AddListedAttributesToResponse(CurrAttributeTable, AttributeList, TotalAttributes, &CurrResponsePos); - + /* Requested service found, abort the search through the service table */ break; } @@ -243,7 +243,7 @@ static void SDP_ProcessServiceAttribute(const SDP_PDUHeader_t* const SDPHeader, /* Calculate the total parameter length that is to be sent, including the fixed return parameters, the created attribute value list and the SDP continuation state */ uint16_t ParamLength = (sizeof(ResponsePacket.AttributeListByteCount) + TotalResponseSize + sizeof(uint8_t)); - + /* Fill in the response packet's header */ ResponsePacket.SDPHeader.PDU = SDP_PDU_SERVICEATTRIBUTERESPONSE; ResponsePacket.SDPHeader.TransactionID = SDPHeader->TransactionID; @@ -265,30 +265,30 @@ static void SDP_ProcessServiceSearchAttribute(const SDP_PDUHeader_t* const SDPHe Bluetooth_Channel_t* const Channel) { const void* CurrentParameter = ((const void*)SDPHeader + sizeof(SDP_PDUHeader_t)); - + BT_SDP_DEBUG(1, "<< Service Search Attribute"); /* Retrieve the list of search UUIDs from the request */ uint8_t UUIDList[12][UUID_SIZE_BYTES]; uint8_t TotalUUIDs = SDP_GetUUIDList(UUIDList, &CurrentParameter); BT_SDP_DEBUG(2, "-- Total UUIDs: %d", TotalUUIDs); - + /* Retrieve the maximum Attribute response size from the request */ uint16_t MaxAttributeSize = SDP_ReadData16(&CurrentParameter); BT_SDP_DEBUG(2, "-- Max Return Attribute Bytes: 0x%04X", MaxAttributeSize); - + /* Retrieve the list of Attributes from the request */ uint16_t AttributeList[8][2]; uint8_t TotalAttributes = SDP_GetAttributeList(AttributeList, &CurrentParameter); BT_SDP_DEBUG(2, "-- Total Attributes: %d", TotalAttributes); - + struct { SDP_PDUHeader_t SDPHeader; uint16_t AttributeListByteCount; uint8_t ResponseData[100]; } ResponsePacket; - + /* Create a pointer to the buffer to indicate the current location for response data to be added */ void* CurrResponsePos = ResponsePacket.ResponseData; @@ -298,7 +298,7 @@ static void SDP_ProcessServiceSearchAttribute(const SDP_PDUHeader_t* const SDPHe /* Add the outer Data Element Sequence header for all of the retrieved Attributes */ uint16_t* TotalResponseSize = SDP_AddSequence16(&CurrResponsePos); - + /* Search through the global service list an item at a time */ for (uint8_t CurrTableItem = 0; CurrTableItem < (sizeof(SDP_Services_Table) / sizeof(void*)); CurrTableItem++) { @@ -307,14 +307,14 @@ static void SDP_ProcessServiceSearchAttribute(const SDP_PDUHeader_t* const SDPHe if (!(SDP_SearchServiceTable(UUIDList, TotalUUIDs, CurrAttributeTable))) continue; - + BT_SDP_DEBUG(2, " -- Found search match in table"); /* Add the listed attributes for the found UUID to the response */ - *TotalResponseSize += SDP_AddListedAttributesToResponse(CurrAttributeTable, AttributeList, TotalAttributes, + *TotalResponseSize += SDP_AddListedAttributesToResponse(CurrAttributeTable, AttributeList, TotalAttributes, &CurrResponsePos); } - + /* Continuation state - always zero */ SDP_WriteData8(&CurrResponsePos, 0); @@ -323,7 +323,7 @@ static void SDP_ProcessServiceSearchAttribute(const SDP_PDUHeader_t* const SDPHe /* Calculate the total parameter length that is to be sent, including the fixed return parameters, the created attribute value list and the SDP continuation state */ - uint16_t ParamLength = (sizeof(ResponsePacket.AttributeListByteCount) + + uint16_t ParamLength = (sizeof(ResponsePacket.AttributeListByteCount) + (3 + *TotalResponseSize) + sizeof(uint8_t)); @@ -366,7 +366,7 @@ static uint16_t SDP_AddListedAttributesToResponse(const ServiceAttributeTable_t* { uint16_t* AttributeIDRange = AttributeList[CurrAttribute]; void* AttributeValue; - + /* Look through the current service's attribute list, examining all the attributes */ while ((AttributeValue = pgm_read_ptr(&AttributeTable->Data)) != NULL) { @@ -377,9 +377,9 @@ static uint16_t SDP_AddListedAttributesToResponse(const ServiceAttributeTable_t* if ((CurrAttributeID >= AttributeIDRange[0]) && (CurrAttributeID <= AttributeIDRange[1])) { /* Increment the current UUID's returned Attribute container size by the number of added bytes */ - *AttributeListSize += SDP_AddAttributeToResponse(CurrAttributeID, AttributeValue, BufferPos); + *AttributeListSize += SDP_AddAttributeToResponse(CurrAttributeID, AttributeValue, BufferPos); } - + AttributeTable++; } } @@ -408,19 +408,19 @@ static uint16_t SDP_AddAttributeToResponse(const uint16_t AttributeID, /* Retrieve the size of the attribute value from its container header */ uint8_t AttributeHeaderLength; uint16_t AttributeValueLength = SDP_GetLocalAttributeContainerSize(AttributeValue, &AttributeHeaderLength); - + BT_SDP_DEBUG(2, " -- Add Attribute (0x%04X) 0x%04X", (AttributeHeaderLength + AttributeValueLength), AttributeID); /* Add a Data Element header to the response for the Attribute ID */ SDP_WriteData8(ResponseBuffer, (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit)); - + /* Add the Attribute ID to the created Data Element */ SDP_WriteData16(ResponseBuffer, AttributeID); - + /* Copy over the Attribute value Data Element container to the response */ memcpy_P(*ResponseBuffer, AttributeValue, AttributeHeaderLength + AttributeValueLength); *ResponseBuffer += AttributeHeaderLength + AttributeValueLength; - + return (sizeof(uint8_t) + sizeof(uint16_t) + AttributeHeaderLength + AttributeValueLength); } @@ -435,17 +435,17 @@ static void* SDP_GetAttributeValue(const ServiceAttributeTable_t* AttributeTable const uint16_t AttributeID) { void* CurrTableItemData; - + /* Search through the current Attribute table, abort when the terminator item has been reached */ while ((CurrTableItemData = pgm_read_ptr(&AttributeTable->Data)) != NULL) { /* Check if the current Attribute ID matches the search ID - if so return a pointer to it */ if (pgm_read_word(&AttributeTable->AttributeID) == AttributeID) return CurrTableItemData; - + AttributeTable++; } - + return NULL; } @@ -463,7 +463,7 @@ static bool SDP_SearchServiceTable(uint8_t UUIDList[][UUID_SIZE_BYTES], { const void* CurrAttribute; uint16_t UUIDMatchFlags = 0; - + /* Search through the current attribute table, checking each attribute value for UUID matches */ while ((CurrAttribute = pgm_read_ptr(&CurrAttributeTable->Data)) != NULL) { @@ -475,7 +475,7 @@ static bool SDP_SearchServiceTable(uint8_t UUIDList[][UUID_SIZE_BYTES], uint8_t UUIDMatches; for (UUIDMatches = 0; UUIDMatchFlags; UUIDMatches++) UUIDMatchFlags &= (UUIDMatchFlags - 1); - + /* If all UUIDs have been matched to the current service, return true */ return (UUIDMatches == TotalUUIDs); } @@ -501,7 +501,7 @@ static void SDP_CheckUUIDMatch(uint8_t UUIDList[][UUID_SIZE_BYTES], if (CurrAttributeType == SDP_DATATYPE_UUID) { uint16_t CurrUUIDMatchMask = (1 << 0); - + /* Look for matches in the UUID list against the current attribute UUID value */ for (uint8_t i = 0; i < TotalUUIDs; i++) { @@ -512,7 +512,7 @@ static void SDP_CheckUUIDMatch(uint8_t UUIDList[][UUID_SIZE_BYTES], *UUIDMatchFlags |= CurrUUIDMatchMask; break; } - + CurrUUIDMatchMask <<= 1; } } @@ -520,15 +520,15 @@ static void SDP_CheckUUIDMatch(uint8_t UUIDList[][UUID_SIZE_BYTES], { uint8_t SequenceHeaderSize; uint16_t SequenceSize = SDP_GetLocalAttributeContainerSize(CurrAttribute, &SequenceHeaderSize); - + CurrAttribute += SequenceHeaderSize; - + /* Recursively unwrap the sequence container, and re-search its contents for UUIDs */ while (SequenceSize) { uint8_t InnerHeaderSize; uint16_t InnerSize = SDP_GetLocalAttributeContainerSize(CurrAttribute, &InnerHeaderSize); - + /* Recursively search of the next element in the sequence, trying to match UUIDs with the UUID list */ SDP_CheckUUIDMatch(UUIDList, TotalUUIDs, UUIDMatchFlags, CurrAttribute); @@ -536,10 +536,10 @@ static void SDP_CheckUUIDMatch(uint8_t UUIDList[][UUID_SIZE_BYTES], SequenceSize -= InnerHeaderSize + InnerSize; CurrAttribute += InnerHeaderSize + InnerSize; } - } + } } -/** Reads in the collection of Attribute ranges from the input buffer's Data Element Sequence container, into the given +/** Reads in the collection of Attribute ranges from the input buffer's Data Element Sequence container, into the given * Attribute list for later use. Once complete, the input buffer pointer is advanced to the end of the Attribute container. * * \param[out] AttributeList Pointer to a buffer where the list of Attribute ranges are to be stored @@ -561,10 +561,10 @@ static uint8_t SDP_GetAttributeList(uint16_t AttributeList[][2], /* Retrieve the size of the next Attribute in the container and get a pointer to the next free Attribute element in the list */ uint16_t* CurrentAttributeRange = AttributeList[TotalAttributes++]; uint8_t AttributeLength = SDP_GetDataElementSize(CurrentParameter, &ElementHeaderSize); - + /* Copy over the starting Attribute ID and (if it the current element is a range) the ending Attribute ID */ memcpy(&CurrentAttributeRange[0], *CurrentParameter, AttributeLength); - + /* If the element is not an Attribute Range, copy over the starting ID to the ending ID to make a range of 1 */ if (AttributeLength == 2) CurrentAttributeRange[1] = CurrentAttributeRange[0]; @@ -574,15 +574,15 @@ static uint8_t SDP_GetAttributeList(uint16_t AttributeList[][2], CurrentAttributeRange[1] = SwapEndian_16(CurrentAttributeRange[1]); BT_SDP_DEBUG(2, "-- Attribute: 0x%04X-0x%04X", CurrentAttributeRange[0], CurrentAttributeRange[1]); - + AttributeIDListLength -= (AttributeLength + ElementHeaderSize); *CurrentParameter += AttributeLength; } - + return TotalAttributes; } -/** Reads in the collection of UUIDs from the input buffer's Data Element Sequence container, into the given +/** Reads in the collection of UUIDs from the input buffer's Data Element Sequence container, into the given * UUID list for later use. Once complete, the input buffer pointer is advanced to the end of the UUID container. * * \param[out] UUIDList Pointer to a buffer where the list of UUIDs are to be stored @@ -604,7 +604,7 @@ static uint8_t SDP_GetUUIDList(uint8_t UUIDList[][UUID_SIZE_BYTES], /* Retrieve the size of the next UUID in the container and get a pointer to the next free UUID element in the list */ uint8_t* CurrentUUID = UUIDList[TotalUUIDs++]; uint8_t UUIDLength = SDP_GetDataElementSize(CurrentParameter, &ElementHeaderSize); - + /* Copy over UUID from the container to the free slot */ if (UUIDLength <= 4) { @@ -617,9 +617,9 @@ static uint8_t SDP_GetUUIDList(uint8_t UUIDList[][UUID_SIZE_BYTES], else { /* Copy over full UUID */ - memcpy(CurrentUUID, *CurrentParameter, UUIDLength); + memcpy(CurrentUUID, *CurrentParameter, UUIDLength); } - + BT_SDP_DEBUG(2, "-- UUID (%d): %02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", UUIDLength, CurrentUUID[0], CurrentUUID[1], CurrentUUID[2], CurrentUUID[3], @@ -631,7 +631,7 @@ static uint8_t SDP_GetUUIDList(uint8_t UUIDList[][UUID_SIZE_BYTES], ServicePatternLength -= (UUIDLength + ElementHeaderSize); *CurrentParameter += UUIDLength; } - + return TotalUUIDs; } @@ -647,7 +647,7 @@ static uint32_t SDP_GetLocalAttributeContainerSize(const void* const AttributeDa { /* Fetch the size of the Data Element structure from the header */ uint8_t SizeIndex = (pgm_read_byte(AttributeData) & 0x07); - + uint32_t ElementValueSize; /* Convert the Data Element size index into a size in bytes */ @@ -686,7 +686,7 @@ static uint32_t SDP_GetDataElementSize(const void** const DataElementHeader, uint8_t* const ElementHeaderSize) { /* Fetch the size of the Data Element structure from the header, increment the current buffer pos */ - uint8_t SizeIndex = (SDP_ReadData8(DataElementHeader) & 0x07); + uint8_t SizeIndex = (SDP_ReadData8(DataElementHeader) & 0x07); uint32_t ElementValueSize; @@ -710,6 +710,7 @@ static uint32_t SDP_GetDataElementSize(const void** const DataElementHeader, ElementValueSize = (1 << SizeIndex); break; } - + return ElementValueSize; } + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.h b/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.h index 2df8c225d..733889a4d 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -48,11 +48,11 @@ #include "BluetoothStack.h" #include "SDPServices.h" - + /* Macros: */ #define BT_SDP_DEBUG(l, s, ...) do { if (SDP_DEBUG_LEVEL >= l) printf_P(PSTR("(SDP) " s "\r\n"), ##__VA_ARGS__); } while (0) #define SDP_DEBUG_LEVEL 0 - + #define SDP_PDU_ERRORRESPONSE 0x01 #define SDP_PDU_SERVICESEARCHREQUEST 0x02 #define SDP_PDU_SERVICESEARCHRESPONSE 0x03 @@ -103,7 +103,7 @@ uint16_t TransactionID; /**< Unique transaction ID number to associate requests and responses */ uint16_t ParameterLength; /**< Length of the data following the SDP header */ } SDP_PDUHeader_t; - + /* Inline Functions: */ /** Writes 8 bits of raw data to the given buffer, incrementing the buffer position afterwards. * @@ -116,7 +116,7 @@ *((uint8_t*)*BufferPos) = Data; *BufferPos += sizeof(uint8_t); } - + /** Writes 16 bits of raw data to the given buffer, incrementing the buffer position afterwards. * * \param[in, out] BufferPos Current position in the buffer where the data is to be written to @@ -127,7 +127,7 @@ { *((uint16_t*)*BufferPos) = SwapEndian_16(Data); *BufferPos += sizeof(uint16_t); - } + } /** Writes 32 bits of raw data to the given buffer, incrementing the buffer position afterwards. * @@ -151,7 +151,7 @@ { uint8_t Data = *((const uint8_t*)*BufferPos); *BufferPos += sizeof(uint8_t); - + return Data; } @@ -165,7 +165,7 @@ { uint16_t Data = SwapEndian_16(*((const uint16_t*)*BufferPos)); *BufferPos += sizeof(uint16_t); - + return Data; } @@ -179,13 +179,13 @@ { uint32_t Data = SwapEndian_32(*((const uint32_t*)*BufferPos)); *BufferPos += sizeof(uint32_t); - + return Data; } - /** Adds a new Data Element Sequence container with a 16-bit size header to the buffer. The buffer + /** Adds a new Data Element Sequence container with a 16-bit size header to the buffer. The buffer * pointer's position is advanced past the added header once the element has been added. The returned - * size header value is pre-zeroed out so that it can be incremented as data is placed into the Data + * size header value is pre-zeroed out so that it can be incremented as data is placed into the Data * Element Sequence container. * * The total added size of the container header is three bytes, regardless of the size of its contents @@ -199,12 +199,12 @@ { SDP_WriteData8(BufferPos, (SDP_DATASIZE_Variable16Bit | SDP_DATATYPE_Sequence)); - uint16_t* SizePos = *BufferPos; + uint16_t* SizePos = *BufferPos; SDP_WriteData16(BufferPos, 0); return SizePos; } - + /* Function Prototypes: */ void SDP_ProcessPacket(void* Data, Bluetooth_Channel_t* const Channel); @@ -247,3 +247,4 @@ #endif #endif + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c b/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c index 93f5519fe..9f7855e63 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -181,3 +181,4 @@ const ServiceAttributeTable_t PROGMEM SerialPort_Attribute_Table[] = SERVICE_ATTRIBUTE_TABLE_TERMINATOR }; + diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h b/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h index afa8e0024..3ec95c4d1 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -35,22 +35,22 @@ #ifndef _SDPSERVICES_H_ #define _SDPSERVICES_H_ - + /* Includes: */ #include "SDP.h" /* Macros: */ /** Size of a full 128 bit UUID, in bytes. */ #define UUID_SIZE_BYTES 16 - + /** First 80 bits common to all standardized Bluetooth services. */ #define BASE_80BIT_UUID 0x0000, 0x0010, 0x0080, {0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB} - + #define RFCOMM_UUID {SWAPENDIAN_32(0x00000003), BASE_80BIT_UUID} #define L2CAP_UUID {SWAPENDIAN_32(0x00000100), BASE_80BIT_UUID} #define SP_CLASS_UUID {SWAPENDIAN_32(0x00001101), BASE_80BIT_UUID} #define PUBLICBROWSEGROUP_CLASS_UUID {SWAPENDIAN_32(0x00001002), BASE_80BIT_UUID} - + #define SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE 0x0000 #define SDP_ATTRIBUTE_ID_SERVICECLASSIDS 0x0001 #define SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST 0x0004 @@ -58,10 +58,10 @@ #define SDP_ATTRIBUTE_ID_LANGUAGEBASEATTROFFSET 0x0006 #define SDP_ATTRIBUTE_ID_SERVICENAME 0x0100 #define SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION 0x0101 - + /** Terminator for a service attribute table of type \ref ServiceAttributeTable_t. */ #define SERVICE_ATTRIBUTE_TABLE_TERMINATOR {.Data = NULL} - + /* Type Defines: */ /** Type define for a UUID value structure. This struct can be used to hold full 128-bit UUIDs. */ typedef struct @@ -72,7 +72,7 @@ uint16_t D; /**< Bits 64-79 of the UUID. */ uint8_t E[6]; /**< Bits 80-128 of the UUID. */ } UUID_t; - + /** Structure for the association of attribute ID values to an attribute value in FLASH. A table of these * structures can then be built up for each supported UUID service within the device. * @@ -111,7 +111,7 @@ uint8_t Header; /**< Data Element header, should be (SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit) */ UUID_t UUID; /**< UUID to store in the list Data Element */ } ItemUUID_t; - + /** Structure for a list of Data Elements Sequences containing UUID Data Elements, for service attributes requiring * protocol lists. */ @@ -119,7 +119,7 @@ { uint8_t Header; /**< Data Element header, should be (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit) */ uint8_t Size; /**< Size of the inner Data Element sequence */ - + struct { ItemUUID_t UUID; /**< UUID to store in the protocol list Data Element sequence */ @@ -133,14 +133,14 @@ { uint8_t Header; /**< Data Element header, should be (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit) */ uint8_t Size; /**< Size of the inner Data Element sequence */ - + struct { ItemUUID_t UUID; /**< UUID to store in the protocol list Data Element sequence */ Item8Bit_t Param; /**< 8-Bit Parameter associated with the service */ } Protocol; } ItemProtocol_8BitParam_t; - + /** Structure for a list of Data Elements Sequences containing UUID Data Elements and an 16-bit param value, for service * attributes requiring extended protocol lists containing an 16-bit value. */ @@ -148,7 +148,7 @@ { uint8_t Header; /**< Data Element header, should be (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit) */ uint8_t Size; /**< Size of the inner Data Element sequence */ - + struct { ItemUUID_t UUID; /**< UUID to store in the protocol list Data Element sequence */ @@ -165,9 +165,10 @@ Item16Bit_t EncodingID; /**< Encoding used for the current language */ Item16Bit_t OffsetID; /**< Attribute offset added to all strings using this language within the service */ } ItemLangEncoding_t; - + /* External Variables: */ extern const ServiceAttributeTable_t SerialPort_Attribute_Table[]; extern const ServiceAttributeTable_t PnP_Attribute_Table[]; - + #endif + |