Updated all host mode demos and projects to use the EVENT_USB_Host_DeviceEnumerationC...
[pub/USBasp.git] / Demos / Host / Incomplete / BluetoothHost / Lib / BluetoothHCICommands.c
index f678ecb..35bfcdd 100644 (file)
@@ -1,21 +1,21 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
-              
+     Copyright (C) Dean Camera, 2011.
+
   dean [at] fourwalledcubicle [dot] com
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2011  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
   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
   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
   software without specific, written prior permission.
 
   The author disclaim all warranties with regard to this
   this software.
 */
 
   this software.
 */
 
+/** \file
+ *
+ *  Bluetooth HCI layer management code. This module manages the overall
+ *  Bluetooth stack connection state to and from other devices, processes
+ *  received events from the Bluetooth controller, and issues commands to
+ *  modify the controller's configuration, such as the broadcast name of the
+ *  device.
+ */
+
 /*
        TODO: Add local to remote device connections
  */
 /*
        TODO: Add local to remote device connections
  */
@@ -35,7 +44,7 @@
 #define  INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C
 #include "BluetoothHCICommands.h"
 
 #define  INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C
 #include "BluetoothHCICommands.h"
 
-/** Temporary Bluetooth Device Address, for HCI responses which much include the detination address */
+/** Temporary Bluetooth Device Address, for HCI responses which much include the destination address */
 static uint8_t Bluetooth_TempDeviceAddress[6];
 
 /** Bluetooth HCI processing task. This task should be called repeatedly the main Bluetooth
 static uint8_t Bluetooth_TempDeviceAddress[6];
 
 /** Bluetooth HCI processing task. This task should be called repeatedly the main Bluetooth
@@ -50,28 +59,28 @@ void Bluetooth_HCITask(void)
                case Bluetooth_ProcessEvents:
                        Pipe_SelectPipe(BLUETOOTH_EVENTS_PIPE);
                        Pipe_Unfreeze();
                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 */
                        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));
-                               
+                               Pipe_Read_Stream_LE(&HCIEventHeader, sizeof(HCIEventHeader), NULL);
+
                                /* Create a temporary buffer for the event parameters */
                                uint8_t EventParams[HCIEventHeader.ParameterLength];
 
                                /* Read in the event parameters into the temporary buffer */
                                /* 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_Read_Stream_LE(&EventParams, HCIEventHeader.ParameterLength, NULL);
                                Pipe_ClearIN();
                                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");
                                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)
                                                {
                                                /* Check which operation was completed in case we need to process the even parameters */
                                                switch (((BT_HCIEvent_CommandComplete_t*)&EventParams)->Opcode)
                                                {
@@ -82,7 +91,7 @@ void Bluetooth_HCITask(void)
                                                                       sizeof(Bluetooth_State.LocalBDADDR));
                                                                break;
                                                }
                                                                       sizeof(Bluetooth_State.LocalBDADDR));
                                                                break;
                                                }
-                                               
+
                                                Bluetooth_State.CurrentHCIState = Bluetooth_State.NextHCIState;
                                                break;
                                        case EVENT_COMMAND_STATUS:
                                                Bluetooth_State.CurrentHCIState = Bluetooth_State.NextHCIState;
                                                break;
                                        case EVENT_COMMAND_STATUS:
@@ -101,7 +110,7 @@ void Bluetooth_HCITask(void)
                                                memcpy(Bluetooth_TempDeviceAddress,
                                                       &((BT_HCIEvent_ConnectionRequest_t*)&EventParams)->RemoteAddress,
                                                       sizeof(Bluetooth_TempDeviceAddress));
                                                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
                                                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
@@ -126,12 +135,12 @@ void Bluetooth_HCITask(void)
                                                break;
                                        case EVENT_LINK_KEY_REQUEST:
                                                BT_HCI_DEBUG(1, "<< Link Key Request");
                                                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,
                                                /* 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:
                                                Bluetooth_State.CurrentHCIState = Bluetooth_Conn_SendLinkKeyNAK;
                                                break;
                                        case EVENT_CONNECTION_COMPLETE:
@@ -146,24 +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;
                                                /* 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;
                                                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();
                                                Bluetooth_DisconnectionComplete();
-                                               
-                                               Bluetooth_State.CurrentHCIState = Bluetooth_Init;
                                                break;
                                }
                        }
                                                break;
                                }
                        }
-                       
+
                        Pipe_Freeze();
                        Pipe_Freeze();
-                       
+
                        break;
                case Bluetooth_Init:
                        BT_HCI_DEBUG(1, "# Init");
                        break;
                case Bluetooth_Init:
                        BT_HCI_DEBUG(1, "# Init");
@@ -173,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));
 
                        /* 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");
                        break;
                case Bluetooth_Init_Reset:
                        BT_HCI_DEBUG(1, "# Reset");
@@ -184,22 +191,22 @@ void Bluetooth_HCITask(void)
                                ParameterLength: 0,
                        };
 
                                ParameterLength: 0,
                        };
 
-                       /* Send the command to reset the bluetooth dongle controller */
+                       /* Send the command to reset the Bluetooth dongle controller */
                        Bluetooth_SendHCICommand(&HCICommandHeader, NULL, 0);
                        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");
                        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),
                                ParameterLength: 0,
                        };
 
                        HCICommandHeader = (BT_HCICommand_Header_t)
                        {
                                OpCode: (OGF_CTRLR_INFORMATIONAL | OCF_CTRLR_INFORMATIONAL_READBUFFERSIZE),
                                ParameterLength: 0,
                        };
 
-                       /* Send the command to read the bluetooth buffer size (mandatory before device sends any data) */
+                       /* Send the command to read the Bluetooth buffer size (mandatory before device sends any data) */
                        Bluetooth_SendHCICommand(&HCICommandHeader, NULL, 0);
 
                        Bluetooth_State.NextHCIState    = Bluetooth_Init_GetBDADDR;
                        Bluetooth_SendHCICommand(&HCICommandHeader, NULL, 0);
 
                        Bluetooth_State.NextHCIState    = Bluetooth_Init_GetBDADDR;
@@ -207,14 +214,14 @@ void Bluetooth_HCITask(void)
                        break;
                case Bluetooth_Init_GetBDADDR:
                        BT_HCI_DEBUG(1, "# Get BDADDR");
                        break;
                case Bluetooth_Init_GetBDADDR:
                        BT_HCI_DEBUG(1, "# Get BDADDR");
-               
+
                        HCICommandHeader = (BT_HCICommand_Header_t)
                        {
                                OpCode: (OGF_CTRLR_INFORMATIONAL | OCF_CTRLR_INFORMATIONAL_READBDADDR),
                                ParameterLength: 0,
                        };
 
                        HCICommandHeader = (BT_HCICommand_Header_t)
                        {
                                OpCode: (OGF_CTRLR_INFORMATIONAL | OCF_CTRLR_INFORMATIONAL_READBDADDR),
                                ParameterLength: 0,
                        };
 
-                       /* Send the command to retrieve the BDADDR of the inserted bluetooth dongle */
+                       /* Send the command to retrieve the BDADDR of the inserted Bluetooth dongle */
                        Bluetooth_SendHCICommand(&HCICommandHeader, NULL, 0);
 
                        Bluetooth_State.NextHCIState    = Bluetooth_Init_SetLocalName;
                        Bluetooth_SendHCICommand(&HCICommandHeader, NULL, 0);
 
                        Bluetooth_State.NextHCIState    = Bluetooth_Init_SetLocalName;
@@ -229,7 +236,7 @@ void Bluetooth_HCITask(void)
                                        ParameterLength: 248,
                                };
 
                                        ParameterLength: 248,
                                };
 
-                       /* Send the command to set the bluetooth dongle's name for other devices to see */
+                       /* Send the command to set the Bluetooth dongle's name for other devices to see */
                        Bluetooth_SendHCICommand(&HCICommandHeader, Bluetooth_DeviceConfiguration.Name, strlen(Bluetooth_DeviceConfiguration.Name));
 
                        Bluetooth_State.NextHCIState    = Bluetooth_Init_SetDeviceClass;
                        Bluetooth_SendHCICommand(&HCICommandHeader, Bluetooth_DeviceConfiguration.Name, strlen(Bluetooth_DeviceConfiguration.Name));
 
                        Bluetooth_State.NextHCIState    = Bluetooth_Init_SetDeviceClass;
@@ -260,10 +267,10 @@ void Bluetooth_HCITask(void)
                        };
 
                        uint8_t Interval = BT_SCANMODE_InquiryAndPageScans;
                        };
 
                        uint8_t Interval = BT_SCANMODE_InquiryAndPageScans;
-                       
+
                        /* Send the command to set the remote device scanning mode */
                        Bluetooth_SendHCICommand(&HCICommandHeader, &Interval, 1);
                        /* 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;
                        Bluetooth_State.NextHCIState    = Bluetooth_Init_FinalizeInit;
                        Bluetooth_State.CurrentHCIState = Bluetooth_ProcessEvents;
                        break;
@@ -294,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));
 
                        /* 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:
                        Bluetooth_State.CurrentHCIState = Bluetooth_ProcessEvents;
                        break;
                case Bluetooth_Conn_RejectConnection:
@@ -314,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));
 
                        /* 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:
                        Bluetooth_State.CurrentHCIState = Bluetooth_ProcessEvents;
                        break;
                case Bluetooth_Conn_SendPINCode:
@@ -332,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));
                        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));
 
                        /* Send the command to transmit the device's local PIN number for authentication */
                        Bluetooth_SendHCICommand(&HCICommandHeader, &PINCodeRequestParams, sizeof(BT_HCICommand_PinCodeResp_t));
 
@@ -367,7 +374,9 @@ void Bluetooth_HCITask(void)
  *
  *  \return A value from the USB_Host_SendControlErrorCodes_t enum.
  */
  *
  *  \return A value from the USB_Host_SendControlErrorCodes_t enum.
  */
-static uint8_t Bluetooth_SendHCICommand(const BT_HCICommand_Header_t* const HCICommandHeader, const void* Parameters, const uint16_t ParameterLength)
+static uint8_t Bluetooth_SendHCICommand(const BT_HCICommand_Header_t* const HCICommandHeader,
+                                        const void* Parameters,
+                                        const uint16_t ParameterLength)
 {
        /* Need to reserve the amount of bytes given in the header for the complete payload */
        uint8_t CommandBuffer[sizeof(BT_HCICommand_Header_t) + HCICommandHeader->ParameterLength];
 {
        /* Need to reserve the amount of bytes given in the header for the complete payload */
        uint8_t CommandBuffer[sizeof(BT_HCICommand_Header_t) + HCICommandHeader->ParameterLength];
@@ -383,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));
 
        /* 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);
        /* 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);
 }
        Pipe_SelectPipe(PIPE_CONTROLPIPE);
        return USB_Host_SendControlRequest(CommandBuffer);
 }
+