Hi Marc (Kleine-Budde), I took the version of this patch I had lying around, please let me know if you have an updated version. Sascha On Sat, Dec 18, 2010 at 04:15:03PM +0100, Sascha Hauer wrote: > From: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> > > 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@xxxxxxxxxxxxxx> > Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > --- > common/Kconfig | 3 +++ > common/Makefile | 1 + > common/console.c | 5 +++++ > common/poller.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ > include/poller.h | 31 +++++++++++++++++++++++++++++++ > 5 files changed, 85 insertions(+), 0 deletions(-) > create mode 100644 common/poller.c > create mode 100644 include/poller.h > > diff --git a/common/Kconfig b/common/Kconfig > index 617f640..02bc67e 100644 > --- a/common/Kconfig > +++ b/common/Kconfig > @@ -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 " > diff --git a/common/Makefile b/common/Makefile > index 753455b..98c9d36 100644 > --- a/common/Makefile > +++ b/common/Makefile > @@ -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 > diff --git a/common/console.c b/common/console.c > index 82786f2..39ead4b 100644 > --- a/common/console.c > +++ b/common/console.c > @@ -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; > diff --git a/common/poller.c b/common/poller.c > new file mode 100644 > index 0000000..0583a53 > --- /dev/null > +++ b/common/poller.c > @@ -0,0 +1,45 @@ > +/* > + * Copyright (C) 2010 Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> > + * > + * 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; > +} > diff --git a/include/poller.h b/include/poller.h > new file mode 100644 > index 0000000..dc98155 > --- /dev/null > +++ b/include/poller.h > @@ -0,0 +1,31 @@ > +/* > + * Copyright (C) 2010 Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> > + * > + * 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 */ > -- > 1.7.2.3 > > -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox