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

📄 fx2_ata_revc.cod

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


  466: 
  467:          if(pagenum == 0x8 || pagenum == 0x3f)
0D8A E55E              MOV     A,pagenum
0D8C 6408              XRL     A,#08H
0D8E 6005              JZ      ?C0080?IDE
0D90 E55E              MOV     A,pagenum
0D92 B43F07            CJNE    A,#03FH,?C0079?IDE
0D95         ?C0080?IDE:
  468:             {
  469:             XAUTODAT2 = 0x8;             // fill out the page num
0D95 90E67C            MOV     DPTR,#0E67CH
0D98 7408              MOV     A,#08H
0D9A F1BA              ACALL   ?L?COM0031
  470:             XAUTODAT2 = 12-2;            // set individual Page Length -- return 12 for all commands
  471:             AUTOPTRL2 += 10;              // 10 zeroes too.
  472:             }
0D9C         ?C0079?IDE:
  473: 
  474:          loadEP8BC(AUTOPTRL2);
0D9C AF9E              MOV     R7,AUTOPTRL2
0D9E 7E00              MOV     R6,#00H
0DA0         
0DA0 1217A6            LCALL   _loadEP8BC
  475:          sensePtr = senseOk;
0DA3         
0DA3 F1AA              ACALL   ?L?COM0022
  476:          return(USBS_PASSED);
0DA5 C3                CLR     C
0DA6 22                RET     
  477:       } // end case
  478: 
  479:       default:
0DA7         ?C0081?IDE:
  480:       {
  481:          // relinquish control of the bulk buffer occupied by the CBW
  482:          EP2BCL = 0x80;     
0DA7 D164              ACALL   ?L?COM000B
  483:          
  484:          sensePtr = senseInvalidOpcode;
0DA9 121795            LCALL   ?L?COM0026
  485:          failedIn();
0DAC         
0DAC 1116              ACALL   failedIn
  486:          return(USBS_FAILED);
0DAE D3                SETB    C
  487:       }
  488:    }
  489: }   
0DAF 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
0DB0 7F05              MOV     R7,#05H
0DB2 F18B              ACALL   ?L?COM001A
   61:    writeATA_DRIVESEL_REG();
0DB4 F15F              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();
0DB6 D146              ACALL   writeATA_DRIVESEL_REG
   67: 
   68:    writePIO8(ATAPI_NULL_REG, ~0xE0);      // Make sure that the bus is NOT still floating at 0xa0
0DB8 7D1F              MOV     R5,#01FH
0DBA 7CFF              MOV     R4,#0FFH
0DBC 7F3E              MOV     R7,#03EH
0DBE 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))))
0DC0 7F2C              MOV     R7,#02CH
0DC2 D123              ACALL   _readPIO8
0DC4 EF                MOV     A,R7
0DC5 54F0              ANL     A,#0F0H
0DC7 FF                MOV     R7,A
0DC8 A201              MOV     C,bMasterSlave
0DCA E4                CLR     A
0DCB 33                RLC     A
0DCC FE                MOV     R6,A
0DCD C4                SWAP    A
0DCE 54F0              ANL     A,#0F0H
0DD0 44E0              ORL     A,#0E0H
0DD2 B50703            CJNE    A,AR7,?C0008?ATARESET
0DD5 D3                SETB    C
0DD6 8001              SJMP    ?C0009?ATARESET
0DD8         ?C0008?ATARESET:
0DD8 C3                CLR     C
0DD9         ?C0009?ATARESET:
0DD9 5033              JNC     ?C0010?ATARESET
0DDB         ?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)
0DDB 7F2A              MOV     R7,#02AH
0DDD D123              ACALL   _readPIO8
0DDF BFEB09            CJNE    R7,#0EBH,?C0011?ATARESET
0DE2 7F28              MOV     R7,#028H
0DE4 D123              ACALL   _readPIO8
0DE6 BF1402            CJNE    R7,#014H,?C0011?ATARESET
   78:    {
   79:       bScsi = 1;
0DE9 D203              SETB    bScsi
   80:    }
0DEB         ?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.
0DEB 200103            JB      bMasterSlave,?C0012?ATARESET
   86:    {
   87:       bDevicePresent = 1;
0DEE D200              SETB    bDevicePresent
0DF0 22                RET     
   88:       return;
   89:    }
0DF1         ?C0012?ATARESET:
   90: 
   91:    if (bScsi)
0DF1 300312            JNB     bScsi,?C0013?ATARESET
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 23


   92:       {
   93:       SendDeviceIdentifyCommand();
0DF4 F149              ACALL   SendDeviceIdentifyCommand
   94:       if (readATAPI_STATUS_REG() & ATAPI_STATUS_DRDY_BIT)
0DF6 1201F6            LCALL   readATAPI_STATUS_REG
0DF9 EF                MOV     A,R7
0DFA 30E611            JNB     ACC.6,?C0010?ATARESET
   95:          {
   96:          bit oldEA = EA;
0DFD F1D8              ACALL   ?L?COM002C
   97:          EA = 0;
   98: 
   99:          FetchDeviceIdentifyIntoEp8();
  100:          bDevicePresent = 1;
0DFF D200              SETB    bDevicePresent
  101:          EA = oldEA;
0E01 A222              MOV     C,oldEA
0E03 92AF              MOV     EA,C
  102:          }
  103:       }
0E05 22                RET     
0E06         ?C0013?ATARESET:
  104:    else if (readATAPI_STATUS_REG())
0E06 1201F6            LCALL   readATAPI_STATUS_REG
0E09 EF                MOV     A,R7
0E0A 6002              JZ      ?C0010?ATARESET
  105:       bDevicePresent = 1;
0E0C D200              SETB    bDevicePresent
  106: }
0E0E         ?C0010?ATARESET:
0E0E 22                RET     
----- FUNCTION detectSCSIvsATA (END) -------


----- FUNCTION ?L?COM0007 (BEGIN) -----
0E0F 90E691            MOV     DPTR,#0E691H
0E12 7480              MOV     A,#080H
0E14 F0                MOVX    @DPTR,A
0E15         ?L?COM0008:
0E15 750807            MOV     sensePtr,#HIGH senseOk
0E18 75092E            MOV     sensePtr+01H,#LOW senseOk
0E1B D223              SETB    ?checkForMedia?BIT
0E1D 12003E            LCALL   checkForMedia
0E20 742E              MOV     A,#LOW senseOk
0E22 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;
0E23         ?C0026?GPIF:
  233: 
  234:    while (!gpifIdle());
0E23 E5BB              MOV     A,GPIFTRIG
0E25 30E7FB            JNB     ACC.7,?C0026?GPIF
0E28         ?C0027?GPIF:
  235: 
  236:    GPIFWFSELECT = (1 << 4);    // PIO read is waveform 1
0E28 90E6C0            MOV     DPTR,#0E6C0H
0E2B 7410              MOV     A,#010H
0E2D 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));
0E2E EF                MOV     A,R7
0E2F 4441              ORL     A,#041H
0E31 F580              MOV     IOA,A
  245: 
  246:    // trigger the GPIF
  247:    retval = XGPIFSGLDATLX;         // Single bus transaction on the GPIF
0E33 90E6F1            MOV     DPTR,#0E6F1H
0E36 E0                MOVX    A,@DPTR
0E37 FF                MOV     R7,A
;---- Variable 'retval' assigned to Register 'R7' ----
0E38         ?C0028?GPIF:
  248: 
  249:    while (!gpifIdle());             // wait till GPIF is done before getting real data
0E38 E5BB              MOV     A,GPIFTRIG
0E3A 30E7FB            JNB     ACC.7,?C0028?GPIF
0E3D         ?C0029?GPIF:
  250: 
  251:    retval = XGPIFSGLDATLNOX;        // get data from last GPIF transaction
0E3D 90E6F2            MOV     DPTR,#0E6F2H
0E40 E0                MOVX    A,@DPTR
0E41 FF                MOV     R7,A
  252:    OUTATAPI = ATAPI_IDLE_VALUE;     // Clear the address/chip selects      
0E42 75807F            MOV     IOA,#07FH
  253: 
  254:     return(retval);
  255: }
0E45 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: }
0E46 F1B1              ACALL   ?L?COM002D
0E48 ACF0              MOV     R4,B
0E4A 44E0              ORL     A,#0E0H
0E4C FD                MOV     R5,A
0E4D 7F2C              MOV     R7,#02CH
0E4F 214D              AJMP    _writePIO8
----- FUNCTION writeATA_DRIVESEL_REG (END) -------


----- FUNCTION ?L?COM0009 (BEGIN) -----
0E51 E4                CLR     A
0E52 F50A              MOV     dwLBA,A
0E54 90F010            MOV     DPTR,#0F010H
0E57 E0                MOVX    A,@DPT

⌨️ 快捷键说明

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