Newer
Older
mbed-os / connectivity / FEATURE_BLE / cordio / TARGET_CORDIO_LL / stack / controller / sources / ble / ll / ll_main_iso.c
@Paul Szczeanek Paul Szczeanek on 7 Aug 2020 9 KB remove generic, TPPs, nested namespaces
/*************************************************************************************************/
/*!
 *  \file
 *
 *  \brief      Link layer (LL) slave parameter interface implementation file.
 *
 *  Copyright (c) 2013-2018 Arm Ltd. All Rights Reserved.
 *
 *  Copyright (c) 2019-2020 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 "ll_api.h"
#include "wsf_cs.h"
#include "wsf_math.h"
#include "wsf_msg.h"
#include "wsf_trace.h"
#include "util/bstream.h"
#include <string.h>
#include "lctr_api_iso.h"
#include "lmgr_api_iso.h"

/*************************************************************************************************/
/*!
 *  \brief      Get the maximum ISO buffers size.
 *
 *  \return     Maximum buffers size in bytes.
 */
/*************************************************************************************************/
uint16_t LlGetIsoMaxBufSize(void)
{
  LL_TRACE_INFO1("### LlApi ###  LlGetIsoMaxBufSize, maxBufSize=%u", pLctrRtCfg->maxIsoSduLen);

  return pLctrRtCfg->maxIsoSduLen;
}

/*************************************************************************************************/
/*!
 *  \brief      Get the number of buffers in the LL ISO transmit queue.
 *
 *  \return     Number of buffers.
 */
/*************************************************************************************************/
uint8_t LlGetIsoTxBufs(void)
{
  LL_TRACE_INFO1("### LlApi ###  LlGetIsoTxBufs, numBufs=%u", pLctrRtCfg->numIsoTxBuf);

  return pLctrRtCfg->numIsoTxBuf;
}

/*************************************************************************************************/
/*!
 *  \brief      Get the number of buffers in the LL ISO receive queue.
 *
 *  \return     Number of buffers.
 */
/*************************************************************************************************/
uint8_t LlGetIsoRxBufs(void)
{
  LL_TRACE_INFO1("### LlApi ###  LlGetIsoRxBufs, numBufs=%u", pLctrRtCfg->numIsoRxBuf);

  return pLctrRtCfg->numIsoRxBuf;
}

/*************************************************************************************************/
/*!
 *  \brief      Read ISO link Quality stats.
 *
 *  \param      handle  connection handle.
 *
 *  \return     Status error code.
 */
/*************************************************************************************************/
uint8_t LlReadIsoLinkQual(uint16_t handle, LlIsoLinkQual_t * pStats)
{
  LL_TRACE_INFO1("### LlApi ###  LlReadIsoLinkQual, handle=%u", handle);

  return LctrReadIsoLinkQual(handle, pStats);
}

/*************************************************************************************************/
/*!
 *  \brief      Initialize LL for use with an audio codec.
 */
/*************************************************************************************************/
void LlInitCodec(void)
{
  LctrInitCodec();
}

/*************************************************************************************************/
/*!
 *  \brief      Send an ISO data packet.
 *
 *  \param      pData   Data buffer
 *
 *  Send an ISO data packet. pData points to an ACL buffer formatted according to [1]; the host
 *  must set the connection handle, flags, and length fields in the buffer.
 */
/*************************************************************************************************/
void LlSendIsoData(uint8_t *pData)
{
  if (lmgrIsoCb.availTxBuf == 0)
  {
    LL_TRACE_WARN0("!!! ISO flow control detected; dropping Tx data PDU");

    /* Drop packet. */
    WsfMsgFree(pData);
    return;
  }

  LctrTxIso(pData);
}

/*************************************************************************************************/
/*!
 *  \brief      Receive an ISO data packet
 *
 *  \return     Data buffer.
 *
 *  Receive an ISO data packet.  This function returns a pointer to an ISO buffer formatted
 *  according to [1].  The host must parse the header to determine the connection handle, flags,
 *  and length fields.  If no ISO buffers are available this function returns NULL.
 *
 *  The host must deallocate the buffer by calling WsfMsgFree() and then calling
 *  LlRecvIsoDataComplete().
 */
/*************************************************************************************************/
uint8_t *LlRecvIsoData(void)
{
  return LctrRxIso();
}

/*************************************************************************************************/
/*!
 *  \brief      Indicate that received ISO data buffer has been deallocated
 *
 *  \param      numBufs     Number of completed packets.
 *
 *  Indicate that received ISO data buffer has been deallocated.
 */
/*************************************************************************************************/
void LlRecvIsoDataComplete(uint8_t numBufs)
{
  LctrRxIsoComplete(numBufs);
}

/*************************************************************************************************/
/*!
 *  \brief      Used to identify and enable the isochronous data path between the host and the
 *              controller for each connected isochronous or broadcast isochronous stream.
 *
 *  \param      handle      BIS or CIS handle.
 *  \param      pPktSn      Packet sequence number.
 *  \param      pTs         Timestamp.
 *  \param      pTimeOffs   Time offset.
 *
 *  \return     Status error code.
 */
/*************************************************************************************************/
uint8_t LlReadIsoTxSync(uint16_t handle, uint16_t *pPktSn, uint32_t *pTs, uint32_t *pTimeOffs)
{
  LL_TRACE_INFO1("### LlApi ###  LlReadIsoTxSync, handle=%u", handle);
  return LctrReadIsoTxSync(handle, pPktSn, pTs, pTimeOffs);
}

/*************************************************************************************************/
/*!
 *  \brief      Used to identify and enable the isochronous data path between the host and the
 *              controller for each connected isochronous stream or broadcast isochronous stream.
 *
 *  \param      pSetupDataPath   Parameters for setup ISO data path.
 */
/*************************************************************************************************/
uint8_t LlSetupIsoDataPath(LlIsoSetupDataPath_t *pSetupDataPath)
{
  LL_TRACE_INFO3("### LlApi ###  LlSetupIsoDataPath, handle=%u, dpDir=%u, dpId=%u", pSetupDataPath->handle, pSetupDataPath->dpDir, pSetupDataPath->dpId);

  return LctrSetupIsoDataPath(pSetupDataPath);
}

/*************************************************************************************************/
/*!
 *  \brief      Used to remove the isochronous data path associated with the
 *              connected isochronous stream or broadcast isochronous stream.
 *
 *  \param      handle      CIS or BIS handle.
 *  \param      dpDir       Direction of data path to remove.
 */
/*************************************************************************************************/
uint8_t LlRemoveIsoDataPath(uint16_t handle, uint8_t dpDir)
{
  LL_TRACE_INFO2("### LlApi ###  LlRemoveIsoDataPath, handle=%u, dpDir=%u", handle, dpDir);

  return LctrRemoveIsoDataPath(handle, dpDir);
}

/*************************************************************************************************/
/*!
 *  \brief      Enable ISO Tx test.
 *
 *  \param      handle      CIS or BIS handle.
 *  \param      pldType     Payload type.
 *
 *  \return     Status error code.
 */
/*************************************************************************************************/
uint8_t LlIsoTxTest(uint16_t handle, uint8_t pldType)
{
  LL_TRACE_INFO2("### LlApi ###  LlIsoTxTest handle=%d pldType=%d", handle, pldType);

  return LctrIsoTxTest(handle, pldType);
}

/*************************************************************************************************/
/*!
 *  \brief      Enable ISO Rx test.
 *
 *  \param      handle      CIS or BIS handle.
 *  \param      pldType     Payload type.
 *
 *  \return     Status error code.
 */
/*************************************************************************************************/
uint8_t LlIsoRxTest(uint16_t handle, uint8_t pldType)
{
  LL_TRACE_INFO2("### LlApi ###  LlIsoRxTest handle=%d pldType=%d", handle, pldType);

  return LctrIsoRxTest(handle, pldType);
}

/*************************************************************************************************/
/*!
 *  \brief      ISO read test counter.
 *
 *  \param      handle      CIS or BIS handle.
 *  \param      pCtr        Test Counter.
 *
 *  \return     Status error code.
 */
/*************************************************************************************************/
uint8_t LlIsoReadTestCounter(uint16_t handle, LlIsoTestCtrs_t *pCtr)
{
  LL_TRACE_INFO1("### LlApi ###  LlIsoReadTestCounter handle=%d", handle);

  LctrIsoReadTestCounter(handle, pCtr);

  return LL_SUCCESS;
}

/*************************************************************************************************/
/*!
 *  \brief      Terminate ISO Tx or Rx test.
 *
 *  \param      handle      CIS or BIS handle.
 *  \param      pCtr        Test counters.
 *
 *  \return     Status error code.
 */
/*************************************************************************************************/
uint8_t LlIsoTestEnd(uint16_t handle, LlIsoTestCtrs_t *pCtr)
{
  LL_TRACE_INFO1("### LlApi ###  LlIsoTestEnd handle=%d", handle);

  return LctrIsoTestEnd(handle, pCtr);
}