mirror of
https://github.com/jialexd/sdk-ameba-v4.0c_180328.git
synced 2024-11-23 22:44:19 +00:00
165 lines
5.2 KiB
C
165 lines
5.2 KiB
C
|
/******************************************************************************
|
||
|
*
|
||
|
* Name: sys-support.h - System type support for Linux
|
||
|
* $Revision: 1.1.1.1 $
|
||
|
*
|
||
|
*****************************************************************************/
|
||
|
|
||
|
#ifndef __OS_TIMER_H__
|
||
|
#define __OS_TIMER_H__
|
||
|
|
||
|
#include "diag.h"
|
||
|
#include "os_support.h"
|
||
|
#include "osdep_service.h"
|
||
|
|
||
|
|
||
|
#define JIFFIES xTaskGetTickCount()
|
||
|
|
||
|
enum {
|
||
|
TIMER_NO_INIT = 0,
|
||
|
TIMER_INIT = 1,
|
||
|
TIMER_START = 2,
|
||
|
TIMER_DISABLE = 3
|
||
|
};
|
||
|
|
||
|
struct TIMER_LIST {
|
||
|
_timerHandle TimeHdl;
|
||
|
u32 Flag;
|
||
|
unsigned long Data;
|
||
|
VOID (*Function)(void *);
|
||
|
u32 TimerID;
|
||
|
};
|
||
|
|
||
|
static inline VOID InitTimer(IN struct TIMER_LIST *Timer)
|
||
|
{
|
||
|
u32 TimerID = Timer->TimerID;
|
||
|
VOID (*Function)(VOID *) = Timer->Function;
|
||
|
|
||
|
save_and_cli();
|
||
|
|
||
|
if (Timer->Flag != TIMER_DISABLE) {
|
||
|
if (Timer->Flag == TIMER_NO_INIT) {
|
||
|
Timer->TimeHdl = rtw_timerCreate( (const char *)"Timer", // Just a test name, not used by the kernel.
|
||
|
( 100 ), // The timer period in ticks.
|
||
|
_FALSE, // The timers will auto-reload themselves when they expire.
|
||
|
( void * ) TimerID, // Assign each timer a unique id equal to its array index.
|
||
|
Function
|
||
|
#ifdef RTK_MODE_TIMER
|
||
|
,data // Each timer calls the same callback when it expires.
|
||
|
#endif
|
||
|
);
|
||
|
if (NULL == Timer->TimeHdl) {
|
||
|
DBG_ERROR_LOG("\rInitial Timer fail !!!!!!!!!\n");
|
||
|
}
|
||
|
else {
|
||
|
TimerID++;
|
||
|
}
|
||
|
|
||
|
Timer->Flag = TIMER_INIT;
|
||
|
}
|
||
|
else if (Timer->Flag == TIMER_START) {
|
||
|
rtw_timerStop(Timer->TimeHdl,0);
|
||
|
Timer->Flag = TIMER_DISABLE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
restore_flags();
|
||
|
}
|
||
|
|
||
|
static inline void ModTimer(IN struct TIMER_LIST *Timer, IN u32 TimeoutTicks)
|
||
|
{
|
||
|
#ifndef PLATFORM_FREERTOS
|
||
|
u32 Flags;
|
||
|
#endif
|
||
|
|
||
|
void (*Function)(void *) = Timer->Function;
|
||
|
|
||
|
save_and_cli();
|
||
|
|
||
|
if (Timer->Flag == TIMER_NO_INIT) {
|
||
|
if (Timer->Function) {
|
||
|
Timer->TimeHdl = rtw_timerCreate((const char *)"Timer", // Just a text name, not used by the kernel.
|
||
|
( 100 ), // The timer period in ticks.
|
||
|
_FALSE, // The timers will auto-reload themselves when they expire.
|
||
|
( void * ) Timer->TimerID, // Assign each timer a unique id equal to its array index.
|
||
|
Function
|
||
|
#ifdef RTK_MODE_TIMER
|
||
|
,Timer->Data // Each timer calls the same callback when it expires.
|
||
|
#endif
|
||
|
);
|
||
|
if (NULL == Timer->TimeHdl) {
|
||
|
DBG_ERROR_LOG("\rInitial Timer fail !!!!!!!!!\n");
|
||
|
}
|
||
|
else {
|
||
|
Timer->TimerID++;
|
||
|
}
|
||
|
|
||
|
Timer->Flag = TIMER_INIT;
|
||
|
}
|
||
|
else {
|
||
|
restore_flags();
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
else if (Timer->Flag == TIMER_START) {
|
||
|
rtw_timerStop(Timer->TimeHdl,0);
|
||
|
Timer->Flag = TIMER_DISABLE;
|
||
|
}
|
||
|
|
||
|
TimeoutTicks -= rtw_get_current_time();
|
||
|
if (TimeoutTicks <= 0)
|
||
|
TimeoutTicks = 2;
|
||
|
|
||
|
if (xTimerStart(Timer->TimeHdl, TimeoutTicks ))
|
||
|
Timer->Flag = TIMER_START;
|
||
|
else
|
||
|
DBG_ERROR_LOG("\r###mod_timer() - no slots available###\n");
|
||
|
restore_flags();
|
||
|
}
|
||
|
|
||
|
|
||
|
static inline int TimerPending (IN const struct TIMER_LIST *Timer)
|
||
|
{
|
||
|
if (Timer->TimeHdl && Timer->Flag != TIMER_NO_INIT)
|
||
|
return 1;
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static inline void DelTimerSync(IN struct TIMER_LIST *Timer)
|
||
|
{
|
||
|
save_and_cli();
|
||
|
|
||
|
if (Timer->TimeHdl && Timer->Flag != TIMER_INIT) {
|
||
|
if (Timer->Flag == TIMER_START)
|
||
|
rtw_timerStop(Timer->TimeHdl, 0);
|
||
|
|
||
|
rtw_timerDelete(Timer->TimeHdl, 0);
|
||
|
Timer->Flag = TIMER_NO_INIT;
|
||
|
}
|
||
|
|
||
|
restore_flags();
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* These inlines deal with timer wrapping correctly. You are
|
||
|
* strongly encouraged to use them
|
||
|
* 1. Because people otherwise forget
|
||
|
* 2. Because if the timer wrap changes in future you wont have to
|
||
|
* alter your driver code.
|
||
|
*
|
||
|
* time_after(a,b) returns true if the time a is after time b.
|
||
|
*
|
||
|
* Do this with "<0" and ">=0" to only test the sign of the result. A
|
||
|
* good compiler would generate better code (and a really good compiler
|
||
|
* wouldn't care). Gcc is currently neither.
|
||
|
*/
|
||
|
#define TIME_AFTER(a,b) ((long)(b) - (long)(a) < 0)
|
||
|
#define TIMER_BEFORE(a,b) TIME_AFTER(b,a)
|
||
|
|
||
|
#define TIME_AFTER_EQ(a,b) ((long)(a) - (long)(b) >= 0)
|
||
|
#define TIMER_BEFORE_EQ(a,b) TIME_AFTER_EQ(b,a)
|
||
|
|
||
|
|
||
|
|
||
|
#endif //__OS_TIMER_H__
|