summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/API5
-rw-r--r--firmware/kernel.c29
-rw-r--r--firmware/kernel.h7
3 files changed, 34 insertions, 7 deletions
diff --git a/firmware/API b/firmware/API
index c74aa20b0d..05d7d20961 100644
--- a/firmware/API
+++ b/firmware/API
@@ -238,6 +238,11 @@ Various
238 238
239 Returns true if the queue is empty. 239 Returns true if the queue is empty.
240 240
241 int queue_broadcast(int id, void *data)
242
243 Posts an event in all queues that has been initiated with queue_init().
244 Returns the number of queues that were posted to.
245
241 int tick_add_task(void (*f)(void)) 246 int tick_add_task(void (*f)(void))
242 247
243 Add a task to the tick task queue. The argument is a pointer to a 248 Add a task to the tick task queue. The argument is a pointer to a
diff --git a/firmware/kernel.c b/firmware/kernel.c
index 3e6f89bc7e..02b76e1e5d 100644
--- a/firmware/kernel.c
+++ b/firmware/kernel.c
@@ -29,21 +29,22 @@ void (*tick_funcs[MAX_NUM_TICK_TASKS])(void);
29 29
30static void tick_start(unsigned int interval_in_ms); 30static void tick_start(unsigned int interval_in_ms);
31 31
32/* This array holds all queues that are initiated. It is used for broadcast. */
33static struct event_queue *all_queues[32];
34static int num_queues;
35
32/**************************************************************************** 36/****************************************************************************
33 * Standard kernel stuff 37 * Standard kernel stuff
34 ****************************************************************************/ 38 ****************************************************************************/
35void kernel_init(void) 39void kernel_init(void)
36{ 40{
37 int i;
38
39 /* Init the threading API */ 41 /* Init the threading API */
40 init_threads(); 42 init_threads();
41 43
42 /* Clear the tick task array */ 44 memset(tick_funcs, 0, sizeof(tick_funcs));
43 for(i = 0;i < MAX_NUM_TICK_TASKS;i++) 45
44 { 46 num_queues = 0;
45 tick_funcs[i] = NULL; 47 memset(all_queues, 0, sizeof(all_queues));
46 }
47 48
48 tick_start(1000/HZ); 49 tick_start(1000/HZ);
49} 50}
@@ -82,6 +83,9 @@ void queue_init(struct event_queue *q)
82{ 83{
83 q->read = 0; 84 q->read = 0;
84 q->write = 0; 85 q->write = 0;
86
87 /* Add it to the all_queues array */
88 all_queues[num_queues++] = q;
85} 89}
86 90
87void queue_wait(struct event_queue *q, struct event *ev) 91void queue_wait(struct event_queue *q, struct event *ev)
@@ -112,6 +116,17 @@ bool queue_empty(struct event_queue* q)
112 return ( q->read == q->write ); 116 return ( q->read == q->write );
113} 117}
114 118
119int queue_broadcast(int id, void *data)
120{
121 int i;
122
123 for(i = 0;i < num_queues;i++)
124 {
125 queue_post(all_queues[i], id, data);
126 }
127
128 return num_queues;
129}
115 130
116/**************************************************************************** 131/****************************************************************************
117 * Timer tick 132 * Timer tick
diff --git a/firmware/kernel.h b/firmware/kernel.h
index ee9ded7ab0..ef287e5689 100644
--- a/firmware/kernel.h
+++ b/firmware/kernel.h
@@ -32,6 +32,12 @@
32#define QUEUE_LENGTH 16 /* MUST be a power of 2 */ 32#define QUEUE_LENGTH 16 /* MUST be a power of 2 */
33#define QUEUE_LENGTH_MASK (QUEUE_LENGTH - 1) 33#define QUEUE_LENGTH_MASK (QUEUE_LENGTH - 1)
34 34
35/* System defined message ID's */
36#define SYS_USB_CONNECTED -1
37#define SYS_USB_CONNECTED_ACK -2
38#define SYS_USB_DISCONNECTED -3
39#define SYS_USB_DISCONNECTED_ACK -4
40
35struct event 41struct event
36{ 42{
37 int id; 43 int id;
@@ -65,6 +71,7 @@ extern void queue_init(struct event_queue *q);
65extern void queue_wait(struct event_queue *q, struct event *ev); 71extern void queue_wait(struct event_queue *q, struct event *ev);
66extern void queue_post(struct event_queue *q, int id, void *data); 72extern void queue_post(struct event_queue *q, int id, void *data);
67extern bool queue_empty(struct event_queue* q); 73extern bool queue_empty(struct event_queue* q);
74extern int queue_broadcast(int id, void *data);
68 75
69extern void mutex_init(struct mutex *m); 76extern void mutex_init(struct mutex *m);
70extern void mutex_lock(struct mutex *m); 77extern void mutex_lock(struct mutex *m);