diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/API | 5 | ||||
-rw-r--r-- | firmware/kernel.c | 29 | ||||
-rw-r--r-- | firmware/kernel.h | 7 |
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 | ||
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 |
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 | |||
35 | struct event | 41 | struct event |
36 | { | 42 | { |
37 | int id; | 43 | int id; |
@@ -65,6 +71,7 @@ extern void queue_init(struct event_queue *q); | |||
65 | extern void queue_wait(struct event_queue *q, struct event *ev); | 71 | extern void queue_wait(struct event_queue *q, struct event *ev); |
66 | extern void queue_post(struct event_queue *q, int id, void *data); | 72 | extern void queue_post(struct event_queue *q, int id, void *data); |
67 | extern bool queue_empty(struct event_queue* q); | 73 | extern bool queue_empty(struct event_queue* q); |
74 | extern int queue_broadcast(int id, void *data); | ||
68 | 75 | ||
69 | extern void mutex_init(struct mutex *m); | 76 | extern void mutex_init(struct mutex *m); |
70 | extern void mutex_lock(struct mutex *m); | 77 | extern void mutex_lock(struct mutex *m); |