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

📄 fx2_ata.cod

📁 Cy68013的应用——USB2.0接口转IDE、CF卡接口
💻 COD
📖 第 1 页 / 共 5 页
字号:
0D54 F0                MOVX    @DPTR,A
  447:             XAUTODAT2 = ActiveLunConfigData.NumCylindersMSB; // #Cyl MSB
0D55 E52E              MOV     A,ActiveLunConfigData
0D57 F0                MOVX    @DPTR,A
  448:             XAUTODAT2 = ActiveLunConfigData.NumCylindersLSB; // #Cyl LSB
0D58 E52F              MOV     A,ActiveLunConfigData+01H
0D5A F0                MOVX    @DPTR,A
  449:             XAUTODAT2 = 0;
0D5B E4                CLR     A
0D5C F0                MOVX    @DPTR,A
  450:             XAUTODAT2 = 0;
0D5D F0                MOVX    @DPTR,A
  451:             }
0D5E         ?C0071?IDE:
  452:          if(pagenum == 0x1B || pagenum == 0x3f)
0D5E E55E              MOV     A,pagenum
0D60 641B              XRL     A,#01BH
0D62 6005              JZ      ?C0076?IDE
0D64 E55E              MOV     A,pagenum
0D66 B43F13            CJNE    A,#03FH,?C0075?IDE
0D69         ?C0076?IDE:
  453:             {
  454:             XAUTODAT2 = 0x1b;            // fill out the page num
0D69 90E67C            MOV     DPTR,#0E67CH
0D6C 741B              MOV     A,#01BH
0D6E F0                MOVX    @DPTR,A
  455:             XAUTODAT2 = 12-2;            // set individual Page Length -- return 12 for all commands
0D6F 740A              MOV     A,#0AH
0D71 F0                MOVX    @DPTR,A
  456:             XAUTODAT2 = 0;
0D72 E4                CLR     A
0D73 F0                MOVX    @DPTR,A
  457:             XAUTODAT2 = 0x01;            // set TLUN = 1 for page 0x1B
0D74 04                INC     A
0D75 F0                MOVX    @DPTR,A
  458:             AUTOPTRL2 += 8;              // 8 zeroes too.
0D76 7408              MOV     A,#08H
0D78 259E              ADD     A,AUTOPTRL2
0D7A F59E              MOV     AUTOPTRL2,A
  459:             }
0D7C         ?C0075?IDE:
  460:          if(pagenum == 0x1 || pagenum == 0x3f)
0D7C E55E              MOV     A,pagenum
0D7E 6401              XRL     A,#01H
0D80 6005              JZ      ?C0078?IDE
0D82 E55E              MOV     A,pagenum
0D84 B43F07            CJNE    A,#03FH,?C0077?IDE
0D87         ?C0078?IDE:
  461:             {
  462:             XAUTODAT2 = 0x1;             // fill out the page num
0D87 90E67C            MOV     DPTR,#0E67CH
0D8A 7401              MOV     A,#01H
0D8C F1BF              ACALL   ?L?COM0031
  463:             XAUTODAT2 = 12-2;            // set individual Page Length -- return 12 for all commands
  464:             AUTOPTRL2 += 10;              // 10 zeroes too.
  465:             }
0D8E         ?C0077?IDE:
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 21


  466: 
  467:          if(pagenum == 0x8 || pagenum == 0x3f)
0D8E E55E              MOV     A,pagenum
0D90 6408              XRL     A,#08H
0D92 6005              JZ      ?C0080?IDE
0D94 E55E              MOV     A,pagenum
0D96 B43F07            CJNE    A,#03FH,?C0079?IDE
0D99         ?C0080?IDE:
  468:             {
  469:             XAUTODAT2 = 0x8;             // fill out the page num
0D99 90E67C            MOV     DPTR,#0E67CH
0D9C 7408              MOV     A,#08H
0D9E F1BF              ACALL   ?L?COM0031
  470:             XAUTODAT2 = 12-2;            // set individual Page Length -- return 12 for all commands
  471:             AUTOPTRL2 += 10;              // 10 zeroes too.
  472:             }
0DA0         ?C0079?IDE:
  473: 
  474:          loadEP8BC(AUTOPTRL2);
0DA0 AF9E              MOV     R7,AUTOPTRL2
0DA2 7E00              MOV     R6,#00H
0DA4         
0DA4 121799            LCALL   _loadEP8BC
  475:          sensePtr = senseOk;
0DA7         
0DA7 F1AF              ACALL   ?L?COM0022
  476:          return(USBS_PASSED);
0DA9 C3                CLR     C
0DAA 22                RET     
  477:       } // end case
  478: 
  479:       default:
0DAB         ?C0081?IDE:
  480:       {
  481:          // relinquish control of the bulk buffer occupied by the CBW
  482:          EP2BCL = 0x80;     
0DAB D169              ACALL   ?L?COM000B
  483:          
  484:          sensePtr = senseInvalidOpcode;
0DAD F1DD              ACALL   ?L?COM0026
  485:          failedIn();
0DAF         
0DAF 1207F7            LCALL   failedIn
  486:          return(USBS_FAILED);
0DB2 D3                SETB    C
  487:       }
  488:    }
  489: }   
0DB3 22                RET     
----- FUNCTION generalIDEInCommand (END) -------


----- FUNCTION detectSCSIvsATA (BEGIN) -----
 FILE: 'atareset.c'
   57: void detectSCSIvsATA()
   58: {
   59:    EZUSB_Delay(5);            // Wait 5 ms to be polite
   60:    writePIO8(ATAPI_CONTROL_REG, 0);       // Make sure that SRST is not set
0DB4 7F05              MOV     R7,#05H
0DB6 F190              ACALL   ?L?COM001A
   61:    writeATA_DRIVESEL_REG();
0DB8 F164              ACALL   ?L?COM0027
   62: 
   63:    // wait for the busy bit to clear.  Even if there is no device, the busy bit will
   64:    // go to zero because of the pulldown on D7
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 22


   65:    waitForBusyBit();
   66:    writeATA_DRIVESEL_REG();
0DBA D14B              ACALL   writeATA_DRIVESEL_REG
   67: 
   68:    writePIO8(ATAPI_NULL_REG, ~0xE0);      // Make sure that the bus is NOT still floating at 0xa0
0DBC 7D1F              MOV     R5,#01FH
0DBE 7CFF              MOV     R4,#0FFH
0DC0 7F3E              MOV     R7,#03EH
0DC2 314D              ACALL   _writePIO8
   69: 
   70:    // Read back the Drive Select register.  If it contains what we wrote to it, then
   71:    // there may be a device here.  Otherwise return.
   72:    if (!((readPIO8(ATA_DRIVESEL_REG) & 0xF0) == (0xE0 | ((BYTE) bMasterSlave << 4))))
0DC4 7F2C              MOV     R7,#02CH
0DC6 D128              ACALL   _readPIO8
0DC8 EF                MOV     A,R7
0DC9 54F0              ANL     A,#0F0H
0DCB FF                MOV     R7,A
0DCC A201              MOV     C,bMasterSlave
0DCE E4                CLR     A
0DCF 33                RLC     A
0DD0 FE                MOV     R6,A
0DD1 C4                SWAP    A
0DD2 54F0              ANL     A,#0F0H
0DD4 44E0              ORL     A,#0E0H
0DD6 B50703            CJNE    A,AR7,?C0008?ATARESET
0DD9 D3                SETB    C
0DDA 8001              SJMP    ?C0009?ATARESET
0DDC         ?C0008?ATARESET:
0DDC C3                CLR     C
0DDD         ?C0009?ATARESET:
0DDD 5034              JNC     ?C0010?ATARESET
0DDF         ?C0007?ATARESET:
   73:          return;
   74: 
   75:    // Check for special SCSI byte count value.  EB14 indicates an ATAPI device.
   76:    // If we read EB14, we know we have a real scsi device and we can quit
   77:    if (readPIO8(ATAPI_BYTE_COUNT_MSB) == 0xeb && readPIO8(ATAPI_BYTE_COUNT_LSB) == 0x14)
0DDF 7F2A              MOV     R7,#02AH
0DE1 D128              ACALL   _readPIO8
0DE3 BFEB09            CJNE    R7,#0EBH,?C0011?ATARESET
0DE6 7F28              MOV     R7,#028H
0DE8 D128              ACALL   _readPIO8
0DEA BF1402            CJNE    R7,#014H,?C0011?ATARESET
   78:    {
   79:       bScsi = 1;
0DED D203              SETB    bScsi
   80:    }
0DEF         ?C0011?ATARESET:
   81:    
   82:    // We now have identified a device that's responding to our commands.  If we have 
   83:    // selected the slave, it could be a master responding for the slave device.
   84:    // ATA devices in this case can be detected by seeing a 0 in the status register.
   85:    if (!bMasterSlave)   // Master devices are done here.
0DEF 200103            JB      bMasterSlave,?C0012?ATARESET
   86:    {
   87:       bDevicePresent = 1;
0DF2 D200              SETB    bDevicePresent
0DF4 22                RET     
   88:       return;
   89:    }
0DF5         ?C0012?ATARESET:
   90: 
   91:    if (bScsi)
0DF5 300313            JNB     bScsi,?C0013?ATARESET
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 23


   92:       {
   93:       SendDeviceIdentifyCommand();
0DF8 F14E              ACALL   SendDeviceIdentifyCommand
   94:       if (readATAPI_STATUS_REG() & ATAPI_STATUS_DRDY_BIT)
0DFA 1201F6            LCALL   readATAPI_STATUS_REG
0DFD EF                MOV     A,R7
0DFE 30E612            JNB     ACC.6,?C0010?ATARESET
   95:          {
   96:          bit oldEA = EA;
0E01 121272            LCALL   ?L?COM002C
   97:          EA = 0;
   98: 
   99:          FetchDeviceIdentifyIntoEp8();
  100:          bDevicePresent = 1;
0E04 D200              SETB    bDevicePresent
  101:          EA = oldEA;
0E06 A222              MOV     C,oldEA
0E08 92AF              MOV     EA,C
  102:          }
  103:       }
0E0A 22                RET     
0E0B         ?C0013?ATARESET:
  104:    else if (readATAPI_STATUS_REG())
0E0B 1201F6            LCALL   readATAPI_STATUS_REG
0E0E EF                MOV     A,R7
0E0F 6002              JZ      ?C0010?ATARESET
  105:       bDevicePresent = 1;
0E11 D200              SETB    bDevicePresent
  106: }
0E13         ?C0010?ATARESET:
0E13 22                RET     
----- FUNCTION detectSCSIvsATA (END) -------


----- FUNCTION ?L?COM0007 (BEGIN) -----
0E14 90E691            MOV     DPTR,#0E691H
0E17 7480              MOV     A,#080H
0E19 F0                MOVX    @DPTR,A
0E1A         ?L?COM0008:
0E1A 750807            MOV     sensePtr,#HIGH senseOk
0E1D 750934            MOV     sensePtr+01H,#LOW senseOk
0E20 D223              SETB    ?checkForMedia?BIT
0E22 12003E            LCALL   checkForMedia
0E25 7434              MOV     A,#LOW senseOk
0E27 22                RET     
----- FUNCTION ?L?COM0007 (END) -------


----- FUNCTION _readPIO8 (BEGIN) -----
 FILE: 'gpif.c'
  230: BYTE readPIO8(char addr)
  231: {
;---- Variable 'addr' assigned to Register 'R7' ----
  232:    BYTE retval;
0E28         ?C0026?GPIF:
  233: 
  234:    while (!gpifIdle());
0E28 E5BB              MOV     A,GPIFTRIG
0E2A 30E7FB            JNB     ACC.7,?C0026?GPIF
0E2D         ?C0027?GPIF:
  235: 
  236:    GPIFWFSELECT = (1 << 4);    // PIO read is waveform 1
0E2D 90E6C0            MOV     DPTR,#0E6C0H
0E30 7410              MOV     A,#010H
0E32 F0                MOVX    @DPTR,A
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 24


  237: 
  238:    // put out address of interest
  239: #if COMPACT_FLASH
  240:    if (bCompactFlash)
  241:       OUTATAPI = (addr | (~ATAPI_ADDR_MASK & ATAPI_IDLE_VALUE)) & ~CF_CE1_; // Drive CF_CE low
  242:    else
  243: #endif
  244:       OUTATAPI = (addr | (~ATAPI_ADDR_MASK & ATAPI_IDLE_VALUE));
0E33 EF                MOV     A,R7
0E34 4480              ORL     A,#080H
0E36 F580              MOV     IOA,A
  245: 
  246:    // trigger the GPIF
  247:    retval = XGPIFSGLDATLX;         // Single bus transaction on the GPIF
0E38 90E6F1            MOV     DPTR,#0E6F1H
0E3B E0                MOVX    A,@DPTR
0E3C FF                MOV     R7,A
;---- Variable 'retval' assigned to Register 'R7' ----
0E3D         ?C0028?GPIF:
  248: 
  249:    while (!gpifIdle());             // wait till GPIF is done before getting real data
0E3D E5BB              MOV     A,GPIFTRIG
0E3F 30E7FB            JNB     ACC.7,?C0028?GPIF
0E42         ?C0029?GPIF:
  250: 
  251:    retval = XGPIFSGLDATLNOX;        // get data from last GPIF transaction
0E42 90E6F2            MOV     DPTR,#0E6F2H
0E45 E0                MOVX    A,@DPTR
0E46 FF                MOV     R7,A
  252:    OUTATAPI = ATAPI_IDLE_VALUE;     // Clear the address/chip selects      
0E47 7580BE            MOV     IOA,#0BEH
  253: 
  254:     return(retval);
  255: }
0E4A 22                RET     
----- FUNCTION _readPIO8 (END) -------


----- FUNCTION writeATA_DRIVESEL_REG (BEGIN) -----
 FILE: 'ide.c'
  954: void writeATA_DRIVESEL_REG()
  955: {
  956:    writePIO8(ATA_DRIVESEL_REG, 0xe0 | ((BYTE)bMasterSlave << 4));
  957: }
0E4B F1B6              ACALL   ?L?COM002D
0E4D ACF0              MOV     R4,B
0E4F 44E0              ORL     A,#0E0H
0E51 FD                MOV     R5,A
0E52 7F2C              MOV     R7,#02CH
0E54 214D              AJMP    _writePIO8
----- FUNCTION writeATA_DRIVESEL_REG (END) -------


----- FUNCTION ?L?COM0009 (BEGIN) -----
0E56 E4                CLR     A
0E57 F50A              MOV     dwLBA,A
0E59 90F010            MOV     DPTR,#0F010H
0E5C E0                MOVX    A,@DPTR
0E

⌨️ 快捷键说明

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