blob: baa484772d47a47fe7a2a2194c36db4d99ea8c63 [file] [log] [blame]
/*
*
* Copyright (c) 2022 Project CHIP Authors
*
* 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "em_gpio.h"
#include "sl_wfx.h"
#include "sl_wfx_board.h"
#include "sl_wfx_host.h"
#include "sl_wfx_task.h"
#include "FreeRTOS.h"
#include "event_groups.h"
#include "task.h"
#include "AppConfig.h"
#define CHECK_VAL 0
#define WFX_BUS_TASK_PRIORITY 2
#define BUS_TASK_STACK_SIZE 1024
static StackType_t busStack[BUS_TASK_STACK_SIZE];
StaticTask_t busTaskStruct;
TaskHandle_t wfx_bus_task_handle;
wfx_frame_q_item wfx_bus_tx_frame;
SemaphoreHandle_t wfxtask_tx_complete;
SemaphoreHandle_t wfxtask_mutex;
// Flag to indicate receive frames is currently running.
static bool wfx_bus_rx_in_process = false;
/***************************************************************************
* @fn bool wfx_bus_is_receive_processing(void)
* @brief
* Check receive frame status
* @param[in] None
* @return returns wfx_bus_rx_in_process
******************************************************************************/
bool wfx_bus_is_receive_processing(void)
{
return wfx_bus_rx_in_process;
}
/*****************************************************************************
* @fn static sl_status_t receive_frames()
* @brief
* Receives frames from the WFX.
* @param[in] None
* @return returns result
******************************************************************************/
static sl_status_t receive_frames()
{
sl_status_t result;
uint16_t control_register = 0;
wfx_bus_rx_in_process = true;
do
{
result = sl_wfx_receive_frame(&control_register);
SL_WFX_ERROR_CHECK(result);
} while ((control_register & SL_WFX_CONT_NEXT_LEN_MASK) != CHECK_VAL);
error_handler:
wfx_bus_rx_in_process = false;
return result;
}
/********************************************************************************
* @fn static void wfx_bus_task(void *p_arg)
* @brief
* WFX bus communication task.
* receives frames from the Bus interface
* @param[in] p_arg:
* @return None
*/
static void wfx_bus_task(void * p_arg)
{
EFR32_LOG("SPI: Bus Task started");
sl_wfx_host_start_platform_interrupt();
for (;;)
{
/*Wait for an interrupt from WFX*/
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
/*Disable the interrupt while treating frames received to avoid
*the case where the interrupt is set but there is no frame left to treat.*/
sl_wfx_host_disable_platform_interrupt();
/*Receive the frame(s) pending in WFX*/
receive_frames();
/*Re-enable the interrupt*/
sl_wfx_host_enable_platform_interrupt();
}
}
/***************************************************************************
* @fn void wfx_bus_start()
* @brief
* Creates WFX bus communication task.
* @param[in] None
* @return None
******************************************************************************/
void wfx_bus_start()
{
wfx_bus_task_handle =
xTaskCreateStatic(wfx_bus_task, "wfxbus", BUS_TASK_STACK_SIZE, NULL, WFX_BUS_TASK_PRIORITY, busStack, &busTaskStruct);
if (wfx_bus_task_handle == NULL)
{
EFR32_LOG("*ERR*WFX BusTask");
}
}