summaryrefslogtreecommitdiff
path: root/firmware/target/arm/as3525
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2011-03-02 08:49:38 +0000
committerMichael Sevakis <jethead71@rockbox.org>2011-03-02 08:49:38 +0000
commit12375d1d3aa41f7d277a9af584c7b810b636ec95 (patch)
treefc9ce8029a6910a8dac71b3bf60c71155a01eea4 /firmware/target/arm/as3525
parent05e180a1308a095d51d51d0e047fcd44425ea88f (diff)
downloadrockbox-12375d1d3aa41f7d277a9af584c7b810b636ec95.tar.gz
rockbox-12375d1d3aa41f7d277a9af584c7b810b636ec95.zip
Merge functionality of wakeups and semaphores-- fewer APIs and object types. semaphore_wait takes a timeout now so codecs and plugins have to be made incompatible. Don't make semaphores for targets not using them.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29492 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/as3525')
-rw-r--r--firmware/target/arm/as3525/ascodec-as3525.c27
-rw-r--r--firmware/target/arm/as3525/ascodec-target.h2
-rw-r--r--firmware/target/arm/as3525/sd-as3525.c12
-rw-r--r--firmware/target/arm/as3525/sd-as3525v2.c16
-rw-r--r--firmware/target/arm/as3525/usb-drv-as3525.c24
-rw-r--r--firmware/target/arm/as3525/usb-drv-as3525.h2
-rw-r--r--firmware/target/arm/as3525/usb-drv-as3525v2.c22
7 files changed, 55 insertions, 50 deletions
diff --git a/firmware/target/arm/as3525/ascodec-as3525.c b/firmware/target/arm/as3525/ascodec-as3525.c
index 822d48e241..39658c0637 100644
--- a/firmware/target/arm/as3525/ascodec-as3525.c
+++ b/firmware/target/arm/as3525/ascodec-as3525.c
@@ -107,7 +107,7 @@ struct ascodec_request {
107 unsigned char status; 107 unsigned char status;
108 unsigned char cnt; 108 unsigned char cnt;
109 unsigned char data[ASCODEC_REQ_MAXLEN]; 109 unsigned char data[ASCODEC_REQ_MAXLEN];
110 struct wakeup wkup; 110 struct semaphore complete;
111 ascodec_cb_fn *callback; 111 ascodec_cb_fn *callback;
112 struct ascodec_request *next; 112 struct ascodec_request *next;
113}; 113};
@@ -121,7 +121,7 @@ static unsigned char *req_data_ptr = NULL;
121static struct ascodec_request *req_head = NULL; 121static struct ascodec_request *req_head = NULL;
122static struct ascodec_request *req_tail = NULL; 122static struct ascodec_request *req_tail = NULL;
123 123
124static struct wakeup adc_wkup; 124static struct semaphore adc_done_sem;
125static struct ascodec_request as_audio_req; 125static struct ascodec_request as_audio_req;
126 126
127#ifdef DEBUG 127#ifdef DEBUG
@@ -168,7 +168,7 @@ static void ascodec_finish_req(struct ascodec_request *req)
168 if (req->callback) { 168 if (req->callback) {
169 req->callback(req->data, req_data_ptr - req->data); 169 req->callback(req->data, req_data_ptr - req->data);
170 } 170 }
171 wakeup_signal(&req->wkup); 171 semaphore_release(&req->complete);
172 172
173 req_head = req->next; 173 req_head = req->next;
174 req->next = NULL; 174 req->next = NULL;
@@ -263,7 +263,7 @@ void ascodec_init(void)
263 int prescaler; 263 int prescaler;
264 264
265 mutex_init(&as_mtx); 265 mutex_init(&as_mtx);
266 wakeup_init(&adc_wkup); 266 semaphore_init(&adc_done_sem, 1, 0);
267 267
268 /* enable clock */ 268 /* enable clock */
269 bitset32(&CGU_PERI, CGU_I2C_AUDIO_MASTER_CLOCK_ENABLE); 269 bitset32(&CGU_PERI, CGU_I2C_AUDIO_MASTER_CLOCK_ENABLE);
@@ -312,7 +312,7 @@ void ascodec_init(void)
312static void ascodec_req_init(struct ascodec_request *req, int type, 312static void ascodec_req_init(struct ascodec_request *req, int type,
313 unsigned int index, unsigned int cnt) 313 unsigned int index, unsigned int cnt)
314{ 314{
315 wakeup_init(&req->wkup); 315 semaphore_init(&req->complete, 1, 0);
316 req->next = NULL; 316 req->next = NULL;
317 req->callback = NULL; 317 req->callback = NULL;
318 req->type = type; 318 req->type = type;
@@ -337,19 +337,10 @@ static void ascodec_submit(struct ascodec_request *req)
337 restore_irq(oldlevel); 337 restore_irq(oldlevel);
338} 338}
339 339
340static int irq_disabled(void)
341{
342 unsigned long cpsr;
343
344 asm volatile ("mrs %0, cpsr" : "=r"(cpsr));
345
346 return (cpsr & IRQ_STATUS) == IRQ_DISABLED;
347}
348
349static void ascodec_wait(struct ascodec_request *req) 340static void ascodec_wait(struct ascodec_request *req)
350{ 341{
351 if (!irq_disabled()) { 342 if (irq_enabled()) {
352 wakeup_wait(&req->wkup, TIMEOUT_BLOCK); 343 semaphore_wait(&req->complete, TIMEOUT_BLOCK);
353 return; 344 return;
354 } 345 }
355 346
@@ -477,7 +468,7 @@ static void ascodec_read_cb(unsigned const char *data, unsigned int len)
477 } 468 }
478 if (data[2] & IRQ_ADC) { /* adc finished */ 469 if (data[2] & IRQ_ADC) { /* adc finished */
479 IFDEBUG(int_adc++); 470 IFDEBUG(int_adc++);
480 wakeup_signal(&adc_wkup); 471 semaphore_release(&adc_done_sem);
481 } 472 }
482 VIC_INT_ENABLE = INTERRUPT_AUDIO; 473 VIC_INT_ENABLE = INTERRUPT_AUDIO;
483} 474}
@@ -492,7 +483,7 @@ void INT_AUDIO(void)
492 483
493void ascodec_wait_adc_finished(void) 484void ascodec_wait_adc_finished(void)
494{ 485{
495 wakeup_wait(&adc_wkup, TIMEOUT_BLOCK); 486 semaphore_wait(&adc_done_sem, TIMEOUT_BLOCK);
496} 487}
497 488
498#ifdef CONFIG_CHARGING 489#ifdef CONFIG_CHARGING
diff --git a/firmware/target/arm/as3525/ascodec-target.h b/firmware/target/arm/as3525/ascodec-target.h
index 7c47bd7e9c..85c3d1c103 100644
--- a/firmware/target/arm/as3525/ascodec-target.h
+++ b/firmware/target/arm/as3525/ascodec-target.h
@@ -28,7 +28,7 @@
28#ifndef SIMULATOR 28#ifndef SIMULATOR
29 29
30#include "as3514.h" 30#include "as3514.h"
31#include "kernel.h" /* for struct wakeup */ 31#include "kernel.h" /* for struct semaphore */
32#include "clock-target.h" /* for AS3525_I2C_PRESCALER */ 32#include "clock-target.h" /* for AS3525_I2C_PRESCALER */
33#include "system-arm.h" 33#include "system-arm.h"
34 34
diff --git a/firmware/target/arm/as3525/sd-as3525.c b/firmware/target/arm/as3525/sd-as3525.c
index 5a6e0df39a..a2d20c36fa 100644
--- a/firmware/target/arm/as3525/sd-as3525.c
+++ b/firmware/target/arm/as3525/sd-as3525.c
@@ -136,7 +136,7 @@ static bool hs_card = false;
136#define EXT_SD_BITS (1<<2) 136#define EXT_SD_BITS (1<<2)
137#endif 137#endif
138 138
139static struct wakeup transfer_completion_signal; 139static struct semaphore transfer_completion_signal;
140static volatile unsigned int transfer_error[NUM_VOLUMES]; 140static volatile unsigned int transfer_error[NUM_VOLUMES];
141#define PL180_MAX_TRANSFER_ERRORS 10 141#define PL180_MAX_TRANSFER_ERRORS 10
142 142
@@ -191,7 +191,7 @@ void INT_NAND(void)
191 191
192 transfer_error[INTERNAL_AS3525] = status & MCI_DATA_ERROR; 192 transfer_error[INTERNAL_AS3525] = status & MCI_DATA_ERROR;
193 193
194 wakeup_signal(&transfer_completion_signal); 194 semaphore_release(&transfer_completion_signal);
195 MCI_CLEAR(INTERNAL_AS3525) = status; 195 MCI_CLEAR(INTERNAL_AS3525) = status;
196} 196}
197 197
@@ -202,7 +202,7 @@ void INT_MCI0(void)
202 202
203 transfer_error[SD_SLOT_AS3525] = status & MCI_DATA_ERROR; 203 transfer_error[SD_SLOT_AS3525] = status & MCI_DATA_ERROR;
204 204
205 wakeup_signal(&transfer_completion_signal); 205 semaphore_release(&transfer_completion_signal);
206 MCI_CLEAR(SD_SLOT_AS3525) = status; 206 MCI_CLEAR(SD_SLOT_AS3525) = status;
207} 207}
208#endif 208#endif
@@ -568,7 +568,7 @@ int sd_init(void)
568 bitset32(&CCU_IO, 1<<2); 568 bitset32(&CCU_IO, 1<<2);
569#endif 569#endif
570 570
571 wakeup_init(&transfer_completion_signal); 571 semaphore_init(&transfer_completion_signal, 1, 0);
572 572
573 init_pl180_controller(INTERNAL_AS3525); 573 init_pl180_controller(INTERNAL_AS3525);
574 ret = sd_init_card(INTERNAL_AS3525); 574 ret = sd_init_card(INTERNAL_AS3525);
@@ -678,7 +678,7 @@ static int sd_select_bank(signed char bank)
678 (9<<4) /* 2^9 = 512 */ ; 678 (9<<4) /* 2^9 = 512 */ ;
679 679
680 /* Wakeup signal from NAND/MCIO isr on MCI_DATA_ERROR | MCI_DATA_END */ 680 /* Wakeup signal from NAND/MCIO isr on MCI_DATA_ERROR | MCI_DATA_END */
681 wakeup_wait(&transfer_completion_signal, TIMEOUT_BLOCK); 681 semaphore_wait(&transfer_completion_signal, TIMEOUT_BLOCK);
682 682
683 /* Wait for FIFO to empty, card may still be in PRG state */ 683 /* Wait for FIFO to empty, card may still be in PRG state */
684 while(MCI_STATUS(INTERNAL_AS3525) & MCI_TX_ACTIVE ); 684 while(MCI_STATUS(INTERNAL_AS3525) & MCI_TX_ACTIVE );
@@ -837,7 +837,7 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start,
837 (9<<4) /* 2^9 = 512 */ ; 837 (9<<4) /* 2^9 = 512 */ ;
838 838
839 /* Wakeup signal from NAND/MCIO isr on MCI_DATA_ERROR | MCI_DATA_END */ 839 /* Wakeup signal from NAND/MCIO isr on MCI_DATA_ERROR | MCI_DATA_END */
840 wakeup_wait(&transfer_completion_signal, TIMEOUT_BLOCK); 840 semaphore_wait(&transfer_completion_signal, TIMEOUT_BLOCK);
841 841
842 /* Wait for FIFO to empty, card may still be in PRG state for writes */ 842 /* Wait for FIFO to empty, card may still be in PRG state for writes */
843 while(MCI_STATUS(drive) & MCI_TX_ACTIVE); 843 while(MCI_STATUS(drive) & MCI_TX_ACTIVE);
diff --git a/firmware/target/arm/as3525/sd-as3525v2.c b/firmware/target/arm/as3525/sd-as3525v2.c
index 70d7c8fda1..b863337cbc 100644
--- a/firmware/target/arm/as3525/sd-as3525v2.c
+++ b/firmware/target/arm/as3525/sd-as3525v2.c
@@ -342,8 +342,8 @@ static struct event_queue sd_queue;
342bool sd_enabled = false; 342bool sd_enabled = false;
343#endif 343#endif
344 344
345static struct wakeup transfer_completion_signal; 345static struct semaphore transfer_completion_signal;
346static struct wakeup command_completion_signal; 346static struct semaphore command_completion_signal;
347static volatile bool retry; 347static volatile bool retry;
348static volatile int cmd_error; 348static volatile int cmd_error;
349 349
@@ -365,12 +365,12 @@ void INT_NAND(void)
365 retry = true; 365 retry = true;
366 366
367 if( status & (MCI_INT_DTO|MCI_DATA_ERROR)) 367 if( status & (MCI_INT_DTO|MCI_DATA_ERROR))
368 wakeup_signal(&transfer_completion_signal); 368 semaphore_release(&transfer_completion_signal);
369 369
370 cmd_error = status & MCI_CMD_ERROR; 370 cmd_error = status & MCI_CMD_ERROR;
371 371
372 if(status & MCI_INT_CD) 372 if(status & MCI_INT_CD)
373 wakeup_signal(&command_completion_signal); 373 semaphore_release(&command_completion_signal);
374 374
375 MCI_CTRL |= INT_ENABLE; 375 MCI_CTRL |= INT_ENABLE;
376} 376}
@@ -442,7 +442,7 @@ static bool send_cmd(const int drive, const int cmd, const int arg, const int fl
442 _buttonlight_off(); 442 _buttonlight_off();
443 } 443 }
444#endif 444#endif
445 wakeup_wait(&command_completion_signal, TIMEOUT_BLOCK); 445 semaphore_wait(&command_completion_signal, TIMEOUT_BLOCK);
446 446
447 /* Handle command responses & errors */ 447 /* Handle command responses & errors */
448 if(flags & MCI_RESP) 448 if(flags & MCI_RESP)
@@ -769,8 +769,8 @@ int sd_init(void)
769 | (AS3525_SDSLOT_DIV << 2) 769 | (AS3525_SDSLOT_DIV << 2)
770 | 1; /* clock source = PLLA */ 770 | 1; /* clock source = PLLA */
771 771
772 wakeup_init(&transfer_completion_signal); 772 semaphore_init(&transfer_completion_signal, 1, 0);
773 wakeup_init(&command_completion_signal); 773 semaphore_init(&command_completion_signal, 1, 0);
774 774
775#if defined(SANSA_FUZEV2) || defined(SANSA_CLIPPLUS) 775#if defined(SANSA_FUZEV2) || defined(SANSA_CLIPPLUS)
776 if (amsv2_variant == 1) 776 if (amsv2_variant == 1)
@@ -932,7 +932,7 @@ sd_transfer_retry_with_reinit:
932 goto sd_transfer_error; 932 goto sd_transfer_error;
933 } 933 }
934 934
935 wakeup_wait(&transfer_completion_signal, TIMEOUT_BLOCK); 935 semaphore_wait(&transfer_completion_signal, TIMEOUT_BLOCK);
936 936
937 last_disk_activity = current_tick; 937 last_disk_activity = current_tick;
938 938
diff --git a/firmware/target/arm/as3525/usb-drv-as3525.c b/firmware/target/arm/as3525/usb-drv-as3525.c
index 2e5330ec1b..69c50cda93 100644
--- a/firmware/target/arm/as3525/usb-drv-as3525.c
+++ b/firmware/target/arm/as3525/usb-drv-as3525.c
@@ -40,6 +40,7 @@
40static struct usb_endpoint endpoints[USB_NUM_EPS][2]; 40static struct usb_endpoint endpoints[USB_NUM_EPS][2];
41static int got_set_configuration = 0; 41static int got_set_configuration = 0;
42static int usb_enum_timeout = -1; 42static int usb_enum_timeout = -1;
43static bool initialized = false;
43 44
44/* 45/*
45 * dma/setup descriptors and buffers should avoid sharing 46 * dma/setup descriptors and buffers should avoid sharing
@@ -180,19 +181,19 @@ static void reset_endpoints(int init)
180 if (endpoints[i][0].state & EP_STATE_BUSY) { 181 if (endpoints[i][0].state & EP_STATE_BUSY) {
181 if (endpoints[i][0].state & EP_STATE_ASYNC) { 182 if (endpoints[i][0].state & EP_STATE_ASYNC) {
182 endpoints[i][0].rc = -1; 183 endpoints[i][0].rc = -1;
183 wakeup_signal(&endpoints[i][0].complete); 184 semaphore_release(&endpoints[i][0].complete);
184 } else { 185 } else {
185 usb_core_transfer_complete(i, USB_DIR_IN, -1, 0); 186 usb_core_transfer_complete(i, USB_DIR_IN, -1, 0);
186 } 187 }
187 } 188 }
188 endpoints[i][0].state = 0; 189 endpoints[i][0].state = 0;
189 wakeup_init(&endpoints[i][0].complete); 190 semaphore_wait(&endpoints[i][0].complete, TIMEOUT_NOBLOCK);
190 191
191 if (i != 2) { /* Skip the OUT EP0 alias */ 192 if (i != 2) { /* Skip the OUT EP0 alias */
192 if (endpoints[i][1].state & EP_STATE_BUSY) 193 if (endpoints[i][1].state & EP_STATE_BUSY)
193 usb_core_transfer_complete(i, USB_DIR_OUT, -1, 0); 194 usb_core_transfer_complete(i, USB_DIR_OUT, -1, 0);
194 endpoints[i][1].state = 0; 195 endpoints[i][1].state = 0;
195 wakeup_init(&endpoints[i][1].complete); 196 semaphore_wait(&endpoints[i][1].complete, TIMEOUT_NOBLOCK);
196 USB_OEP_SUP_PTR(i) = 0; 197 USB_OEP_SUP_PTR(i) = 0;
197 } 198 }
198 } 199 }
@@ -225,6 +226,18 @@ void usb_drv_init(void)
225{ 226{
226 logf("usb_drv_init() !!!!\n"); 227 logf("usb_drv_init() !!!!\n");
227 228
229 if (!initialized)
230 {
231 int i;
232 for (i = 0; i < USB_NUM_EPS; i++)
233 {
234 semaphore_init(&endpoints[i][0].complete, 1, 0);
235 semaphore_init(&endpoints[i][1].complete, 1, 0);
236 }
237
238 initialized = true;
239 }
240
228 usb_enable_pll(); 241 usb_enable_pll();
229 242
230 /* we have external power, so boost cpu */ 243 /* we have external power, so boost cpu */
@@ -322,6 +335,7 @@ void usb_drv_exit(void)
322 ascodec_write(AS3515_USB_UTIL, ascodec_read(AS3515_USB_UTIL) & ~(1<<4)); 335 ascodec_write(AS3515_USB_UTIL, ascodec_read(AS3515_USB_UTIL) & ~(1<<4));
323 usb_disable_pll(); 336 usb_disable_pll();
324 cpu_boost(0); 337 cpu_boost(0);
338 initialized = false;
325 logf("usb_drv_exit() !!!!\n"); 339 logf("usb_drv_exit() !!!!\n");
326} 340}
327 341
@@ -529,7 +543,7 @@ int usb_drv_send(int ep, void *ptr, int len)
529 } 543 }
530 544
531 ep_send(ep, ptr, len); 545 ep_send(ep, ptr, len);
532 if (wakeup_wait(&endpoints[ep][0].complete, HZ) == OBJ_WAIT_TIMEDOUT) 546 if (semaphore_wait(&endpoints[ep][0].complete, HZ) == OBJ_WAIT_TIMEDOUT)
533 logf("send timed out!\n"); 547 logf("send timed out!\n");
534 548
535 return endpoints[ep][0].rc; 549 return endpoints[ep][0].rc;
@@ -570,7 +584,7 @@ static void handle_in_ep(int ep)
570 endpoints[ep][0].state &= ~EP_STATE_ASYNC; 584 endpoints[ep][0].state &= ~EP_STATE_ASYNC;
571 usb_core_transfer_complete(ep, USB_DIR_IN, 0, endpoints[ep][0].len); 585 usb_core_transfer_complete(ep, USB_DIR_IN, 0, endpoints[ep][0].len);
572 } else { 586 } else {
573 wakeup_signal(&endpoints[ep][0].complete); 587 semaphore_release(&endpoints[ep][0].complete);
574 } 588 }
575 ep_sts &= ~USB_EP_STAT_TDC; 589 ep_sts &= ~USB_EP_STAT_TDC;
576 } 590 }
diff --git a/firmware/target/arm/as3525/usb-drv-as3525.h b/firmware/target/arm/as3525/usb-drv-as3525.h
index 960b023039..0f8b3c0668 100644
--- a/firmware/target/arm/as3525/usb-drv-as3525.h
+++ b/firmware/target/arm/as3525/usb-drv-as3525.h
@@ -310,7 +310,7 @@ struct usb_endpoint
310 unsigned int len; 310 unsigned int len;
311 volatile unsigned int state; 311 volatile unsigned int state;
312 int rc; 312 int rc;
313 struct wakeup complete; 313 struct semaphore complete;
314 struct usb_dev_dma_desc *uc_desc; 314 struct usb_dev_dma_desc *uc_desc;
315}; 315};
316 316
diff --git a/firmware/target/arm/as3525/usb-drv-as3525v2.c b/firmware/target/arm/as3525/usb-drv-as3525v2.c
index 78dc2a603f..24548f30c5 100644
--- a/firmware/target/arm/as3525/usb-drv-as3525v2.c
+++ b/firmware/target/arm/as3525/usb-drv-as3525v2.c
@@ -61,7 +61,7 @@ static const uint8_t out_ep_list[NUM_OUT_EP + 1] = {0, OUT_EP_LIST};
61struct usb_endpoint 61struct usb_endpoint
62{ 62{
63 unsigned int len; /* length of the data buffer */ 63 unsigned int len; /* length of the data buffer */
64 struct wakeup complete; /* wait object */ 64 struct semaphore complete; /* wait object */
65 int8_t status; /* completion status (0 for success) */ 65 int8_t status; /* completion status (0 for success) */
66 bool active; /* true is endpoint has been requested (true for EP0) */ 66 bool active; /* true is endpoint has been requested (true for EP0) */
67 bool wait; /* true if usb thread is blocked on completion */ 67 bool wait; /* true if usb thread is blocked on completion */
@@ -281,7 +281,7 @@ static void reset_endpoints(void)
281 if(endpoints[ep][DIR_IN].wait) 281 if(endpoints[ep][DIR_IN].wait)
282 { 282 {
283 endpoints[ep][DIR_IN].wait = false; 283 endpoints[ep][DIR_IN].wait = false;
284 wakeup_signal(&endpoints[ep][DIR_IN].complete); 284 semaphore_release(&endpoints[ep][DIR_IN].complete);
285 } 285 }
286 if(DIEPCTL(ep) & DEPCTL_epena) 286 if(DIEPCTL(ep) & DEPCTL_epena)
287 DIEPCTL(ep) = DEPCTL_snak; 287 DIEPCTL(ep) = DEPCTL_snak;
@@ -297,7 +297,7 @@ static void reset_endpoints(void)
297 if(endpoints[ep][DIR_OUT].wait) 297 if(endpoints[ep][DIR_OUT].wait)
298 { 298 {
299 endpoints[ep][DIR_OUT].wait = false; 299 endpoints[ep][DIR_OUT].wait = false;
300 wakeup_signal(&endpoints[ep][DIR_OUT].complete); 300 semaphore_release(&endpoints[ep][DIR_OUT].complete);
301 } 301 }
302 if(DOEPCTL(ep) & DEPCTL_epena) 302 if(DOEPCTL(ep) & DEPCTL_epena)
303 DOEPCTL(ep) = DEPCTL_snak; 303 DOEPCTL(ep) = DEPCTL_snak;
@@ -329,7 +329,7 @@ static void cancel_all_transfers(bool cancel_ep0)
329 if(endpoints[ep][DIR_IN].wait) 329 if(endpoints[ep][DIR_IN].wait)
330 { 330 {
331 endpoints[ep][DIR_IN].wait = false; 331 endpoints[ep][DIR_IN].wait = false;
332 wakeup_signal(&endpoints[ep][DIR_IN].complete); 332 semaphore_release(&endpoints[ep][DIR_IN].complete);
333 } 333 }
334 DIEPCTL(ep) = (DIEPCTL(ep) & ~DEPCTL_usbactep) | DEPCTL_snak; 334 DIEPCTL(ep) = (DIEPCTL(ep) & ~DEPCTL_usbactep) | DEPCTL_snak;
335 } 335 }
@@ -340,7 +340,7 @@ static void cancel_all_transfers(bool cancel_ep0)
340 if(endpoints[ep][DIR_OUT].wait) 340 if(endpoints[ep][DIR_OUT].wait)
341 { 341 {
342 endpoints[ep][DIR_OUT].wait = false; 342 endpoints[ep][DIR_OUT].wait = false;
343 wakeup_signal(&endpoints[ep][DIR_OUT].complete); 343 semaphore_release(&endpoints[ep][DIR_OUT].complete);
344 } 344 }
345 DOEPCTL(ep) = (DOEPCTL(ep) & ~DEPCTL_usbactep) | DEPCTL_snak; 345 DOEPCTL(ep) = (DOEPCTL(ep) & ~DEPCTL_usbactep) | DEPCTL_snak;
346 } 346 }
@@ -457,9 +457,9 @@ void usb_drv_init(void)
457 /* Core init */ 457 /* Core init */
458 core_init(); 458 core_init();
459 FOR_EACH_IN_EP_AND_EP0(i, ep) 459 FOR_EACH_IN_EP_AND_EP0(i, ep)
460 wakeup_init(&endpoints[ep][DIR_IN].complete); 460 semaphore_init(&endpoints[ep][DIR_IN].complete, 1, 0);
461 FOR_EACH_OUT_EP_AND_EP0(i, ep) 461 FOR_EACH_OUT_EP_AND_EP0(i, ep)
462 wakeup_init(&endpoints[ep][DIR_OUT].complete); 462 semaphore_init(&endpoints[ep][DIR_OUT].complete, 1, 0);
463 /* Enable global interrupts */ 463 /* Enable global interrupts */
464 enable_global_interrupts(); 464 enable_global_interrupts();
465} 465}
@@ -498,7 +498,7 @@ static void handle_ep_in_int(int ep)
498 if(endpoint->wait) 498 if(endpoint->wait)
499 { 499 {
500 endpoint->wait = false; 500 endpoint->wait = false;
501 wakeup_signal(&endpoint->complete); 501 semaphore_release(&endpoint->complete);
502 } 502 }
503 } 503 }
504 } 504 }
@@ -515,7 +515,7 @@ static void handle_ep_in_int(int ep)
515 if(endpoint->wait) 515 if(endpoint->wait)
516 { 516 {
517 endpoint->wait = false; 517 endpoint->wait = false;
518 wakeup_signal(&endpoint->complete); 518 semaphore_release(&endpoint->complete);
519 } 519 }
520 } 520 }
521 } 521 }
@@ -549,7 +549,7 @@ static void handle_ep_out_int(int ep)
549 if(endpoint->wait) 549 if(endpoint->wait)
550 { 550 {
551 endpoint->wait = false; 551 endpoint->wait = false;
552 wakeup_signal(&endpoint->complete); 552 semaphore_release(&endpoint->complete);
553 } 553 }
554 } 554 }
555 } 555 }
@@ -798,7 +798,7 @@ static int usb_drv_transfer(int ep, void *ptr, int len, bool dir_in, bool blocki
798 798
799 if(blocking) 799 if(blocking)
800 { 800 {
801 wakeup_wait(&endpoint->complete, TIMEOUT_BLOCK); 801 semaphore_wait(&endpoint->complete, TIMEOUT_BLOCK);
802 return endpoint->status; 802 return endpoint->status;
803 } 803 }
804 804