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

📄 scsicmd.lst

📁 SdCard_V2.1TinyFatFs.rar是单片机实现SD卡功能的FAT文件系统
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE SCSICMD
OBJECT MODULE PLACED IN .\Output\ScsiCmd.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ScsiCmd.c LARGE OPTIMIZE(SIZE) BROWSE DEBUG OBJECTEXTEND PRINT(.\Output\Scs
                    -iCmd.lst) OBJECT(.\Output\ScsiCmd.obj)

stmt level    source

   1          /*
   2          **********************************************************************************************
   3          * Project:      FS7805 SD CARD READER
   4          * File:         main.c
   5          * Contents: 
   6          *           The main function is SD and MMC card reader.
   7          *
   8          * $Date: 12/15/06    Derek    V1.0  
   9          *  
  10          * Coments: This is the SD/MMC card reader firmware.
  11          *                  When read sector,the 512 pingpong FIFO mechanism
  12          *                  is used to improve performance.But when write sector,
  13          *                  only single FIFO is used.
  14          *
  15          * Copyright (c) 2006 Fameg, Inc. All rights reserved
  16          *
  17          * 
  18          ***********************************************************************************************
  19          */
  20          #include "include\Include.h"
  21          
  22          /*************************************************
  23             Global Variables
  24          *************************************************/
  25          xdata BYTE SenseKey;
  26          xdata BYTE AddSenseCode;
  27          xdata BYTE AddSenseCodeQ;
  28          xdata bool ScsiMediaChange[MAX_DEVICE_NUM];
*** WARNING C231 IN LINE 28 OF SCSICMD.C: 'ScsiMediaChange': redefinition
  29          /*************************************************
  30             Local Variables
  31          *************************************************/
  32          static xdata BYTE ScsiWriteProtect[MAX_DEVICE_NUM];
  33          static xdata bool ScsiWriteProtectChange[MAX_DEVICE_NUM];
  34          //static xdata UINT32 CapacityInfo[2];
  35          static xdata BYTE ScsiLoadStatus[MAX_DEVICE_NUM];
  36          
  37          /*BYTE RequestSenseData[REQUEST_SENSE_DATA_LEN] = 
  38          { 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
  39            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  40            0x00, 0x00
  41          };*/  
  42          
  43          code BYTE ModeParamHeader6[MODE_PARAM_HEADER_LEN] = 
  44          { 0x00, 0x00, 0x00, 0x00 };
  45          
  46          // Mode Page #1     Read-Write Error Recovery
  47          code BYTE ModePage_1[] = 
  48          { 0x01, 0x0A, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 
  49            0x03, 0x00, 0x00, 0x00
  50          };
  51          // Mode Page #5   
  52          /*code BYTE ModePage_5[] = 
  53          { 0x05, 0x1e, 0x13, 0x88, 0x08, 0x20, 0x02, 0x00, 0x01, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00,
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 2   

  54            0x00, 0x00, 0x00, 0x00, 0x05, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68,
  55            0x00, 0x00, };
  56          // Mode Page #1B
  57          code BYTE ModePage_1B[] = 
  58          { 0x1B, 0x0A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  59          // Mode Page #1C   
  60          code BYTE ModePage_1C[] = 
  61          { 0x1C, 0x06, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00 };
  62          */
  63          xdata MODE_PAGE_TABLE ModePageArray[] = 
  64          {
  65            { ModePage_1, sizeof(ModePage_1) },
  66          // Reduce XDATA Size so don't return more mode pages.  
  67          //  { ModePage_5, sizeof(ModePage_5) },
  68          //  { ModePage_1B, sizeof(ModePage_1B) },
  69          //  { ModePage_1C, sizeof(ModePage_1C) },
  70            { NULL, 0 }
  71          };  
  72          
  73          //----------------------------------------------------------------------------
  74          // Detect the write protect on the storage media.(Shared)
  75          //----------------------------------------------------------------------------
  76          bool ScsiDetectWriteProtect(BYTE Lun)
  77          {
  78   1        if (ScsiWriteProtect[Lun])
  79   1        {
  80   2          SenseKey      = DATA_PROTECT;
  81   2          AddSenseCode  = HW_WRITE_PROTECT;
  82   2          return true;
  83   2        }
  84   1        return false;
  85   1      }
  86          
  87          //----------------------------------------------------------------------------
  88          // Set Command Error.(INVALID_FIELD_IN_CDB)
  89          //----------------------------------------------------------------------------
  90          void ScsiInvalidFieldError(BYTE Lun) // To be replaced
  91          {
  92   1              Lun=Lun;
  93   1          CmdStatus     = PHASE_ERROR;  
  94   1          SenseKey      = ILLEGAL_REQUEST;
  95   1          AddSenseCode  = INVALID_FIELD_IN_CDB;   
  96   1          AddSenseCodeQ = 0x00;       
  97   1      }
  98          
  99          void SetSenseErrOpCode()
 100          {
 101   1          CmdStatus     = PHASE_ERROR;  
 102   1          SenseKey      = 0x05; // INVALID COMMAND OPERATION CODE
 103   1          AddSenseCode  = 0x20;
 104   1          AddSenseCodeQ = 0x00;
 105   1      }
 106          
 107          void SetSenseErrCmdField()
 108          {
 109   1          CmdStatus     = PHASE_ERROR;  
 110   1          SenseKey      = 0x05; // INVALID FIELD IN COMMAND PACKET
 111   1          AddSenseCode  = 0x24;
 112   1          AddSenseCodeQ = 0x00;
 113   1      }
 114          
 115          /*void SetSenseErrCmdPara()
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 3   

 116          {
 117              CmdStatus     = PHASE_ERROR;  
 118              SenseKey      = 0x05; // PARAMETER VALUE INVALID
 119              AddSenseCode  = 0x26;
 120              AddSenseCodeQ = 0x02;
 121          }*/
 122          
 123          void ScsiModifySenseWord(BYTE Lun, BYTE Status)
 124          {
 125   1              Lun=Lun;
 126   1          switch (Status)
 127   1          {
 128   2              case STATUS_SUCCESS:      // NO SENSE
 129   2                  SenseKey      = 0x00;
 130   2                  AddSenseCode  = 0x00;    
 131   2                  AddSenseCodeQ = 0x00;       
 132   2                  break;      
 133   2               
 134   2              case STATUS_NO_MEDIA:     // MEDIUM NOT PRESENT
 135   2                  SenseKey      = 0x02;
 136   2                  AddSenseCode  = 0x3A;   
 137   2                  AddSenseCodeQ = 0x00;       
 138   2                  break;           
 139   2               
 140   2              case STATUS_MEDIA_CHANGE: // NOT READY TO READY TRANSITION 
 141   2                  SenseKey      = 0x06; // - MEDIA CHANGED
 142   2                  AddSenseCode  = 0x28;   
 143   2                  AddSenseCodeQ = 0x00;       
 144   2                  break;      
 145   2         
 146   2              default:                  // UNKNOWN ERROR
 147   2                  SenseKey      = 0x02;
 148   2                  AddSenseCode  = 0xFF;
 149   2                  AddSenseCodeQ = 0xFF;
 150   2                  break;           
 151   2          }   
 152   1      }  
 153          
 154          void SetSenseDataWr(BYTE Status)
 155          {
 156   1          switch (Status)
 157   1          {
 158   2              case STATUS_SUCCESS:      // NO SENSE
 159   2                  SenseKey      = 0x00;
 160   2                  AddSenseCode  = 0x00;
 161   2                  AddSenseCodeQ = 0x00;
 162   2                  break;
 163   2      
 164   2              case STATUS_NO_MEDIA:     // MEDIUM NOT PRESENT
 165   2                  SenseKey      = 0x02;
 166   2                  AddSenseCode  = 0x3A;
 167   2                  AddSenseCodeQ = 0x00;
 168   2                  break;
 169   2      
 170   2              case STATUS_MEDIA_CHANGE: // NOT READY TO READY TRANSITION 
 171   2                  SenseKey      = 0x06; // - MEDIA CHANGED
 172   2                  AddSenseCode  = 0x28;   
 173   2                  AddSenseCodeQ = 0x00;
 174   2                  break;
 175   2      
 176   2              case STATUS_WRITE_PROTECT:// WRITE PROTECTED MEDIA
 177   2                  SenseKey      = 0x07; 
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 4   

 178   2                  AddSenseCode  = 0x27;   
 179   2                  AddSenseCodeQ = 0x00;
 180   2                  break;
 181   2              
 182   2              case STATUS_FLASH_ERROR:  // WRITE FAULT
 183   2              case STATUS_NO_BLOCK:     // WRITE FAULT
 184   2                  SenseKey      = 0x03; //
 185   2                  AddSenseCode  = 0x03;
 186   2                  AddSenseCodeQ = 0x00;
 187   2                  break;
 188   2      
 189   2              default:                  // UNKNOWN ERROR
 190   2                  SenseKey      = 0x02;
 191   2                  AddSenseCode  = 0xFF;
 192   2                  AddSenseCodeQ = 0xFF;
 193   2               break;
 194   2          }
 195   1      }
 196          
 197          void SetSenseDataRd(BYTE Status)
 198          {
 199   1          switch (Status)
 200   1          {
 201   2              case STATUS_SUCCESS:      // NO SENSE
 202   2                  SenseKey      = 0x00;
 203   2                  AddSenseCode  = 0x00;
 204   2                  AddSenseCodeQ = 0x00;
 205   2                  break;
 206   2              
 207   2              case STATUS_NO_MEDIA:     // MEDIUM NOT PRESENT
 208   2                  SenseKey      = 0x02;
 209   2                  AddSenseCode  = 0x3A;
 210   2                  AddSenseCodeQ = 0x00;
 211   2                  break;
 212   2      
 213   2              case STATUS_MEDIA_CHANGE: // NOT READY TO READY TRANSITION 
 214   2                  SenseKey      = 0x06; // - MEDIUM CHANGED
 215   2                  AddSenseCode  = 0x28;   
 216   2                  AddSenseCodeQ = 0x00;
 217   2                  break;
 218   2      
 219   2              case STATUS_FLASH_ERROR:  // UNRECOVERED READ ERROR
 220   2              case STATUS_ECC_2ERROR:   // UNRECOVERED READ ERROR
 221   2                  SenseKey      = 0x03;
 222   2                  AddSenseCode  = 0x11;
 223   2                  AddSenseCodeQ = 0x00;
 224   2                  break;
 225   2      
 226   2              default:                  // UNKNOWN ERROR
 227   2                  SenseKey      = 0x02;
 228   2                  AddSenseCode  = 0xFF;
 229   2                  AddSenseCodeQ = 0xFF;
 230   2               break;
 231   2          }
 232   1      }
 233          
 234          //----------------------------------------------------------------------------
 235          // Get the LUN capcity
 236          //  Description: Write those capacity informations to the global variable
 237          //               CapacityInfo[]. 
 238          //----------------------------------------------------------------------------
 239          void ScsiGetLunCapacity()
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 5   

 240          {
 241   1        BYTE Status;
 242   1      
 243   1        Status = QueryDevice();
 244   1          *(UINT32 xdata *)(FIFO_ADDRESS_IN + 0)   = DeviceInfo.TotalBlocks;
 245   1          *(UINT32 xdata *)(FIFO_ADDRESS_IN + 4)   = (UINT32)DeviceInfo.BlockSize;
 246   1      
 247   1      }
 248          
 249          //----------------------------------------------------------------------------
 250          // Check Vaild Logic Unit Number
 251          //  Description: If not valid, change Sense Parameters.
 252          //----------------------------------------------------------------------------
 253          void ScsiLunValidCheck()
 254          {
 255   1          BYTE Status;
 256   1      
 257   1          if(ScsiLun > LastDevice)
 258   1          {
 259   2              CmdStatus = PHASE_ERROR;
 260   2              return;
 261   2          }
 262   1      
 263   1          Status = QueryDevice();
 264   1       
 265   1          if(ScsiWriteProtect[ScsiLun] != DeviceInfo.WriteProtect)
 266   1          {
 267   2              ScsiWriteProtectChange[ScsiLun] = true;
 268   2              ScsiWriteProtect[ScsiLun] = DeviceInfo.WriteProtect;
 269   2          }
 270   1          
 271   1          if((Status == STATUS_SUCCESS) || 
 272   1             (Status == STATUS_MEDIA_CHANGE))
 273   1          {
 274   2              if((ScsiLoadStatus[ScsiLun] & SCSI_LAST_QUERY_MASK) == 0)
 275   2                  ScsiLoadStatus[ScsiLun] |= SCSI_LOAD_STATUS_MASK;
 276   2      
 277   2              ScsiLoadStatus[ScsiLun] |= SCSI_LAST_QUERY_MASK;
 278   2          }
 279   1          else
 280   1              ScsiLoadStatus[ScsiLun] &= ~SCSI_LAST_QUERY_MASK;
 281   1      
 282   1          if(Status == STATUS_SUCCESS)
 283   1              return;
 284   1      
 285   1          ScsiModifySenseWord(ScsiLun, Status);
 286   1          CmdStatus = COMMAND_FAILED;
 287   1      } 
 288          
 289          //----------------------------------------------------------------------------

⌨️ 快捷键说明

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