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

📄 ide.lst

📁 HIGH_SPEED_USB_To_ATA(IDE)Firmware相关代码(EZ USB FX2芯片)
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.50   IDE                                                                   11/07/2006 14:52:09 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE IDE
OBJECT MODULE PLACED IN ide.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ide.c ROM(COMPACT) OPTIMIZE(9,SPEED) REGFILE(.\fx2_ata.ORC) BROWSE ORDER IN
                    -CDIR(c:\cypress\usb\target\inc) DEFINE(GPIF=0,FLASH=0,DEVICE_TYPE_IS_SCSI=1,DEVICE_TYPE_IS_IDE=1,VBUS_DETECT=1) DEBUG OB
                    -JECTEXTEND CODE

line level    source

   1          //-----------------------------------------------------------------------------
   2          //  Copyright (c) 1999 Cypress Semiconductor, Inc. All rights reserved
   3          //-----------------------------------------------------------------------------
   4          //
   5          // This file contains the IDE specific portions of the code.  In ATAPI
   6          // or SCSI applications, this file should not be needed.
   7          //
   8          // $Archive: /USB/atapifx2/software/ide.c $
   9          // $Date: 1/23/02 9:35a $
  10          // $Revision: 53 $
  11          //-----------------------------------------------------------------------------
  12          #include "Fx2.h"
  13          #include "Fx2regs.h"
  14          #include "gpif.h"
  15          #include "scsi.h"
  16          
  17          static bit ideReadCommand(bit verify);
  18          static bit ideWriteCommand();
  19          bit ideUdmaWriteCommand();
  20          static void IDEnop();
  21          static bit checkForMedia();
  22          static DWORD dwLBA;     // This is global to help the optimizer
  23          void dwLBAtoLBARegs();      // Stuff the LBA registers
  24          
  25          
  26          // From SCSI spec SPC (SCSI primary commands)
  27          // Byte 0 -- 70 = Current error
  28          // Byte 1 -- Segment number
  29          // Byte 2 -- Sense key
  30          // Byte 3-6 -- Information (not used)
  31          // Byte 7 -- add'l sense length 
  32          // byte 8-11 -- Command specific information
  33          // byte 12 -- ASC (Add'l sense code)
  34          // byte 13 -- ASQ (Add'l sense qualifier)
  35          //                                                       Key                                              
             -           ASC   ASQ
  36          //                                             0     1     2     3     4     5     6     7     8     9    
             -10    11    12    13    14    15
  37          const char code senseCRCError[] =          {0x70, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x
             -00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00};   
  38          const char code senseInvalidFieldInCDB[] = {0x70, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x
             -00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00};   
  39          const char code senseOk[] =                {0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x
             -00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};   
  40          char code * sensePtr;
  41          
  42          extern char NumCylindersMSB; // global #Cyl MSB
  43          extern char NumCylindersLSB; // global #Cyl LSB
  44          extern char NumHeads;        // global #Heads
  45          extern char NumSectPerTrack; // global #SectorsPerTrack
  46          
  47          /////////////////////////////////////////////////////////////////////////////////
  48          #if DEVICE_TYPE_IS_IDE
C51 COMPILER V7.50   IDE                                                                   11/07/2006 14:52:09 PAGE 2   

  49          /////////////////////////////////////////////////////////////////////////////////
  50          
  51          
  52          bit generalIDEInCommand()
  53          {
  54   1         BYTE cmd;
  55   1         WORD packetLen;
  56   1         bit status;
  57   1         
  58   1         cmd = EP2FIFOBUF[0xf];  
  59   1         
  60   1         switch (cmd)
  61   1         {
  62   2            // Minimum processing for a case in this switch statement:
  63   2            case INQUIRY:
  64   2            {
  65   3               sensePtr = senseOk;
  66   3               packetLen = min(dataTransferLen, (WORD) sizeof(SCSIInquiryData));
  67   3               
  68   3               // relinquish control of the bulk buffer occupied by the CBW
  69   3               EP2BCL = 0x80;     
  70   3      
  71   3               // Send out our stored inquiry data
  72   3               waitForInBuffer();
  73   3               mymemmovexx(EP8FIFOBUF, SCSIInquiryData_, packetLen);   // NOTE: may not be needed anymore since 
             -FIFO in AUTOIN 
  74   3               
  75   3               if (packetLen)
  76   3               {
  77   4                  EP8BCH = MSB(packetLen);
  78   4                  EP8BCL = LSB(packetLen);
  79   4               
  80   4                  dataTransferLen -= packetLen;
  81   4               }
  82   3               
  83   3               return(USBS_PASSED);
  84   3            }
  85   2                  
  86   2            case READ_10:
  87   2            {
  88   3               sensePtr = senseOk;
  89   3               checkForMedia();
  90   3      
  91   3               if (sensePtr == senseOk)
  92   3               {
  93   4                  return(ideReadCommand(0));   
  94   4               }
  95   3               else
  96   3               {
  97   4                  // relinquish control of the bulk buffer occupied by the CBW
  98   4                  EP2BCL = 0x80;     
  99   4                  
 100   4                  failedIn();         
 101   4                  return(USBS_FAILED);
 102   4               }
 103   3            }
 104   2                      
 105   2            case VERIFY_10:
 106   2            {
 107   3               sensePtr = senseOk;
 108   3               checkForMedia();
 109   3               if (sensePtr == senseOk)
C51 COMPILER V7.50   IDE                                                                   11/07/2006 14:52:09 PAGE 3   

 110   3                  return(ideReadCommand(1));   // ideReadCommand sets the OUT2BC = 0
 111   3               else
 112   3               {
 113   4                  // relinquish control of the bulk buffer occupied by the CBW
 114   4                  EP2BCL = 0x80;     
 115   4                  
 116   4                  failedIn();         
 117   4                  return(USBS_FAILED);
 118   4               }
 119   3            }            
 120   2            case SEEK_10:
 121   2            {
 122   3               sensePtr = senseOk;
 123   3               checkForMedia();
 124   3      
 125   3               // relinquish control of the bulk buffer occupied by the CBW
 126   3               EP2BCL = 0x80;     
 127   3                  
 128   3               if (sensePtr == senseOk)
 129   3               {
 130   4                  return(USBS_PASSED);
 131   4               }
 132   3               else
 133   3               {
 134   4                  failedIn();         
 135   4                  return(USBS_FAILED);
 136   4               }
 137   3            }                
 138   2      
 139   2            case READ_FORMAT_CAPACITIES:
 140   2            case READ_CAPACITY:
 141   2            {
 142   3               BYTE cap_hdr_offset = 0;
 143   3               BYTE num_dwords = 2;
 144   3      
 145   3               // relinquish control of the bulk buffer occupied by the CBW
 146   3               EP2BCL = 0x80;     
 147   3               
 148   3               sensePtr = senseOk;
 149   3               checkForMedia();
 150   3                       
 151   3               waitForInBuffer();
 152   3               if (sensePtr == senseOk)
 153   3               {
 154   4                  if(cmd == READ_FORMAT_CAPACITIES) // add 4 byte capacity list header
 155   4                  {
 156   5                     EP8FIFOBUF[0] = 0x0;
 157   5                     EP8FIFOBUF[1] = 0x0;
 158   5                     EP8FIFOBUF[2] = 0x0;
 159   5                     EP8FIFOBUF[3] = 0x08;
 160   5                     cap_hdr_offset = 4;
 161   5                     num_dwords = 3;
 162   5                  }
 163   4                  EP8FIFOBUF[0+cap_hdr_offset] = ((BYTE *) &driveCapacity)[0];
 164   4                  EP8FIFOBUF[1+cap_hdr_offset] = ((BYTE *) &driveCapacity)[1];
 165   4                  EP8FIFOBUF[2+cap_hdr_offset] = ((BYTE *) &driveCapacity)[2];
 166   4                  EP8FIFOBUF[3+cap_hdr_offset] = ((BYTE *) &driveCapacity)[3];
 167   4                  EP8FIFOBUF[4+cap_hdr_offset] = (ATA_SECTOR_SIZE >> 24) & 0xff;
 168   4                  EP8FIFOBUF[5+cap_hdr_offset] = (ATA_SECTOR_SIZE >> 16) & 0xff;
 169   4                  EP8FIFOBUF[7+cap_hdr_offset] = (ATA_SECTOR_SIZE >>  0) & 0xff;
 170   4                  EP8FIFOBUF[6+cap_hdr_offset] = (ATA_SECTOR_SIZE >>  8) & 0xff;
 171   4                  
C51 COMPILER V7.50   IDE                                                                   11/07/2006 14:52:09 PAGE 4   

 172   4                  packetLen = min(sizeof(DWORD) * num_dwords, dataTransferLen);
 173   4                  if (packetLen)
 174   4                  {
 175   5                     EP8BCH = MSB(packetLen);
 176   5                     EP8BCL = LSB(packetLen);
 177   5                     dataTransferLen -= packetLen;
 178   5                  }
 179   4                  status = USBS_PASSED;
 180   4               }
 181   3               else
 182   3               {
 183   4                  failedIn();
 184   4                  status = USBS_FAILED;
 185   4               }
 186   3      
 187   3               return(status);
 188   3            }
 189   2      
 190   2            case TEST_UNIT_READY:
 191   2            case PREVENT_ALLOW_MEDIUM_REMOVAL:
 192   2            {
 193   3            // relinquish control of the bulk buffer occupied by the CBW
 194   3               EP2BCL = 0x80;     
 195   3               
 196   3               if (dataTransferLen)    // This command shouldn't have any data!
 197   3                  failedIn();         
 198   3               
 199   3               checkForMedia();
 200   3               
 201   3               if (sensePtr == senseOk)
 202   3                  return(USBS_PASSED);
 203   3               else
 204   3                  return(USBS_FAILED);
 205   3            }                
 206   2            case REQUEST_SENSE:
 207   2            {
 208   3               // relinquish control of the bulk buffer occupied by the CBW
 209   3               EP2BCL = 0x80;     
 210   3         
 211   3               waitForInBuffer();
 212   3      
 213   3               mymemmovexx(EP8FIFOBUF, (char xdata *) sensePtr, sizeof(senseOk));
 214   3      
 215   3               packetLen = min(sizeof(senseOk), dataTransferLen);   
 216   3               if (packetLen)
 217   3               {
 218   4                  EP8BCH = MSB(packetLen);
 219   4                  EP8BCL = LSB(packetLen);
 220   4      
 221   4                  dataTransferLen -= packetLen;
 222   4               }
 223   3               sensePtr = senseOk;
 224   3               return(USBS_PASSED);
 225   3            }
 226   2      
 227   2            case MODE_SENSE_10:
 228   2            {               
 229   3               BYTE pagenum;
 230   3               
 231   3               pagenum = EP2FIFOBUF[CBW_DATA_START+2] & 0x3F; // identify page (see p.141 SCSI 2ed.)
 232   3         
 233   3               EP2BCL = 0x80; // relinquish control of the bulk buffer occupied by the CBW
C51 COMPILER V7.50   IDE                                                                   11/07/2006 14:52:09 PAGE 5   

 234   3               
 235   3               waitForInBuffer();
 236   3               
 237   3               if((pagenum != 0x05) && (pagenum != 0x3F)
 238   3                   && (pagenum != 0x01) && (pagenum != 0x08) && (pagenum != 0x1B))
 239   3               { // only respond to requests for certain pages (the mandatory ones plus page 5)
 240   4                  sensePtr = senseInvalidFieldInCDB;
 241   4                  failedIn();
 242   4                  return(USBS_FAILED);
 243   4               }
 244   3         
 245   3               // If one of the supported pages is requested, return the 8 byte Mode Parameter Header
 246   3               // plus a single 12 byte page. Only the Mode Data length (LSB) is significant in the
 247   3               // Mode Parameter Header. It has a Vendor Specific Medium Type Code in byte 2, and
 248   3               // a 1 bit WP Write Protect bit in byte 3 that are not initialized here.
 249   3               // Pages 0x01, and 0x08 do not have significant data - they are spoofed.
 250   3               // Page 0x1B has a TLUN field in byte 3 that is initialized to 1 (as per ISD).
 251   3               // Page 0x05 does contain information that is needed to boot to HDD and CDROM.

⌨️ 快捷键说明

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