X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/f6e84eabce461aa3e80638f6ce3e6eaba492216e..ec537fd84d6ad3fd0dfa1b55efa2c2d554c1db48:/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c index 0f9d63cff..ac7895112 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c @@ -1,21 +1,21 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com + www.lufa-lib.org */ /* 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 @@ -65,10 +65,10 @@ const uint8_t CRC8_Table[256] PROGMEM = RFCOMM_Channel_t RFCOMM_Channels[RFCOMM_MAX_OPEN_CHANNELS]; -/** Initializes the RFCOMM service, ready for new connections from a SDP client. */ +/** Initialises the RFCOMM service, ready for new connections from a SDP client. */ void RFCOMM_Initialize(void) { - /* Reset the RFCOMM channel structures, to invalidate any confiured RFCOMM channels */ + /* Reset the RFCOMM channel structures, to invalidate any configured RFCOMM channels */ for (uint8_t i = 0; i < RFCOMM_MAX_OPEN_CHANNELS; i++) RFCOMM_Channels[i].State = RFCOMM_Channel_Closed; } @@ -115,15 +115,16 @@ void RFCOMM_ServiceChannels(Bluetooth_Channel_t* const ACLChannel) /** Processes an incoming RFCOMM packet on an ACL channel which has been previously opened between the local and * a remote device to handle RFCOMM traffic. * - * \param[in] Data Incomming packet data containing the RFCOMM packet + * \param[in] Data Incoming packet data containing the RFCOMM packet * \param[in] ACLChannel ACL channel the request was issued to by the remote device */ -void RFCOMM_ProcessPacket(void* Data, Bluetooth_Channel_t* const ACLChannel) +void RFCOMM_ProcessPacket(void* Data, + Bluetooth_Channel_t* const ACLChannel) { 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) { @@ -154,7 +155,8 @@ void RFCOMM_ProcessPacket(void* Data, Bluetooth_Channel_t* const ACLChannel) * \param[in] RFCOMMChannel RFCOMM logical channel whose local terminal signals have changed * \param[in] ACLChannel ACL channel which has been opened to carry RFCOMM traffic between devices */ -void RFCOMM_SendChannelSignals(const RFCOMM_Channel_t* const RFCOMMChannel, Bluetooth_Channel_t* const ACLChannel) +void RFCOMM_SendChannelSignals(const RFCOMM_Channel_t* const RFCOMMChannel, + Bluetooth_Channel_t* const ACLChannel) { BT_RFCOMM_DEBUG(1, ">> MSC Command"); BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", RFCOMMChannel->DLCI); @@ -165,7 +167,7 @@ void RFCOMM_SendChannelSignals(const RFCOMM_Channel_t* const RFCOMMChannel, Blue 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}; @@ -173,7 +175,7 @@ void RFCOMM_SendChannelSignals(const RFCOMM_Channel_t* const RFCOMMChannel, Blue 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 @@ -184,17 +186,19 @@ void RFCOMM_SendChannelSignals(const RFCOMM_Channel_t* const RFCOMMChannel, Blue * \param[in] RFCOMMChannel RFCOMM logical channel which is to be transmitted to * \param[in] ACLChannel ACL channel which has been opened to carry RFCOMM traffic between devices */ -void RFCOMM_SendData(const uint16_t DataLen, const uint8_t* Data, const RFCOMM_Channel_t* const RFCOMMChannel, +void RFCOMM_SendData(const uint16_t DataLen, + const uint8_t* Data, + const RFCOMM_Channel_t* const RFCOMMChannel, Bluetooth_Channel_t* const ACLChannel) { 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) @@ -216,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; } @@ -230,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; @@ -244,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)) { @@ -259,12 +263,16 @@ uint16_t RFCOMM_GetVariableFieldValue(const uint8_t** BufferPos) (*BufferPos)++; } - /* Bitshift the bytes that comprise the variable length field so that they form a single integer */ + /* Bit-shift the bytes that comprise the variable length field so that they form a single integer */ return (((uint16_t)SecondOctet << 7) | FirstOctet >> 1); } -void RFCOMM_SendFrame(const uint8_t DLCI, const bool CommandResponse, const uint8_t Control, const uint16_t DataLen, - const void* Data, Bluetooth_Channel_t* const ACLChannel) +void RFCOMM_SendFrame(const uint8_t DLCI, + const bool CommandResponse, + const uint8_t Control, + const uint16_t DataLen, + const void* Data, + Bluetooth_Channel_t* const ACLChannel) { struct { @@ -273,30 +281,30 @@ void RFCOMM_SendFrame(const uint8_t DLCI, const bool CommandResponse, const uint 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); @@ -304,10 +312,11 @@ void RFCOMM_SendFrame(const uint8_t DLCI, const bool CommandResponse, const uint Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), ACLChannel); } -static uint8_t RFCOMM_GetFCSValue(const void* FrameStart, uint8_t Length) +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]]); @@ -315,19 +324,21 @@ static uint8_t RFCOMM_GetFCSValue(const void* FrameStart, uint8_t Length) return ~FCS; } -static void RFCOMM_ProcessDM(const RFCOMM_Address_t* const FrameAddress, Bluetooth_Channel_t* const ACLChannel) +static void RFCOMM_ProcessDM(const RFCOMM_Address_t* const FrameAddress, + Bluetooth_Channel_t* const ACLChannel) { BT_RFCOMM_DEBUG(1, "<< DM Received"); BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameAddress->DLCI); } -static void RFCOMM_ProcessDISC(const RFCOMM_Address_t* const FrameAddress, Bluetooth_Channel_t* const ACLChannel) +static void RFCOMM_ProcessDISC(const RFCOMM_Address_t* const FrameAddress, + Bluetooth_Channel_t* const ACLChannel) { BT_RFCOMM_DEBUG(1, "<< DISC Received"); 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; @@ -336,7 +347,8 @@ static void RFCOMM_ProcessDISC(const RFCOMM_Address_t* const FrameAddress, Bluet RFCOMM_SendFrame(FrameAddress->DLCI, true, (RFCOMM_Frame_UA | FRAME_POLL_FINAL), 0, NULL, ACLChannel); } -static void RFCOMM_ProcessSABM(const RFCOMM_Address_t* const FrameAddress, Bluetooth_Channel_t* const ACLChannel) +static void RFCOMM_ProcessSABM(const RFCOMM_Address_t* const FrameAddress, + Bluetooth_Channel_t* const ACLChannel) { BT_RFCOMM_DEBUG(1, "<< SABM Received"); BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameAddress->DLCI); @@ -344,7 +356,7 @@ static void RFCOMM_ProcessSABM(const RFCOMM_Address_t* const FrameAddress, Bluet 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); @@ -353,7 +365,7 @@ static void RFCOMM_ProcessSABM(const RFCOMM_Address_t* const FrameAddress, Bluet /* 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); @@ -362,7 +374,7 @@ static void RFCOMM_ProcessSABM(const RFCOMM_Address_t* const FrameAddress, Bluet 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); } @@ -375,14 +387,17 @@ static void RFCOMM_ProcessSABM(const RFCOMM_Address_t* const FrameAddress, Bluet } } -static void RFCOMM_ProcessUA(const RFCOMM_Address_t* const FrameAddress, Bluetooth_Channel_t* const ACLChannel) +static void RFCOMM_ProcessUA(const RFCOMM_Address_t* const FrameAddress, + Bluetooth_Channel_t* const ACLChannel) { BT_RFCOMM_DEBUG(1, "<< UA Received"); BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameAddress->DLCI); } -static void RFCOMM_ProcessUIH(const RFCOMM_Address_t* const FrameAddress, const uint16_t FrameLength, - const uint8_t* FrameData, Bluetooth_Channel_t* const ACLChannel) +static void RFCOMM_ProcessUIH(const RFCOMM_Address_t* const FrameAddress, + const uint16_t FrameLength, + const uint8_t* FrameData, + Bluetooth_Channel_t* const ACLChannel) { if (FrameAddress->DLCI == RFCOMM_CONTROL_DLCI) { @@ -393,9 +408,10 @@ static void RFCOMM_ProcessUIH(const RFCOMM_Address_t* const FrameAddress, const 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); } +