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

📄 bulkcmd.lst

📁 SdCard_V2.1TinyFatFs.rar是单片机实现SD卡功能的FAT文件系统
💻 LST
📖 第 1 页 / 共 2 页
字号:
 217          {
 218   1        PCMD_STATUS_WRAPPER StatusWrapper;
 219   1           
 220   1        BulkCmdRunning = false;
 221   1      
 222   1        SetBulkInFull();
 223   1      
 224   1        StatusWrapper = (CMD_STATUS_WRAPPER xdata *)(FIFO_ADDRESS_IN);
 225   1        // 1. Set CSW. 
 226   1        StatusWrapper->Sign = CSW_SIGNATURE;
 227   1        StatusWrapper->Tag  = WrapperTag;
 228   1        StatusWrapper->DataResidueLen = 0; 
 229   1        StatusWrapper->Status = Status;
 230   1        // 2. Set DMA related parameters and enable.
 231   1        BulkSetDmaIn(CSW_LENGTH);
 232   1        // 3. Wait for replying CSW.
 233   1        BulkState = CSW_REPLY_COMPLETED;
 234   1      
 235   1      }
 236          
 237          //----------------------------------------------------------------------------
 238          void InitBulkPipe()
 239          {
 240   1        BulkState = CBW_GET_COMPLETED;    
C51 COMPILER V7.02b   BULKCMD                                                              02/27/2008 12:54:50 PAGE 5   

 241   1        CmdStatus = COMMAND_PASSED;
 242   1      
 243   1        // Init Scsi Used Params.
 244   1        ScsiInit();
 245   1      }  
 246          
 247          //----------------------------------------------------------------------------
 248          void UsbBulkIntHandler(BYTE IntEvent)
 249          {
 250   1          STATUS Status;
 251   1          bool GoodCBW = true;        
 252   1          UINT16 CmdLen;
 253   1      
 254   1          if(IntEvent & bmEPAINT)
 255   1              {
 256   2                      if(BusResetFlag)//如果有bus reset发生
 257   2                      {     
 258   3                              //BulkState = CBW_GET_COMPLETED;    
 259   3                      //CmdStatus = COMMAND_PASSED;
 260   3      
 261   3                              Status = SdStopCmd();
 262   3                              SdCtrlReset();
 263   3                              BusResetFlag = false;
 264   3                      } 
 265   2              }
 266   1        
 267   1              switch (BulkState)
 268   1              {
 269   2              case CBW_GET_COMPLETED:
 270   2              case CSW_REPLY_COMPLETED:
 271   2      
 272   2                  BulkState = CBW_GET_COMPLETED;
 273   2      
 274   2                  if((IntEvent & bmEPAINT)==0) //
 275   2                  {
 276   3                                      break;
 277   3                               }
 278   2                              SelectOutFifo();//Derek 12.26
 279   2                              if(FIFO_ADDRESS_OUT == DMA_FIFOA0) 
 280   2                              { //Derek 12.26
 281   3                                      ((TDataCast *)&CmdLen)->ucByte[0]   = EPACNTH & 0x07;
 282   3                      ((TDataCast *)&CmdLen)->ucByte[1]   = EPACNT0L;
 283   3                              } else {
 284   3                                      ((TDataCast *)&CmdLen)->ucByte[0]   = (EPACNTH & 0x70) >> 4;
 285   3                      ((TDataCast *)&CmdLen)->ucByte[1]   = EPACNT1L;
 286   3                              }
 287   2                      
 288   2                              if(BulkOutTogErr())     //是否发生DATA toggle错误
 289   2                  {
 290   3                      BulkFreeBuffer();
 291   3                                      break;
 292   3                  }
 293   2      
 294   2                  if((CmdLen != CBW_LENGTH) &&                 //CBW必须是31或32字节
 295   2                     (CmdLen != CBW_LENGTH_98))
 296   2                  {
 297   3                      BulkFreeBuffer();
 298   3                                      break;
 299   3                  }
 300   2      
 301   2                  BulkCmdRunning = true;
 302   2                  ScsiCheckCmd();   
C51 COMPILER V7.02b   BULKCMD                                                              02/27/2008 12:54:50 PAGE 6   

 303   2        
 304   2                  break;
 305   2          
 306   2              case BULK_DMA_IN_COMPLETED:   
 307   2      
 308   2                  if((IntEvent & bmEPBINT) == 0)
 309   2                      break;
 310   2      
 311   2                  if(SectorCount == 0)                   
 312   2                  {
 313   3                      BulkPrepareCSW(CmdStatus);
 314   3                  }
 315   2                  else
 316   2                  {   
 317   3                      Status = ReadNextSector();
 318   3      
 319   3                      if(Status != STATUS_SUCCESS)
 320   3                      {
 321   4                          CmdStatus = COMMAND_FAILED; 
 322   4                          SetSenseDataRd(Status);
 323   4                          BulkInStall();
 324   4                          BulkState = STALL_IN_COMPLETED;
 325   4                      }
 326   3                  }
 327   2                  break;
 328   2      
 329   2              case BULK_DMA_OUT_COMPLETED:
 330   2      
 331   2                  if((IntEvent & bmEPAINT) == 0)
 332   2                      break;
 333   2      
 334   2                  Status = STATUS_SUCCESS;
 335   2      
 336   2                         if(BulkOutTogErr())
 337   2                  {
 338   3                                      SelectOutFifo();//SelectOutfifo()和BulkFreeBuffer配对使用!切记!
 339   3                      BulkFreeBuffer();                  
 340   3                      break;
 341   3                  }
 342   2      
 343   2                  if(ScsiDetectWriteProtect(ScsiLun))
 344   2                  {
 345   3                      Status = STATUS_WRITE_PROTECT;
 346   3                      CmdStatus = COMMAND_FAILED; 
 347   3                                      SelectOutFifo();//SelectOutfifo()和BulkFreeBuffer配对使用!切记!
 348   3                                      BulkFreeBuffer(); 
 349   3                  }
 350   2                  else
 351   2                  {
 352   3                      if(FirstWrite)
 353   3                      {
 354   4                          Status = WriteSector();
 355   4                          FirstWrite = false;
 356   4                      }
 357   3                      else
 358   3                          Status = WriteNextSector();
 359   3      
 360   3                  }
 361   2      
 362   2                  if(Status != STATUS_SUCCESS)
 363   2                  {
 364   3                       CmdStatus = COMMAND_FAILED;
C51 COMPILER V7.02b   BULKCMD                                                              02/27/2008 12:54:50 PAGE 7   

 365   3                       SetSenseDataWr(Status);
 366   3                           BulkInStall();
 367   3                       BulkState = STALL_IN_COMPLETED; 
 368   3                       break;         
 369   3                  }
 370   2      
 371   2                  if(SectorCount == 0)
 372   2                      BulkPrepareCSW(CmdStatus);
 373   2                  break;           
 374   2        
 375   2              case STALL_IN_COMPLETED:           //读写过程有错后,进入此状态
 376   2                  if (IntEvent & bmEPAINT)   // Keep receving out packets.
 377   2                  {   SelectOutFifo();                //SelectOutfifo()和BulkFreeBuffer配对使用!切记!
 378   3                      BulkFreeBuffer();               //Derek 2007.01.11
 379   3                  }                    
 380   2                  if(EPBCS & bmTX0_SESTALL)   //如果IN EP的STALL位被置1
 381   2                  {
 382   3                      if(CmdStatus == PHASE_ERROR)
 383   3                          CmdStatus = COMMAND_PASSED; 
 384   3      
 385   3                      BulkState = CBW_GET_COMPLETED; 
 386   3      
 387   3                      ScsiCmdSTALLed = true;  //STALL标志变量置1
 388   3                      
 389   3                      // Set RXTXEN to receive next OUT packet.
 390   3                      if(!(EPACS & bmEP_RXTXEN))
 391   3                          BulkSetDmaOut(); //允许OUT 端点再次接收数据,为下次传输做准备
 392   3                  } 
 393   2                  break;  
 394   2         
 395   2              default:
 396   2                  BulkInStall();
 397   2                  BulkState = STALL_IN_COMPLETED;      
 398   2                  break;   
 399   2          }  
 400   1      }
 401          //-----------------------
 402          //用作BUS RESET后的处理
 403          //-----------------------
 404          void BusResetDeal(void)//2007.01.22
 405          {
 406   1              STINT   = STINT & (~bmUSBRSTINT);
 407   1          while (!(USBGCTRL & bmHS_DETECTED));           // detect USB speed
 408   1          HighSpeed       = USBGCTRL & bmSPEED;          // High speed
 409   1              //无论低速高速,reset后都要将FIFO_TOGGLE位清零。
 410   1              if (HighSpeed)
 411   1              {
 412   2                      EPAFIFOCS = 0xF0;                               //06.08.28
 413   2                      EPBFIFOCS = 0xF0;                               //06.08.28
 414   2              }else 
 415   1              { //如果是低速主机接口-06.08.28//Derek
 416   2                      EPAFIFOCS = 0xF2;                               //06.08.28
 417   2                      EPBFIFOCS = 0xF2;                               //06.08.28
 418   2              } 
 419   1              SW_RST |= bmUSB_RST;    //USB software reset Derek 10.23
 420   1              UsbInit();                              //重新配置端点属性
 421   1              BusResetFlag = true;    //Derek 09.06
 422   1              SW_IN_FIFO_Toggle  = 0; //12.29 software toggle bit reset
 423   1              SW_OUT_FIFO_Toggle = 0;
 424   1      }  


C51 COMPILER V7.02b   BULKCMD                                                              02/27/2008 12:54:50 PAGE 8   

MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    983    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     27       6
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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