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

📄 ctrlrequest.lst

📁 增强型51单片机fs7821sd卡、mmc卡读写程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 294   2                  break;
 295   2              
 296   2              case OUT_TOKEN:
 297   2              case IN_OK_TOKEN:
 298   2              default:
 299   2                  pSotaUsbRequest->InProgress = false;
 300   2                  if(FeatureCleared)
 301   2                  {
 302   3                      if(ScsiCmdSTALLed)
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 6   

 303   3                      {
 304   4                          BulkReportHandle();
 305   4                          ScsiCmdSTALLed = false;
 306   4                      }
 307   3                  }
 308   2                  break;
 309   2          }
 310   1      }
 311          
 312          //----------------------------------------------------------------------------
 313          // Set USB Test Mode.
 314          //----------------------------------------------------------------------------
 315          void CtrlSetTestMode(BYTE TestItem)
 316          {
 317   1        BYTE TestModeReg;
 318   1      
 319   1        if ((((UINT32)HwId() << 16) | HwVersion()) >= 0x60340100)
 320   1          TestModeReg = USB_TEST_MODE1;
 321   1        else
 322   1          TestModeReg = USB_TEST_MODE0;
 323   1      
 324   1        switch (TestItem)
 325   1        {
 326   2           case TEST_J:
 327   2                CSRWrite(USB_BASE + TestModeReg, SET_TM_J);
 328   2                break; 
 329   2                           
 330   2           case TEST_K:
 331   2                CSRWrite(USB_BASE + TestModeReg, SET_TM_K);
 332   2                break; 
 333   2                           
 334   2           case TEST_SE0_NAK:
 335   2                CSRWrite(USB_BASE + TestModeReg, SET_TM_SE0_NAK);
 336   2                break; 
 337   2                           
 338   2           case TEST_PACKET:
 339   2                while (true)
 340   2                {
 341   3                  BYTE i;
 342   3      
 343   3                  CSRWrite(USB_BASE + TestModeReg, SET_TM_PKT);
 344   3                  for (i = 0; i < 120; i++); // Delay about 111us under 11MHz
 345   3                  CSRWrite(USB_BASE + TestModeReg, 0);
 346   3                }
 347   2                break; 
 348   2                           
 349   2           case TEST_FORCE_ENABLE:
 350   2                // Not Support.                     
 351   2           default:
 352   2                TestModeParam = NO_TEST_PARAM;       
 353   2                break;
 354   2        }     
 355   1      }               
 356          
 357          //----------------------------------------------------------------------------
 358          // Check USB Test Mode Parameters.
 359          //----------------------------------------------------------------------------
 360          bool CtrlChkTestMode(PUSB_REQUEST pReq, PBYTE Param)
 361          {
 362   1        bit Rc = false;
 363   1              
 364   1        if (pReq->bmRequestType == 0)
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 7   

 365   1        {
 366   2          if (((TDataCast *)&(pReq->wIndex))->ucByte[0] == 0)
 367   2          {
 368   3            if (pReq->wLength == 0)
 369   3            {
 370   4              *Param = (BYTE)(pReq->wIndex);
 371   4              Rc = true;              
 372   4            }  
 373   3          }  
 374   2        }     
 375   1                     
 376   1        return Rc;           
 377   1      }
 378          
 379          //----------------------------------------------------------------------------
 380          // Set Feature Request,Only Support EP0 ~ EP3. 
 381          //----------------------------------------------------------------------------
 382          void CtrlReqSetFeature()
 383          {
 384   1        BYTE Token = pSotaUsbRequest->Token;
 385   1          
 386   1        switch(Token)
 387   1        {
 388   2          case SETUP_TOKEN:
 389   2                 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);    
 390   2                 TestModeParam = NO_TEST_PARAM;
 391   2                 break;
 392   2                        
 393   2          case IN_TOKEN:
 394   2               {
 395   3                 PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
 396   3                 bit ReqAccept = false;
 397   3                 BYTE Value = (BYTE)ConvertEndian16(pReq->wValue);
 398   3                                                  
 399   3                 if (ENDPOINT_HALT == Value)
 400   3                 {
 401   4                   if (pReq->bmRequestType == 0x02)
 402   4                   {
 403   5                     BYTE Index = ((TDataCast *)&(pReq->wIndex))->ucByte[0];
 404   5                     BYTE Offset = CtrlEPIndex2RegOffset(Index);
 405   5                                    
 406   5                     if (Offset == 0xff)               
 407   5                       ReqAccept = false;    
 408   5                     else
 409   5                     {
 410   6                       ReqAccept = true;
 411   6                       if (Offset)
 412   6                         CSRWrite(USB_BASE + Offset, 0x02);
 413   6                       else                                 // Set EP0                
 414   6                         pSotaUsbRequest->HaltStatus = true;                              
 415   6                     }   
 416   5                   }
 417   4                 }
 418   3                 if (TEST_MODE == Value)
 419   3                   ReqAccept = CtrlChkTestMode(pReq, &TestModeParam);
 420   3                              
 421   3                 if (DEVICE_REMOTE_WAKEUP == Value) 
 422   3                 {
 423   4                   // Not Support Yet!
 424   4                   ReqAccept = true;          
 425   4                 }    
 426   3                 
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 8   

 427   3                 if (ReqAccept)
 428   3                 {
 429   4                   CSRWrite(USB_BASE + EP0_TXCNT, 0);
 430   4                   CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);    
 431   4                 }  
 432   3                 else
 433   3                   CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);    
 434   3                 break;
 435   3               }  
 436   2       
 437   2          case IN_OK_TOKEN:
 438   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);    
 439   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL); 
 440   2             
 441   2          case OUT_TOKEN:
 442   2          default:
 443   2               pSotaUsbRequest->InProgress = false;
 444   2               if (TestModeParam != NO_TEST_PARAM)
 445   2               {
 446   3                 CtrlSetTestMode(TestModeParam);  
 447   3                 // Clear Test Mode until power reset(power cycled).
 448   3                 while(1); 
 449   3               }
 450   2               break;          
 451   2        }  
 452   1      }
 453          
 454          //----------------------------------------------------------------------------
 455          // Set Address Request 
 456          //  NOTE:
 457          //       It is critical on the timing of changing USB address. We must do it 
 458          //       before next Setup Token (With new address) and after now running
 459          //       transaction has been finished.So we end this request without using
 460          //       state machine.  
 461          //----------------------------------------------------------------------------
 462          void CtrlReqSetAddress()
 463          {
 464   1        BYTE Token = pSotaUsbRequest->Token;
 465   1            
 466   1        switch(Token)
 467   1        {
 468   2          case SETUP_TOKEN:
 469   2               { 
 470   3                 PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
 471   3      
 472   3                 UsbAddr = ((TDataCast *)&(pReq->wValue))->ucByte[0];
 473   3                 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
 474   3                 break;
 475   3               }
 476   2               
 477   2          case IN_TOKEN:
 478   2               CSRWrite(USB_BASE + USBADDR, UsbAddr);
 479   2               CSRWrite(USB_BASE + EP0_TXCNT, 0);
 480   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
 481   2               /*
 482   2                  Before host set address,it would issue usb reset so we
 483   2                  must enable EP1,EP2 again.(These pipe were disable default)
 484   2               */
 485   2               CSRWrite(USB_BASE + EPCTL, EN_EP0 | EN_EP1 | EN_EP2 );
 486   2               // Clear the Bulk IN/OUT stall bits.
 487   2               CSRWrite(USB_BASE + EP1_TXCSR, 0x00);
 488   2               CSRWrite(USB_BASE + EP2_RXCSR, EN_RX2);
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 9   

 489   2               pSotaUsbRequest->InProgress = false;
 490   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
 491   2               break;
 492   2      
 493   2          case IN_OK_TOKEN:
 494   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);    
 495   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL); 
 496   2               break;
 497   2      
 498   2          case OUT_TOKEN:
 499   2          default:
 500   2               break;
 501   2        }  
 502   1      }
 503          
 504          static BYTE ConfigSetValue = 1;
 505          //----------------------------------------------------------------------------
 506          // Get Configuration Request 
 507          //----------------------------------------------------------------------------
 508          void CtrlReqGetConfiguration()
 509          {
 510   1        BYTE Token = pSotaUsbRequest->Token;
 511   1            
 512   1        switch(Token)
 513   1        {
 514   2          case SETUP_TOKEN:
 515   2               pSotaUsbRequest->LoadInDataOk = true;
 516   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
 517   2               break;
 518   2      
 519   2          case IN_TOKEN:
 520   2               if (pSotaUsbRequest->LoadInDataOk)
 521   2               {
 522   3                 CSRWrite(USB_BASE + EP0_TXCNT, 1);
 523   3                 CSRWrite(USB_BASE + EP0_TXDATA, ConfigSetValue);
 524   3                 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);    
 525   3                 pSotaUsbRequest->LoadInDataOk = false;
 526   3               }
 527   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);             
 528   2               break;   
 529   2      
 530   2          case IN_OK_TOKEN:
 531   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);    
 532   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL); 
 533   2               break;         
 534   2      
 535   2          case OUT_TOKEN:
 536   2          default:
 537   2               // Ctrl Read End
 538   2               pSotaUsbRequest->InProgress = false;
 539   2               break;          
 540   2        }  
 541   1      }  
 542          
 543          //----------------------------------------------------------------------------
 544          // Set Configuration Request 
 545          //----------------------------------------------------------------------------
 546          void CtrlReqSetConfiguration()
 547          {
 548   1        BYTE Token = pSotaUsbRequest->Token;
 549   1          
 550   1        switch(Token)
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 10  

 551   1        {
 552   2          case SETUP_TOKEN:
 553   2               {
 554   3                 PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
 555   3                 BYTE Value = ((TDataCast *)&(pReq->wValue))->ucByte[0];
 556   3                 
 557   3                 ConfigSetValue = Value; 
 558   3                 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);    
 559   3                 break;
 560   3               }  
 561   2               
 562   2          case IN_TOKEN:
 563   2               CtrlClearHaltFeature();
 564   2               CSRWrite(USB_BASE + EP0_TXCNT, 0);
 565   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);    
 566   2               break;
 567   2              
 568   2          case IN_OK_TOKEN:
 569   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);    
 570   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL); 
 571   2      
 572   2          case OUT_TOKEN:
 573   2          default:
 574   2               pSotaUsbRequest->InProgress = false;
 575   2               break;          
 576   2        }  
 577   1      }
 578          
 579          //----------------------------------------------------------------------------
 580          // Get Interface Request 
 581          //----------------------------------------------------------------------------
 582          void CtrlReqGetInterface()
 583          {
 584   1        BYTE Token = pSotaUsbRequest->Token;
 585   1            
 586   1        switch(Token)
 587   1        {
 588   2          case SETUP_TOKEN:
 589   2               pSotaUsbRequest->LoadInDataOk = true;
 590   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
 591   2               break;
 592   2      
 593   2          case IN_TOKEN:
 594   2               if (pSotaUsbRequest->LoadInDataOk)

⌨️ 快捷键说明

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