blob: c6d6381932d3ea3eb7c53ec76fd91bba7f8ad2f8 [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.
*/
/**
* Includes
*/
#include "em_cmu.h"
#ifdef RSI_WITH_OS
/* FreeRTOS includes. */
#include "FreeRTOS.h"
#include "event_groups.h"
#include "task.h"
#include "timers.h"
#if defined(SysTick)
#undef SysTick_Handler
/* FreeRTOS SysTick interrupt handler prototype */
extern void SysTick_Handler(void);
/* FreeRTOS tick timer interrupt handler prototype */
extern void xPortSysTickHandler(void);
#endif /* SysTick */
#endif /* RSI_WITH_OS */
#include "wfx_host_events.h"
/* RSI Driver include file */
#include "rsi_driver.h"
/* RSI WLAN Config include file */
#include "rsi_bootup_config.h"
#include "rsi_common_apis.h"
#include "rsi_data_types.h"
#include "rsi_error.h"
#include "rsi_nwk.h"
#include "rsi_socket.h"
#include "rsi_utils.h"
#include "rsi_wlan.h"
#include "rsi_wlan_apis.h"
#include "rsi_wlan_config.h"
#include "wfx_rsi.h"
#ifndef _use_the_rsi_defined_functions
StaticTimer_t sRsiTimerBuffer;
/*
* We (Matter port) need a few functions out of this file
* They are at the top
*/
uint32_t rsi_hal_gettickcount(void)
{
return xTaskGetTickCount();
}
void rsi_delay_ms(uint32_t delay_ms)
{
#ifndef RSI_WITH_OS
uint32_t start;
#endif
if (delay_ms == 0) // Check if delay is 0msec
return;
#ifdef RSI_WITH_OS
vTaskDelay(pdMS_TO_TICKS(delay_ms));
#else
start = rsi_hal_gettickcount();
do
{
} while (rsi_hal_gettickcount() - start < delay_ms);
#endif
}
static struct rsi_timer
{
void (*func)(void);
TimerHandle_t handle;
uint8_t id;
uint8_t name[3];
} rsi_timer[WFX_RSI_NUM_TIMERS];
static void timer_cb(TimerHandle_t thandle)
{
int x;
for (x = 0; x < WFX_RSI_NUM_TIMERS; x++)
{
if (rsi_timer[x].handle == thandle)
{
(*rsi_timer[x].func)();
break;
}
}
}
/*
* Run a one-shot/periodic timer
*/
int32_t rsi_timer_start(uint8_t timer_node, uint8_t mode, uint8_t type, uint32_t duration, void (*rsi_timer_cb)(void))
{
int x;
struct rsi_timer * tp;
if (mode == RSI_HAL_TIMER_MODE_MILLI)
return RSI_ERROR_INVALID_OPTION; /* Not supported for now - Fix this later */
for (x = 0; x < WFX_RSI_NUM_TIMERS; x++)
{
tp = &rsi_timer[x];
if (tp->handle == NULL)
{
goto found;
}
}
/* No space */
return RSI_ERROR_INSUFFICIENT_BUFFER;
found:
tp->name[0] = 'r';
tp->name[1] = timer_node;
tp->name[2] = 0;
tp->func = rsi_timer_cb;
tp->handle =
xTimerCreateStatic((char *) &tp->name[0], pdMS_TO_TICKS(duration),
((mode == RSI_HAL_TIMER_TYPE_SINGLE_SHOT) ? pdFALSE : pdTRUE), NULL, timer_cb, &sRsiTimerBuffer);
if (tp->handle == NULL)
{
return RSI_ERROR_INSUFFICIENT_BUFFER;
}
(void) xTimerStart(tp->handle, TIMER_TICKS_TO_WAIT_0);
return RSI_ERROR_NONE;
}
#else /* _use_the_rsi_defined_functions */
/* Counts 1ms timeTicks */
volatile uint32_t msTicks = 0;
/*===================================================*/
/**
* @fn int32_t rsi_timer_start(uint8_t timer_no, uint8_t mode,uint8_t type,uint32_t duration,void (*
* rsi_timer_expiry_handler)())
* @brief Starts and configures timer
* @param[in] timer_node, timer node to be configured.
* @param[in] mode , mode of the timer
* 0 - Micro seconds mode
* 1 - Milli seconds mode
* @param[in] type, type of the timer
* 0 - single shot type
* 1 - periodic type
* @param[in] duration, timer duration
* @param[in] rsi_timer_expiry_handler() ,call back function to handle timer interrupt
* @param[out] none
* @return 0 - success
* !0 - Failure
* @description This HAL API should contain the code to initialize the timer and start the timer
*
*/
int32_t rsi_timer_start(uint8_t timer_node, uint8_t mode, uint8_t type, uint32_t duration, void (*rsi_timer_expiry_handler)(void))
{
// Initialise the timer
// register the call back
// Start timer
return 0;
}
/*===================================================*/
/**
* @fn int32_t rsi_timer_stop(uint8_t timer_no)
* @brief Stops timer
* @param[in] timer_node, timer node to stop
* @param[out] none
* @return 0 - success
* !0 - Failure
* @description This HAL API should contain the code to stop the timer
*
*/
int32_t rsi_timer_stop(uint8_t timer_node)
{
// Stop the timer
return 0;
}
/*===================================================*/
/**
* @fn uint32_t rsi_timer_read(uint8_t timer_node)
* @brief read timer
* @param[in] timer_node, timer node to read
* @param[out] none
* @return timer value
* @description This HAL API should contain API to read the timer
*
*/
uint32_t rsi_timer_read(uint8_t timer_node)
{
volatile uint32_t timer_val = 0;
// read the timer and return timer value
return timer_val;
}
/*===================================================*/
/**
* @fn void rsi_delay_us(uint32_t delay)
* @brief create delay in micro seconds
* @param[in] delay_us, timer delay in micro seconds
* @param[out] none
* @return none
* @description This HAL API should contain the code to create delay in micro seconds
*
*/
void rsi_delay_us(uint32_t delay_us)
{
// call the API for delay in micro seconds
return;
}
#ifdef RSI_M4_INTERFACE
extern void SysTick_Handler(void);
void SysTick_Handler(void)
{
_dwTickCount++;
}
uint32_t GetTickCount(void)
{
return _dwTickCount; // gets the tick count from systic ISR
}
#endif
/*===================================================*/
/**
* @fn void rsi_delay_ms(uint32_t delay)
* @brief create delay in milli seconds
* @param[in] delay, timer delay in milli seconds
* @param[out] none
* @return none
* @description This HAL API should contain the code to create delay in milli seconds
*/
void rsi_delay_ms(uint32_t delay_ms)
{
#ifndef RSI_WITH_OS
uint32_t start;
#endif
if (delay_ms == DELAY0)
return;
#ifdef RSI_WITH_OS
vTaskDelay(delay_ms);
#else
start = rsi_hal_gettickcount();
do
{
} while (rsi_hal_gettickcount() - start < delay_ms);
#endif
}
/*===================================================*/
/**
* @fn uint32_t rsi_hal_gettickcount()
* @brief provides a tick value in milliseconds
* @return tick value
* @description This HAL API should contain the code to read the timer tick count value in milliseconds
*
*/
#ifndef RSI_HAL_USE_RTOS_SYSTICK
/*
SysTick handler implementation that also clears overflow flag.
*/
void SysTick_Handler(void)
{
/* Increment counter necessary in Delay()*/
msTicks++;
#ifdef RSI_WITH_OS
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
{
xPortSysTickHandler();
}
#endif
}
uint32_t rsi_hal_gettickcount(void)
{
return msTicks;
#ifdef LINUX_PLATFORM
// Define your API to get the tick count delay in milli seconds from systic ISR and return the resultant value
struct rsi_timeval tv1;
gettimeofday(&tv1, NULL);
return (tv1.tv_sec * CONVERT_SEC_TO_MSEC + tv1.tv_usec * CONVERT_USEC_TO_MSEC);
#endif
}
#else
uint32_t rsi_hal_gettickcount(void)
{
return xTaskGetTickCount();
}
#endif /* RSI_HAL_USE_RTOS_SYSTICK */
#endif /* _use_the_rsi_defined_functions */