00001
00041 #include <assert.h>
00042 #include <byteorder.h>
00043 #include <bitops.h>
00044 #include <debug.h>
00045 #include <interrupt.h>
00046 #include <io.h>
00047 #include <status_codes.h>
00048 #include <string.h>
00049 #include <util.h>
00050 #include <workqueue.h>
00051
00052 #include <usb/request.h>
00053 #include <usb/dev.h>
00054 #include <usb/udc.h>
00055 #include <usb/udc_lib.h>
00056
00057 #include <chip/regs.h>
00058 #include <chip/memory-map.h>
00059 #include <chip/at90usb.h>
00060
00061 #include <app/usb.h>
00062
00063 #include "at90usb_internal.h"
00064 #include "at90usb_regs.h"
00065
00066
00067 #if !defined(CONFIG_UDC_LOW_SPEED) && !defined(CONFIG_UDC_FULL_SPEED)
00068 # error No valid USB speed has been configured
00069 #endif
00070 #if defined(CONFIG_UDC_HIGH_SPEED)
00071 # error High-speed configuration not supported on this chip
00072 #endif
00073 #if defined(CONFIG_UDC_FULL_SPEED) && !defined(CHIP_AT90USB_UDC_FULL_SPEED)
00074 # error Full-speed configuration not supported on this chip
00075 #endif
00076 #if defined(CONFIG_UDC_LOW_SPEED)
00077 # if !defined(CHIP_AT90USB_UDC_LOW_SPEED)
00078 # error Low-speed configuration not supported on this chip
00079 # endif
00080 # if defined(CONFIG_UDC_FULL_SPEED)
00081 # error Low-speed configuration must be selected exclusively
00082 # endif
00083 #endif
00084
00092 static void copy_from_fifo(uint8_t *dest, const unsigned int len)
00093 {
00094 unsigned int i;
00095
00096 for (i = 0; i < len; i++)
00097 dest[i] = avr_read_reg8(UEDATX);
00098 }
00099
00107 static void copy_to_fifo(const uint8_t *source, const unsigned int len)
00108 {
00109 unsigned int i;
00110
00111 for (i = 0; i < len; i++)
00112 avr_write_reg8(UEDATX, source[i]);
00113 }
00114
00128 static inline struct at90usb_udc *at90usb_udc_of(struct udc *udc)
00129 {
00130 return container_of(udc, struct at90usb_udc, udc);
00131 }
00132
00142 static inline
00143 struct at90usb_udc *at90usb_udc_task_of(struct workqueue_task *task)
00144 {
00145 return container_of(task, struct at90usb_udc, task);
00146 }
00147
00157 static inline
00158 struct at90usb_udc_ep *at90usb_ep_task_of(struct workqueue_task *task)
00159 {
00160 return container_of(task, struct at90usb_udc_ep, task);
00161 }
00162
00174 static void at90usb_udc_req_done(struct udc *udc, struct usb_request *req,
00175 enum status_code status)
00176 {
00177 req->status = status;
00178
00179 if (req->req_done)
00180 req->req_done(udc, req);
00181 }
00182
00191 static void at90usb_udc_kill_last_in_bank(void)
00192 {
00193 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX) | AT90USB_UEINTX_KILLBK);
00194 while (avr_read_reg8(UEINTX) & AT90USB_UEINTX_KILLBK)
00195 barrier();
00196 }
00197
00206 static void at90usb_udc_kill_first_out_bank(void)
00207 {
00208 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX)
00209 & ~(AT90USB_UEINTX_RXOUTI | AT90USB_UEINTX_FIFOCON));
00210 }
00211
00223 static void at90usb_udc_kill_all_banks(struct udc *udc, usb_ep_id_t ep_id)
00224 {
00225 bool is_in = avr_read_reg8(UECFG0X) & AT90USB_UECFG0X_EPDIR_IN;
00226
00227 while (AT90USB_UESTA0X_GET_NBUSYBK(avr_read_reg8(UESTA0X))) {
00228 if (is_in)
00229 at90usb_udc_kill_last_in_bank();
00230 else
00231 at90usb_udc_kill_first_out_bank();
00232 }
00233 }
00234
00235 void udc_ep0_submit_out_req(struct udc *udc, struct usb_request *req)
00236 {
00237 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
00238 struct at90usb_udc_ep *ep = &udc90->ep[0];
00239 irqflags_t iflags;
00240
00241 assert(!test_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags));
00242 assert(slist_is_empty(&ep->buf_queue));
00243 assert(slist_is_empty(&ep->req_queue));
00244 assert(ep->buf_offset == 0);
00245
00246 udc90->ctrl_state = EP0_STATE_DATA_OUT;
00247 set_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags);
00248 slist_borrow_to_tail(&ep->buf_queue, &req->buf_list);
00249 slist_insert_tail(&ep->req_queue, &req->node);
00250 barrier();
00251
00252 iflags = cpu_irq_save();
00253
00254 avr_write_reg8(UENUM, 0);
00255 ep->ueienx |= AT90USB_UEIENX_RXOUTE;
00256 avr_write_reg8(UEIENX, ep->ueienx);
00257
00258 cpu_irq_restore(iflags);
00259 }
00260
00261 void udc_ep0_submit_in_req(struct udc *udc, struct usb_request *req)
00262 {
00263 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
00264 struct at90usb_udc_ep *ep = &udc90->ep[0];
00265 irqflags_t iflags;
00266
00267 assert(!test_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags));
00268 assert(slist_is_empty(&ep->buf_queue));
00269 assert(slist_is_empty(&ep->req_queue));
00270 assert(ep->buf_offset == 0);
00271
00272 udc90->ctrl_state = EP0_STATE_DATA_IN;
00273 set_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags);
00274 slist_borrow_to_tail(&ep->buf_queue, &req->buf_list);
00275 slist_insert_tail(&ep->req_queue, &req->node);
00276 barrier();
00277
00278 iflags = cpu_irq_save();
00279
00280 avr_write_reg8(UENUM, 0);
00281 ep->ueienx |= AT90USB_UEIENX_TXINE;
00282 avr_write_reg8(UEIENX, ep->ueienx);
00283
00284 cpu_irq_restore(iflags);
00285 }
00286
00287 status_t udc_ep0_write_sync(struct udc *udc, const void *data, size_t len)
00288 {
00289 irqflags_t iflags;
00290 const uint8_t *data_p = data;
00291
00292 assert(len > 0);
00293 assert(!test_bit(AT90USB_EP_ACTIVE_XFER,
00294 &at90usb_udc_of(udc)->ep[0].flags));
00295 avr_write_reg8(UENUM, 0);
00296 assert(avr_read_reg8(UEINTX) & AT90USB_UEINTX_TXINI);
00297
00298 len = min_u(len, APP_UDC_MAXPACKETSIZE0);
00299
00300 copy_to_fifo(data_p, len);
00301
00302 iflags = cpu_irq_save();
00303 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX) & ~AT90USB_UEINTX_TXINI);
00304 cpu_irq_restore(iflags);
00305
00306 while (!(avr_read_reg8(UEINTX) & AT90USB_UEINTX_TXINI))
00307 barrier();
00308
00309 return len;
00310 }
00311
00312 void udc_ep0_send_status(struct udc *udc)
00313 {
00314 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
00315 struct at90usb_udc_ep *ep = &udc90->ep[0];
00316 irqflags_t iflags;
00317
00318 dbg_verbose("at90usb-udc: send status\n");
00319
00320 assert(!test_bit(AT90USB_EP_ACTIVE_XFER, &udc90->ep[0].flags));
00321 avr_write_reg8(UENUM, 0);
00322 assert(avr_read_reg8(UEINTX) & AT90USB_UEINTX_TXINI);
00323
00324 iflags = cpu_irq_save();
00325
00326 ep->ueienx &= ~AT90USB_UEIENX_RXOUTE;
00327 ep->ueienx |= AT90USB_UEIENX_TXINE;
00328 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX) & ~AT90USB_UEINTX_TXINI);
00329 avr_write_reg8(UEIENX, ep->ueienx);
00330
00331 cpu_irq_restore(iflags);
00332
00333 udc90->ctrl_state = EP0_STATE_STATUS_IN;
00334 }
00335
00336 void udc_ep0_expect_status(struct udc *udc)
00337 {
00338 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
00339
00340
00341
00342 assert(!test_bit(AT90USB_EP_ACTIVE_XFER, &udc90->ep[0].flags));
00343
00344
00345
00346
00347
00348 udc90->ctrl_state = EP0_STATE_STATUS_OUT;
00349 }
00350
00366 static void at90usb_udc_submit_out_queue(struct workqueue_task *task)
00367 {
00368 struct at90usb_udc_ep *ep = at90usb_ep_task_of(task);
00369 struct at90usb_udc *udc90 = ep->udc90;
00370 struct buffer *buf;
00371 struct usb_request *req;
00372 uint16_t buf_offset = 0;
00373 uint16_t fifo_size;
00374
00375 if (slist_is_empty(&ep->req_queue))
00376 goto no_transfer;
00377
00378 avr_write_reg8(UENUM, ep->id);
00379
00380 cpu_irq_disable();
00381
00382 dbg_verbose("ep%u-out: submit req_queue %p status=%02x\n",
00383 ep->id, slist_peek_head_node(&ep->req_queue),
00384 avr_read_reg8(UEINTX));
00385
00386 assert(!test_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags));
00387
00388 set_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags);
00389
00390 cpu_irq_enable();
00391
00392 if (!test_bit(AT90USB_EP_ENABLED, &ep->flags))
00393 goto no_transfer;
00394
00395 cpu_irq_disable();
00396 req = slist_pop_head(&ep->req_queue, struct usb_request, node);
00397 cpu_irq_enable();
00398 if (slist_is_empty(&req->buf_list)) {
00399 assert(slist_is_empty(&ep->req_queue));
00400 goto no_transfer;
00401 }
00402
00403 buf = slist_peek_head(&req->buf_list, struct buffer, node);
00404 while (slist_node_is_valid(&req->buf_list, &buf->node)) {
00405 uint16_t nbytes;
00406
00407 cpu_irq_disable();
00408
00409 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX)
00410 & ~AT90USB_UEINTX_RXOUTI);
00411 cpu_irq_enable();
00412
00413 fifo_size = (avr_read_reg8(UEBCHX) << 8) | avr_read_reg8(UEBCLX);
00414 nbytes = min_u(fifo_size, buf->len - buf_offset);
00415
00416 copy_from_fifo((uint8_t *)((uintptr_t)buf->addr.phys
00417 + buf_offset), nbytes);
00418
00419 buf_offset += nbytes;
00420
00421 cpu_irq_disable();
00422
00423 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX)
00424 & ~AT90USB_UEINTX_FIFOCON);
00425 cpu_irq_enable();
00426
00427
00428
00429
00430
00431
00432 if (fifo_size < ep->maxpacket) {
00433 req->bytes_xfered += buf_offset;
00434 break;
00435 }
00436
00437 if (buf_offset == buf->len) {
00438 req->bytes_xfered += buf_offset;
00439
00440
00441
00442
00443
00444 if (req->buf_list.last == &buf->node)
00445 break;
00446
00447 buf = slist_peek_next(&buf->node, struct buffer, node);
00448 buf_offset = 0;
00449 }
00450
00451
00452 while (!(avr_read_reg8(UEINTX) & AT90USB_UEINTX_RXOUTI)) {
00453 if (!test_bit(AT90USB_EP_ENABLED, &ep->flags))
00454 goto no_transfer;
00455 }
00456 }
00457
00458
00459 barrier();
00460
00461 at90usb_udc_req_done(&udc90->udc, req, 0);
00462
00463 cpu_irq_disable();
00464
00465 avr_write_reg8(UENUM, ep->id);
00466 ep->ueienx |= AT90USB_UEIENX_RXOUTE;
00467 avr_write_reg8(UEIENX, ep->ueienx);
00468 cpu_irq_enable();
00469
00470 goto out;
00471
00472 no_transfer:
00473 cpu_irq_disable();
00474 ep->ueienx &= ~AT90USB_UEIENX_RXOUTE;
00475 avr_write_reg8(UEIENX, ep->ueienx);
00476 cpu_irq_enable();
00477 out:
00478 clear_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags);
00479 }
00480
00496 static void at90usb_udc_submit_in_queue(struct workqueue_task *task)
00497 {
00498 struct at90usb_udc_ep *ep = at90usb_ep_task_of(task);
00499 struct at90usb_udc *udc90 = ep->udc90;
00500 struct buffer *buf;
00501 struct usb_request *req;
00502 uint16_t buf_offset = 0;
00503 uint16_t fifo_len = ep->maxpacket;
00504 uint16_t fifo_offset;
00505
00506 if (slist_is_empty(&ep->req_queue))
00507 goto no_transfer;
00508
00509 avr_write_reg8(UENUM, ep->id);
00510
00511 cpu_irq_disable();
00512
00513 dbg_verbose("ep%u-in: submit req_queue %p status=%02x\n",
00514 ep->id, slist_peek_head_node(&ep->req_queue),
00515 avr_read_reg8(UEINTX));
00516
00517 assert(!test_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags));
00518
00519 set_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags);
00520
00521 cpu_irq_enable();
00522
00523 if (!test_bit(AT90USB_EP_ENABLED, &ep->flags))
00524 goto no_transfer;
00525
00526 cpu_irq_disable();
00527 req = slist_pop_head(&ep->req_queue, struct usb_request, node);
00528 cpu_irq_enable();
00529 if (slist_is_empty(&req->buf_list)) {
00530 assert(slist_is_empty(&ep->req_queue));
00531 goto no_transfer;
00532 }
00533
00534 buf = slist_peek_head(&req->buf_list, struct buffer, node);
00535 fifo_offset = (avr_read_reg8(UEBCHX) << 8) | avr_read_reg8(UEBCLX);
00536
00537 while (slist_node_is_valid(&req->buf_list, &buf->node)) {
00538 unsigned int nbytes;
00539
00540 nbytes = min_u(fifo_len - fifo_offset, buf->len - buf_offset);
00541
00542
00543 while (!(avr_read_reg8(UEINTX) & AT90USB_UEINTX_TXINI))
00544 barrier();
00545
00546 cpu_irq_disable();
00547
00548 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX)
00549 & ~AT90USB_UEINTX_TXINI);
00550 cpu_irq_enable();
00551
00552 copy_to_fifo((uint8_t *)((uintptr_t)buf->addr.phys
00553 + buf_offset), nbytes);
00554
00555 buf_offset += nbytes;
00556 fifo_offset += nbytes;
00557
00558 if (fifo_offset == fifo_len || buf_offset == buf->len) {
00559
00560 cpu_irq_disable();
00561 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX)
00562 & ~AT90USB_UEINTX_FIFOCON);
00563 cpu_irq_enable();
00564 fifo_offset = 0;
00565 }
00566
00567 if (buf_offset == buf->len) {
00568 req->bytes_xfered += buf_offset;
00569
00570
00571
00572
00573 if (req->buf_list.last == &buf->node)
00574 break;
00575
00576 buf = slist_peek_next(&buf->node, struct buffer, node);
00577 buf_offset = 0;
00578 }
00579
00580 if (!test_bit(AT90USB_EP_ENABLED, &ep->flags))
00581 goto no_transfer;
00582 }
00583
00584
00585 barrier();
00586
00587 at90usb_udc_req_done(&udc90->udc, req, 0);
00588 workqueue_add_task(&main_workqueue, &ep->task);
00589 no_transfer:
00590 clear_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags);
00591 }
00592
00593 void udc_ep_submit_out_req(struct udc *udc, usb_ep_id_t ep_id,
00594 struct usb_request *req)
00595 {
00596 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
00597 struct at90usb_udc_ep *ep = &udc90->ep[ep_id];
00598 bool queued = true;
00599
00600 assert(cpu_irq_is_enabled());
00601 assert(ep_id > 0 && ep_id < APP_UDC_NR_ENDPOINTS);
00602
00603 req->bytes_xfered = 0;
00604 req->status = OPERATION_IN_PROGRESS;
00605
00606 cpu_irq_disable();
00607 if (test_bit(AT90USB_EP_ENABLED, &ep->flags)) {
00608 slist_insert_tail(&ep->req_queue, &req->node);
00609 if (!test_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags)) {
00610 avr_write_reg8(UENUM, ep->id);
00611 ep->ueienx |= AT90USB_UEIENX_RXOUTE;
00612 avr_write_reg8(UEIENX, ep->ueienx);
00613 }
00614 } else {
00615 queued = false;
00616 }
00617 cpu_irq_enable();
00618
00619 if (!queued)
00620 at90usb_udc_req_done(udc, req, ERR_FLUSHED);
00621 }
00622
00623 void udc_ep_submit_in_req(struct udc *udc, usb_ep_id_t ep_id,
00624 struct usb_request *req)
00625 {
00626 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
00627 struct at90usb_udc_ep *ep = &udc90->ep[ep_id];
00628 bool queued = true;
00629
00630 assert(cpu_irq_is_enabled());
00631 assert(ep_id > 0 && ep_id < APP_UDC_NR_ENDPOINTS);
00632
00633 req->bytes_xfered = 0;
00634 req->status = OPERATION_IN_PROGRESS;
00635
00636 cpu_irq_disable();
00637 if (test_bit(AT90USB_EP_ENABLED, &ep->flags)) {
00638 slist_insert_tail(&ep->req_queue, &req->node);
00639 if (!test_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags))
00640 workqueue_add_task(&main_workqueue, &ep->task);
00641 } else {
00642 queued = false;
00643 }
00644 cpu_irq_enable();
00645
00646 if (!queued)
00647 at90usb_udc_req_done(udc, req, ERR_FLUSHED);
00648 }
00649
00650 status_t udc_ep_is_halted(struct udc *udc, usb_ep_id_t ep)
00651 {
00652 irqflags_t iflags;
00653 status_t retval;
00654
00655 if (ep >= APP_UDC_NR_ENDPOINTS)
00656 return -1;
00657
00658 iflags = cpu_irq_save();
00659
00660 avr_write_reg8(UENUM, ep);
00661 retval = !!(avr_read_reg8(UECONX) & AT90USB_UECONX_STALLRQ);
00662
00663 cpu_irq_restore(iflags);
00664
00665 return retval;
00666 }
00667
00668 status_t udc_ep_set_halt(struct udc *udc, usb_ep_id_t ep)
00669 {
00670 irqflags_t iflags;
00671 uint8_t uecfg;
00672
00673 dbg_verbose("at90usb-udc: ep%d: set halt\n", ep);
00674
00675 if (ep >= APP_UDC_NR_ENDPOINTS)
00676 return -1;
00677
00678 avr_write_reg8(UENUM, ep);
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702 uecfg = avr_read_reg8(UECFG0X);
00703 if (uecfg & AT90USB_UECFG0X_EPDIR_IN) {
00704 uint8_t uesta;
00705
00706
00707 do {
00708 uesta = avr_read_reg8(UESTA0X);
00709 } while (AT90USB_UESTA0X_GET_NBUSYBK(uesta) != 0);
00710 }
00711
00712
00713 iflags = cpu_irq_save();
00714 avr_write_reg8(UECONX, avr_read_reg8(UECONX)
00715 | AT90USB_UECONX_STALLRQ);
00716 cpu_irq_restore(iflags);
00717
00718 if (ep != 0 && !(uecfg & AT90USB_UECFG0X_EPDIR_IN)) {
00719
00720
00721
00722
00723
00724 at90usb_udc_kill_all_banks(udc, ep);
00725 }
00726
00727 return 0;
00728 }
00729
00730 status_t udc_ep_clear_halt(struct udc *udc, usb_ep_id_t ep)
00731 {
00732 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
00733 irqflags_t iflags;
00734
00735 dbg_verbose("at90usb-udc: ep%d: clear halt (%swedged)\n", ep,
00736 test_bit(AT90USB_EP_WEDGE, &udc90->ep[ep].flags)
00737 ? "" : "not ");
00738
00739 if (ep >= APP_UDC_NR_ENDPOINTS)
00740 return -1;
00741
00742 iflags = cpu_irq_save();
00743
00744 avr_write_reg8(UENUM, ep);
00745
00746
00747 avr_write_reg8(UECONX, avr_read_reg8(UECONX) | AT90USB_UECONX_RSTDT);
00748
00749 if (!test_bit(AT90USB_EP_WEDGE, &udc90->ep[ep].flags)) {
00750
00751 avr_write_reg8(UECONX, avr_read_reg8(UECONX)
00752 | AT90USB_UECONX_STALLRQC);
00753 }
00754
00755 cpu_irq_restore(iflags);
00756
00757 return 0;
00758 }
00759
00760 bool udc_ep_is_wedged(struct udc *udc, usb_ep_id_t ep)
00761 {
00762 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
00763
00764 assert(ep < APP_UDC_NR_ENDPOINTS);
00765
00766 return test_bit(AT90USB_EP_WEDGE, &udc90->ep[ep].flags);
00767 }
00768
00769 void udc_ep_set_wedge(struct udc *udc, usb_ep_id_t ep)
00770 {
00771 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
00772 irqflags_t iflags;
00773
00774 dbg_verbose("at90usb-udc: ep%d: set wedge\n", ep);
00775
00776 iflags = cpu_irq_save();
00777 set_bit(AT90USB_EP_WEDGE, &udc90->ep[ep].flags);
00778
00779
00780
00781
00782
00783 assert(ep < APP_UDC_NR_ENDPOINTS);
00784 udc_ep_set_halt(udc, ep);
00785
00786 cpu_irq_restore(iflags);
00787 }
00788
00789 void udc_ep_clear_wedge(struct udc *udc, usb_ep_id_t ep)
00790 {
00791 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
00792 irqflags_t iflags;
00793
00794 dbg_verbose("at90usb-udc: ep%d: clear wedge\n", ep);
00795
00796 assert(ep < APP_UDC_NR_ENDPOINTS);
00797
00798 iflags = cpu_irq_save();
00799
00800 assert(!test_bit(AT90USB_EP_WEDGE, &udc90->ep[ep].flags)
00801 || udc_ep_is_halted(udc, ep) > 0);
00802
00803 clear_bit(AT90USB_EP_WEDGE, &udc90->ep[ep].flags);
00804 cpu_irq_restore(iflags);
00805 }
00806
00821 static status_t at90usb_udc_configure_ep(uint8_t id, unsigned int size,
00822 enum usb_ep_xfer_type type, bool is_in, uint8_t nr_banks)
00823 {
00824 irqflags_t iflags;
00825 uint8_t config;
00826
00828 assert(nr_banks >= 1 && nr_banks <= 2 && size >= 8 && size <= 256);
00829
00830 iflags = cpu_irq_save();
00831
00832 avr_write_reg8(UENUM, id);
00833 avr_write_reg8(UECONX, AT90USB_UECONX_EPEN);
00834
00835 config = AT90USB_UECFG0X_EPTYPE(type);
00836 if (is_in)
00837 config |= AT90USB_UECFG0X_EPDIR_IN;
00838
00839 avr_write_reg8(UECFG0X, config);
00840
00841 config = (AT90USB_UECFG1X_ALLOC
00842 | AT90USB_UECFG1X_EPBK(nr_banks - 1));
00843
00844 switch(size) {
00845 case 8:
00846 config |= AT90USB_UECFG1X_EPSIZE_8;
00847 break;
00848 case 16:
00849 config |= AT90USB_UECFG1X_EPSIZE_16;
00850 break;
00851 case 32:
00852 config |= AT90USB_UECFG1X_EPSIZE_32;
00853 break;
00854 case 64:
00855 config |= AT90USB_UECFG1X_EPSIZE_64;
00856 break;
00857 case 128:
00858 config |= AT90USB_UECFG1X_EPSIZE_128;
00859 break;
00860 case 256:
00861 config |= AT90USB_UECFG1X_EPSIZE_256;
00862 break;
00863 }
00864
00865 avr_write_reg8(UECFG1X, config);
00866 if (!(avr_read_reg8(UESTA0X) & AT90USB_UESTA0X_CFGOK)) {
00867 avr_write_reg8(UECONX, 0);
00868 dbg_error("ep%u: configuration %02x invalid\n", id, config);
00869 cpu_irq_restore(iflags);
00870 return ERR_INVALID_ARG;
00871 }
00872
00873 avr_write_reg8(UERST, AT90USB_UERST_EPRST(id));
00874 avr_write_reg8(UERST, 0);
00875
00876 cpu_irq_restore(iflags);
00877
00878 return STATUS_OK;
00879 }
00880
00888 static void
00889 at90usb_udc_ep_flush(struct at90usb_udc *udc90, struct at90usb_udc_ep *ep)
00890 {
00891 struct udc *udc = &udc90->udc;
00892 struct buffer *buf;
00893 struct buffer *next_buf;
00894 struct usb_request *req;
00895 irqflags_t iflags;
00896
00897 assert(ep->id != 0 && ep->id < APP_UDC_NR_ENDPOINTS);
00898 assert(test_bit(AT90USB_EP_ENABLED, &ep->flags));
00899
00900
00901
00902
00903
00904 iflags = cpu_irq_save();
00905
00906
00907 clear_bit(AT90USB_EP_ENABLED, &ep->flags);
00908 clear_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags);
00909
00910 ep->ueienx = 0;
00911 avr_write_reg8(UENUM, ep->id);
00912 avr_write_reg8(UEIENX, ep->ueienx);
00913
00914
00915 at90usb_udc_kill_all_banks(udc, ep->id);
00916 cpu_irq_restore(iflags);
00917
00918
00919 if (!slist_is_empty(&ep->req_queue)) {
00920 req = slist_pop_head(&ep->req_queue, struct usb_request, node);
00921 buf = slist_peek_head(&req->buf_list, struct buffer, node);
00922 while (slist_node_is_valid(&req->buf_list, &buf->node)) {
00923 next_buf = slist_peek_next(&buf->node,
00924 struct buffer, node);
00925 dbg_verbose("buf %p req [%p %p]\n",
00926 &buf->node, req->buf_list.first.next,
00927 req->buf_list.last);
00928 if (req->buf_list.last == &buf->node) {
00929 at90usb_udc_req_done(udc, req, ERR_FLUSHED);
00930 if (!slist_is_empty(&ep->req_queue))
00931 req = slist_pop_head(&ep->req_queue,
00932 struct usb_request,
00933 node);
00934 }
00935
00936 buf = next_buf;
00937 }
00938
00939 assert(slist_is_empty(&ep->req_queue));
00940 }
00941 }
00942
00943 void udc_ep_flush(struct udc *udc, usb_ep_id_t ep_id)
00944 {
00945 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
00946 struct at90usb_udc_ep *ep;
00947 irqflags_t iflags;
00948
00949 dbg_verbose("at90usb-udc: flush ep%u\n", ep_id);
00950
00951 ep = &udc90->ep[ep_id];
00952 at90usb_udc_ep_flush(udc90, ep);
00953
00954
00955 iflags = cpu_irq_save();
00956 set_bit(AT90USB_EP_ENABLED, &ep->flags);
00957 cpu_irq_restore(iflags);
00958 }
00959
00973 static struct at90usb_udc_ep *
00974 at90usb_ep_alloc(struct udc *udc, uint8_t addr, uint16_t max_packet_size)
00975 {
00976 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
00977 struct at90usb_udc_ep *ep;
00978 uint8_t index;
00979
00980 index = addr & USB_EP_ADDR_MASK;
00981 assert(index > 0 && index < APP_UDC_NR_ENDPOINTS);
00982
00983 ep = &udc90->ep[index];
00984 if (atomic_test_and_set_bit(AT90USB_EP_ALLOCATED, &ep->flags))
00985 return NULL;
00986
00987
00988
00989
00990
00991 if (addr & USB_DIR_IN)
00992 set_bit(AT90USB_EP_IS_IN, &ep->flags);
00993
00994 ep->id = index;
00995 ep->udc90 = udc90;
00996 ep->ueienx = 0;
00997 ep->maxpacket = max_packet_size;
00998
00999 slist_init(&ep->req_queue);
01000
01001 if (test_bit(AT90USB_EP_IS_IN, &ep->flags))
01002 workqueue_task_init(&ep->task, at90usb_udc_submit_in_queue);
01003 else
01004 workqueue_task_init(&ep->task, at90usb_udc_submit_out_queue);
01005
01006 return ep;
01007 }
01008
01023 static usb_ep_id_t at90usb_ep_enable(struct at90usb_udc_ep *ep, uint8_t addr,
01024 uint16_t max_packet_size, enum usb_ep_xfer_type type,
01025 unsigned int nr_banks)
01026 {
01027 status_t ret;
01028 uint8_t index;
01029
01030 index = addr & USB_EP_ADDR_MASK;
01031 ret = at90usb_udc_configure_ep(index, max_packet_size, type,
01032 addr & USB_DIR_IN, nr_banks);
01033 if (ret)
01034 return ret;
01035
01036
01037
01038
01039
01040 barrier();
01041 set_bit(AT90USB_EP_ENABLED, &ep->flags);
01042
01043 return index;
01044 }
01045
01046 usb_ep_id_t udc_ep_create_bulk(struct udc *udc, uint8_t addr,
01047 uint16_t max_packet_size)
01048 {
01049 struct at90usb_udc_ep *ep;
01050 usb_ep_id_t ret;
01051
01052 dbg_verbose("at90usb-udc: create BULK ep addr: %02x size: %u\n",
01053 addr, max_packet_size);
01054
01055 ep = at90usb_ep_alloc(udc, addr, max_packet_size);
01056 if (!ep)
01057 return ERR_BUSY;
01058
01059 ret = at90usb_ep_enable(ep, addr, max_packet_size,
01060 USB_EP_XFER_BULK, 2);
01061 if (ret < 0)
01062 atomic_clear_bit(AT90USB_EP_ALLOCATED, &ep->flags);
01063
01064 return ret;
01065 }
01066
01067 usb_ep_id_t udc_ep_create_interrupt(struct udc *udc, uint8_t addr,
01068 uint16_t max_packet_size)
01069 {
01070 struct at90usb_udc_ep *ep;
01071 status_t ret;
01072
01073 dbg_verbose("at90usb-udc: create INTERRUPT ep addr: %02x size: %u\n",
01074 addr, max_packet_size);
01075
01076 ep = at90usb_ep_alloc(udc, addr, max_packet_size);
01077 if (!ep)
01078 return ERR_BUSY;
01079
01080 ret = at90usb_ep_enable(ep, addr, max_packet_size,
01081 USB_EP_XFER_INTERRUPT, 2);
01082 if (ret < 0)
01083 atomic_clear_bit(AT90USB_EP_ALLOCATED, &ep->flags);
01084
01085 return ret;
01086 }
01087
01088 void udc_ep_destroy(struct udc *udc, usb_ep_id_t ep_id)
01089 {
01090 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
01091 struct at90usb_udc_ep *ep;
01092 irqflags_t iflags;
01093
01094 dbg_verbose("at90usb-udc: destroy ep%u\n", ep_id);
01095
01096 assert(ep_id != 0 && ep_id < APP_UDC_NR_ENDPOINTS);
01097
01098 ep = &udc90->ep[ep_id];
01099 at90usb_udc_ep_flush(udc90, ep);
01100
01101 iflags = cpu_irq_save();
01102
01103 avr_write_reg8(UENUM, ep_id);
01104
01105
01106 avr_write_reg8(UERST, AT90USB_UERST_EPRST(ep_id));
01107 avr_write_reg8(UERST, 0);
01108
01109 avr_write_reg8(UECONX, 0);
01110 avr_write_reg8(UESTA0X, 0);
01111
01112
01113 ep->flags = 0;
01114 cpu_irq_restore(iflags);
01115 }
01116
01117 status_t udc_enter_test_mode(struct udc *udc, unsigned int mode)
01118 {
01119 return -1;
01120 }
01121
01132 static void at90usb_ep0_tx_complete(struct udc *udc, struct at90usb_udc_ep *ep)
01133 {
01134 struct usb_request *req;
01135 struct buffer *buf;
01136 unsigned int buf_offset;
01137 unsigned int bytes_written;
01138
01139 if (slist_is_empty(&ep->req_queue)) {
01140 assert(slist_is_empty(&ep->buf_queue));
01141 return;
01142 }
01143
01144 assert(!slist_is_empty(&ep->buf_queue));
01145
01146 req = slist_peek_head(&ep->req_queue, struct usb_request, node);
01147 buf = slist_peek_head(&ep->buf_queue, struct buffer, node);
01148
01149 buf_offset = ep->buf_offset;
01150 bytes_written = ep->bytes_written;
01151
01152 req->bytes_xfered += bytes_written;
01153
01154 while (bytes_written && buf_offset + bytes_written >= buf->len) {
01155 bytes_written -= buf->len - buf_offset;
01156 buf_offset = 0;
01157 slist_pop_head_node(&ep->buf_queue);
01158 if (bytes_written)
01159 assert(!slist_is_empty(&ep->buf_queue));
01160 buf = slist_peek_head(&ep->buf_queue, struct buffer, node);
01161 }
01162
01163 if (slist_is_empty(&ep->buf_queue)) {
01164 slist_init(&ep->req_queue);
01165
01166 slist_give_back_head(&req->buf_list, &ep->buf_queue);
01167 clear_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags);
01168 at90usb_udc_req_done(udc, req, 0);
01169 }
01170
01171 ep->buf_offset = bytes_written;
01172 ep->bytes_written = 0;
01173 }
01174
01182 static void at90usb_ep0_tx_flush(struct udc *udc, struct at90usb_udc_ep *ep)
01183 {
01184
01185 at90usb_ep0_tx_complete(udc, ep);
01186
01187
01188 if (!slist_is_empty(&ep->req_queue)) {
01189 struct usb_request *req;
01190
01191 req = slist_pop_head(&ep->req_queue, struct usb_request, node);
01192 assert(slist_is_empty(&ep->req_queue));
01193 slist_init(&ep->buf_queue);
01194 ep->buf_offset = 0;
01195 clear_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags);
01196 at90usb_udc_req_done(udc, req, ERR_PROTOCOL);
01197 }
01198 }
01199
01211 static void at90usb_udc_ep0_worker(struct workqueue_task *task)
01212 {
01213 struct at90usb_udc_ep *ep = at90usb_ep_task_of(task);
01214 struct at90usb_udc *udc90 = ep->udc90;
01215 uint8_t status;
01216 uint8_t enabled;
01217 uint8_t pending;
01218
01219 avr_write_reg8(UENUM, 0);
01220
01221 status = avr_read_reg8(UEINTX);
01222 enabled = ep->ueienx;
01223 pending = enabled & status;
01224
01225 if (pending & AT90USB_UEINTX_RXOUTI) {
01226 struct usb_request *req;
01227 struct buffer *buf;
01228 uint16_t fifo_len;
01229 uint16_t buf_offset;
01230 uint16_t fifo_offset = 0;
01231
01232 cpu_irq_disable();
01233 if (slist_is_empty(&ep->req_queue)) {
01234 assert(slist_is_empty(&ep->buf_queue));
01235
01236 cpu_irq_enable();
01237 goto stall;
01238 }
01239
01240 req = slist_peek_head(&ep->req_queue, struct usb_request, node);
01241 cpu_irq_enable();
01242
01243 buf_offset = ep->buf_offset;
01244 fifo_len = (avr_read_reg8(UEBCHX) << 8) | avr_read_reg8(UEBCLX);
01245
01246 cpu_irq_disable();
01247 while (!slist_is_empty(&ep->buf_queue)) {
01248 unsigned int nbytes;
01249
01250 cpu_irq_disable();
01251 buf = slist_peek_head(&ep->buf_queue,
01252 struct buffer, node);
01253 cpu_irq_enable();
01254
01255 nbytes = min_u(fifo_len - fifo_offset,
01256 buf->len - buf_offset);
01257
01258 copy_from_fifo((uint8_t *)((uintptr_t)buf->addr.phys
01259 + buf_offset), nbytes);
01260
01261 buf_offset += nbytes;
01262 fifo_offset += nbytes;
01263
01264 if (buf_offset == buf->len) {
01265 req->bytes_xfered += buf_offset;
01266 cpu_irq_disable();
01267 slist_pop_head_node(&ep->buf_queue);
01268 cpu_irq_enable();
01269 buf_offset = 0;
01270 }
01271 }
01272
01273 cpu_irq_disable();
01274 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX)
01275 & ~AT90USB_UEINTX_RXOUTI);
01276 cpu_irq_enable();
01277 ep->buf_offset = buf_offset;
01278
01279 cpu_irq_disable();
01280 if (slist_is_empty(&ep->buf_queue)) {
01281
01282 assert(buf_offset == 0);
01283 slist_init(&ep->req_queue);
01284 ep->ueienx &= ~AT90USB_UEIENX_RXOUTE;
01285 udc90->ctrl_state = EP0_STATE_SETUP;
01286 clear_bit(AT90USB_EP_ACTIVE_XFER, &ep->flags);
01287 cpu_irq_enable();
01288 at90usb_udc_req_done(&udc90->udc, req, 0);
01289 }
01290 cpu_irq_enable();
01291 }
01292 if (pending & AT90USB_UEINTX_TXINI) {
01293 struct usb_request *req;
01294 struct buffer *buf;
01295 unsigned int buf_offset;
01296 unsigned int fifo;
01297 unsigned int fifo_end;
01298
01299 if (udc90->ctrl_state == EP0_STATE_STATUS_IN) {
01300 struct usb_setup_req *setup;
01301
01302
01303 setup = &udc90->setup_req;
01304 if (setup->bRequest == USB_REQ_SET_ADDRESS) {
01305 uint8_t addr = le16_to_cpu(setup->wValue)
01306 & AT90USB_UDADDR_UADD_MASK;
01307
01308
01309 avr_write_reg8(UDADDR, addr);
01310 avr_write_reg8(UDADDR,
01311 AT90USB_UDADDR_ADDEN | addr);
01312 udc90->udc.address = addr;
01313 }
01314 cpu_irq_disable();
01315 ep->ueienx &= ~AT90USB_UEIENX_TXINE;
01316 cpu_irq_enable();
01317 udc90->ctrl_state = EP0_STATE_SETUP;
01318 goto out;
01319 }
01320
01321
01322 if (udc90->ctrl_state == EP0_STATE_DATA_ZLP) {
01323 udc90->ctrl_state = EP0_STATE_DATA_IN;
01324 cpu_irq_disable();
01325 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX)
01326 & ~AT90USB_UEINTX_TXINI);
01327 cpu_irq_enable();
01328 goto out;
01329 }
01330
01331
01332 at90usb_ep0_tx_complete(&udc90->udc, ep);
01333
01334
01335 if (slist_is_empty(&ep->buf_queue)) {
01336 cpu_irq_disable();
01337 ep->ueienx &= ~AT90USB_UEIENX_TXINE;
01338 cpu_irq_enable();
01339 udc90->ctrl_state = EP0_STATE_SETUP;
01340 goto out;
01341 }
01342
01343 buf_offset = ep->buf_offset;
01344 cpu_irq_disable();
01345 buf = slist_peek_head(&ep->buf_queue, struct buffer, node);
01346 cpu_irq_enable();
01347
01348 fifo = 0;
01349 fifo_end = APP_UDC_MAXPACKETSIZE0;
01350 while (fifo < APP_UDC_MAXPACKETSIZE0) {
01351 unsigned int nbytes;
01352 unsigned int buf_len;
01353
01354 buf_len = buf->len;
01355
01356 nbytes = min_u(fifo_end - fifo, buf_len - buf_offset);
01357 dbg_verbose("fifo %u data %p off %u nbytes %u\n",
01358 fifo, buf->addr.ptr,
01359 buf_offset, nbytes);
01360
01361 copy_to_fifo((uint8_t *)((uintptr_t)buf->addr.phys
01362 + buf_offset), nbytes);
01363
01364 buf_offset += nbytes;
01365 fifo += nbytes;
01366
01367 if (buf_offset == buf_len) {
01368 cpu_irq_disable();
01369 if (slist_node_is_last(&ep->buf_queue,
01370 &buf->node))
01371 break;
01372 buf = slist_peek_next(&buf->node,
01373 struct buffer, node);
01374 cpu_irq_enable();
01375 buf_offset = 0;
01376 }
01377 }
01378
01379 cpu_irq_disable();
01380 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX)
01381 & ~AT90USB_UEINTX_TXINI);
01382 cpu_irq_enable();
01383
01384 ep->bytes_written = (unsigned long)fifo;
01385
01386 cpu_irq_disable();
01387 req = slist_peek_head(&ep->req_queue, struct usb_request, node);
01388 if (&buf->node == req->buf_list.last
01389 && buf_offset == buf->len
01390 && test_bit(USB_REQ_SHORT_PKT, &req->flags)
01391 && fifo == fifo_end)
01392 udc90->ctrl_state = EP0_STATE_DATA_ZLP;
01393 cpu_irq_enable();
01394 }
01395 if (pending & AT90USB_UEINTX_RXSTPI) {
01396 struct usb_setup_req *setup;
01397 uint16_t byte_count;
01398
01399 setup = &udc90->setup_req;
01400
01401
01402
01403
01404
01405 if (enabled & AT90USB_UEINTX_TXINI) {
01406 cpu_irq_disable();
01407 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX)
01408 & ~AT90USB_UEINTX_TXINI);
01409 cpu_irq_enable();
01410 at90usb_ep0_tx_flush(&udc90->udc, ep);
01411 }
01412
01413 byte_count = (avr_read_reg8(UEBCHX) << 8) |
01414 avr_read_reg8(UEBCLX);
01415
01416 if (byte_count != sizeof(*setup)) {
01417
01418 cpu_irq_disable();
01419 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX)
01420 & ~AT90USB_UEINTX_RXSTPI);
01421 cpu_irq_enable();
01422 goto stall;
01423 }
01424
01425 copy_from_fifo((uint8_t *)setup, sizeof(*setup));
01426
01427 cpu_irq_disable();
01428 avr_write_reg8(UEINTX, avr_read_reg8(UEINTX)
01429 & ~AT90USB_UEINTX_RXSTPI);
01430 cpu_irq_enable();
01431
01432 if (udc_lib_process_setup_request(&udc90->udc, setup) < 0)
01433 goto stall;
01434 }
01435
01436 out:
01437 avr_write_reg8(UEIENX, ep->ueienx);
01438 return;
01439
01440 stall:
01441 cpu_irq_disable();
01442 ep->ueienx &= ~(AT90USB_UEIENX_RXOUTE | AT90USB_UEIENX_TXINE);
01443 cpu_irq_enable();
01444 avr_write_reg8(UEIENX, ep->ueienx);
01445 udc_ep_set_halt(&udc90->udc, 0);
01446 goto out;
01447 }
01448
01449 static struct at90usb_udc the_at90usb_udc;
01450
01457 static void at90usb_udc_device_worker(struct workqueue_task *task)
01458 {
01459 if (avr_read_reg8(UDINT) & AT90USB_UDINT_EORSTI) {
01460 struct at90usb_udc *udc90 = at90usb_udc_task_of(task);
01461 struct at90usb_udc_ep *ep = &udc90->ep[0];
01462 struct udc *udc = &udc90->udc;
01463 irqflags_t iflags;
01464
01465 avr_write_reg8(UDINT, avr_read_reg8(UDINT)
01466 & ~AT90USB_UDINT_EORSTI);
01467
01468
01469 udc->address = 0;
01470 clear_bit(UDC_IS_SUSPENDED, &udc->flags);
01471
01472
01473 #ifdef CONFIG_UDC_FULL_SPEED
01474 udc->speed = USB_SPEED_FULL;
01475 #else
01476 udc->speed = USB_SPEED_LOW;
01477 #endif
01478 dbg_verbose("at90usb-udc: reset speed %u\n", udc->speed);
01479
01480 at90usb_ep0_tx_flush(udc, &udc90->ep[0]);
01481 usb_dev_reset(udc);
01482
01483
01484 if (at90usb_udc_configure_ep(0, APP_UDC_MAXPACKETSIZE0,
01485 USB_EP_XFER_CONTROL, false, 1)) {
01486 udc->speed = USB_SPEED_UNKNOWN;
01487 goto out;
01488 }
01489
01490
01491 udc90->ctrl_state = EP0_STATE_SETUP;
01492
01493 iflags = cpu_irq_save();
01494
01495 avr_write_reg8(UENUM, 0);
01496 ep->ueienx |= AT90USB_UEIENX_RXSTPE;
01497 avr_write_reg8(UEIENX, ep->ueienx);
01498
01499 cpu_irq_restore(iflags);
01500 }
01501 out:
01502 avr_write_reg8(UDIEN, AT90USB_UDIEN_EORSTE);
01503 }
01504
01511 static void at90usb_udc_maybe_attach(struct at90usb_udc *udc90)
01512 {
01513 struct udc *udc = &udc90->udc;
01514
01515 dbg_verbose("at90usb_udc maybe attach: flags=0x%x\n", udc->flags);
01516 if (at90usb_udc_is_enabled(udc90)
01517 && test_bit(UDC_HAS_POWER, &udc->flags)
01518 && test_bit(UDC_AUTOATTACH, &udc->flags)) {
01519 dbg_verbose("at90usb_udc: attaching...\n");
01520 #ifdef CONFIG_AT90USB_ENABLE_UVREG
01521 avr_write_reg8(UHWCON, avr_read_reg8(UHWCON)
01522 | AT90USB_UHWCON_UVREGE);
01523 #endif
01524 avr_write_reg8(UDCON, avr_read_reg8(UDCON)
01525 & ~AT90USB_UDCON_DETACH);
01526 avr_write_reg8(UDIEN, AT90USB_UDIEN_EORSTE);
01527 }
01528 }
01529
01536 static void at90usb_udc_detach(struct at90usb_udc *udc90)
01537 {
01538 struct udc *udc = &udc90->udc;
01539 uint8_t udcon;
01540
01541 dbg_verbose("at90usb_udc detach: flags=0x%x\n", udc->flags);
01542
01543 udc->speed = USB_SPEED_UNKNOWN;
01544 udc->address = 0;
01545 udc->flags &= (1 << UDC_IS_ENABLED) | (1 << UDC_HAS_POWER)
01546 | (1 << UDC_AUTOATTACH);
01547
01548 udcon = avr_read_reg8(UDCON);
01549
01550 if (!(udcon & AT90USB_UDCON_DETACH)) {
01551 usb_dev_reset(&udc90->udc);
01552
01553 avr_write_reg8(UDCON, udcon | AT90USB_UDCON_DETACH);
01554 avr_write_reg8(UDIEN, 0);
01555 }
01556 }
01557
01567 void at90usb_udc_vbus_on(struct at90usb_udc *udc90)
01568 {
01569 struct udc *udc = &udc90->udc;
01570
01571 if (!test_bit(UDC_HAS_POWER, &udc->flags)) {
01572 dbg_verbose("at90usb_udc: Vbus ON\n");
01573 set_bit(UDC_HAS_POWER, &udc->flags);
01574 at90usb_udc_maybe_attach(udc90);
01575 }
01576 }
01577
01587 void at90usb_udc_vbus_off(struct at90usb_udc *udc90)
01588 {
01589 struct udc *udc = &udc90->udc;
01590
01591 if (test_bit(UDC_HAS_POWER, &udc->flags)) {
01592 dbg_verbose("at90usb_udc: Vbus OFF\n");
01593 clear_bit(UDC_HAS_POWER, &udc->flags);
01594 at90usb_udc_detach(udc90);
01595 }
01596 }
01597
01598 void udc_attach(struct udc *udc)
01599 {
01600 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
01601 irqflags_t iflags;
01602
01603 iflags = cpu_irq_save();
01604 if (!test_bit(UDC_AUTOATTACH, &udc->flags)) {
01605 set_bit(UDC_AUTOATTACH, &udc->flags);
01606 at90usb_udc_maybe_attach(udc90);
01607 }
01608 cpu_irq_restore(iflags);
01609 }
01610
01611 void udc_detach(struct udc *udc)
01612 {
01613 struct at90usb_udc *udc90 = at90usb_udc_of(udc);
01614 irqflags_t iflags;
01615
01616 iflags = cpu_irq_save();
01617 if (test_bit(UDC_AUTOATTACH, &udc->flags)) {
01618 clear_bit(UDC_AUTOATTACH, &udc->flags);
01619 at90usb_udc_detach(udc90);
01620 }
01621 cpu_irq_restore(iflags);
01622 }
01623
01634 struct at90usb_udc *at90usb_udc_init(void)
01635 {
01636 struct at90usb_udc *udc90 = &the_at90usb_udc;
01637
01638 slist_init(&udc90->ep[0].req_queue);
01639 slist_init(&udc90->ep[0].buf_queue);
01640
01641 udc90->udc.flags = 0;
01642
01643 workqueue_task_init(&udc90->task, at90usb_udc_device_worker);
01644
01645 udc90->ep[0].id = 0;
01646 udc90->ep[0].udc90 = udc90;
01647
01648 workqueue_task_init(&udc90->ep[0].task, at90usb_udc_ep0_worker);
01649
01650 #ifdef CONFIG_UDC_LOW_SPEED
01651 avr_write_reg8(UDCON, avr_read_reg8(UDCON) | AT90USB_UDCON_LSM);
01652 #else
01653 avr_write_reg8(UDCON, avr_read_reg8(UDCON) & ~AT90USB_UDCON_LSM);
01654 #endif
01655
01656 return udc90;
01657 }
01658
01668 void at90usb_udc_shutdown(struct at90usb_udc *udc90)
01669 {
01670 udc90->udc.flags = 0;
01671 }
01672