diff options
Diffstat (limited to 'firmware/kernel.c')
-rw-r--r-- | firmware/kernel.c | 29 |
1 files changed, 22 insertions, 7 deletions
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 | ||
30 | static void tick_start(unsigned int interval_in_ms); | 30 | static void tick_start(unsigned int interval_in_ms); |
31 | 31 | ||
32 | /* This array holds all queues that are initiated. It is used for broadcast. */ | ||
33 | static struct event_queue *all_queues[32]; | ||
34 | static int num_queues; | ||
35 | |||
32 | /**************************************************************************** | 36 | /**************************************************************************** |
33 | * Standard kernel stuff | 37 | * Standard kernel stuff |
34 | ****************************************************************************/ | 38 | ****************************************************************************/ |
35 | void kernel_init(void) | 39 | void 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 | ||
87 | void queue_wait(struct event_queue *q, struct event *ev) | 91 | void 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 | ||
119 | int 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 |