summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/kernel.c27
-rw-r--r--firmware/kernel.h11
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
74struct event *queue_wait(struct event_queue *q) 74void 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
84void queue_post(struct event_queue *q, int id, void *data) 84void 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 ****************************************************************************/
197void mutex_init(struct mutex *m)
198{
199 m->count = 0;
200}
201
202void 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
212void 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
44struct mutex
45{
46 int count;
47};
48
44/* global tick variable */ 49/* global tick variable */
45extern long current_tick; 50extern long current_tick;
46 51
@@ -53,7 +58,11 @@ int tick_add_task(void (*f)(void));
53int tick_remove_task(void (*f)(void)); 58int tick_remove_task(void (*f)(void));
54 59
55extern void queue_init(struct event_queue *q); 60extern void queue_init(struct event_queue *q);
56extern struct event *queue_wait(struct event_queue *q); 61extern void queue_wait(struct event_queue *q, struct event *ev);
57extern void queue_post(struct event_queue *q, int id, void *data); 62extern void queue_post(struct event_queue *q, int id, void *data);
58 63
64extern void mutex_init(struct mutex *m);
65extern void mutex_lock(struct mutex *m);
66extern void mutex_unlock(struct mutex *m);
67
59#endif 68#endif