9
0
Fork 0

Add generic poll infrastructure

Barebox does not have interrupt functionality. Nevertheless it's
sometimes useful to periodically call functions, like for example
a heartbeat LED or watchdog reset. Instead of cluttering the code
with calls to these functions this patch adds a generic polling
infrastructure. Code which might run for longer now can call
poller_call() periodically which in turn will call all registered
pollers.
This patch adds a call to poller_call in two generic pathes. First
of them is getc() which covers waiting for uart input. Second is
ctrlc() which should be called anyway from code which might run
for longer. So instead adding poller_call directly to your code,
consider checking ctrlc instead which also gives additional
convenience to the user.
The poller code is safe against reentrancy which means that it's
safe to call poller_call inside a poller.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Marc Kleine-Budde 2010-12-18 11:25:34 +01:00 committed by Sascha Hauer
parent f4b1ebd2fd
commit 0277a663bc
5 changed files with 85 additions and 0 deletions

View File

@ -414,6 +414,9 @@ config DEFAULT_ENVIRONMENT_PATH
Relative pathes will be relative to the barebox Toplevel dir, but absolute
pathes are fine aswell.
config POLLER
bool "generic polling infrastructure"
endmenu
menu "Debugging "

View File

@ -5,6 +5,7 @@ obj-$(CONFIG_OF_FLAT_TREE) += ft_build.o
obj-$(CONFIG_KALLSYMS) += kallsyms.o
obj-$(CONFIG_ENV_HANDLING) += environment.o
obj-$(CONFIG_AUTO_COMPLETE) += complete.o
obj-$(CONFIG_POLLER) += poller.o
obj-y += dlmalloc.o
obj-y += clock.o

View File

@ -34,6 +34,7 @@
#include <clock.h>
#include <kfifo.h>
#include <module.h>
#include <poller.h>
#include <linux/list.h>
LIST_HEAD(console_list);
@ -205,6 +206,8 @@ int getc(void)
*/
start = get_time_ns();
while (1) {
poller_call();
if (tstc()) {
kfifo_putc(console_input_buffer, getc_raw());
@ -397,6 +400,8 @@ EXPORT_SYMBOL(vprintf);
/* test if ctrl-c was pressed */
int ctrlc (void)
{
poller_call();
if (tstc() && getc() == 3)
return 1;
return 0;

45
common/poller.c Normal file
View File

@ -0,0 +1,45 @@
/*
* Copyright (C) 2010 Marc Kleine-Budde <mkl@pengutronix.de>
*
* This file is released under the GPLv2
*
*/
#include <common.h>
#include <driver.h>
#include <malloc.h>
#include <module.h>
#include <param.h>
#include <poller.h>
static LIST_HEAD(poller_list);
static int poller_active;
int poller_register(struct poller_struct *poller)
{
list_add_tail(&poller->list, &poller_list);
return 0;
}
int poller_unregister(struct poller_struct *poller)
{
list_del(&poller->list);
return 0;
}
void poller_call(void)
{
struct poller_struct *poller, *tmp;
if (poller_active)
return;
poller_active = 1;
list_for_each_entry_safe(poller, tmp, &poller_list, list)
poller->func(poller);
poller_active = 0;
}

31
include/poller.h Normal file
View File

@ -0,0 +1,31 @@
/*
* Copyright (C) 2010 Marc Kleine-Budde <mkl@pengutronix.de>
*
* This file is released under the GPLv2
*
*/
#ifndef POLLER_H
#define POLLER_H
#include <linux/list.h>
struct poller_struct {
void (*func)(struct poller_struct *poller);
struct list_head list;
};
int poller_register(struct poller_struct *poller);
int poller_unregister(struct poller_struct *poller);
#ifdef CONFIG_POLLER
void poller_call(void);
#else
static inline void poller_call(void)
{
}
#endif /* CONFIG_POLLER */
#endif /* !POLLER_H */