⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbd_udphs.lst

📁 本代bootloader通过usb下载代码首先存放在sdram中
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -