diff options
Diffstat (limited to 'firmware/target/arm/as3525')
-rw-r--r-- | firmware/target/arm/as3525/ascodec-as3525.c | 27 | ||||
-rw-r--r-- | firmware/target/arm/as3525/ascodec-target.h | 2 | ||||
-rw-r--r-- | firmware/target/arm/as3525/sd-as3525.c | 12 | ||||
-rw-r--r-- | firmware/target/arm/as3525/sd-as3525v2.c | 16 | ||||
-rw-r--r-- | firmware/target/arm/as3525/usb-drv-as3525.c | 24 | ||||
-rw-r--r-- | firmware/target/arm/as3525/usb-drv-as3525.h | 2 | ||||
-rw-r--r-- | firmware/target/arm/as3525/usb-drv-as3525v2.c | 22 |
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; | |||
121 | static struct ascodec_request *req_head = NULL; | 121 | static struct ascodec_request *req_head = NULL; |
122 | static struct ascodec_request *req_tail = NULL; | 122 | static struct ascodec_request *req_tail = NULL; |
123 | 123 | ||
124 | static struct wakeup adc_wkup; | 124 | static struct semaphore adc_done_sem; |
125 | static struct ascodec_request as_audio_req; | 125 | static 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) | |||
312 | static void ascodec_req_init(struct ascodec_request *req, int type, | 312 | static 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 | ||
340 | static 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 | |||
349 | static void ascodec_wait(struct ascodec_request *req) | 340 | static 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 | ||
493 | void ascodec_wait_adc_finished(void) | 484 | void 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 | ||
139 | static struct wakeup transfer_completion_signal; | 139 | static struct semaphore transfer_completion_signal; |
140 | static volatile unsigned int transfer_error[NUM_VOLUMES]; | 140 | static 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; | |||
342 | bool sd_enabled = false; | 342 | bool sd_enabled = false; |
343 | #endif | 343 | #endif |
344 | 344 | ||
345 | static struct wakeup transfer_completion_signal; | 345 | static struct semaphore transfer_completion_signal; |
346 | static struct wakeup command_completion_signal; | 346 | static struct semaphore command_completion_signal; |
347 | static volatile bool retry; | 347 | static volatile bool retry; |
348 | static volatile int cmd_error; | 348 | static 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 @@ | |||
40 | static struct usb_endpoint endpoints[USB_NUM_EPS][2]; | 40 | static struct usb_endpoint endpoints[USB_NUM_EPS][2]; |
41 | static int got_set_configuration = 0; | 41 | static int got_set_configuration = 0; |
42 | static int usb_enum_timeout = -1; | 42 | static int usb_enum_timeout = -1; |
43 | static 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}; | |||
61 | struct usb_endpoint | 61 | struct 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 | ||