📄 usbd_udphs.lst
字号:
425
426 // End of transfer ?
427 if( (pTransfer->remaining > 0)
428 ||(sendZLP == 1)) {
429 TRACE_DEBUG_WP("\n\r1pTransfer->buffered %d \n\r", pTransfer->buffered);
430 TRACE_DEBUG_WP("1pTransfer->transferred %d \n\r", pTransfer->transferred);
431 TRACE_DEBUG_WP("1pTransfer->remaining %d \n\r", pTransfer->remaining);
432
433 // Transfer remaining data
434 TRACE_DEBUG_WP(" %d ", pEndpoint->size);
435
436 // Send next packet
437 UDPHS_WritePayload(bEndpoint);
438 AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTSETSTA = AT91C_UDPHS_TX_PK_RDY;
439 sendZLP = 2;
440 }
441 else {
442 TRACE_DEBUG_WP("\n\r0pTransfer->buffered %d \n\r", pTransfer->buffered);
443 TRACE_DEBUG_WP("0pTransfer->transferred %d \n\r", pTransfer->transferred);
444 TRACE_DEBUG_WP("0pTransfer->remaining %d \n\r", pTransfer->remaining);
445
446 TRACE_DEBUG_WP(" %d ", pTransfer->transferred);
447
448 // Disable interrupt if this is not a control endpoint
449 if( AT91C_UDPHS_EPT_TYPE_CTL_EPT != (AT91C_UDPHS_EPT_TYPE&(AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG)) ) {
450
451 AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1<<SHIFT_INTERUPT<<bEndpoint);
452 }
453 AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLDIS = AT91C_UDPHS_TX_PK_RDY;
454
455 UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS);
456 sendZLP = 0;
457 }
458 }
459 else {
460
461 TRACE_ERROR("Error Wr");
462 }
463 }
464
465 // OUT packet received
466 if( AT91C_UDPHS_RX_BK_RDY == (status & AT91C_UDPHS_RX_BK_RDY) ) {
467
468 TRACE_DEBUG_WP("Rd ");
469
470 // Check that the endpoint is in Receiving state
471 if (pEndpoint->state != UDP_ENDPOINT_RECEIVING) {
472
473 // Check if an ACK has been received on a Control endpoint
474 if( (0 == (AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG & AT91C_UDPHS_EPT_TYPE))
475 && (0 == (status & AT91C_UDPHS_BYTE_COUNT)) ) {
476
477 // Control endpoint, 0 bytes received
478 // Acknowledge the data and finish the current transfer
479 TRACE_DEBUG_WP("Ack ");
480 UDPHS_ClearRxFlag(bEndpoint);
481 UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS);
482 }
483 // Check if the data has been STALLed
484 else if( AT91C_UDPHS_FRCESTALL == (status & AT91C_UDPHS_FRCESTALL)) {
485
486 // Discard STALLed data
487 TRACE_DEBUG_WP("Discard ");
488 UDPHS_ClearRxFlag(bEndpoint);
489 }
490 // NAK the data
491 else {
492
493 TRACE_DEBUG_WP("Nak ");
494 AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1<<SHIFT_INTERUPT<<bEndpoint);
495 }
496 }
497 else {
498
499 // Endpoint is in Read state
500 // Retrieve data and store it into the current transfer buffer
501 wPacketSize = (unsigned short)((status & AT91C_UDPHS_BYTE_COUNT)>>20);
502
503 TRACE_DEBUG_WP("%d ", wPacketSize);
504 UDPHS_ReadPayload(bEndpoint, wPacketSize);
505 UDPHS_ClearRxFlag(bEndpoint);
506
507 // Check if the transfer is finished
508 if ((pTransfer->remaining == 0) || (wPacketSize < pEndpoint->size)) {
509
510 AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLDIS = AT91C_UDPHS_RX_BK_RDY;
511
512 // Disable interrupt if this is not a control endpoint
513 if( AT91C_UDPHS_EPT_TYPE_CTL_EPT != (AT91C_UDPHS_EPT_TYPE & (AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG)) ) {
514
515 AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1<<SHIFT_INTERUPT<<bEndpoint);
516 }
517 UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS);
518 }
519 }
520 }
521
522
523 // STALL sent
524 if( AT91C_UDPHS_STALL_SNT == (status & AT91C_UDPHS_STALL_SNT) ) {
525
526 TRACE_WARNING( "Sta 0x%X [%d] ", status, bEndpoint);
527
528 // Acknowledge the stall flag
529 AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_STALL_SNT;
530
531 // If the endpoint is not halted, clear the STALL condition
532 if (pEndpoint->state != UDP_ENDPOINT_HALTED) {
533
534 TRACE_WARNING( "_ " );
535 AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_FRCESTALL;
536 }
537 }
538
539 // SETUP packet received
540 if( AT91C_UDPHS_RX_SETUP == (status & AT91C_UDPHS_RX_SETUP) ) {
541
542 TRACE_DEBUG_WP("Stp ");
543
544 // If a transfer was pending, complete it
545 // Handles the case where during the status phase of a control write
546 // transfer, the host receives the device ZLP and ack it, but the ack
547 // is not received by the device
548 if ((pEndpoint->state == UDP_ENDPOINT_RECEIVING)
549 || (pEndpoint->state == UDP_ENDPOINT_SENDING)) {
550
551 UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS);
552 }
553 // Copy the setup packet
554 UDPHS_ReadRequest(&request);
555
556 // Acknowledge setup packet
557 AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_RX_SETUP;
558
559 // Forward the request to the upper layer
560 USBDCallbacks_RequestReceived(&request);
561 }
562
563 }
564
565 //------------------------------------------------------------------------------
566 // Interrupt service routine
567 //------------------------------------------------------------------------------
568 #ifdef DMA
569 //----------------------------------------------------------------------------
570 /// Endpoint DMA interrupt handler.
571 /// This function (ISR) handles dma interrupts
572 /// \param bEndpoint Index of endpoint
573 //----------------------------------------------------------------------------
574 static void UDPHS_DmaHandler( unsigned char bEndpoint )
575 {
576 Endpoint *pEndpoint = &(endpoints[bEndpoint]);
577 Transfer *pTransfer = &(pEndpoint->transfer);
578 int justTransferred;
579 unsigned int status;
580 unsigned char result = USBD_STATUS_SUCCESS;
581
582 status = AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMASTATUS;
583 TRACE_DEBUG_WP("Dma Ept%d ", bEndpoint);
584
585 // Disable DMA interrupt to avoid receiving 2 interrupts (B_EN and TR_EN)
586 AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMACONTROL &=
587 ~(AT91C_UDPHS_END_TR_EN | AT91C_UDPHS_END_B_EN);
588
589 AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1 << SHIFT_DMA << bEndpoint);
590
591 if( AT91C_UDPHS_END_BF_ST == (status & AT91C_UDPHS_END_BF_ST) ) {
592
593 TRACE_DEBUG_WP("EndBuffer ");
594
595 // BUFF_COUNT holds the number of untransmitted bytes.
596 // BUFF_COUNT is equal to zero in case of good transfer
597 justTransferred = pTransfer->buffered
598 - ((status & AT91C_UDPHS_BUFF_COUNT) >> 16);
599 pTransfer->transferred += justTransferred;
600
601 pTransfer->buffered = ((status & AT91C_UDPHS_BUFF_COUNT) >> 16);
602
603 pTransfer->remaining -= justTransferred;
604
605 TRACE_DEBUG_WP("\n\r1pTransfer->buffered %d \n\r", pTransfer->buffered);
606 TRACE_DEBUG_WP("1pTransfer->transferred %d \n\r", pTransfer->transferred);
607 TRACE_DEBUG_WP("1pTransfer->remaining %d \n\r", pTransfer->remaining);
608
609 if( (pTransfer->remaining + pTransfer->buffered) > 0 ) {
610
611 // Prepare an other transfer
612 if( pTransfer->remaining > DMA_MAX_FIFO_SIZE ) {
613
614 pTransfer->buffered = DMA_MAX_FIFO_SIZE;
615 }
616 else {
617 pTransfer->buffered = pTransfer->remaining;
618 }
619
620 AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMAADDRESS =
621 (unsigned int)((pTransfer->pData) + (pTransfer->transferred));
622
623 // Clear unwanted interrupts
624 AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMASTATUS;
625
626 // Enable DMA endpoint interrupt
627 AT91C_BASE_UDPHS->UDPHS_IEN |= (1 << SHIFT_DMA << bEndpoint);
628 // DMA config for receive the good size of buffer, or an error buffer
629
630 AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMACONTROL = 0; // raz
631 AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMACONTROL =
632 ( ((pTransfer->buffered << 16) & AT91C_UDPHS_BUFF_COUNT)
633 | AT91C_UDPHS_END_TR_EN
634 | AT91C_UDPHS_END_TR_IT
635 | AT91C_UDPHS_END_B_EN
636 | AT91C_UDPHS_END_BUFFIT
637 | AT91C_UDPHS_CHANN_ENB );
638 }
639 }
640 else if( AT91C_UDPHS_END_TR_ST == (status & AT91C_UDPHS_END_TR_ST) ) {
641
642 TRACE_DEBUG_WP("EndTransf ");
643
644 pTransfer->transferred = pTransfer->buffered
645 - ((status & AT91C_UDPHS_BUFF_COUNT) >> 16);
646 pTransfer->remaining = 0;
647 TRACE_DEBUG_WP("\n\r0pTransfer->buffered %d \n\r", pTransfer->buffered);
648 TRACE_DEBUG_WP("0pTransfer->transferred %d \n\r", pTransfer->transferred);
649 TRACE_DEBUG_WP("0pTransfer->remaining %d \n\r", pTransfer->remaining);
650 }
651 else {
652
653 TRACE_ERROR("UDPHS_DmaHandler: Error (0x%08X)\n\r", status);
654 result = USBD_STATUS_ABORTED;
655 }
656
657 // Invoke callback
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -