@ -28,43 +28,16 @@
this software .
this software .
*/
*/
# define INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C
# include "BluetoothHCICommands.h"
# include "BluetoothHCICommands.h"
static B luetooth _HCICommand_Header_t HCICommandHeader ;
static B T _HCICommand_Header_t HCICommandHeader ;
uint8_t Bluetooth_HCIProcessingState ;
uint8_t Bluetooth_HCIProcessingState ;
static uint8_t Bluetooth_HCINextState ;
static uint8_t Bluetooth_HCINextState ;
static uint8_t Bluetooth_TempDeviceAddress [ 6 ] ;
static uint8_t Bluetooth_TempDeviceAddress [ 6 ] ;
static uint8_t Bluetooth_SendHCICommand ( void * Parameters , uint16_t ParameterLength )
void Bluetooth_HCITask ( void )
{
/* Need to reserve the amount of bytes given in the header for the complete payload */
uint8_t CommandBuffer [ sizeof ( HCICommandHeader ) + HCICommandHeader . ParameterLength ] ;
USB_ControlRequest = ( USB_Request_Header_t )
{
. bmRequestType = ( REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_DEVICE ) ,
. bRequest = 0 ,
. wValue = 0 ,
. wIndex = 0 ,
. wLength = sizeof ( CommandBuffer )
} ;
/* Copy over the HCI command header to the allocated buffer */
memcpy ( CommandBuffer , & HCICommandHeader , sizeof ( HCICommandHeader ) ) ;
/* Zero out the parameter section of the response to ensure that any padding bytes do not expose private RAM contents */
memset ( & CommandBuffer [ sizeof ( HCICommandHeader ) ] , 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 ( HCICommandHeader ) ] , Parameters , ParameterLength ) ;
Pipe_SelectPipe ( PIPE_CONTROLPIPE ) ;
return USB_Host_SendControlRequest ( CommandBuffer ) ;
}
void Bluetooth_ProcessHCICommands ( void )
{
{
switch ( Bluetooth_HCIProcessingState )
switch ( Bluetooth_HCIProcessingState )
{
{
@ -74,7 +47,7 @@ void Bluetooth_ProcessHCICommands(void)
if ( Pipe_IsReadWriteAllowed ( ) )
if ( Pipe_IsReadWriteAllowed ( ) )
{
{
B luetooth _HCIEvent_Header_t HCIEventHeader ;
B T _HCIEvent_Header_t HCIEventHeader ;
/* Read in the event header to fetch the event code and payload length */
/* 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 ) ) ;
@ -93,16 +66,16 @@ void Bluetooth_ProcessHCICommands(void)
break ;
break ;
case EVENT_COMMAND_STATUS :
case EVENT_COMMAND_STATUS :
/* If the execution of a command failed, reset the stack */
/* If the execution of a command failed, reset the stack */
if ( ( ( B luetooth _HCIEvent_CommandStatus_t* ) & EventParams ) - > Status )
if ( ( ( B T _HCIEvent_CommandStatus_t* ) & EventParams ) - > Status )
Bluetooth_HCIProcessingState = Bluetooth_Init ;
Bluetooth_HCIProcessingState = Bluetooth_Init ;
break ;
break ;
case EVENT_CONNECTION_REQUEST :
case EVENT_CONNECTION_REQUEST :
/* Need to store the remote device's BT address in a temporary buffer for later use */
/* Need to store the remote device's BT address in a temporary buffer for later use */
memcpy ( Bluetooth_TempDeviceAddress ,
memcpy ( Bluetooth_TempDeviceAddress ,
& ( ( B luetooth _HCIEvent_ConnectionRequest_t* ) & EventParams ) - > RemoteAddress ,
& ( ( B T _HCIEvent_ConnectionRequest_t* ) & EventParams ) - > RemoteAddress ,
sizeof ( Bluetooth_TempDeviceAddress ) ) ;
sizeof ( Bluetooth_TempDeviceAddress ) ) ;
bool IsACLConnection = ( ( ( B luetooth _HCIEvent_ConnectionRequest_t* ) & EventParams ) - > LinkType = = 0x01 ) ;
bool IsACLConnection = ( ( ( B T _HCIEvent_ConnectionRequest_t* ) & EventParams ) - > LinkType = = 0x01 ) ;
/* Only accept the connection if it is a ACL (data) connection, a device is not already connected
/* Only accept the connection if it is a ACL (data) connection, a device is not already connected
and the user application has indicated that the connection should be allowed */
and the user application has indicated that the connection should be allowed */
@ -113,7 +86,7 @@ void Bluetooth_ProcessHCICommands(void)
case EVENT_PIN_CODE_REQUEST :
case EVENT_PIN_CODE_REQUEST :
/* Need to store the remote device's BT address in a temporary buffer for later use */
/* Need to store the remote device's BT address in a temporary buffer for later use */
memcpy ( Bluetooth_TempDeviceAddress ,
memcpy ( Bluetooth_TempDeviceAddress ,
& ( ( B luetooth_HCIEvent_PinCodeRequest _t* ) & EventParams ) - > RemoteAddress ,
& ( ( B T_HCIEvent_PinCodeReq _t* ) & EventParams ) - > RemoteAddress ,
sizeof ( Bluetooth_TempDeviceAddress ) ) ;
sizeof ( Bluetooth_TempDeviceAddress ) ) ;
Bluetooth_HCIProcessingState = Bluetooth_Conn_SendPINCode ;
Bluetooth_HCIProcessingState = Bluetooth_Conn_SendPINCode ;
@ -121,11 +94,11 @@ void Bluetooth_ProcessHCICommands(void)
case EVENT_CONNECTION_COMPLETE :
case EVENT_CONNECTION_COMPLETE :
/* Need to store the remote device's BT address in a temporary buffer for later use */
/* Need to store the remote device's BT address in a temporary buffer for later use */
memcpy ( Bluetooth_Connection . RemoteAddress ,
memcpy ( Bluetooth_Connection . RemoteAddress ,
& ( ( B luetooth _HCIEvent_ConnectionComplete_t* ) & EventParams ) - > RemoteAddress ,
& ( ( B T _HCIEvent_ConnectionComplete_t* ) & EventParams ) - > RemoteAddress ,
sizeof ( Bluetooth_TempDeviceAddress ) ) ;
sizeof ( Bluetooth_TempDeviceAddress ) ) ;
/* Store the created connection handle and indicate that the connection has been established */
/* Store the created connection handle and indicate that the connection has been established */
Bluetooth_Connection . ConnectionHandle = ( ( B luetooth _HCIEvent_ConnectionComplete_t* ) & EventParams ) - > ConnectionHandle ;
Bluetooth_Connection . ConnectionHandle = ( ( B T _HCIEvent_ConnectionComplete_t* ) & EventParams ) - > ConnectionHandle ;
Bluetooth_Connection . IsConnected = true ;
Bluetooth_Connection . IsConnected = true ;
Bluetooth_ConnectionComplete ( ) ;
Bluetooth_ConnectionComplete ( ) ;
@ -151,7 +124,7 @@ void Bluetooth_ProcessHCICommands(void)
Bluetooth_HCIProcessingState = Bluetooth_Init_Reset ;
Bluetooth_HCIProcessingState = Bluetooth_Init_Reset ;
break ;
break ;
case Bluetooth_Init_Reset :
case Bluetooth_Init_Reset :
HCICommandHeader = ( B luetooth _HCICommand_Header_t)
HCICommandHeader = ( B T _HCICommand_Header_t)
{
{
OpCode : { OGF : OGF_CTRLR_BASEBAND , OCF : OCF_CTRLR_BASEBAND_RESET } ,
OpCode : { OGF : OGF_CTRLR_BASEBAND , OCF : OCF_CTRLR_BASEBAND_RESET } ,
ParameterLength : 0 ,
ParameterLength : 0 ,
@ -164,7 +137,7 @@ void Bluetooth_ProcessHCICommands(void)
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
break ;
break ;
case Bluetooth_Init_SetLocalName :
case Bluetooth_Init_SetLocalName :
HCICommandHeader = ( B luetooth _HCICommand_Header_t)
HCICommandHeader = ( B T _HCICommand_Header_t)
{
{
OpCode : { OGF : OGF_CTRLR_BASEBAND , OCF : OCF_CTRLR_BASEBAND_WRITE_LOCAL_NAME } ,
OpCode : { OGF : OGF_CTRLR_BASEBAND , OCF : OCF_CTRLR_BASEBAND_WRITE_LOCAL_NAME } ,
ParameterLength : 248 ,
ParameterLength : 248 ,
@ -177,7 +150,7 @@ void Bluetooth_ProcessHCICommands(void)
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
break ;
break ;
case Bluetooth_Init_SetDeviceClass :
case Bluetooth_Init_SetDeviceClass :
HCICommandHeader = ( B luetooth _HCICommand_Header_t)
HCICommandHeader = ( B T _HCICommand_Header_t)
{
{
OpCode : { OGF : OGF_CTRLR_BASEBAND , OCF : OCF_CTRLR_BASEBAND_WRITE_CLASS_OF_DEVICE } ,
OpCode : { OGF : OGF_CTRLR_BASEBAND , OCF : OCF_CTRLR_BASEBAND_WRITE_CLASS_OF_DEVICE } ,
ParameterLength : 3 ,
ParameterLength : 3 ,
@ -190,7 +163,7 @@ void Bluetooth_ProcessHCICommands(void)
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
break ;
break ;
case Bluetooth_Init_WriteScanEnable :
case Bluetooth_Init_WriteScanEnable :
HCICommandHeader = ( B luetooth _HCICommand_Header_t)
HCICommandHeader = ( B T _HCICommand_Header_t)
{
{
OpCode : { OGF : OGF_CTRLR_BASEBAND , OCF : OCF_CTRLR_BASEBAND_WRITE_SCAN_ENABLE } ,
OpCode : { OGF : OGF_CTRLR_BASEBAND , OCF : OCF_CTRLR_BASEBAND_WRITE_SCAN_ENABLE } ,
ParameterLength : 1 ,
ParameterLength : 1 ,
@ -205,60 +178,88 @@ void Bluetooth_ProcessHCICommands(void)
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
break ;
break ;
case Bluetooth_Conn_AcceptConnection :
case Bluetooth_Conn_AcceptConnection :
HCICommandHeader = ( B luetooth _HCICommand_Header_t)
HCICommandHeader = ( B T _HCICommand_Header_t)
{
{
OpCode : { OGF : OGF_LINK_CONTROL , OCF : OCF_LINK_CONTROL_ACCEPT_CONNECTION_REQUEST } ,
OpCode : { OGF : OGF_LINK_CONTROL , OCF : OCF_LINK_CONTROL_ACCEPT_CONNECTION_REQUEST } ,
ParameterLength : sizeof ( B luetooth_HCICommand_AcceptConnectionRequest _t) ,
ParameterLength : sizeof ( B T_HCICommand_AcceptConnectionReq _t) ,
} ;
} ;
/* Copy over the temporary BT device address saved from the Connection Request event, indicate slave
/* Copy over the temporary BT device address saved from the Connection Request event, indicate slave
connection role */
connection role */
B luetooth_HCICommand_AcceptConnectionRequest _t AcceptConnectionParams ;
B T_HCICommand_AcceptConnectionReq _t AcceptConnectionParams ;
memcpy ( AcceptConnectionParams . RemoteAddress , Bluetooth_TempDeviceAddress ,
memcpy ( AcceptConnectionParams . RemoteAddress , Bluetooth_TempDeviceAddress ,
sizeof ( AcceptConnectionParams . RemoteAddress ) ) ;
sizeof ( AcceptConnectionParams . RemoteAddress ) ) ;
AcceptConnectionParams . SlaveRole = true ;
AcceptConnectionParams . SlaveRole = true ;
/* Send the command to accept the remote connection request */
/* Send the command to accept the remote connection request */
Bluetooth_SendHCICommand ( & AcceptConnectionParams , sizeof ( B luetooth_HCICommand_AcceptConnectionRequest _t) ) ;
Bluetooth_SendHCICommand ( & AcceptConnectionParams , sizeof ( B T_HCICommand_AcceptConnectionReq _t) ) ;
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
break ;
break ;
case Bluetooth_Conn_RejectConnection :
case Bluetooth_Conn_RejectConnection :
HCICommandHeader = ( B luetooth _HCICommand_Header_t)
HCICommandHeader = ( B T _HCICommand_Header_t)
{
{
OpCode : { OGF : OGF_LINK_CONTROL , OCF : OCF_LINK_CONTROL_REJECT_CONNECTION_REQUEST } ,
OpCode : { OGF : OGF_LINK_CONTROL , OCF : OCF_LINK_CONTROL_REJECT_CONNECTION_REQUEST } ,
ParameterLength : sizeof ( B luetooth_HCICommand_RejectConnectionRequest _t) ,
ParameterLength : sizeof ( B T_HCICommand_RejectConnectionReq _t) ,
} ;
} ;
/* Copy over the temporary BT device address saved from the Connection Request event, indicate failure
/* Copy over the temporary BT device address saved from the Connection Request event, indicate failure
to accept the connection due to limited device resources or incorrect device address */
to accept the connection due to limited device resources or incorrect device address */
B luetooth_HCICommand_RejectConnectionRequest _t RejectConnectionParams ;
B T_HCICommand_RejectConnectionReq _t RejectConnectionParams ;
memcpy ( RejectConnectionParams . RemoteAddress , Bluetooth_TempDeviceAddress , sizeof ( RejectConnectionParams . RemoteAddress ) ) ;
memcpy ( RejectConnectionParams . RemoteAddress , Bluetooth_TempDeviceAddress , sizeof ( RejectConnectionParams . RemoteAddress ) ) ;
RejectConnectionParams . Reason = Bluetooth_Connection . IsConnected ? ERROR_LIMITED_RESOURCES : ERROR_UNACCEPTABLE_BDADDR ;
RejectConnectionParams . Reason = Bluetooth_Connection . IsConnected ? ERROR_LIMITED_RESOURCES : ERROR_UNACCEPTABLE_BDADDR ;
/* Send the command to reject the remote connection request */
/* Send the command to reject the remote connection request */
Bluetooth_SendHCICommand ( & RejectConnectionParams , sizeof ( B luetooth_HCICommand_RejectConnectionRequest _t) ) ;
Bluetooth_SendHCICommand ( & RejectConnectionParams , sizeof ( B T_HCICommand_RejectConnectionReq _t) ) ;
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
break ;
break ;
case Bluetooth_Conn_SendPINCode :
case Bluetooth_Conn_SendPINCode :
HCICommandHeader = ( B luetooth _HCICommand_Header_t)
HCICommandHeader = ( B T _HCICommand_Header_t)
{
{
OpCode : { OGF : OGF_LINK_CONTROL , OCF : OCF_LINK_CONTROL_PIN_CODE_REQUEST_REPLY } ,
OpCode : { OGF : OGF_LINK_CONTROL , OCF : OCF_LINK_CONTROL_PIN_CODE_REQUEST_REPLY } ,
ParameterLength : sizeof ( B luetooth_HCICommand_PinCodeResponse _t) ,
ParameterLength : sizeof ( B T_HCICommand_PinCodeResp _t) ,
} ;
} ;
/* Copy over the temporary BT device address saved from the PIN Code Request event, copy over the
/* Copy over the temporary BT device address saved from the PIN Code Request event, copy over the
local PIN authentication code to the response */
local PIN authentication code to the response */
B luetooth_HCICommand_PinCodeResponse _t PINCodeRequestParams ;
B T_HCICommand_PinCodeResp _t PINCodeRequestParams ;
memcpy ( PINCodeRequestParams . RemoteAddress , Bluetooth_TempDeviceAddress , sizeof ( PINCodeRequestParams . RemoteAddress ) ) ;
memcpy ( PINCodeRequestParams . RemoteAddress , Bluetooth_TempDeviceAddress , sizeof ( PINCodeRequestParams . RemoteAddress ) ) ;
PINCodeRequestParams . PINCodeLength = strlen ( Bluetooth_DeviceConfiguration . PINCode ) ;
PINCodeRequestParams . PINCodeLength = strlen ( Bluetooth_DeviceConfiguration . PINCode ) ;
memcpy ( PINCodeRequestParams . PINCode , Bluetooth_DeviceConfiguration . PINCode , sizeof ( PINCodeRequestParams . PINCode ) ) ;
memcpy ( PINCodeRequestParams . PINCode , Bluetooth_DeviceConfiguration . PINCode , sizeof ( PINCodeRequestParams . PINCode ) ) ;
/* Send the command to transmit the device's local PIN number for authentication */
/* Send the command to transmit the device's local PIN number for authentication */
Bluetooth_SendHCICommand ( & PINCodeRequestParams , sizeof ( B luetooth_HCICommand_PinCodeResponse _t) ) ;
Bluetooth_SendHCICommand ( & PINCodeRequestParams , sizeof ( B T_HCICommand_PinCodeResp _t) ) ;
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents ;
break ;
break ;
}
}
}
}
static uint8_t Bluetooth_SendHCICommand ( void * Parameters , uint16_t ParameterLength )
{
/* Need to reserve the amount of bytes given in the header for the complete payload */
uint8_t CommandBuffer [ sizeof ( HCICommandHeader ) + HCICommandHeader . ParameterLength ] ;
USB_ControlRequest = ( USB_Request_Header_t )
{
. bmRequestType = ( REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_DEVICE ) ,
. bRequest = 0 ,
. wValue = 0 ,
. wIndex = 0 ,
. wLength = sizeof ( CommandBuffer )
} ;
/* Copy over the HCI command header to the allocated buffer */
memcpy ( CommandBuffer , & HCICommandHeader , sizeof ( HCICommandHeader ) ) ;
/* Zero out the parameter section of the response to ensure that any padding bytes do not expose private RAM contents */
memset ( & CommandBuffer [ sizeof ( HCICommandHeader ) ] , 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 ( HCICommandHeader ) ] , Parameters , ParameterLength ) ;
Pipe_SelectPipe ( PIPE_CONTROLPIPE ) ;
return USB_Host_SendControlRequest ( CommandBuffer ) ;
}