diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/kernel.c | 27 | ||||
-rw-r--r-- | firmware/kernel.h | 11 |
2 files changed, 35 insertions, 3 deletions
diff --git a/firmware/kernel.c b/firmware/kernel.c index 8474126a0d..c6ac1fb7aa 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c | |||
@@ -71,14 +71,14 @@ void queue_init(struct event_queue *q) | |||
71 | q->write = 0; | 71 | q->write = 0; |
72 | } | 72 | } |
73 | 73 | ||
74 | struct event *queue_wait(struct event_queue *q) | 74 | void queue_wait(struct event_queue *q, struct event *ev) |
75 | { | 75 | { |
76 | while(q->read == q->write) | 76 | while(q->read == q->write) |
77 | { | 77 | { |
78 | switch_thread(); | 78 | switch_thread(); |
79 | } | 79 | } |
80 | 80 | ||
81 | return &q->events[(q->read++) & QUEUE_LENGTH_MASK]; | 81 | *ev = q->events[(q->read++) & QUEUE_LENGTH_MASK]; |
82 | } | 82 | } |
83 | 83 | ||
84 | void queue_post(struct event_queue *q, int id, void *data) | 84 | void queue_post(struct event_queue *q, int id, void *data) |
@@ -190,3 +190,26 @@ int tick_remove_task(void (*f)(void)) | |||
190 | set_irq_level(oldlevel); | 190 | set_irq_level(oldlevel); |
191 | return -1; | 191 | return -1; |
192 | } | 192 | } |
193 | |||
194 | /**************************************************************************** | ||
195 | * Simple mutex functions | ||
196 | ****************************************************************************/ | ||
197 | void mutex_init(struct mutex *m) | ||
198 | { | ||
199 | m->count = 0; | ||
200 | } | ||
201 | |||
202 | void mutex_lock(struct mutex *m) | ||
203 | { | ||
204 | /* Wait until the lock is open... */ | ||
205 | while(m->count) | ||
206 | yield(); | ||
207 | |||
208 | /* ...and lock it */ | ||
209 | m->count++; | ||
210 | } | ||
211 | |||
212 | void mutex_unlock(struct mutex *m) | ||
213 | { | ||
214 | m->count--; | ||
215 | } | ||
diff --git a/firmware/kernel.h b/firmware/kernel.h index 951ccee947..cd5539b791 100644 --- a/firmware/kernel.h +++ b/firmware/kernel.h | |||
@@ -41,6 +41,11 @@ struct event_queue | |||
41 | unsigned int write; | 41 | unsigned int write; |
42 | }; | 42 | }; |
43 | 43 | ||
44 | struct mutex | ||
45 | { | ||
46 | int count; | ||
47 | }; | ||
48 | |||
44 | /* global tick variable */ | 49 | /* global tick variable */ |
45 | extern long current_tick; | 50 | extern long current_tick; |
46 | 51 | ||
@@ -53,7 +58,11 @@ int tick_add_task(void (*f)(void)); | |||
53 | int tick_remove_task(void (*f)(void)); | 58 | int tick_remove_task(void (*f)(void)); |
54 | 59 | ||
55 | extern void queue_init(struct event_queue *q); | 60 | extern void queue_init(struct event_queue *q); |
56 | extern struct event *queue_wait(struct event_queue *q); | 61 | extern void queue_wait(struct event_queue *q, struct event *ev); |
57 | extern void queue_post(struct event_queue *q, int id, void *data); | 62 | extern void queue_post(struct event_queue *q, int id, void *data); |
58 | 63 | ||
64 | extern void mutex_init(struct mutex *m); | ||
65 | extern void mutex_lock(struct mutex *m); | ||
66 | extern void mutex_unlock(struct mutex *m); | ||
67 | |||
59 | #endif | 68 | #endif |