| /* |
| * |
| * 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"); |
| } |
| } |