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

📄 ctrlrequest.lst

📁 增强型51单片机fs7821sd卡、mmc卡读写程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 595   2               {
 596   3                 CSRWrite(USB_BASE + EP0_TXCNT, 1);
 597   3                 CSRWrite(USB_BASE + EP0_TXDATA, 0x00);
 598   3                 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);    
 599   3                 pSotaUsbRequest->LoadInDataOk = false;
 600   3               }
 601   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);            
 602   2               break;   
 603   2      
 604   2          case IN_OK_TOKEN:
 605   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
 606   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
 607   2               break;
 608   2      
 609   2          case OUT_TOKEN:
 610   2          default:
 611   2               // Ctrl Read End
 612   2               pSotaUsbRequest->InProgress = false;
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 11  

 613   2               break;          
 614   2        }  
 615   1      }  
 616          
 617          //----------------------------------------------------------------------------
 618          // Set Interface Request 
 619          //----------------------------------------------------------------------------
 620          void CtrlReqSetInterface()
 621          {
 622   1        BYTE Token = pSotaUsbRequest->Token;
 623   1          
 624   1        switch(Token)
 625   1        {
 626   2          case SETUP_TOKEN:
 627   2               // Because we don't support Alternate-IF-Set, we do nothing here. 
 628   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);    
 629   2               break;
 630   2               
 631   2          case IN_TOKEN:
 632   2               CtrlClearHaltFeature();
 633   2               CSRWrite(USB_BASE + EP0_TXCNT, 0);
 634   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);    
 635   2               break;
 636   2      
 637   2          case IN_OK_TOKEN:
 638   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
 639   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
 640   2              
 641   2          case OUT_TOKEN:
 642   2          default:
 643   2               pSotaUsbRequest->InProgress = false;
 644   2               break;          
 645   2        }  
 646   1      }
 647          
 648          //----------------------------------------------------------------------------
 649          // Sync Frame Request 
 650          //----------------------------------------------------------------------------
 651          void CtrlReqSyncFrame()
 652          {
 653   1        BYTE Token = pSotaUsbRequest->Token;
 654   1            
 655   1        switch(Token)
 656   1        {
 657   2          case SETUP_TOKEN:
 658   2               // We do not support isochronous mode.
 659   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
 660   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
 661   2               break;
 662   2         
 663   2          case IN_OK_TOKEN:
 664   2          case IN_TOKEN:
 665   2          case OUT_TOKEN:
 666   2          default:
 667   2               pSotaUsbRequest->InProgress = false;
 668   2               break;          
 669   2        }    
 670   1      }
 671          
 672          //----------------------------------------------------------------------------
 673          // Get Max Lun Request 
 674          //----------------------------------------------------------------------------
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 12  

 675          void CtrlReqGetMaxLun()
 676          {
 677   1        BYTE Token = pSotaUsbRequest->Token;
 678   1          
 679   1        switch(Token)
 680   1        {
 681   2          case SETUP_TOKEN:
 682   2               pSotaUsbRequest->LoadInDataOk = true;
 683   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);    
 684   2               break;
 685   2      
 686   2          case IN_TOKEN:
 687   2               if (pSotaUsbRequest->LoadInDataOk)
 688   2               {
 689   3                 CSRWrite(USB_BASE + EP0_TXCNT, 1);
 690   3                 CSRWrite(USB_BASE + EP0_TXDATA, LastDevice);   
 691   3                 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);    
 692   3                 pSotaUsbRequest->LoadInDataOk = false; 
 693   3               } 
 694   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);     
 695   2               break;
 696   2      
 697   2          case IN_OK_TOKEN:
 698   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
 699   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
 700   2               break;
 701   2      
 702   2          case OUT_TOKEN:
 703   2          default:
 704   2               // Ctrl Read End
 705   2               pSotaUsbRequest->InProgress = false;
 706   2               break;          
 707   2        }  
 708   1      }  
 709          
 710          //----------------------------------------------------------------------------
 711          // Bulk Only Reset Request 
 712          //----------------------------------------------------------------------------
 713          void CtrlReqBulkReset()
 714          {
 715   1        BYTE Token = pSotaUsbRequest->Token;
 716   1          
 717   1        switch(Token)
 718   1        {
 719   2          case SETUP_TOKEN:
 720   2      #ifndef CTRL_SIMULATION 
 721   2               BulkState = CBW_GET_COMPLETED;    
 722   2               CmdStatus = COMMAND_PASSED;
 723   2      #endif  
 724   2               break;
 725   2                        
 726   2          case IN_TOKEN:
 727   2               CSRWrite(USB_BASE + EP0_TXCNT, 0);
 728   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);    
 729   2               break;
 730   2      
 731   2          case IN_OK_TOKEN:
 732   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
 733   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
 734   2              
 735   2          case OUT_TOKEN:
 736   2          default:
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 13  

 737   2               // Ctrl Read End
 738   2               pSotaUsbRequest->InProgress = false;
 739   2               break;          
 740   2        }  
 741   1      }
 742          
 743          //----------------------------------------------------------------------------
 744          // Request Setup
 745          //----------------------------------------------------------------------------
 746          void CtrlReqSetup()
 747          {
 748   1        PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
 749   1      
 750   1        memcpy((void *)pReq, (void *)UsbBuf, sizeof(USB_REQUEST));
 751   1        pSotaUsbRequest->InProgress = true;
 752   1        pSotaUsbRequest->FinishedDataLen = 0;
 753   1        pReq->wLength = ConvertEndian16(pReq->wLength);  
 754   1      }
 755          
 756          //----------------------------------------------------------------------------
 757          // Rx Transation Check
 758          //----------------------------------------------------------------------------  
 759          void CtrlRxCheck()
 760          {
 761   1        BYTE i;
 762   1        BYTE Len;
 763   1        BYTE RxTokenType = 0;
 764   1      
 765   1        Len = CSRRead(USB_BASE + EP0_RXCNT);
 766   1        for (i=0; i < Len; i++)
 767   1        {
 768   2          UsbBuf[i] = CSRRead(USB_BASE + EP0_RXDATA);
 769   2        }
 770   1          
 771   1        RxTokenType = CSRRead(USB_BASE + EP0_RXTOKEN);  
 772   1        if (RxTokenType & (STS_SETUP0 | STS_SETUP0_OW)) 
 773   1        {
 774   2          if (Len == USB_REQUEST_LEN)
 775   2          {
 776   3            CtrlReqSetup(); 
 777   3            pSotaUsbRequest->Token = SETUP_TOKEN; 
 778   3          }  
 779   2          else
 780   2          {
 781   3            pSotaUsbRequest->Token = BAD_SETUP_TOKEN;
 782   3          }
 783   2          // Add delay may resolve SE1 issue if using H/W incurred this issue.
 784   2      //    Delay(30);
 785   2        }  
 786   1        else // Out Token Coming
 787   1          pSotaUsbRequest->Token = OUT_TOKEN;   
 788   1        CSRWrite(USB_BASE + EP0_RXTOKEN, 0x00);
 789   1      }  
 790          
 791          //--------------------------------------------------------------------
 792          // 
 793          //--------------------------------------------------------------------
 794          void CtrlRequestProcess()
 795          {
 796   1          BYTE RequestCode = pSotaUsbRequest->Request.bRequest;
 797   1          BYTE RequestType = pSotaUsbRequest->Request.bmRequestType;
 798   1        
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 14  

 799   1          if((RequestType & 0x60) == 0) // Standard Request
 800   1          {  
 801   2              switch (RequestCode)
 802   2              {
 803   3                  case GET_STATUS       : CtrlReqGetStatus();        return;
 804   3                  case CLEAR_FEATURE    : CtrlReqClearFeature();     return;
 805   3                  case SET_FEATURE      : CtrlReqSetFeature();       return;
 806   3                  case SET_ADDRESS      : CtrlReqSetAddress();       return;
 807   3                  case GET_DESCRIPTOR   : CtrlReqGetDescriptor();    return;
 808   3                  case GET_CONFIGURATION: CtrlReqGetConfiguration(); return;
 809   3                  case SET_CONFIGURATION: CtrlReqSetConfiguration(); return;
 810   3                  case GET_INTERFACE    : CtrlReqGetInterface();     return;
 811   3                  case SET_INTERFACE    : CtrlReqSetInterface();     return;
 812   3                  case SYNCH_FRAME      : CtrlReqSyncFrame();        return;
 813   3              }
 814   2          }
 815   1      
 816   1          else if((RequestType & 0x60) == 0x20) // Class Request
 817   1          {
 818   2              switch (RequestCode)
 819   2              {       
 820   3                  case BULKONLY_GET_MAX_LUN: CtrlReqGetMaxLun(); return;
 821   3                  case BULKONLY_RESET      : CtrlReqBulkReset(); return;
 822   3              }
 823   2          }        
 824   1      
 825   1          pSotaUsbRequest->InProgress = false;
 826   1          CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);    
 827   1          CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);      
 828   1      }  
 829          
 830          //----------------------------------------------------------------------------
 831          // Ctrl Pipe Check
 832          //----------------------------------------------------------------------------
 833          void UsbCtrlIntHandler(BYTE IntEvent)
 834          {
 835   1        // Clear IRQs.
 836   1        CSRWrite(USB_BASE + EPIE, ~IntEvent);                 
 837   1      
 838   1        if (IntEvent & IRQ_IN0)
 839   1        {
 840   2          pSotaUsbRequest->Token = IN_TOKEN;     
 841   2          CSRWrite(USB_BASE + EP0_RXCSR, 0); // Fix the PHY miss IN ACK problem
 842   2        }
 843   1        if (IntEvent & IRQ_TX0) // This irq mean IN packet Completed
 844   1          pSotaUsbRequest->Token = IN_OK_TOKEN;
 845   1        if (IntEvent & IRQ_RX0)
 846   1          CtrlRxCheck();  
 847   1        
 848   1        if (pSotaUsbRequest->InProgress)
 849   1          CtrlRequestProcess();  
 850   1        else
 851   1          CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);    
 852   1      }  
 853                  
 854          //----------------------------------------------------------------------------
 855          // Init USB
 856          //----------------------------------------------------------------------------
 857          void UsbInit()
 858          {
 859   1          BYTE Reg;
 860   1      
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 15  

 861   1          CtrlPktSize = CTRL_PKT_SIZE; 
 862   1              
 863   1          CSRWrite(USB_BASE + EPIM, 0xdf); 
 864   1          CSRWrite(USB_BASE + EPCTL, EN_EP0 | EN_EP1 | EN_EP2);
 865   1          pSotaUsbRequest               = &SotaUsbRequest;
 866   1          pSotaUsbRequest->InProgress   = false;
 867   1          pSotaUsbRequest->LoadInDataOk = false;
 868   1          pSotaUsbRequest->HaltStatus   = false;
 869   1      
 870   1          InitBulkPipe();  
 871   1      
 872   1          while(1) // Detect USB Link Speed
 873   1          {
 874   2              Reg = CSRRead(USB_BASE + USB_SPEED);
 875   2              if(Reg & SPEED_READY)
 876   2                  break;
 877   2          }
 878   1      }
 879            


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1941    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     84    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1      45
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2       7
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -