2013-12-04 16:06:17 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
* Copyright (C) 2002 by Björn Stenberg
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
#ifndef TICK_H
|
|
|
|
#define TICK_H
|
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
#include "system.h" /* for NULL */
|
2022-12-03 14:10:19 +00:00
|
|
|
extern void init_tick(void) INIT_ATTR;
|
2013-12-04 16:06:17 +00:00
|
|
|
|
|
|
|
#define HZ 100 /* number of ticks per second */
|
|
|
|
|
|
|
|
#define MAX_NUM_TICK_TASKS 8
|
|
|
|
|
|
|
|
/* global tick variable */
|
|
|
|
#if defined(CPU_PP) && defined(BOOTLOADER) && \
|
|
|
|
!defined(HAVE_BOOTLOADER_USB_MODE)
|
|
|
|
/* We don't enable interrupts in the PP bootloader unless USB mode is
|
|
|
|
enabled for it, so we need to fake the current_tick variable */
|
|
|
|
#define current_tick (signed)(USEC_TIMER/10000)
|
|
|
|
|
|
|
|
static inline void call_tick_tasks(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
extern volatile long current_tick;
|
|
|
|
|
|
|
|
/* inline helper for implementing target interrupt handler */
|
|
|
|
static inline void call_tick_tasks(void)
|
|
|
|
{
|
|
|
|
extern void (*tick_funcs[MAX_NUM_TICK_TASKS+1])(void);
|
|
|
|
void (**p)(void) = tick_funcs;
|
|
|
|
void (*fn)(void);
|
|
|
|
|
|
|
|
current_tick++;
|
|
|
|
|
|
|
|
for(fn = *p; fn != NULL; fn = *(++p))
|
|
|
|
{
|
|
|
|
fn();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* implemented in target tree */
|
|
|
|
extern void tick_start(unsigned int interval_in_ms) INIT_ATTR;
|
|
|
|
|
|
|
|
extern int tick_add_task(void (*f)(void));
|
|
|
|
extern int tick_remove_task(void (*f)(void));
|
|
|
|
|
|
|
|
#endif /* TICK_H */
|