Newer
Older
mbed-os / features / FEATURE_BLE / targets / TARGET_CORDIO / stack / ble-host / sources / hci / dual_chip / hci_vs_ae.c
@Paul Szczeanek Paul Szczeanek on 2 Jul 2020 5 KB update host and wsf files
/*************************************************************************************************/
/*!
 *  \file
 *
 *  \brief  HCI vendor specific AE functions for generic controllers.
 *
 *  Copyright (c) 2016-2018 Arm Ltd. All Rights Reserved.
 *
 *  Copyright (c) 2019 Packetcraft, Inc.
 *  
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *  
 *      http://www.apache.org/licenses/LICENSE-2.0
 *  
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
/*************************************************************************************************/

#include "wsf_types.h"
#include "util/bstream.h"
#include "hci_core.h"

#if HCI_VS_TARGET == HCI_VS_GENERIC

/**************************************************************************************************
  Local Functions
**************************************************************************************************/

static void hciCoreReadMaxAdvDataLen(void);
static void hciCoreReadNumSupAdvSets(void);
static void hciCoreReadPerAdvListSize(void);

/*************************************************************************************************/
/*!
 *  \brief  Read maximum advertising data length command.
 *
 *  \return None.
 */
/*************************************************************************************************/
static void hciCoreReadMaxAdvDataLen(void)
{
  /* if LE Extended Advertising is supported by Controller and included */
  if ((hciCoreCb.leSupFeat & HCI_LE_SUP_FEAT_LE_EXT_ADV) &&
      (hciLeSupFeatCfg & HCI_LE_SUP_FEAT_LE_EXT_ADV))
  {
    /* send next command in sequence */
    HciLeReadMaxAdvDataLen();
  }
  else
  {
    hciCoreCb.maxAdvDataLen = 0;

    /* send next command in sequence */
    hciCoreReadNumSupAdvSets();
  }
}

/*************************************************************************************************/
/*!
 *  \brief  Read read number of supported advertising sets command.
 *
 *  \return None.
 */
/*************************************************************************************************/
static void hciCoreReadNumSupAdvSets(void)
{
  /* if LE Extended Advertising is supported by Controller and included */
  if ((hciCoreCb.leSupFeat & HCI_LE_SUP_FEAT_LE_EXT_ADV) &&
      (hciLeSupFeatCfg & HCI_LE_SUP_FEAT_LE_EXT_ADV))
  {
    /* send next command in sequence */
    HciLeReadNumSupAdvSets();
  }
  else
  {
    hciCoreCb.numSupAdvSets = 0;

    /* send next command in sequence */
    hciCoreReadPerAdvListSize();
  }
}

/*************************************************************************************************/
/*!
 *  \brief  Read periodic advertiser list size command.
 *
 *  \return None.
 */
/*************************************************************************************************/
static void hciCoreReadPerAdvListSize(void)
{
  /* if LE Extended Advertising is supported by Controller and included */
  if ((hciCoreCb.leSupFeat & HCI_LE_SUP_FEAT_LE_PER_ADV) &&
      (hciLeSupFeatCfg & HCI_LE_SUP_FEAT_LE_PER_ADV))
  {
    /* send next command in sequence */
    HciLeReadPerAdvListSizeCmd();
  }
  else
  {
    hciCoreCb.perAdvListSize = 0;

    /* send next command in sequence */
    HciLeRandCmd();
  }
}

/*************************************************************************************************/
/*!
 *  \brief  Implement the HCI extended reset sequence.
 *
 *  \param  pMsg    HCI event message from previous command in the sequence.
 *  \param  opcode  HCI event message opcode.
 *
 *  \return None.
 */
/*************************************************************************************************/
static void hciCoreExtResetSequence(uint8_t *pMsg, uint16_t opcode)
{
  /* decode opcode */
  switch (opcode)
  {
    case HCI_OPCODE_READ_LOCAL_VER_INFO:
      /* send next command in sequence */
      hciCoreReadMaxAdvDataLen();
      break;

    case HCI_OPCODE_LE_READ_MAX_ADV_DATA_LEN:
      BSTREAM_TO_UINT16(hciCoreCb.maxAdvDataLen, pMsg);

      /* send next command in sequence */
      hciCoreReadNumSupAdvSets();
      break;

    case HCI_OPCODE_LE_READ_NUM_SUP_ADV_SETS:
      /* parse and store event parameters */
      BSTREAM_TO_UINT8(hciCoreCb.numSupAdvSets, pMsg);

      /* send next command in sequence */
      hciCoreReadPerAdvListSize();
      break;

    case HCI_OPCODE_LE_READ_PER_ADV_LIST_SIZE:
      /* parse and store event parameters */
      BSTREAM_TO_UINT8(hciCoreCb.perAdvListSize, pMsg);

      /* send next command in sequence */
      HciLeRandCmd();
      break;

    default:
      break;
  }
}

/*************************************************************************************************/
/*!
 *  \brief  Vendor-specific controller AE initialization function.
 *
 *  \param  param    Vendor-specific parameter.
 *
 *  \return None.
 */
/*************************************************************************************************/
void HciVsAeInit(uint8_t param)
{
  hciCoreCb.extResetSeq = hciCoreExtResetSequence;
}

#endif