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

📄 mainloop.lst

📁 D12 USB源代码 硬盘
💻 LST
📖 第 1 页 / 共 2 页
字号:
 264   3                  if(BOTFSM_IDLE)   //BOTFSM_IDLE = BOTFSMstate^0
 265   3                  {
 266   4                                  Hal4Sys_D12CmdPortOutB( 0x04);// SelectEP BulkOut
 267   4                                  FlexByte = Hal4Sys_D12DataPortInB();
 268   4                      if(FlexByte_b0 == 1) // BulkOut Full
 269   4                          TPBulk_CBWHandler(); // Goto BOTFSMstate_CBWProc
 270   4                         // Hal4D12_ReadLastTransactionStatus(5); 
 271   4                  } // if BOT in IDLE
 272   3      
 273   3      
 274   3                  while(BOTFSM_DataOut) //BOTFSM_DataOut = BOTFSMstate^3
 275   3                  {
 276   4                      Hal4Sys_D12CmdPortOutB( 0x04);// 选择端点4
 277   4                                  FlexByte = Hal4Sys_D12DataPortInB(); //读取端点状态
 278   4                      if(FlexByte_b0 == 0) // 端点为空退出
 279   4                          break;
 280   4      
 281   4                                      Hal4Sys_D12CmdPortOutB( 0xF0);          // 发读D12数据指令
 282   4                                      Hal4Sys_D12DataPortInB();                       // 没效数据
 283   4                                      FlexByte = Hal4Sys_D12DataPortInB();// 读取D12缓冲区数据长度
 284   4      
 285   4                                      if(BOTXfer_atATA)   //BOTXfer_atATA = Xfer_Space^5
 286   4                                              MLsup_XferPktFrUSB2IDE();
 287   4                                      else 
 288   4                                              if(BOTXfer_atRAM || BOTXfer_atROM)
 289   4                                                      MLsup_XferPktFrUSB2MEM(FlexByte);
 290   4      
 291   4                                      BOTXfer_pdata += FlexByte;      // 已传输数据地址指针
 292   4                                      BOTXfer_wResidue -= FlexByte;   // 沉余字节数
 293   4                      if(BOTXfer_wResidue == 0)
 294   4                      {
 295   5                              TPBulk_CSWHandler(); // Goto BOTFSMstate_CSWProc
 296   5                                      }
 297   4                  }//BOTFSM_DATAOUT
 298   3      
 299   3      
 300   3                  while(BOTFSM_DataIn)//BOTFSM_DataIn = BOTFSMstate^2
 301   3                  {
 302   4                      Hal4Sys_D12CmdPortOutB( 0x05);// SelectEP BulkIn
 303   4                              FlexByte = Hal4Sys_D12DataPortInB();
C51 COMPILER V7.06   MAINLOOP                                                              02/17/2004 14:42:22 PAGE 6   

 304   4                      if(FlexByte_b0 == 1) // BulkIn is full
 305   4                          break;
 306   4      
 307   4                      if(BOTXfer_atATA)
 308   4                                      {
 309   5                                              MLsup_XferPktFrIDE2USB();       //从IDE写到USB
 310   5                                              FlexByte = EP2_PACKET_SIZE;     //EP2_PACKET_SIZE=64
 311   5                                      }
 312   4                                      else if(BOTXfer_atRAM || BOTXfer_atROM)
 313   4                                              FlexByte = MLsup_XferPktFrMEM2USB();    //从MEMORY 写到  USB
 314   4      
 315   4                                      BOTXfer_pdata += FlexByte;
 316   4                                      BOTXfer_wResidue -= FlexByte;               //沉余字节数
 317   4                      if(BOTXfer_wResidue == 0)
 318   4                      {       TPBulk_CSWHandler();// Goto BOTFSMstate_CSWProc
 319   5                                          BOTFSM_DataIn = 0 ;//*******
 320   5                                  }
 321   4                      } // BOTFSM_DataIn
 322   3      
 323   3      
 324   3                          if(BOTFSM_CSW)      //BOTFSM_CSW = BOTFSMstate^5
 325   3                          {
 326   4                                  Hal4Sys_D12CmdPortOutB( 0x05);// SelectEP  BulkIn
 327   4                                  FlexByte = Hal4Sys_D12DataPortInB();
 328   4                                  if(FlexByte_b0 == 0) // BulkIn is empty
 329   4                                  {
 330   5                                          FlexByte = MLsup_XferPktFrMEM2USB();
 331   5                                          BOTXfer_pdata += FlexByte;
 332   5                                          BOTXfer_wResidue -= FlexByte;
 333   5                                          if(BOTXfer_wResidue == 0)
 334   5                                              
 335   5                                              Hal4D12_ReadLastTransactionStatus(5); 
 336   5                                               BOTFSMstate = USBFSM4BOT_IDLE; // Goto BOTFSMstate_IDLE
 337   5                                      }
 338   4                         }
 339   3              }
 340   2             LowerIRQL();
 341   2              }
 342   1      }
 343          
 344          
 345          void MLsup_DisconnectUSB(void)                  //断开USB
 346          {
 347   1              RaiseIRQL();
 348   1          // Initialize D12 configuration
 349   1              Hal4D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_4M);
 350   1      }
 351          
 352          
 353          void MLsup_ConnectUSB(void)             //联接USB
 354          {
 355   1              // reset event flags
 356   1              RaiseIRQL();
 357   1              // No DMA, No IRQ from EPI4 & EPI5
 358   1              Hal4D12_SetDMA(0);
 359   1              // Initialize D12 configuration
 360   1              Hal4D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_4M);
 361   1      }
 362          
 363          
 364          void MLsup_ReconnectUSB(void)                   //重接USB
 365          {
C51 COMPILER V7.06   MAINLOOP                                                              02/17/2004 14:42:22 PAGE 7   

 366   1              D12SUSPD        = 0;
 367   1          MLsup_DisconnectUSB();
 368   1          // Make sure disconnect time > 2.5 uS
 369   1          LowerIRQL();
 370   1          Hal4Sys_WaitInMS(100);
 371   1              MLsup_ConnectUSB();
 372   1      }
 373          
 374          
 375          void MLsup_USBSetupTokenHandler(void)
 376          {
 377   1          D12BF_SetupOverwritten = 0;
 378   1          DCPXfer_wResidue = 0;
 379   1      
 380   1          tempvars4UsbReq.chars.c0 = Hal4D12_ReadEndpoint(0, sizeof(DEVICE_REQUEST),(INT8 *)(&(DCPDeviceRequest)
             -));
 381   1              if( tempvars4UsbReq.chars.c0 == sizeof(DEVICE_REQUEST) )
 382   1              {
 383   2              DCPDeviceRequest.wValue = Hal4Sys_SwapINT16(DCPDeviceRequest.wValue);
 384   2                      DCPDeviceRequest.wIndex = Hal4Sys_SwapINT16(DCPDeviceRequest.wIndex);
 385   2                      DCPDeviceRequest.wLength = Hal4Sys_SwapINT16(DCPDeviceRequest.wLength);
 386   2      
 387   2              if(DCPDeviceRequest.bmRequestType & USB_ENDPOINT_DIRECTION_MASK)//USB_ENDPOINT_DIRECTION_MASK=0x80
 388   2                      {
 389   3                  // get command
 390   3                  REQBF_DCPRequest_dir = 1;  // REQBF_DCPRequest_dir = bFlags.value^3
 391   3                      }
 392   2                      else
 393   2                      {
 394   3                              // Set command  without Data stage
 395   3                  // or
 396   3                              // Set command  with Data Buffer
 397   3                  REQBF_DCPRequest_dir = 0;
 398   3                      }
 399   2      
 400   2              if(DCPDeviceRequest.wIndex & USB_ENDPOINT_DIRECTION_MASK)
 401   2                      {
 402   3                  REQBF_DCPRequest_EPdir = 1;
 403   3                      }
 404   2                      else
 405   2                      {
 406   3                  REQBF_DCPRequest_EPdir = 0;
 407   3                      }
 408   2      
 409   2              //      USBDeviceRequest_Handler();
 410   2              UsbReq_Recipient = DCPDeviceRequest.bmRequestType & USB_RECIPIENT;
 411   2      
 412   2              UsbReq_Type = DCPDeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
 413   2                  UsbReq_Request = DCPDeviceRequest.bRequest & USB_REQUEST_MASK;
 414   2      
 415   2              if ( REQBF_DCPRequest_dir || (DCPDeviceRequest.wLength == 0))
 416   2              {
 417   3                  // For Get command via Control In
 418   3                  // For Set command without Data Stage via Control Out
 419   3                  // First of all, AckSetup to make it available for BUFFER fill in fifo
 420   3                  MLsup_AcknowledgeSETUP(); // A needle hole for Setup TK overwritten
 421   3                  if(D12BF_SetupOverwritten)
 422   3                  return;
 423   3              }
 424   2      
 425   2      
 426   2              // REQBF_StallDCPRequest = 0; // has been cleared already!
C51 COMPILER V7.06   MAINLOOP                                                              02/17/2004 14:42:22 PAGE 8   

 427   2              if ( (UsbReq_Type == USB_STANDARD_REQUEST) && (UsbReq_Request<MAX_STD_REQUEST))
 428   2              {
 429   3                          (*StandardDeviceRequest[UsbReq_Request])();
 430   3              }
 431   2                  else if((UsbReq_Type == USB_CLASS_REQUEST))
 432   2              {
 433   3                  UsbReq_Request = 0xFF - UsbReq_Request;
 434   3                  if(UsbReq_Request < MAX_CLASS_REQUEST)
 435   3                  (*ClassDeviceRequest[UsbReq_Request])();
 436   3              }
 437   2      /*          else if((UsbReq_Type == USB_VENDOR_REQUEST) &&(UsbReq_Request<MAX_VENDOR_REQUEST))
 438   2              {
 439   2                  (*VendorDeviceRequest[UsbReq_Request])();
 440   2              }
 441   2      */
 442   2              else
 443   2              {
 444   3                          REQBF_StallDCPRequest = 1;
 445   3              }
 446   2      
 447   2              if(REQBF_StallDCPRequest)
 448   2              {
 449   3                  MLsup_StallEP0();
 450   3              }
 451   2              else if ( (!REQBF_DCPRequest_dir) && (DCPDeviceRequest.wLength != 0))
 452   2              {
 453   3                  // For Set command with Data Stage via Control Out
 454   3                  // First of all, AckSetup to make it available for Buffer Out Clearing
 455   3                      MLsup_AcknowledgeSETUP(); // A needle hole for Setup TK overwritten
 456   3              }
 457   2          }
 458   1              else
 459   1              {
 460   2                      MLsup_StallEP0();
 461   2              }
 462   1      
 463   1      }
 464          
 465          
 466          void MLsup_AcknowledgeSETUP(void)
 467          {
 468   1          // Give a needle hole for Setup Overwritten as well as ISR
 469   1          LowerIRQL();
 470   1          RaiseIRQL();
 471   1          if(!D12BF_SetupOverwritten)
 472   1              Hal4D12_AcknowledgeSETUP();
 473   1      }
 474          
 475          
 476          void MLsup_StallEP0(void)
 477          {
 478   1          // Give a needle hole for Setup Overwritten as well as ISR
 479   1          LowerIRQL();
 480   1          RaiseIRQL();
 481   1          if(!D12BF_SetupOverwritten)
 482   1          {
 483   2              DCPFSMstate = USBFSM4DCP_STALL;
 484   2              Hal4D12_StallEP0();
 485   2          }
 486   1      }
 487          
 488          
C51 COMPILER V7.06   MAINLOOP                                                              02/17/2004 14:42:22 PAGE 9   

 489          void MLsup_XferPktFrUSB2MEM(INT8 Len)   // 从D12读取数据到MEMORY
 490          {
 491   1              TPBulksup_ReadFrBOEP(Len);                      // 批量读取数据
 492   1      }
 493          
 494          
 495          INT8 MLsup_XferPktFrMEM2USB(void)
 496          {
 497   1              if(BOTXfer_wResidue > EP2_PACKET_SIZE )
 498   1                      return TPBulksup_WriteToBIEP(EP2_PACKET_SIZE);
 499   1              else
 500   1                      return TPBulksup_WriteToBIEP((INT8)BOTXfer_wResidue);
 501   1      }
 502          
 503          
 504          void MLsup_XferPktFrUSB2IDE(void)
 505          {
 506   1          INT8    c0;
 507   1          for(c0=EP2_PACKET_SIZE/2 ; c0!=0; c0--)
 508   1                MLsup_XferWordFrUSB2IDE();
 509   1          Hal4Sys_D12CmdPortOutB( 0xF2);      // 清D12缓冲区
 510   1          Hal4ATA_SectCntInBlk -- ;
 511   1          if( Hal4ATA_SectCntInBlk == 0)      //写满扇区
 512   1          {
 513   2              Hal4ATA_SectCntInBlk = ATADevExt_IDData.MaximumBlockTransfer << BITNUM4EP2PKT_PER_SECTOR;
 514   2      //        Hal4ATA_WaitOnBusyNDrq();
 515   2              Hal4ATA_WaitOnBusy();
 516   2          }
 517   1      }
 518          
 519          
 520          void MLsup_XferPktFrIDE2USB(void)
 521          {
 522   1          INT8 c0;
 523   1              Hal4Sys_D12CmdPortOutB( 0xF0);                          // 发写缓冲区指令
 524   1              Hal4Sys_D12DataPortOutB(0);                                     // 第一字节没效总为0
 525   1              Hal4Sys_D12DataPortOutB(EP2_PACKET_SIZE);       // LO BYTE of Buffer Len
 526   1          for(c0=EP2_PACKET_SIZE/2 ; c0!=0; c0--)
 527   1              MLsup_XferWordFrIDE2USB();                              //从IDE写一个字(16位)到USB
 528   1      
 529   1          Hal4Sys_D12CmdPortOutB( 0xFA);                      //使缓冲区有效
 530   1      
 531   1          Hal4ATA_SectCntInBlk -- ;
 532   1          if( Hal4ATA_SectCntInBlk == 0)
 533   1          {
 534   2              Hal4ATA_SectCntInBlk = ATADevExt_IDData.MaximumBlockTransfer << BITNUM4EP2PKT_PER_SECTOR;//传送的

⌨️ 快捷键说明

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