Hi Qiu,

Need some help, how far is the Bluetooth supported in the new specs 2.5?

Based on 2.4 errata B specs and UDK 2014 release, I have to add the BT stack 
(HCI/L2CAP) to support BT keyboards? If we know , the upcoming specs provide 
the Bluetooth protocol, then it will easy for us to add new profiles and cut 
down our development effort in bringing over the lower layer stack.

Your help is so much appreciated.

Thanks
Sai

-----Original Message-----
From: Qiu Shumin [mailto:shumin....@intel.com]
Sent: Monday, May 04, 2015 11:27 PM
To: edk2-devel@lists.sourceforge.net
Subject: [edk2] [PATCH 1/2] MdePkg: Add UEFI2.5 bluetooth protocol/devicepath 
definition in MdePkg.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Qiu Shumin <shumin....@intel.com>
Reviewed-by: Liming Gao <liming....@intel.com>
Reviewed-by: Yao Jiewen <jiewen....@intel.com>
---
 MdePkg/Include/IndustryStandard/Bluetooth.h |  47 +++
 MdePkg/Include/Protocol/BluetoothConfig.h   | 514 ++++++++++++++++++++++++++++
 MdePkg/Include/Protocol/BluetoothHc.h       | 328 ++++++++++++++++++
 MdePkg/Include/Protocol/BluetoothIo.h       | 416 ++++++++++++++++++++++
 MdePkg/Include/Protocol/DevicePath.h        |  16 +-
 MdePkg/MdePkg.dec                           |  10 +
 6 files changed, 1330 insertions(+), 1 deletion(-)
 create mode 100644 MdePkg/Include/IndustryStandard/Bluetooth.h
 create mode 100644 MdePkg/Include/Protocol/BluetoothConfig.h
 create mode 100644 MdePkg/Include/Protocol/BluetoothHc.h
 create mode 100644 MdePkg/Include/Protocol/BluetoothIo.h

diff --git a/MdePkg/Include/IndustryStandard/Bluetooth.h 
b/MdePkg/Include/IndustryStandard/Bluetooth.h
new file mode 100644
index 0000000..f4b7372
--- /dev/null
+++ b/MdePkg/Include/IndustryStandard/Bluetooth.h
@@ -0,0 +1,47 @@
+/** @file
+  This file contains the Bluetooth definitions that are consumed by drivers.
+  These definitions are from Bluetooth Core Specification Version 4.0 June, 
2010
+
+  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD 
License
+  which accompanies this distribution.  The full text of the license may be 
found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _BLUETOOTH_H_
+#define _BLUETOOTH_H_
+
+#pragma pack(1)
+
+///
+/// BLUETOOTH_ADDRESS
+///
+typedef struct {
+  ///
+  /// 48bit Bluetooth device address.
+  ///
+  UINT8      Address[6];
+} BLUETOOTH_ADDRESS;
+
+///
+/// BLUETOOTH_CLASS_OF_DEVICE. See Bluetooth specification for detail.
+///
+typedef struct {
+  UINT8      FormatType:2;
+  UINT8      MinorDeviceClass: 6;
+  UINT16     MajorDeviceClass: 5;
+  UINT16     MajorServiceClass:11;
+} BLUETOOTH_CLASS_OF_DEVICE;
+
+#pragma pack()
+
+#define BLUETOOTH_HCI_COMMAND_LOCAL_READABLE_NAME_MAX_SIZE    248
+
+#define BLUETOOTH_HCI_LINK_KEY_SIZE                           16
+
+#endif
diff --git a/MdePkg/Include/Protocol/BluetoothConfig.h 
b/MdePkg/Include/Protocol/BluetoothConfig.h
new file mode 100644
index 0000000..cc72b1e
--- /dev/null
+++ b/MdePkg/Include/Protocol/BluetoothConfig.h
@@ -0,0 +1,514 @@
+/** @file
+  EFI Bluetooth Configuration Protocol as defined in UEFI 2.5.
+  This protocol abstracts user interface configuration for Bluetooth device.
+
+  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials are licensed and made available 
under
+  the terms and conditions of the BSD License that accompanies this 
distribution.
+  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php.
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  @par Revision Reference:
+  This Protocol is introduced in UEFI Specification 2.5
+
+**/
+
+#ifndef __EFI_BLUETOOTH_CONFIG_PROTOCOL_H__
+#define __EFI_BLUETOOTH_CONFIG_PROTOCOL_H__
+
+#include <IndustryStandard/Bluetooth.h>
+
+#define EFI_BLUETOOTH_CONFIG_PROTOCOL_GUID \
+  { \
+    0x62960cf3, 0x40ff, 0x4263, { 0xa7, 0x7c, 0xdf, 0xde, 0xbd, 0x19, 0x1b, 
0x4b } \
+  }
+
+typedef struct _EFI_BLUETOOTH_CONFIG_PROTOCOL EFI_BLUETOOTH_CONFIG_PROTOCOL;
+
+typedef UINT32      EFI_BLUETOOTH_CONFIG_REMOTE_DEVICE_STATE_TYPE;
+#define EFI_BLUETOOTH_CONFIG_REMOTE_DEVICE_STATE_CONNECTED    0x1
+#define EFI_BLUETOOTH_CONFIG_REMOTE_DEVICE_STATE_PAIRED       0x2
+
+///
+/// EFI_BLUETOOTH_SCAN_CALLBACK_INFORMATION
+///
+typedef struct {
+  ///
+  /// 48bit Bluetooth device address.
+  ///
+  BLUETOOTH_ADDRESS         BDAddr;
+  ///
+  /// State of the remote deive
+  ///
+  UINT8                     RemoteDeviceState;
+  ///
+  /// Bluetooth ClassOfDevice. See Bluetooth specification for detail.
+  ///
+  BLUETOOTH_CLASS_OF_DEVICE ClassOfDevice;
+  ///
+  /// Remote device name
+  ///
+  UINT8                     
RemoteDeviceName[BLUETOOTH_HCI_COMMAND_LOCAL_READABLE_NAME_MAX_SIZE];
+} EFI_BLUETOOTH_SCAN_CALLBACK_INFORMATION;
+
+///
+/// EFI_BLUETOOTH_CONFIG_DATA_TYPE
+///
+typedef enum {
+  ///
+  /// Local/Remote Bluetooth device name. Data structure is zero terminated 
CHAR8[].
+  ///
+  EfiBluetoothConfigDataTypeDeviceName,
+  ///
+  /// Local/Remote Bluetooth device ClassOfDevice. Data structure is 
BLUETOOTH_CLASS_OF_DEVICE.
+  ///
+  EfiBluetoothConfigDataTypeClassOfDevice,
+  ///
+  /// Remote Bluetooth device state. Data structure is 
EFI_BLUETOOTH_CONFIG_REMOTE_DEVICE_STATE_TYPE.
+  ///
+  EfiBluetoothConfigDataTypeRemoteDeviceState,
+  ///
+  /// Local/Remote Bluetooth device SDP information. Data structure is UINT8[].
+  ///
+  EfiBluetoothConfigDataTypeSdpInfo,
+  ///
+  /// Local Bluetooth device address. Data structure is BLUETOOTH_ADDRESS.
+  ///
+  EfiBluetoothConfigDataTypeBDADDR,
+  ///
+  /// Local Bluetooth discoverable state. Data structure is UINT8. (Page scan 
and/or Inquiry scan)
+  ///
+  EfiBluetoothConfigDataTypeDiscoverable,
+  ///
+  /// Local Bluetooth controller stored paired device list. Data structure is 
BLUETOOTH_ADDRESS[].
+  ///
+  EfiBluetoothConfigDataTypeControllerStoredPairedDeviceList,
+  ///
+  /// Local available device list. Data structure is BLUETOOTH_ADDRESS[].
+  ///
+  EfiBluetoothConfigDataTypeAvailableDeviceList,
+  EfiBluetoothConfigDataTypeMax,
+} EFI_BLUETOOTH_CONFIG_DATA_TYPE;
+
+///
+/// EFI_BLUETOOTH_PIN_CALLBACK_TYPE.
+///
+typedef enum {
+  ///
+  /// For SSP - passkey entry. Input buffer is Passkey (4 bytes). No output 
buffer.
+  /// See Bluetooth HCI command for detail.
+  ///
+  EfiBluetoothCallbackTypeUserPasskeyNotification,
+  ///
+  /// For SSP - just work and numeric comparison. Input buffer is numeric 
value (4 bytes).
+  /// Output buffer is BOOLEAN (1 byte). See Bluetooth HCI command for detail.
+  ///
+  EfiBluetoothCallbackTypeUserConfirmationRequest,
+  ///
+  /// For SSP - OOB. See Bluetooth HCI command for detail.
+  ///
+  EfiBluetoothCallbackTypeOOBDataRequest,
+  ///
+  /// For legacy paring. No input buffer. Output buffer is PIN code( <= 16 
bytes).
+  /// See Bluetooth HCI command for detail.
+  ///
+  EfiBluetoothCallbackTypePinCodeRequest,
+  EfiBluetoothCallbackTypeMax
+} EFI_BLUETOOTH_PIN_CALLBACK_TYPE;
+
+///
+/// EFI_BLUETOOTH_CONNECT_COMPLETE_CALLBACK_TYPE.
+///
+typedef enum {
+  ///
+  /// This callback is called when Bluetooth receive Disconnection_Complete 
event. Input buffer is Event
+  /// Parameters of Disconnection_Complete Event defined in Bluetooth 
specification.
+  ///
+  EfiBluetoothConnCallbackTypeDisconnected,
+  ///
+  /// This callback is called when Bluetooth receive Connection_Complete 
event. Input buffer is Event
+  /// Parameters of Connection_Complete Event defined in Bluetooth 
specification.
+  ///
+  EfiBluetoothConnCallbackTypeConnected,
+  ///
+  /// This callback is called when Bluetooth receive Authentication_Complete 
event. Input buffer is Event
+  /// Parameters of Authentication_Complete Event defined in Bluetooth 
specification.
+  ///
+  EfiBluetoothConnCallbackTypeAuthenticated,
+  ///
+  /// This callback is called when Bluetooth receive Encryption_Change event. 
Input buffer is Event
+  /// Parameters of Encryption_Change Event defined in Bluetooth specification.
+  ///
+  EfiBluetoothConnCallbackTypeEncrypted
+} EFI_BLUETOOTH_CONNECT_COMPLETE_CALLBACK_TYPE;
+
+
+/**
+  Initialize Bluetooth host controller and local device.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
+
+  @retval EFI_SUCCESS           The Bluetooth host controller and local device 
is initialized successfully.
+  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to initialize 
the Bluetooth host controller
+                                and local device.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_INIT)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL  *This
+  );
+
+/**
+  Callback function, it is called if a Bluetooth device is found during scan 
process.
+
+  @param  This            Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL 
instance.
+  @param  Context         Context passed from scan request.
+  @param  CallbackInfo    Data related to scan result. NULL CallbackInfo means 
scan complete.
+
+  @retval EFI_SUCCESS       The callback function complete successfully.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_SCAN_CALLBACK_FUNCTION) (
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL            *This,
+  IN VOID                                     *Context,
+  IN EFI_BLUETOOTH_SCAN_CALLBACK_INFORMATION  *CallbackInfo
+  );
+
+/**
+  Scan Bluetooth device.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
+  @param  ReScan        If TRUE, a new scan request is submitted no matter 
there is scan result before.
+                        If FALSE and there is scan result, the previous scan 
result is returned and no scan request
+                        is submitted.
+  @param  ScanType      Bluetooth scan type, Inquiry and/or Page. See 
Bluetooth specification for detail.
+  @param  Callback      The callback function. This function is called if a 
Bluetooth device is found during scan
+                        process.
+  @param  Context       Data passed into Callback function. This is optional 
parameter and may be NULL.
+
+  @retval EFI_SUCCESS           The Bluetooth scan request is submitted.
+  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to scan the 
Bluetooth device.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_SCAN)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
+  IN BOOLEAN                                        ReScan,
+  IN UINT8                                          ScanType,
+  IN EFI_BLUETOOTH_CONFIG_SCAN_CALLBACK_FUNCTION    Callback,
+  IN VOID                                           *Context
+  );
+
+/**
+  Connect a Bluetooth device.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
+  @param  BD_ADDR       The address of Bluetooth device to be connected.
+
+  @retval EFI_SUCCESS           The Bluetooth device is connected successfully.
+  @retval EFI_ALREADY_STARTED   The Bluetooth device is already connected.
+  @retval EFI_NOT_FOUND         The Bluetooth device is not found.
+  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to connect 
the Bluetooth device.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_CONNECT)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
+  IN BLUETOOTH_ADDRESS                              *BD_ADDR
+  );
+
+/**
+  Disconnect a Bluetooth device.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
+  @param  BD_ADDR       The address of Bluetooth device to be connected.
+  @param  Reason        Bluetooth disconnect reason. See Bluetooth 
specification for detail.
+
+  @retval EFI_SUCCESS           The Bluetooth device is disconnected 
successfully.
+  @retval EFI_NOT_STARTED       The Bluetooth device is not connected.
+  @retval EFI_NOT_FOUND         The Bluetooth device is not found.
+  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to disconnect 
the Bluetooth device.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_DISCONNECT)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
+  IN BLUETOOTH_ADDRESS                              *BD_ADDR,
+  IN UINT8                                          Reason
+  );
+
+/**
+  Get Bluetooth configuration data.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
+  @param  DataType      Configuration data type.
+  @param  DataSize      On input, indicates the size, in bytes, of the data 
buffer specified by Data.
+                        On output, indicates the amount of data actually 
returned.
+  @param  Data          A pointer to the buffer of data that will be returned.
+
+  @retval EFI_SUCCESS           The Bluetooth configuration data is returned 
successfully.
+  @retval EFI_INVALID_PARAMETER One or more of the following conditions is 
TRUE:
+                                - DataSize is NULL.
+                                - *DataSize is 0.
+                                - Data is NULL.
+  @retval EFI_UNSUPPORTED       The DataType is unsupported.
+  @retval EFI_NOT_FOUND         The DataType is not found.
+  @retval EFI_BUFFER_TOO_SMALL  The buffer is too small to hold the buffer.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_GET_DATA)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
+  IN EFI_BLUETOOTH_CONFIG_DATA_TYPE                 DataType,
+  IN OUT UINTN                                      *DataSize,
+  IN OUT VOID                                       *Data
+  );
+
+/**
+  Set Bluetooth configuration data.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
+  @param  DataType      Configuration data type.
+  @param  DataSize      Indicates the size, in bytes, of the data buffer 
specified by Data.
+  @param  Data          A pointer to the buffer of data that will be set.
+
+  @retval EFI_SUCCESS           The Bluetooth configuration data is set 
successfully.
+  @retval EFI_INVALID_PARAMETER One or more of the following conditions is 
TRUE:
+                                - DataSize is 0.
+                                - Data is NULL.
+  @retval EFI_UNSUPPORTED       The DataType is unsupported.
+  @retval EFI_BUFFER_TOO_SMALL  Cannot set configuration data.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_SET_DATA)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
+  IN EFI_BLUETOOTH_CONFIG_DATA_TYPE                 DataType,
+  IN UINTN                                          DataSize,
+  IN VOID                                           *Data
+  );
+
+/**
+  Get remove Bluetooth device configuration data.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
+  @param  DataType      Configuration data type.
+  @param  BDAddr        Remote Bluetooth device address.
+  @param  DataSize      On input, indicates the size, in bytes, of the data 
buffer specified by Data.
+                        On output, indicates the amount of data actually 
returned.
+  @param  Data          A pointer to the buffer of data that will be returned.
+
+  @retval EFI_SUCCESS           The remote Bluetooth device configuration data 
is returned successfully.
+  @retval EFI_INVALID_PARAMETER One or more of the following conditions is 
TRUE:
+                                - DataSize is NULL.
+                                - *DataSize is 0.
+                                - Data is NULL.
+  @retval EFI_UNSUPPORTED       The DataType is unsupported.
+  @retval EFI_NOT_FOUND         The DataType is not found.
+  @retval EFI_BUFFER_TOO_SMALL  The buffer is too small to hold the buffer.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_GET_REMOTE_DATA)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
+  IN EFI_BLUETOOTH_CONFIG_DATA_TYPE                 DataType,
+  IN BLUETOOTH_ADDRESS                              BDAddr,
+  IN OUT UINTN                                      *DataSize,
+  IN OUT VOID                                       *Data
+  );
+
+/**
+  The callback function for PIN code.
+
+  @param  This                Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL 
instance.
+  @param  Context             Context passed from registration.
+  @param  CallbackType        Callback type in EFI_BLUETOOTH_PIN_CALLBACK_TYPE.
+  @param  InputBuffer         A pointer to the buffer of data that is input 
from callback caller.
+  @param  InputBufferSize     Indicates the size, in bytes, of the data buffer 
specified by InputBuffer.
+  @param  OutputBuffer        A pointer to the buffer of data that will be 
output from callback callee.
+                              Callee allocates this buffer by using EFI Boot 
Service AllocatePool().
+  @param  OutputBufferSize    Indicates the size, in bytes, of the data buffer 
specified by OutputBuffer.
+
+  @retval EFI_SUCCESS   The callback function complete successfully.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_PIN_CALLBACK_FUNCTION)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                        *This,
+  IN VOID                                                 *Context,
+  IN EFI_BLUETOOTH_PIN_CALLBACK_TYPE                      CallbackType,
+  IN VOID                                                 *InputBuffer,
+  IN UINTN                                                InputBufferSize,
+  OUT VOID                                                **OutputBuffer,
+  OUT UINTN                                               *OutputBufferSize
+  );
+
+/**
+  Register PIN callback function.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
+  @param  Callback      The callback function. NULL means unregister.
+  @param  Context       Data passed into Callback function. This is optional 
parameter and may be NULL.
+
+  @retval EFI_SUCCESS   The PIN callback function is registered successfully.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_PIN_CALLBACK)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                        *This,
+  IN EFI_BLUETOOTH_CONFIG_REGISTER_PIN_CALLBACK_FUNCTION  Callback,
+  IN VOID                                                 *Context
+  );
+
+/**
+  The callback function to get link key.
+
+  @param  This                Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL 
instance.
+  @param  Context             Context passed from registration.
+  @param  BDAddr              A pointer to Bluetooth device address.
+  @param  LinkKey             A pointer to the buffer of link key.
+
+  @retval EFI_SUCCESS   The callback function complete successfully.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_GET_LINK_KEY_CALLBACK_FUNCTION)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL        *This,
+  IN VOID                                 *Context,
+  IN BLUETOOTH_ADDRESS                    *BDAddr,
+  OUT UINT8                               LinkKey[BLUETOOTH_HCI_LINK_KEY_SIZE]
+  );
+
+/**
+  Register get link key callback function.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
+  @param  Callback      The callback function. NULL means unregister.
+  @param  Context       Data passed into Callback function. This is optional 
parameter and may be NULL.
+
+  @retval EFI_SUCCESS   The link key callback function is registered 
successfully.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_GET_LINK_KEY_CALLBACK)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                                  *This,
+  IN EFI_BLUETOOTH_CONFIG_REGISTER_GET_LINK_KEY_CALLBACK_FUNCTION   Callback,
+  IN VOID                                                           *Context
+  );
+
+/**
+  The callback function to set link key.
+
+  @param  This                Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL 
instance.
+  @param  Context             Context passed from registration.
+  @param  BDAddr              A pointer to Bluetooth device address.
+  @param  LinkKey             A pointer to the buffer of link key.
+
+  @retval EFI_SUCCESS   The callback function complete successfully.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_SET_LINK_KEY_CALLBACK_FUNCTION)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL        *This,
+  IN VOID                                 *Context,
+  IN BLUETOOTH_ADDRESS                    *BDAddr,
+  IN UINT8                                LinkKey[BLUETOOTH_HCI_LINK_KEY_SIZE]
+  );
+
+/**
+  Register set link key callback function.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
+  @param  Callback      The callback function. NULL means unregister.
+  @param  Context       Data passed into Callback function. This is optional 
parameter and may be NULL.
+
+  @retval EFI_SUCCESS   The link key callback function is registered 
successfully.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_SET_LINK_KEY_CALLBACK)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                                  *This,
+  IN EFI_BLUETOOTH_CONFIG_REGISTER_SET_LINK_KEY_CALLBACK_FUNCTION   Callback,
+  IN VOID                                                           *Context
+  );
+
+/**
+  The callback function. It is called after connect completed.
+
+  @param  This                Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL 
instance.
+  @param  Context             Context passed from registration.
+  @param  CallbackType        Callback type in 
EFI_BLUETOOTH_CONNECT_COMPLETE_CALLBACK_TYPE.
+  @param  BDAddr              A pointer to Bluetooth device address.
+  @param  InputBuffer         A pointer to the buffer of data that is input 
from callback caller.
+  @param  InputBufferSize     Indicates the size, in bytes, of the data buffer 
specified by InputBuffer.
+
+  @retval EFI_SUCCESS   The callback function complete successfully.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_CONNECT_COMPLETE_CALLBACK_FUNCTION)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
+  IN VOID                                           *Context,
+  IN EFI_BLUETOOTH_CONNECT_COMPLETE_CALLBACK_TYPE   CallbackType,
+  IN BLUETOOTH_ADDRESS                              *BDAddr,
+  IN VOID                                           *InputBuffer,
+  IN UINTN                                          InputBufferSize
+  );
+
+/**
+  Register link connect complete callback function.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
+  @param  Callback      The callback function. NULL means unregister.
+  @param  Context       Data passed into Callback function. This is optional 
parameter and may be NULL.
+
+  @retval EFI_SUCCESS   The link connect complete callback function is 
registered successfully.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_CONNECT_COMPLETE_CALLBACK)(
+  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                                      *This,
+  IN EFI_BLUETOOTH_CONFIG_REGISTER_CONNECT_COMPLETE_CALLBACK_FUNCTION   
Callback,
+  IN VOID                                                               
*Context
+  );
+
+///
+/// This protocol abstracts user interface configuration for Bluetooth device.
+///
+struct _EFI_BLUETOOTH_CONFIG_PROTOCOL {
+  EFI_BLUETOOTH_CONFIG_INIT                               Init;
+  EFI_BLUETOOTH_CONFIG_SCAN                               Scan;
+  EFI_BLUETOOTH_CONFIG_CONNECT                            Connect;
+  EFI_BLUETOOTH_CONFIG_DISCONNECT                         Disconnect;
+  EFI_BLUETOOTH_CONFIG_GET_DATA                           GetData;
+  EFI_BLUETOOTH_CONFIG_SET_DATA                           SetData;
+  EFI_BLUETOOTH_CONFIG_GET_REMOTE_DATA                    GetRemoteData;
+  EFI_BLUETOOTH_CONFIG_REGISTER_PIN_CALLBACK              RegisterPinCallback;
+  EFI_BLUETOOTH_CONFIG_REGISTER_GET_LINK_KEY_CALLBACK     
RegisterGetLinkKeyCallback;
+  EFI_BLUETOOTH_CONFIG_REGISTER_SET_LINK_KEY_CALLBACK     
RegisterSetLinkKeyCallback;
+  EFI_BLUETOOTH_CONFIG_REGISTER_CONNECT_COMPLETE_CALLBACK 
RegisterLinkConnectCompleteCallback;
+};
+
+extern EFI_GUID gEfiBluetoothConfigProtocolGuid;
+
+#endif
diff --git a/MdePkg/Include/Protocol/BluetoothHc.h 
b/MdePkg/Include/Protocol/BluetoothHc.h
new file mode 100644
index 0000000..eb55079
--- /dev/null
+++ b/MdePkg/Include/Protocol/BluetoothHc.h
@@ -0,0 +1,328 @@
+/** @file
+  EFI Bluetooth Host Controller Protocol as defined in UEFI 2.5.
+  This protocol abstracts the Bluetooth host controller layer message transmit 
and receive.
+
+  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials are licensed and made available 
under
+  the terms and conditions of the BSD License that accompanies this 
distribution.
+  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php.
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  @par Revision Reference:
+  This Protocol is introduced in UEFI Specification 2.5
+
+**/
+
+#ifndef __EFI_BLUETOOTH_HC_PROTOCOL_H__
+#define __EFI_BLUETOOTH_HC_PROTOCOL_H__
+
+#define EFI_BLUETOOTH_HC_PROTOCOL_GUID \
+  { \
+    0xb3930571, 0xbeba, 0x4fc5, { 0x92, 0x3, 0x94, 0x27, 0x24, 0x2e, 0x6a, 
0x43 } \
+  }
+
+typedef struct _EFI_BLUETOOTH_HC_PROTOCOL EFI_BLUETOOTH_HC_PROTOCOL;
+
+/**
+  Send HCI command packet.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_HC_PROTOCOL instance.
+  @param  BufferSize    On input, indicates the size, in bytes, of the data 
buffer specified by Buffer.
+                        On output, indicates the amount of data actually 
transferred.
+  @param  Buffer        A pointer to the buffer of data that will be 
transmitted to Bluetooth host
+                        controller.
+  @param  Timeout       Indicating the transfer should be completed within 
this time frame. The units are
+                        in milliseconds. If Timeout is 0, then the caller must 
wait for the function to
+                        be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is 
returned.
+
+  @retval EFI_SUCCESS           The HCI command packet is sent successfully.
+  @retval EFI_INVALID_PARAMETER One or more of the following conditions is 
TRUE:
+                                - BufferSize is NULL.
+                                - *BufferSize is 0.
+                                - Buffer is NULL.
+  @retval EFI_TIMEOUT           Sending HCI command packet fail due to timeout.
+  @retval EFI_DEVICE_ERROR      Sending HCI command packet fail due to host 
controller or device error.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_HC_SEND_COMMAND)(
+  IN EFI_BLUETOOTH_HC_PROTOCOL  *This,
+  IN OUT UINTN                  *BufferSize,
+  IN VOID                       *Buffer,
+  IN UINTN                      Timeout
+  );
+
+
+/**
+  Receive HCI event packet.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_HC_PROTOCOL instance.
+  @param  BufferSize    On input, indicates the size, in bytes, of the data 
buffer specified by Buffer.
+                        On output, indicates the amount of data actually 
transferred.
+  @param  Buffer        A pointer to the buffer of data that will be received 
from Bluetooth host controller.
+  @param  Timeout       Indicating the transfer should be completed within 
this time frame. The units are
+                        in milliseconds. If Timeout is 0, then the caller must 
wait for the function to
+                        be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is 
returned.
+
+  @retval EFI_SUCCESS           The HCI event packet is received successfully.
+  @retval EFI_INVALID_PARAMETER One or more of the following conditions is 
TRUE:
+                                - BufferSize is NULL.
+                                - *BufferSize is 0.
+                                - Buffer is NULL.
+  @retval EFI_TIMEOUT           Receiving HCI event packet fail due to timeout.
+  @retval EFI_DEVICE_ERROR      Receiving HCI event packet fail due to host 
controller or device error.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_HC_RECEIVE_EVENT)(
+  IN EFI_BLUETOOTH_HC_PROTOCOL  *This,
+  IN OUT UINTN                  *BufferSize,
+  OUT VOID                      *Buffer,
+  IN UINTN                      Timeout
+  );
+
+/**
+  Callback function, it is called when asynchronous transfer is completed.
+
+  @param  Data              Pointer to the EFI_BLUETOOTH_HC_PROTOCOL instance.
+  @param  DataLength        Specifies the length, in bytes, of the data to be 
received.
+  @param  Context           Data passed into Callback function. This is 
optional parameter and may be NULL.
+
+  @retval EFI_SUCCESS             The callback function complete successfully.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_HC_ASYNC_FUNC_CALLBACK) (
+  IN VOID                       *Data,
+  IN UINTN                      DataLength,
+  IN VOID                       *Context
+  );
+
+/**
+  Receive HCI event packet in non-blocking way.
+
+  @param  This              Pointer to the EFI_BLUETOOTH_HC_PROTOCOL instance.
+  @param  IsNewTransfer     If TRUE, a new transfer will be submitted. If 
FALSE, the request is deleted.
+  @param  PollingInterval   Indicates the periodic rate, in milliseconds, that 
the transfer is to be executed.
+  @param  DataLength        Specifies the length, in bytes, of the data to be 
received.
+  @param  Callback          The callback function. This function is called if 
the asynchronous transfer is
+                            completed.
+  @param  Context           Data passed into Callback function. This is 
optional parameter and may be NULL.
+
+  @retval EFI_SUCCESS           The HCI asynchronous receive request is 
submitted successfully.
+  @retval EFI_INVALID_PARAMETER One or more of the following conditions is 
TRUE:
+                                - DataLength is 0.
+                                - If IsNewTransfer is TRUE, and an 
asynchronous receive request already exists.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_HC_ASYNC_RECEIVE_EVENT)(
+  IN EFI_BLUETOOTH_HC_PROTOCOL            *This,
+  IN BOOLEAN                              IsNewTransfer,
+  IN UINTN                                PollingInterval,
+  IN UINTN                                DataLength,
+  IN EFI_BLUETOOTH_HC_ASYNC_FUNC_CALLBACK Callback,
+  IN VOID                                 *Context
+  );
+
+/**
+  Send HCI ACL data packet.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_HC_PROTOCOL instance.
+  @param  BufferSize    On input, indicates the size, in bytes, of the data 
buffer specified by Buffer.
+                        On output, indicates the amount of data actually 
transferred.
+  @param  Buffer        A pointer to the buffer of data that will be 
transmitted to Bluetooth host
+                        controller.
+  @param  Timeout       Indicating the transfer should be completed within 
this time frame. The units are
+                        in milliseconds. If Timeout is 0, then the caller must 
wait for the function to
+                        be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is 
returned.
+
+  @retval EFI_SUCCESS           The HCI ACL data packet is sent successfully.
+  @retval EFI_INVALID_PARAMETER One or more of the following conditions is 
TRUE:
+                                - BufferSize is NULL.
+                                - *BufferSize is 0.
+                                - Buffer is NULL.
+  @retval EFI_TIMEOUT           Sending HCI ACL data packet fail due to 
timeout.
+  @retval EFI_DEVICE_ERROR      Sending HCI ACL data packet fail due to host 
controller or device error.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_HC_SEND_ACL_DATA)(
+  IN EFI_BLUETOOTH_HC_PROTOCOL  *This,
+  IN OUT UINTN                  *BufferSize,
+  IN VOID                       *Buffer,
+  IN UINTN                      Timeout
+  );
+
+/**
+  Receive HCI ACL data packet.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_HC_PROTOCOL instance.
+  @param  BufferSize    On input, indicates the size, in bytes, of the data 
buffer specified by Buffer.
+                        On output, indicates the amount of data actually 
transferred.
+  @param  Buffer        A pointer to the buffer of data that will be received 
from Bluetooth host controller.
+  @param  Timeout       Indicating the transfer should be completed within 
this time frame. The units are
+                        in milliseconds. If Timeout is 0, then the caller must 
wait for the function to
+                        be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is 
returned.
+
+  @retval EFI_SUCCESS           The HCI ACL data packet is received 
successfully.
+  @retval EFI_INVALID_PARAMETER One or more of the following conditions is 
TRUE:
+                                - BufferSize is NULL.
+                                - *BufferSize is 0.
+                                - Buffer is NULL.
+  @retval EFI_TIMEOUT           Receiving HCI ACL data packet fail due to 
timeout.
+  @retval EFI_DEVICE_ERROR      Receiving HCI ACL data packet fail due to host 
controller or device error.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_HC_RECEIVE_ACL_DATA)(
+  IN EFI_BLUETOOTH_HC_PROTOCOL  *This,
+  IN OUT UINTN                  *BufferSize,
+  OUT VOID                      *Buffer,
+  IN UINTN                      Timeout
+  );
+
+
+/**
+  Receive HCI ACL data packet in non-blocking way.
+
+  @param  This              Pointer to the EFI_BLUETOOTH_HC_PROTOCOL instance.
+  @param  IsNewTransfer     If TRUE, a new transfer will be submitted. If 
FALSE, the request is deleted.
+  @param  PollingInterval   Indicates the periodic rate, in milliseconds, that 
the transfer is to be executed.
+  @param  DataLength        Specifies the length, in bytes, of the data to be 
received.
+  @param  Callback          The callback function. This function is called if 
the asynchronous transfer is
+                            completed.
+  @param  Context           Data passed into Callback function. This is 
optional parameter and may be NULL.
+
+  @retval EFI_SUCCESS           The HCI asynchronous receive request is 
submitted successfully.
+  @retval EFI_INVALID_PARAMETER One or more of the following conditions is 
TRUE:
+                                - DataLength is 0.
+                                - If IsNewTransfer is TRUE, and an 
asynchronous receive request already exists.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_HC_ASYNC_RECEIVE_ACL_DATA) (
+  IN EFI_BLUETOOTH_HC_PROTOCOL            *This,
+  IN BOOLEAN                              IsNewTransfer,
+  IN UINTN                                PollingInterval,
+  IN UINTN                                DataLength,
+  IN EFI_BLUETOOTH_HC_ASYNC_FUNC_CALLBACK Callback,
+  IN VOID                                 *Context
+  );
+
+/**
+  Send HCI SCO data packet.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_HC_PROTOCOL instance.
+  @param  BufferSize    On input, indicates the size, in bytes, of the data 
buffer specified by Buffer.
+                        On output, indicates the amount of data actually 
transferred.
+  @param  Buffer        A pointer to the buffer of data that will be 
transmitted to Bluetooth host
+                        controller.
+  @param  Timeout       Indicating the transfer should be completed within 
this time frame. The units are
+                        in milliseconds. If Timeout is 0, then the caller must 
wait for the function to
+                        be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is 
returned.
+
+  @retval EFI_SUCCESS           The HCI SCO data packet is sent successfully.
+  @retval EFI_UNSUPPORTED       The implementation does not support HCI SCO 
transfer.
+  @retval EFI_INVALID_PARAMETER One or more of the following conditions is 
TRUE:
+                                - BufferSize is NULL.
+                                - *BufferSize is 0.
+                                - Buffer is NULL.
+  @retval EFI_TIMEOUT           Sending HCI SCO data packet fail due to 
timeout.
+  @retval EFI_DEVICE_ERROR      Sending HCI SCO data packet fail due to host 
controller or device error.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_HC_SEND_SCO_DATA)(
+  IN EFI_BLUETOOTH_HC_PROTOCOL  *This,
+  IN OUT UINTN                  *BufferSize,
+  IN VOID                       *Buffer,
+  IN UINTN                      Timeout
+  );
+
+/**
+  Receive HCI SCO data packet.
+
+  @param  This          Pointer to the EFI_BLUETOOTH_HC_PROTOCOL instance.
+  @param  BufferSize    On input, indicates the size, in bytes, of the data 
buffer specified by Buffer.
+                        On output, indicates the amount of data actually 
transferred.
+  @param  Buffer        A pointer to the buffer of data that will be received 
from Bluetooth host controller.
+  @param  Timeout       Indicating the transfer should be completed within 
this time frame. The units are
+                        in milliseconds. If Timeout is 0, then the caller must 
wait for the function to
+                        be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is 
returned.
+
+  @retval EFI_SUCCESS           The HCI SCO data packet is received 
successfully.
+  @retval EFI_INVALID_PARAMETER One or more of the following conditions is 
TRUE:
+                                - BufferSize is NULL.
+                                - *BufferSize is 0.
+                                - Buffer is NULL.
+  @retval EFI_TIMEOUT           Receiving HCI SCO data packet fail due to 
timeout
+  @retval EFI_DEVICE_ERROR      Receiving HCI SCO data packet fail due to host 
controller or device error.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_HC_RECEIVE_SCO_DATA)(
+  IN EFI_BLUETOOTH_HC_PROTOCOL  *This,
+  IN OUT UINTN                  *BufferSize,
+  OUT VOID                      *Buffer,
+  IN UINTN                      Timeout
+  );
+
+/**
+  Receive HCI SCO data packet in non-blocking way.
+
+  @param  This              Pointer to the EFI_BLUETOOTH_HC_PROTOCOL instance.
+  @param  IsNewTransfer     If TRUE, a new transfer will be submitted. If 
FALSE, the request is deleted.
+  @param  PollingInterval   Indicates the periodic rate, in milliseconds, that 
the transfer is to be executed.
+  @param  DataLength        Specifies the length, in bytes, of the data to be 
received.
+  @param  Callback          The callback function. This function is called if 
the asynchronous transfer is
+                            completed.
+  @param  Context           Data passed into Callback function. This is 
optional parameter and may be NULL.
+
+  @retval EFI_SUCCESS           The HCI asynchronous receive request is 
submitted successfully.
+  @retval EFI_INVALID_PARAMETER One or more of the following conditions is 
TRUE:
+                                - DataLength is 0.
+                                - If IsNewTransfer is TRUE, and an 
asynchronous receive request already exists.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_HC_ASYNC_RECEIVE_SCO_DATA) (
+  IN EFI_BLUETOOTH_HC_PROTOCOL            *This,
+  IN BOOLEAN                              IsNewTransfer,
+  IN UINTN                                PollingInterval,
+  IN UINTN                                DataLength,
+  IN EFI_BLUETOOTH_HC_ASYNC_FUNC_CALLBACK Callback,
+  IN VOID                                 *Context
+  );
+
+///
+/// This protocol abstracts the Bluetooth host controller layer message 
transmit and receive.
+///
+struct _EFI_BLUETOOTH_HC_PROTOCOL {
+  EFI_BLUETOOTH_HC_SEND_COMMAND               SendCommand;
+  EFI_BLUETOOTH_HC_RECEIVE_EVENT              ReceiveEvent;
+  EFI_BLUETOOTH_HC_ASYNC_RECEIVE_EVENT        AsyncReceiveEvent;
+  EFI_BLUETOOTH_HC_SEND_ACL_DATA              SendACLData;
+  EFI_BLUETOOTH_HC_RECEIVE_ACL_DATA           ReceiveACLData;
+  EFI_BLUETOOTH_HC_ASYNC_RECEIVE_ACL_DATA     AsyncReceiveACLData;
+  EFI_BLUETOOTH_HC_SEND_SCO_DATA              SendSCOData;
+  EFI_BLUETOOTH_HC_RECEIVE_SCO_DATA           ReceiveSCOData;
+  EFI_BLUETOOTH_HC_ASYNC_RECEIVE_SCO_DATA     AsyncReceiveSCOData;
+};
+
+extern EFI_GUID gEfiBluetoothHcProtocolGuid;
+
+#endif
diff --git a/MdePkg/Include/Protocol/BluetoothIo.h 
b/MdePkg/Include/Protocol/BluetoothIo.h
new file mode 100644
index 0000000..652de57
--- /dev/null
+++ b/MdePkg/Include/Protocol/BluetoothIo.h
@@ -0,0 +1,416 @@
+/** @file
+  EFI Bluetooth IO Service Binding Protocol as defined in UEFI 2.5.
+  EFI Bluetooth IO Protocol as defined in UEFI 2.5.
+  The EFI Bluetooth IO Service Binding Protocol is used to locate EFI 
Bluetooth IO Protocol drivers to
+  create and destroy child of the driver to communicate with other Bluetooth 
device by using Bluetooth IO protocol.
+
+  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials are licensed and made available 
under
+  the terms and conditions of the BSD License that accompanies this 
distribution.
+  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php.
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  @par Revision Reference:
+  This Protocol is introduced in UEFI Specification 2.5
+
+**/
+
+#ifndef __EFI_BLUETOOTH_IO_PROTOCOL_H__
+#define __EFI_BLUETOOTH_IO_PROTOCOL_H__
+
+#include <IndustryStandard/Bluetooth.h>
+
+#define EFI_BLUETOOTH_IO_SERVICE_BINDING_PROTOCOL_GUID \
+  { \
+    0x388278d3, 0x7b85, 0x42f0, { 0xab, 0xa9, 0xfb, 0x4b, 0xfd, 0x69, 0xf5, 
0xab   } \
+  }
+
+#define EFI_BLUETOOTH_IO_PROTOCOL_GUID \
+  { \
+    0x467313de, 0x4e30, 0x43f1, { 0x94, 0x3e, 0x32, 0x3f, 0x89, 0x84, 0x5d, 
0xb5  } \
+  }
+
+typedef struct _EFI_BLUETOOTH_IO_PROTOCOL EFI_BLUETOOTH_IO_PROTOCOL;
+
+///
+/// EFI_BLUETOOTH_DEVICE_INFO
+///
+typedef struct {
+  ///
+  /// The version of the structure
+  ///
+  UINT32                      Version;
+  ///
+  /// 48bit Bluetooth device address.
+  ///
+  BLUETOOTH_ADDRESS           BD_ADDR;
+  ///
+  /// Bluetooth PageScanRepetitionMode. See Bluetooth specification for detail.
+  ///
+  UINT8                       PageScanRepetitionMode;
+  ///
+  /// Bluetooth ClassOfDevice. See Bluetooth specification for detail.
+  ///
+  BLUETOOTH_CLASS_OF_DEVICE   ClassOfDevice;
+  ///
+  /// Bluetooth CloseOffset. See Bluetooth specification for detail.
+  ///
+  UINT16                      ClockOffset;
+  ///
+  /// Bluetooth RSSI. See Bluetooth specification for detail.
+  ///
+  UINT8                       RSSI;
+  ///
+  /// Bluetooth ExtendedInquiryResponse. See Bluetooth specification for 
detail.
+  ///
+  UINT8                       ExtendedInquiryResponse[240];
+} EFI_BLUETOOTH_DEVICE_INFO;
+
+/**
+  Get Bluetooth device information.
+
+  @param  This            Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
+  @param  DeviceInfoSize  A pointer to the size, in bytes, of the DeviceInfo 
buffer.
+  @param  DeviceInfo      A pointer to a callee allocated buffer that returns 
Bluetooth device information.
+
+  @retval EFI_SUCCESS           The Bluetooth device information is returned 
successfully.
+  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to retrieve 
the Bluetooth device information.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_IO_GET_DEVICE_INFO)(
+  IN EFI_BLUETOOTH_IO_PROTOCOL  *This,
+  OUT UINTN                     *DeviceInfoSize,
+  OUT VOID                      **DeviceInfo
+  );
+
+/**
+  Get Bluetooth SDP information.
+
+  @param  This            Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
+  @param  SdpInfoSize     A pointer to the size, in bytes, of the SdpInfo 
buffer.
+  @param  SdpInfo         A pointer to a callee allocated buffer that returns 
Bluetooth SDP information.
+
+  @retval EFI_SUCCESS           The Bluetooth device information is returned 
successfully.
+  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to retrieve 
the Bluetooth SDP information.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_IO_GET_SDP_INFO)(
+  IN EFI_BLUETOOTH_IO_PROTOCOL  *This,
+  OUT UINTN                     *SdpInfoSize,
+  OUT VOID                      **SdpInfo
+  );
+
+/**
+  Send L2CAP message (including L2CAP header).
+
+  @param  This            Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
+  @param  BufferSize      On input, indicates the size, in bytes, of the data 
buffer specified by Buffer.
+                          On output, indicates the amount of data actually 
transferred.
+  @param  Buffer          A pointer to the buffer of data that will be 
transmitted to Bluetooth L2CAP layer.
+  @param  Timeout         Indicating the transfer should be completed within 
this time frame. The units are in
+                          milliseconds. If Timeout is 0, then the caller must 
wait for the function to be completed
+                          until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
+
+  @retval EFI_SUCCESS             The L2CAP message is sent successfully.
+  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is 
TRUE:
+                                  - BufferSize is NULL.
+                                  - *BufferSize is 0.
+                                  - Buffer is NULL.
+  @retval EFI_TIMEOUT             Sending L2CAP message fail due to timeout.
+  @retval EFI_DEVICE_ERROR        Sending L2CAP message fail due to host 
controller or device error.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_RAW_SEND)(
+  IN EFI_BLUETOOTH_IO_PROTOCOL  *This,
+  IN OUT UINTN                  *BufferSize,
+  IN VOID                       *Buffer,
+  IN UINTN                      Timeout
+  );
+
+/**
+  Receive L2CAP message (including L2CAP header).
+
+  @param  This            Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
+  @param  BufferSize      On input, indicates the size, in bytes, of the data 
buffer specified by Buffer.
+                          On output, indicates the amount of data actually 
transferred.
+  @param  Buffer          A pointer to the buffer of data that will be 
received from Bluetooth L2CAP layer.
+  @param  Timeout         Indicating the transfer should be completed within 
this time frame. The units are in
+                          milliseconds. If Timeout is 0, then the caller must 
wait for the function to be completed
+                          until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
+
+  @retval EFI_SUCCESS             The L2CAP message is received successfully.
+  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is 
TRUE:
+                                  - BufferSize is NULL.
+                                  - *BufferSize is 0.
+                                  - Buffer is NULL.
+  @retval EFI_TIMEOUT             Receiving L2CAP message fail due to timeout.
+  @retval EFI_DEVICE_ERROR        Receiving L2CAP message fail due to host 
controller or device error.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_RAW_RECEIVE)(
+  IN EFI_BLUETOOTH_IO_PROTOCOL  *This,
+  IN OUT UINTN                  *BufferSize,
+  OUT VOID                      *Buffer,
+  IN UINTN                      Timeout
+  );
+
+/**
+  Callback function, it is called when asynchronous transfer is completed.
+
+  @param  ChannelID         Bluetooth L2CAP message channel ID.
+  @param  Data              Data received via asynchronous transfer.
+  @param  DataLength        The length of Data in bytes, received via 
asynchronous transfer.
+  @param  Context           Context passed from asynchronous transfer request.
+
+  @retval EFI_SUCCESS       The callback function complete successfully.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_IO_ASYNC_FUNC_CALLBACK) (
+  IN UINT16                     ChannelID,
+  IN VOID                       *Data,
+  IN UINTN                      DataLength,
+  IN VOID                       *Context
+  );
+
+/**
+  Receive L2CAP message (including L2CAP header) in non-blocking way.
+
+  @param  This            Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
+  @param  IsNewTransfer   If TRUE, a new transfer will be submitted. If FALSE, 
the request is deleted.
+  @param  PollingInterval Indicates the periodic rate, in milliseconds, that 
the transfer is to be executed.
+  @param  DataLength      Specifies the length, in bytes, of the data to be 
received.
+  @param  Callback        The callback function. This function is called if 
the asynchronous transfer is
+                          completed.
+  @param  Context         Data passed into Callback function. This is optional 
parameter and may be NULL.
+
+  @retval EFI_SUCCESS             The L2CAP asynchronous receive request is 
submitted successfully.
+  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is 
TRUE:
+                                  - DataLength is 0.
+                                  - If IsNewTransfer is TRUE, and an 
asynchronous receive request already exists.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_RAW_ASYNC_RECEIVE)(
+  IN EFI_BLUETOOTH_IO_PROTOCOL              *This,
+  IN BOOLEAN                                IsNewTransfer,
+  IN UINTN                                  PollingInterval,
+  IN UINTN                                  DataLength,
+  IN EFI_BLUETOOTH_IO_ASYNC_FUNC_CALLBACK   Callback,
+  IN VOID                                   *Context
+  );
+
+/**
+  Send L2CAP message (excluding L2CAP header) to a specific channel.
+
+  @param  This            Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
+  @param  Handle          A handle created by 
EFI_BLUETOOTH_IO_PROTOCOL.L2CapConnect indicates which channel to send.
+  @param  BufferSize      On input, indicates the size, in bytes, of the data 
buffer specified by Buffer.
+                          On output, indicates the amount of data actually 
transferred.
+  @param  Buffer          A pointer to the buffer of data that will be 
transmitted to Bluetooth L2CAP layer.
+  @param  Timeout         Indicating the transfer should be completed within 
this time frame. The units are in
+                          milliseconds. If Timeout is 0, then the caller must 
wait for the function to be completed
+                          until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
+
+  @retval EFI_SUCCESS             The L2CAP message is sent successfully.
+  @retval EFI_NOT_FOUND           Handle is invalid or not found.
+  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is 
TRUE:
+                                  - BufferSize is NULL.
+                                  - *BufferSize is 0.
+                                  - Buffer is NULL.
+  @retval EFI_TIMEOUT             Sending L2CAP message fail due to timeout.
+  @retval EFI_DEVICE_ERROR        Sending L2CAP message fail due to host 
controller or device error.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_SEND)(
+  IN EFI_BLUETOOTH_IO_PROTOCOL  *This,
+  IN EFI_HANDLE                 Handle,
+  IN OUT UINTN                  *BufferSize,
+  IN VOID                       *Buffer,
+  IN UINTN                      Timeout
+  );
+
+/**
+  Receive L2CAP message (excluding L2CAP header) from a specific channel.
+
+  @param  This            Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
+  @param  Handle          A handle created by 
EFI_BLUETOOTH_IO_PROTOCOL.L2CapConnect indicates which channel to receive.
+  @param  BufferSize      Indicates the size, in bytes, of the data buffer 
specified by Buffer.
+  @param  Buffer          A pointer to the buffer of data that will be 
received from Bluetooth L2CAP layer.
+  @param  Timeout         Indicating the transfer should be completed within 
this time frame. The units are in
+                          milliseconds. If Timeout is 0, then the caller must 
wait for the function to be completed
+                          until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
+
+  @retval EFI_SUCCESS             The L2CAP message is received successfully.
+  @retval EFI_NOT_FOUND           Handle is invalid or not found.
+  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is 
TRUE:
+                                  - BufferSize is NULL.
+                                  - *BufferSize is 0.
+                                  - Buffer is NULL.
+  @retval EFI_TIMEOUT             Receiving L2CAP message fail due to timeout.
+  @retval EFI_DEVICE_ERROR        Receiving L2CAP message fail due to host 
controller or device error.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_RECEIVE)(
+  IN EFI_BLUETOOTH_IO_PROTOCOL  *This,
+  IN EFI_HANDLE                 Handle,
+  OUT UINTN                     *BufferSize,
+  OUT VOID                      **Buffer,
+  IN UINTN                      Timeout
+  );
+
+/**
+  Callback function, it is called when asynchronous transfer is completed.
+
+  @param  Data              Data received via asynchronous transfer.
+  @param  DataLength        The length of Data in bytes, received via 
asynchronous transfer.
+  @param  Context           Context passed from asynchronous transfer request.
+
+  @retval EFI_SUCCESS       The callback function complete successfully.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_IO_CHANNEL_SERVICE_CALLBACK) (
+  IN VOID                       *Data,
+  IN UINTN                      DataLength,
+  IN VOID                       *Context
+  );
+
+/**
+  Receive L2CAP message (excluding L2CAP header) in non-blocking way from a 
specific channel.
+
+  @param  This            Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
+  @param  Handel          A handle created by 
EFI_BLUETOOTH_IO_PROTOCOL.L2CapConnect indicates which channel to receive.
+  @param  Callback        The callback function. This function is called if 
the asynchronous transfer is
+                          completed.
+  @param  Context         Data passed into Callback function. This is optional 
parameter and may be NULL.
+
+  @retval EFI_SUCCESS             The L2CAP asynchronous receive request is 
submitted successfully.
+  @retval EFI_NOT_FOUND           Handle is invalid or not found.
+  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is 
TRUE:
+                                  - DataLength is 0.
+                                  - If an asynchronous receive request already 
exists on same Handle.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_ASYNC_RECEIVE)(
+  IN EFI_BLUETOOTH_IO_PROTOCOL                    *This,
+  IN EFI_HANDLE                                   Handle,
+  IN EFI_BLUETOOTH_IO_CHANNEL_SERVICE_CALLBACK    Callback,
+  IN VOID                                         *Context
+  );
+
+/**
+  Do L2CAP connection.
+
+  @param  This            Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
+  @param  Handel          A handle to indicate this L2CAP connection.
+  @param  Psm             Bluetooth PSM. See Bluetooth specification for 
detail.
+  @param  Mtu             Bluetooth MTU. See Bluetooth specification for 
detail.
+  @param  Callback        The callback function. This function is called 
whenever there is message received
+                          in this channel.
+  @param  Context         Data passed into Callback function. This is optional 
parameter and may be NULL.
+
+  @retval EFI_SUCCESS             The Bluetooth L2CAP layer connection is 
created successfully.
+  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is 
TRUE:
+                                  - Handle is NULL.
+  @retval EFI_DEVICE_ERROR        A hardware error occurred trying to do 
Bluetooth L2CAP connection.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_CONNECT)(
+  IN EFI_BLUETOOTH_IO_PROTOCOL                    *This,
+  OUT EFI_HANDLE                                  *Handle,
+  IN UINT16                                       Psm,
+  IN UINT16                                       Mtu,
+  IN EFI_BLUETOOTH_IO_CHANNEL_SERVICE_CALLBACK    Callback,
+  IN VOID                                         *Context
+  );
+
+/**
+  Do L2CAP disconnection.
+
+  @param  This            Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
+  @param  Handel          A handle to indicate this L2CAP connection.
+
+  @retval EFI_SUCCESS             The Bluetooth L2CAP layer is disconnected 
successfully.
+  @retval EFI_NOT_FOUND           Handle is invalid or not found.
+  @retval EFI_DEVICE_ERROR        A hardware error occurred trying to do 
Bluetooth L2CAP disconnection.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_DISCONNECT)(
+  IN EFI_BLUETOOTH_IO_PROTOCOL                    *This,
+  IN EFI_HANDLE                                   Handle
+  );
+
+/**
+  Register L2CAP callback function for special channel.
+
+  @param  This            Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
+  @param  Handel          A handle to indicate this L2CAP connection.
+  @param  Psm             Bluetooth PSM. See Bluetooth specification for 
detail.
+  @param  Mtu             Bluetooth MTU. See Bluetooth specification for 
detail.
+  @param  Callback        The callback function. This function is called 
whenever there is message received
+                          in this channel. NULL means unregister.
+  @param  Context         Data passed into Callback function. This is optional 
parameter and may be NULL.
+
+  @retval EFI_SUCCESS             The Bluetooth L2CAP callback function is 
registered successfully.
+  @retval EFI_ALREADY_STARTED     The callback function already exists when 
register.
+  @retval EFI_NOT_FOUND           The callback function does not exist when 
unregister.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_REGISTER_SERVICE)(
+  IN EFI_BLUETOOTH_IO_PROTOCOL                    *This,
+  OUT EFI_HANDLE                                  *Handle,
+  IN UINT16                                       Psm,
+  IN UINT16                                       Mtu,
+  IN EFI_BLUETOOTH_IO_CHANNEL_SERVICE_CALLBACK    Callback,
+  IN VOID                                         *Context
+  );
+
+///
+/// This protocol provides service for Bluetooth L2CAP (Logical Link Control 
and Adaptation Protocol)
+/// and SDP (Service Discovery Protocol).
+///
+struct _EFI_BLUETOOTH_IO_PROTOCOL {
+  EFI_BLUETOOTH_IO_GET_DEVICE_INFO            GetDeviceInfo;
+  EFI_BLUETOOTH_IO_GET_SDP_INFO               GetSdpInfo;
+  EFI_BLUETOOTH_IO_L2CAP_RAW_SEND             L2CapRawSend;
+  EFI_BLUETOOTH_IO_L2CAP_RAW_RECEIVE          L2CapRawReceive;
+  EFI_BLUETOOTH_IO_L2CAP_RAW_ASYNC_RECEIVE    L2CapRawAsyncReceive;
+  EFI_BLUETOOTH_IO_L2CAP_SEND                 L2CapSend;
+  EFI_BLUETOOTH_IO_L2CAP_RECEIVE              L2CapReceive;
+  EFI_BLUETOOTH_IO_L2CAP_ASYNC_RECEIVE        L2CapAsyncReceive;
+  EFI_BLUETOOTH_IO_L2CAP_CONNECT              L2CapConnect;
+  EFI_BLUETOOTH_IO_L2CAP_DISCONNECT           L2CapDisconnect;
+  EFI_BLUETOOTH_IO_L2CAP_REGISTER_SERVICE     L2CapRegisterService;
+};
+
+extern EFI_GUID gEfiBluetoothIoServiceBindingProtocolGuid;
+extern EFI_GUID gEfiBluetoothIoProtocolGuid;
+
+#endif
diff --git a/MdePkg/Include/Protocol/DevicePath.h 
b/MdePkg/Include/Protocol/DevicePath.h
index 3c9b1ec..4d2f340 100644
--- a/MdePkg/Include/Protocol/DevicePath.h
+++ b/MdePkg/Include/Protocol/DevicePath.h
@@ -20,7 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 
EXPRESS OR IMPLIED.
 #define __EFI_DEVICE_PATH_PROTOCOL_H__

 #include <Guid/PcAnsi.h>
-
+#include <IndustryStandard/Bluetooth.h>
 ///
 /// Device Path protocol.
 ///
@@ -862,6 +862,18 @@ typedef struct {
   UINT16                          VlanId;
 } VLAN_DEVICE_PATH;

+///
+/// Bluetooth Device Path SubType.
+///
+#define MSG_BLUETOOTH_DP     0x1b
+typedef struct {
+  EFI_DEVICE_PATH_PROTOCOL        Header;
+  ///
+  /// 48bit Bluetooth device address.
+  ///
+  BLUETOOTH_ADDRESS               BD_ADDR;
+} BLUETOOTH_DEVICE_PATH;
+
 //
 // Media Device Path
 //
@@ -1110,6 +1122,7 @@ typedef union {
   SAS_DEVICE_PATH                            Sas;
   SASEX_DEVICE_PATH                          SasEx;
   NVME_NAMESPACE_DEVICE_PATH                 NvmeNamespace;
+  BLUETOOTH_DEVICE_PATH                      Bluetooth;
   UFS_DEVICE_PATH                            Ufs;
   HARDDRIVE_DEVICE_PATH                      HardDrive;
   CDROM_DEVICE_PATH                          CD;
@@ -1161,6 +1174,7 @@ typedef union {
   SAS_DEVICE_PATH                            *Sas;
   SASEX_DEVICE_PATH                          *SasEx;
   NVME_NAMESPACE_DEVICE_PATH                 *NvmeNamespace;
+  BLUETOOTH_DEVICE_PATH                      *Bluetooth;
   UFS_DEVICE_PATH                            *Ufs;
   HARDDRIVE_DEVICE_PATH                      *HardDrive;
   CDROM_DEVICE_PATH                          *CD;
diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
index c5366d8..9ae7d70 100644
--- a/MdePkg/MdePkg.dec
+++ b/MdePkg/MdePkg.dec
@@ -1428,6 +1428,16 @@
   #
   ## Include/Protocol/NvmExpressPassthru.h
   gEfiNvmExpressPassThruProtocolGuid   = { 0x52c78312, 0x8edc, 0x4233, { 0x98, 
0xf2, 0x1a, 0x1a, 0xa5, 0xe3, 0x88, 0xa5 }}
+
+  ## Include/Protocol/BluetoothHc.h
+  gEfiBluetoothHcProtocolGuid         = { 0xb3930571, 0xbeba, 0x4fc5, { 0x92, 
0x3, 0x94, 0x27, 0x24, 0x2e, 0x6a, 0x43 }}
+
+  ## Include/Protocol/BluetoothIo.h
+  gEfiBluetoothIoServiceBindingProtocolGuid   = { 0x388278d3, 0x7b85, 0x42f0, 
{ 0xab, 0xa9, 0xfb, 0x4b, 0xfd, 0x69, 0xf5, 0xab }}
+  gEfiBluetoothIoProtocolGuid                 = { 0x467313de, 0x4e30, 0x43f1, 
{ 0x94, 0x3e, 0x32, 0x3f, 0x89, 0x84, 0x5d, 0xb5 }}
+
+  ## Include/Protocol/BluetoothConfig.h
+  gEfiBluetoothConfigProtocolGuid             = { 0x62960cf3, 0x40ff, 0x4263, 
{ 0xa7, 0x7c, 0xdf, 0xde, 0xbd, 0x19, 0x1b, 0x4b }}

 #
 # [Error.gEfiMdePkgTokenSpaceGuid]
--
1.9.5.msysgit.1



------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud 
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to