You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
3.3 KiB
88 lines
3.3 KiB
#ifndef LIBMFWTIMER_H
|
|
#define LIBMFWTIMER_H
|
|
|
|
#include "libmftypes.h"
|
|
|
|
struct wtimer_callback;
|
|
struct wtimer_desc;
|
|
|
|
#if defined(__ICC8051__)
|
|
typedef void (*wtimer_callback_handler_t)(struct wtimer_callback __xdata *desc);
|
|
typedef void (*wtimer_desc_handler_t)(struct wtimer_desc __xdata *desc);
|
|
#else
|
|
typedef __reentrantb void (*wtimer_callback_handler_t)(struct wtimer_callback __xdata *desc) __reentrant;
|
|
typedef __reentrantb void (*wtimer_desc_handler_t)(struct wtimer_desc __xdata *desc) __reentrant;
|
|
#endif
|
|
|
|
struct wtimer_callback {
|
|
// do not change the order
|
|
// must be compatible with wtimer_desc
|
|
struct wtimer_callback __xdata *next;
|
|
wtimer_callback_handler_t handler;
|
|
};
|
|
|
|
struct wtimer_desc {
|
|
// do not change the order
|
|
struct wtimer_desc __xdata *next;
|
|
wtimer_desc_handler_t handler;
|
|
uint32_t time;
|
|
};
|
|
|
|
#define WTFLAG_CANSLEEP 0x01
|
|
#define WTFLAG_CANSTANDBY 0x02
|
|
#define WTFLAG_CANSLEEPCONT 0x04
|
|
|
|
#define WTIDLE_WORK 0x01
|
|
#define WTIDLE_SLEEP 0x02
|
|
|
|
extern __reentrantb void wtimer0_setconfig(uint8_t cfg) __reentrant;
|
|
extern __reentrantb void wtimer1_setconfig(uint8_t cfg) __reentrant;
|
|
|
|
#define wtimer0_setclksrc(clksrc, prescaler) \
|
|
do { \
|
|
uint8_t c = clksrc, p = prescaler; \
|
|
wtimer0_setconfig((c & 0x07) | ((p & 0x07) << 3)); \
|
|
} while (0)
|
|
|
|
#define wtimer1_setclksrc(clksrc, prescaler) \
|
|
do { \
|
|
uint8_t c = clksrc, p = prescaler; \
|
|
wtimer1_setconfig((c & 0x07) | ((p & 0x07) << 3)); \
|
|
} while (0)
|
|
|
|
extern __reentrantb void wtimer_init(void) __reentrant;
|
|
extern __reentrantb void wtimer_init_deepsleep(void) __reentrant;
|
|
extern __reentrantb uint8_t wtimer_idle(uint8_t flags) __reentrant;
|
|
#if defined(__ICC8051__)
|
|
extern uint8_t wtimer_runcallbacks(void);
|
|
#else
|
|
// note: wtimer_runcallbacks is only reentrant if the handlers
|
|
// it might call are reentrant too
|
|
extern __reentrantb uint8_t wtimer_runcallbacks(void) __reentrant;
|
|
#endif
|
|
|
|
extern __reentrantb uint32_t wtimer0_curtime(void) __reentrant;
|
|
extern __reentrantb uint32_t wtimer1_curtime(void) __reentrant;
|
|
extern __reentrantb void wtimer0_addabsolute(struct wtimer_desc __xdata *desc) __reentrant;
|
|
extern __reentrantb void wtimer1_addabsolute(struct wtimer_desc __xdata *desc) __reentrant;
|
|
extern __reentrantb void wtimer0_addrelative(struct wtimer_desc __xdata *desc) __reentrant;
|
|
extern __reentrantb void wtimer1_addrelative(struct wtimer_desc __xdata *desc) __reentrant;
|
|
extern __reentrantb uint8_t wtimer_remove(struct wtimer_desc __xdata *desc) __reentrant;
|
|
extern __reentrantb uint8_t wtimer0_remove(struct wtimer_desc __xdata *desc) __reentrant;
|
|
extern __reentrantb uint8_t wtimer1_remove(struct wtimer_desc __xdata *desc) __reentrant;
|
|
|
|
extern __reentrantb void wtimer_add_callback(struct wtimer_callback __xdata *desc) __reentrant;
|
|
extern __reentrantb uint8_t wtimer_remove_callback(struct wtimer_callback __xdata *desc) __reentrant;
|
|
|
|
extern __reentrantb uint8_t wtimer_cansleep(void) __reentrant;
|
|
|
|
#if defined SDCC
|
|
extern void wtimer_irq(void) __interrupt(1);
|
|
#elif defined __CX51__ || defined __C51__
|
|
#elif defined __ICC8051__
|
|
#else
|
|
#error "Compiler unsupported"
|
|
#endif
|
|
|
|
#endif /* LIBMFWTIMER_H */
|