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

📄 scsicmd.lst

📁 SdCard_V2.1TinyFatFs.rar是单片机实现SD卡功能的FAT文件系统
💻 LST
📖 第 1 页 / 共 3 页
字号:
 290          // Make Mode Page Data Ready
 291          //----------------------------------------------------------------------------
 292          void ScsiPrepareModePage(BYTE PageCode, UINT16 XferLength)
 293          {
 294   1        UINT16 TotalPageLen = 0;
 295   1        BYTE i = 0;
 296   1        PBYTE Page;
 297   1        BYTE PageLen;
 298   1        
 299   1        while((Page = ModePageArray[i].PagePtr) != NULL)
 300   1        {
 301   2          PageLen = 0;
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 6   

 302   2          if ( (PageCode == 0x3f) || (PageCode == Page[0]) )
 303   2          {
 304   3            PageLen = ModePageArray[i].Size;
 305   3                  memcpy((BYTE xdata *)(FIFO_ADDRESS_IN + MODE_PARAM_HEADER_LEN \
 306   3                    + TotalPageLen), (void *)Page, PageLen);  
 307   3          }
 308   2          TotalPageLen += PageLen;   
 309   2          i++;
 310   2        }
 311   1        TotalPageLen += MODE_PARAM_HEADER_LEN; 
 312   1          memcpy((BYTE xdata *)(FIFO_ADDRESS_IN), (void *)ModeParamHeader6, \
 313   1                  MODE_PARAM_HEADER_LEN);
 314   1        // Length field.(1 Byte)  
 315   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 0) = (BYTE)(TotalPageLen - 1);
 316   1      // (Device-Specific-Parameter)It is write protect reference for WinXP & Win2K.
 317   1        QueryDevice();
 318   1      
 319   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 2) = DeviceInfo.WriteProtect ? 0x80: 0x00;
 320   1        if (XferLength > TotalPageLen)
 321   1          XferLength = TotalPageLen;
 322   1        
 323   1        UsbDmaTotalLength = XferLength;    
 324   1      }
 325          
 326          //--------------------------------------------------------------------
 327          // Prepare Disk Info. 
 328          //--------------------------------------------------------------------
 329          void ScsiPrepareDiskInfo()
 330          {
 331   1          memset((BYTE xdata *)(FIFO_ADDRESS_IN), 0, SCSI_INFO_START_OFFSET);
 332   1      
 333   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 1)     = 0x80;
 334   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 3)     = 0x01;
 335   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 4)     = 0x1F;
 336   1      
 337   1          // Vendor Information
 338   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 8)     = 'F';
 339   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 9)     = 'a';
 340   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 10)    = 'm';
 341   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 11)    = 'e';
 342   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 12)    = 'G';
 343   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 13)    = ' ';
 344   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 14)    = ' ';
 345   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 15)    = ' ';
 346   1      
 347   1          // Product Identification
 348   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 16)    = 'U';
 349   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 17)    = 'S';
 350   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 18)    = 'B';
 351   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 19)    = ' ';
 352   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 20)    = '2';
 353   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 21)    = '.';
 354   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 22)    = '0';
 355   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 23)    = ' ';
 356   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 24)    = 'D';
 357   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 25)    = 'i';
 358   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 26)    = 's';
 359   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 27)    = 'k';
 360   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 28)    = ' ';
 361   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 29)    = ' ';
 362   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 30)    = ' ';
 363   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 31)    = ' ';
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 7   

 364   1      
 365   1          // Revision Field.
 366   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 32)    = '1';
 367   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 33)    = '.';
 368   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 34)    = '0';
 369   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 35)    = '0';
 370   1      }       
 371            
 372          /***************************************************************************
 373            Notes of SCSI Command
 374            1. Ignore Checking Valid CbwcbLen 
 375          ***************************************************************************/
 376          
 377          //----------------------------------------------------------------------------
 378          // ScsiCmdTestUnitReady
 379          //----------------------------------------------------------------------------  
 380          void ScsiCmdTestUnitReady()
 381          {
 382   1        if (ConvertEndian32(BlockWrapper->DataXsferLen) != 0) 
 383   1          ScsiInvalidFieldError(ScsiLun); 
 384   1      
 385   1        if (ScsiMediaChange[ScsiLun])
 386   1        {
 387   2          ScsiMediaChange[ScsiLun] = false;
 388   2          ScsiModifySenseWord(ScsiLun, STATUS_MEDIA_CHANGE);
 389   2          CmdStatus = COMMAND_FAILED;
 390   2        }
 391   1        else if (ScsiWriteProtectChange[ScsiLun])
 392   1        {
 393   2          ScsiWriteProtectChange[ScsiLun] = false;
 394   2          ScsiModifySenseWord(ScsiLun, STATUS_MEDIA_CHANGE);
 395   2          CmdStatus = COMMAND_FAILED;
 396   2        }
 397   1        else if(!(ScsiLoadStatus[ScsiLun] & SCSI_LOAD_STATUS_MASK)) 
 398   1        {
 399   2          ScsiModifySenseWord(ScsiLun, STATUS_NO_MEDIA);      
 400   2          CmdStatus = COMMAND_FAILED;         
 401   2        }     
 402   1      
 403   1        BulkFreeBuffer();  //.
 404   1        
 405   1        if (CmdStatus == PHASE_ERROR)
 406   1        {
 407   2          BulkInStall();
 408   2          BulkState = STALL_IN_COMPLETED;   
 409   2        }  
 410   1        else
 411   1          BulkPrepareCSW(CmdStatus);
 412   1      }  
 413          
 414          //----------------------------------------------------------------------------
 415          // ScsiCmdInquiry
 416          //----------------------------------------------------------------------------  
 417          void ScsiCmdInquiry()
 418          {
 419   1        BYTE i;
 420   1      
 421   1        // Scsi command start.
 422   1        for(i = 0; i < MAX_DEVICE_NUM; i++) 
 423   1          ScsiLoadStatus[i] = 0;
 424   1        if (UsbDmaTotalLength > STANDARD_INQUIRY_DATA_LEN)
 425   1          UsbDmaTotalLength = STANDARD_INQUIRY_DATA_LEN;
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 8   

 426   1        // Don't care LUN's value, we return the same Inquiry Data.
 427   1        CmdStatus = COMMAND_PASSED;  //
 428   1        if (!(0x80 & BlockWrapper->Flags))
 429   1          ScsiInvalidFieldError(ScsiLun); 
 430   1        BulkFreeBuffer();  //
 431   1        // Prepare Data.
 432   1        
 433   1        if (CmdStatus != PHASE_ERROR)
 434   1        { 
 435   2              SetBulkInFull();
 436   2          ScsiPrepareDiskInfo();
 437   2          BulkSetDmaIn((UINT16)UsbDmaTotalLength);
 438   2          BulkState = BULK_DMA_IN_COMPLETED;   
 439   2        }  
 440   1        else
 441   1        {
 442   2          BulkInStall();
 443   2          BulkState = STALL_IN_COMPLETED; 
 444   2        }  
 445   1      }  
 446          
 447          //----------------------------------------------------------------------------
 448          // ScsiCmdRquestSense
 449          //----------------------------------------------------------------------------  
 450          void ScsiCmdRquestSense()
 451          {
 452   1        bit ClearSenseWord = true;
 453   1        
 454   1        if (UsbDmaTotalLength > REQUEST_SENSE_DATA_LEN)
 455   1          UsbDmaTotalLength = REQUEST_SENSE_DATA_LEN;
 456   1      
 457   1        if ((ScsiLun > LastDevice) || (!(0x80 & BlockWrapper->Flags)))
 458   1        {
 459   2          //We put unsupport sense word on SenseKey,AddSenseCode,AddSenseCodeQ[MAX_DEVICE_NUM].
 460   2          //It needn't to clear beause ScsiLun start from 0 to MAX_DEVICE_NUM - 1.        
 461   2          ScsiLun = MAX_DEVICE_NUM;  
 462   2          ClearSenseWord = false;
 463   2        }
 464   1          
 465   1        //Force to be Command Passed  ????
 466   1        CmdStatus = COMMAND_PASSED;
 467   1          BulkFreeBuffer();
 468   1        // Init Data of RequestSense.
 469   1        SetBulkInFull();
 470   1          memset((BYTE xdata *)(FIFO_ADDRESS_IN), 0, REQUEST_SENSE_DATA_LEN);
 471   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 0) = 0x70;
 472   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 7) = 0x0A;
 473   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + SENSE_KEY_INDEX)      = (0xf & SenseKey);
 474   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + ADD_SENSE_CODE_INDEX) = AddSenseCode;
 475   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + ADD_SENSE_CODEQ_INDEX)= AddSenseCodeQ;
 476   1        if (ClearSenseWord)
 477   1        {
 478   2          SenseKey      = NO_SENSE;
 479   2          AddSenseCode  = 0x00;
 480   2          AddSenseCodeQ = 0x00; 
 481   2        }  
 482   1        
 483   1        
 484   1        if (CmdStatus != PHASE_ERROR)
 485   1        {
 486   2           BulkSetDmaIn((UINT16)UsbDmaTotalLength);
 487   2           BulkState = BULK_DMA_IN_COMPLETED;   
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 9   

 488   2        }  
 489   1        else
 490   1        {
 491   2          BulkInStall();
 492   2          BulkState = STALL_IN_COMPLETED; 
 493   2        }  
 494   1      }  
 495          
 496          //----------------------------------------------------------------------------
 497          // ScsiCmdModeSense6
 498          //----------------------------------------------------------------------------  
 499          void ScsiCmdModeSense6()
 500          {
 501   1        BYTE PageCode = (*(BYTE xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 2) & 0x3f);
 502   1          
 503   1        if ( !(0x80 & BlockWrapper->Flags) )
 504   1          ScsiInvalidFieldError(ScsiLun); 
 505   1      
 506   1        BulkFreeBuffer();  //Out端点接收使能
 507   1            
 508   1        if (CmdStatus == COMMAND_PASSED)
 509   1        {
 510   2              SetBulkInFull();
 511   2          ScsiPrepareModePage(PageCode, (UINT16)UsbDmaTotalLength);
 512   2          BulkSetDmaIn((UINT16)UsbDmaTotalLength);
 513   2          BulkState = BULK_DMA_IN_COMPLETED;   
 514   2        }
 515   1        else  
 516   1        {
 517   2          BulkInStall();
 518   2          BulkState = STALL_IN_COMPLETED; 
 519   2        }
 520   1      }  
 521          
 522          //----------------------------------------------------------------------------
 523          // ScsiCmdModeSense10
 524          //----------------------------------------------------------------------------
 525          void ScsiCmdModeSense10()
 526          {
 527   1          BulkFreeBuffer();
 528   1          SetBulkInFull();
 529   1        // Always return the fixed data.      
 530   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 0)     = 0x00;
 531   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 1)     = 0x06;
 532   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 2)     = 0x00;
 533   1          if (ScsiWriteProtect[ScsiLun])
 534   1          {
 535   2              *(BYTE xdata *)(FIFO_ADDRESS_IN + 3) = 0x80;
 536   2          }
 537   1          else
 538   1          {
 539   2              *(BYTE xdata *)(FIFO_ADDRESS_IN + 3) = 0x00;
 540   2          }
 541   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 4)     = 0x00;
 542   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 5)     = 0x00;
 543   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 6)     = 0x00;
 544   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 7)     = 0x00;
 545   1        
 546   1        
 547   1        BulkSetDmaIn(8);
 548   1        BulkState = BULK_DMA_IN_COMPLETED;    
 549   1      }       
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 10  

 550          //----------------------------------------------------------------------------
 551          // ScsiCmdReadBuf---2007.08.16
 552          //----------------------------------------------------------------------------
 553          void ScsiCmdReadBuf(void)
 554          {
 555   1          BulkFreeBuffer();
 556   1      
 557   1          SetBulkInFull();
 558   1              memset((BYTE xdata *)DMA_FIFOB0, 0, 8);
 559   1      
 560   1          BulkSetDmaIn(8);
 561   1          BulkState   = BULK_DMA_IN_COMPLETED;
 562   1      }
 563          
 564          //----------------------------------------------------------------------------
 565          // ScsiCmdStartStopUnit
 566          //----------------------------------------------------------------------------  
 567          void ScsiCmdStartStopUnit()
 568          {
 569   1        if (ConvertEndian32(BlockWrapper->DataXsferLen) != 0) 
 570   1          ScsiInvalidFieldError(ScsiLun);
 571   1        // Host request device to unload this LUN.  
 572   1        if (*(BYTE xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 4) == 0x02)
 573   1          ScsiLoadStatus[ScsiLun] &= ~SCSI_LOAD_STATUS_MASK; 
 574   1      
 575   1        if (*(BYTE xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 0x04)) // detect start or stop device.
 576   1          StorageStart(); // add by C.H. Liang
 577   1        else
 578   1          StorageEject(); // add by C.H. Liang
 579   1        
 580   1        BulkFreeBuffer();  //
 581   1      
 582   1        CmdStatus = 0x00;
 583   1        BulkPrepareCSW(CmdStatus);
 584   1      }  
 585          
 586          //----------------------------------------------------------------------------
 587          // ScsiCmdPreventRemoval

⌨️ 快捷键说明

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