projects
/
bertos.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
TRACEMSG() support for compilers with no variadic macros.
[bertos.git]
/
drv
/
kbd.c
diff --git
a/drv/kbd.c
b/drv/kbd.c
index d078418cf1dceae5218413e96cb37d3d23ca489e..e231536524f2397cfb7c3a316f2a76b3417c75bf 100755
(executable)
--- a/
drv/kbd.c
+++ b/
drv/kbd.c
@@
-17,6
+17,12
@@
/*#*
*#* $Log$
/*#*
*#* $Log$
+ *#* Revision 1.3 2006/02/17 21:15:42 bernie
+ *#* Add MOD_CHECK() checks.
+ *#*
+ *#* Revision 1.2 2006/02/10 12:36:20 bernie
+ *#* Add preliminary FreeRTOS support; Enforce CONFIG_* definitions.
+ *#*
*#* Revision 1.1 2005/06/27 21:28:45 bernie
*#* Import generic keyboard driver.
*#*
*#* Revision 1.1 2005/06/27 21:28:45 bernie
*#* Import generic keyboard driver.
*#*
@@
-29,8
+35,12
@@
#include <drv/buzzer.h>
#include <cfg/debug.h>
#include <drv/buzzer.h>
#include <cfg/debug.h>
+#include <cfg/module.h>
-
+/* Configuration sanity checks */
+#if !defined(CONFIG_KBD_POLL) || (CONFIG_KBD_POLL != KBD_POLL_SOFTINT && CONFIG_KBD_POLL != CONFIG_POLL_FREERTOS)
+ #error CONFIG_KBD_POLL must be defined to either KBD_POLL_SOFTINT or CONFIG_POLL_FREERTOS
+#endif
#define KBD_CHECK_INTERVAL 10 /*!< (ms) Timing for kbd softint */
#define KBD_CHECK_INTERVAL 10 /*!< (ms) Timing for kbd softint */
@@
-52,7
+62,7
@@
static enum { KS_IDLE, KS_REPDELAY, KS_REPEAT } kbd_rptStatus;
static volatile keymask_t kbd_buf; /*!< Single entry keyboard buffer */
static volatile keymask_t kbd_cnt; /*!< Number of keypress events in \c kbd_buf */
static volatile keymask_t kbd_buf; /*!< Single entry keyboard buffer */
static volatile keymask_t kbd_cnt; /*!< Number of keypress events in \c kbd_buf */
-static Timer kbd_timer; /*!< Keyboard
KBD_BEEP_TIME
softtimer */
+static Timer kbd_timer; /*!< Keyboard softtimer */
static List kbd_rawHandlers; /*!< Raw keyboard handlers */
static List kbd_handlers; /*!< Cooked keyboard handlers */
static List kbd_rawHandlers; /*!< Raw keyboard handlers */
static List kbd_handlers; /*!< Cooked keyboard handlers */
@@
-67,9
+77,15
@@
static KbdHandler kbd_lngHandler; /*!< Long pression keys handler */
/*!
/*!
- * Keyboard soft-irq handler.
+ * Poll keyboard and dispatch keys to handlers.
+ *
+ * Read the key states and invoke all keyboard
+ * handlers to process the new state.
+ *
+ * Call this function periodically using a software
+ * timer, an interrupt or a process.
*/
*/
-static void kbd_
softint(UNUSED_ARG(iptr_t, arg)
)
+static void kbd_
poll(void
)
{
/*! Currently depressed key */
static keymask_t current_key;
{
/*! Currently depressed key */
static keymask_t current_key;
@@
-91,10
+107,34
@@
static void kbd_softint(UNUSED_ARG(iptr_t, arg))
FOREACHNODE(handler, &kbd_handlers)
key = handler->hook(key);
}
FOREACHNODE(handler, &kbd_handlers)
key = handler->hook(key);
}
+}
+
+#if CONFIG_KBD_POLL == KBD_POLL_SOFTINT
+/*!
+ * Keyboard soft-irq handler.
+ */
+static void kbd_softint(UNUSED_ARG(iptr_t, arg))
+{
+ kbd_poll();
timer_add(&kbd_timer);
}
timer_add(&kbd_timer);
}
+#elif CONFIG_KBD_POLL == CONFIG_POLL_FREERTOS
+
+#include "FreeRTOS.h"
+#include "task.h"
+
+static portTASK_FUNCTION(kbd_poll, arg)
+{
+ for (;;)
+ {
+ kbd_poll(0);
+ timer_delay(KBD_CHECK_INTERVAL);
+ }
+}
+
+#endif /* CONFIG_KBD_POLL */
/*!
* \brief Read a key from the keyboard buffer.
/*!
* \brief Read a key from the keyboard buffer.
@@
-112,6
+152,10
@@
keymask_t kbd_peek(void)
{
keymask_t key = 0;
{
keymask_t key = 0;
+// FIXME
+ extern void schedule(void);
+ schedule();
+
/* Extract an event from the keyboard buffer */
IRQ_DISABLE;
if (kbd_cnt)
/* Extract an event from the keyboard buffer */
IRQ_DISABLE;
if (kbd_cnt)
@@
-209,8
+253,10
@@
static keymask_t kbd_defHandlerFunc(keymask_t key)
kbd_buf = key;
kbd_cnt = 1;
kbd_buf = key;
kbd_cnt = 1;
+#if KBD_BEEP_TIME
if (!(key & K_REPEAT))
buz_beep(KBD_BEEP_TIME);
if (!(key & K_REPEAT))
buz_beep(KBD_BEEP_TIME);
+#endif
}
/* Eat all input */
}
/* Eat all input */
@@
-337,20
+383,17
@@
static keymask_t kbd_rptHandlerFunc(keymask_t key)
}
}
+MOD_DEFINE(kbd)
/*!
* Initialize keyboard ports and softtimer
*/
void kbd_init(void)
{
/*!
* Initialize keyboard ports and softtimer
*/
void kbd_init(void)
{
-
- cpuflags_t flags;
- IRQ_SAVE_DISABLE(flags);
+ MOD_CHECK(buzzer);
KBD_HW_INIT;
KBD_HW_INIT;
- IRQ_RESTORE(flags);
-
/* Init handlers lists */
LIST_INIT(&kbd_handlers);
LIST_INIT(&kbd_rawHandlers);
/* Init handlers lists */
LIST_INIT(&kbd_handlers);
LIST_INIT(&kbd_rawHandlers);
@@
-369,21
+412,35
@@
void kbd_init(void)
kbd_addHandler(&kbd_lngHandler);
#endif
kbd_addHandler(&kbd_lngHandler);
#endif
-
/* Add repeat keyboard handler */
kbd_rptHandler.hook = kbd_rptHandlerFunc;
kbd_rptHandler.pri = 80; /* high priority */
kbd_rptHandler.flags = KHF_RAWKEYS;
kbd_addHandler(&kbd_rptHandler);
/* Add repeat keyboard handler */
kbd_rptHandler.hook = kbd_rptHandlerFunc;
kbd_rptHandler.pri = 80; /* high priority */
kbd_rptHandler.flags = KHF_RAWKEYS;
kbd_addHandler(&kbd_rptHandler);
-
/* Add default keyboard handler */
kbd_defHandler.hook = kbd_defHandlerFunc;
kbd_defHandler.pri = -128; /* lowest priority */
kbd_addHandler(&kbd_defHandler);
/* Add default keyboard handler */
kbd_defHandler.hook = kbd_defHandlerFunc;
kbd_defHandler.pri = -128; /* lowest priority */
kbd_addHandler(&kbd_defHandler);
+#if CONFIG_KBD_POLL == KBD_POLL_SOFTINT
+
+ MOD_CHECK(timer);
+
/* Add kbd handler to soft timers list */
event_initSoftInt(&kbd_timer.expire, kbd_softint, 0);
timer_setDelay(&kbd_timer, ms_to_ticks(KBD_CHECK_INTERVAL));
timer_add(&kbd_timer);
/* Add kbd handler to soft timers list */
event_initSoftInt(&kbd_timer.expire, kbd_softint, 0);
timer_setDelay(&kbd_timer, ms_to_ticks(KBD_CHECK_INTERVAL));
timer_add(&kbd_timer);
+
+#elif CONFIG_KBD_POLL == CONFIG_POLL_FREERTOS
+
+ /* Create a timer specific thread */
+ xTaskCreate(kbd_poll, "kbd_poll", CONFIG_STACK_KBD,
+ NULL, CONFIG_PRI_KBD, NULL);
+
+#else
+ #error "Define keyboard poll method"
+#endif
+
+ MOD_INIT(kbd);
}
}