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

📄 fx2_ata.cod

📁 Cy68013的应用——USB2.0接口转IDE、CF卡接口
💻 COD
📖 第 1 页 / 共 5 页
字号:
LX51 LINKER/LOCATER V3.30                                                               08/23/2002  14:36:35  PAGE 1





ASSEMBLER CODE PACKING OF MODULE:  fx2_ata (DSCR)


000B 021BF5            LJMP    01BF5H
0033 801A              SJMP    0100004FH
----- FUNCTION checkForMedia (BEGIN) -----
 FILE: 'ide.c'
 1032: bit checkForMedia(bit commandProcessing)
 1033: {
 1034:    #if COMPACT_FLASH
 1035:    // Check for new media every time, not just when the last command addressed a CF
 1036:    // If there's no media, just set the noFlashMedia flag.  If the host tries to execute
 1037:    // a command w/o media, we report "no media".
 1038:    // On the transition from no media to media, we must wait until the host tries to 
 1039:    // send a command, then report "media changed".
 1040:    if (OUTATAPI & CF_DETECT_)
 1041:       {
 1042:       noFlashMedia = 1;
 1043:       }
 1044: 
 1045:    if (bCompactFlash && commandProcessing)
 1046:       {
 1047:       // If there's no media, the noMedia flag will be set above.  Just load sensePtr and return.
 1048:       // We cannot do this above because we the CF only owns the sensePtr when its LUN is selected.
 1049:       if (OUTATAPI & CF_DETECT_)
 1050:          {
 1051:          sensePtr = senseNoMedia;
 1052:          return (0);   
 1053:          }
 1054:       else  // CF detected case
 1055:          {
 1056:          // If the noFlashMedia flag is set, we're transitioning from no media to media inserted.
 1057:          if (noFlashMedia)
 1058:             {
 1059:             //bFirstTime = 1;         // Force hard reset, no matter what
 1060:             //resetATAPIDevice();
 1061:             cfHardwareReset();
 1062: 
 1063:             ATAPIIdDevice();        // Identify the device
 1064: 
 1065:             // move the drive identification stuff to LUN0.  Compact flash is always LUN0.
 1066:             LunBits[0] = ActiveLunBits;
 1067:             mymemmove((BYTE *)&DeviceConfigData[0],(BYTE *)&ActiveLunConfigData, sizeof(DEVICE_CONFIG_DATA));
 1068:             sensePtr = senseMediaChanged;
 1069:             noFlashMedia = 0;
 1070:             return (0);       // 0 will force the code through the error path.
 1071:             }
 1072:          return (1);
 1073:          }
 1074:       }
 1075:    else
 1076:    #endif
 1077:       return(1);
003E D3                SETB    C
 1078: }
003F 22                RET     
----- FUNCTION checkForMedia (END) -------


----- FUNCTION resume_isr (BEGIN) -----
 FILE: 'fw.c'
  494: void resume_isr(void) interrupt WKUP_VECT
  495: {
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 2


  496:    EZUSB_CLEAR_RSMIRQ();
004F 53D8EF            ANL     EICON,#0EFH
  497: }
0052 32                RETI    
----- FUNCTION resume_isr (END) -------


----- FUNCTION readATAPI_STATUS_REG (BEGIN) -----
 FILE: 'gpif.c'
  224: BYTE readATAPI_STATUS_REG()
  225: {
  226:    return(readPIO8(ATAPI_STATUS_REG));
  227: }
01F6 7F2E              MOV     R7,#02EH
01F8 020E28            LJMP    _readPIO8
----- FUNCTION readATAPI_STATUS_REG (END) -------


----- FUNCTION resetATAPIDevice (BEGIN) -----
 FILE: 'atareset.c'
   21: void resetATAPIDevice()
   22: {
   23: 
   24:    sensePtr = senseDeviceReset;
0916 750807            MOV     sensePtr,#HIGH senseDeviceReset
0919 750952            MOV     sensePtr+01H,#LOW senseDeviceReset
   25: 
   26:    if (bFirstTime)
091C 301907            JNB     bFirstTime,?C0001?ATARESET
   27:       EZUSB_Delay(DELAY_AFTER_POWERUP);            // Wait for stable power -- Sony CDU4811 and Maxtor 34098 (40G
>> ) are good tests for this
091F 7FD0              MOV     R7,#0D0H
0921 7E07              MOV     R6,#07H
0923 12065C            LCALL   _EZUSB_Delay
0926         ?C0001?ATARESET:
   28:    
   29: 
   30:    /////////////////////////////////////////////////////////////////////////////////////
   31:    // Perform hardware reset ONCE on reset, then obey the skip pin reset flag
   32:    if ((bFirstTime) || !(SKIP_PIN_RESET))
0926 30190D            JNB     bFirstTime,?C0002?ATARESET
0929         ?C0003?ATARESET:
   33:    {
   34:       hardwareReset();
0929 F1E4              ACALL   hardwareReset
   35:       bFirstTime = 0;
092B C219              CLR     bFirstTime
   36:       EZUSB_Delay(90);            // Mitsumi CR-4808TE(CYSD007) is a good test for this number.
092D 7F5A              MOV     R7,#05AH
092F 7E00              MOV     R6,#00H
0931 12065C            LCALL   _EZUSB_Delay
   37:       // give devices a chance to recover after ATA reset
   38:    }
0934 800C              SJMP    ?C0004?ATARESET
0936         ?C0002?ATARESET:
   39:     
   40:    /////////////////////////////////////////////////////////////////////////////////////
   41:    // Perform software reset and retest for SCSI vs ATA
   42:    else if (SRST_ENABLE)
   43:    {
   44:       writePIO8(ATAPI_CONTROL_REG, ATAPI_CONTROL_REG_SOFT_RESET);
0936 7D04              MOV     R5,#04H
0938 7C00              MOV     R4,#00H
093A 7F1C              MOV     R7,#01CH
093C 314D              ACALL   _writePIO8
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 3


   45:       EZUSB_Delay(50);            
093E 7F32              MOV     R7,#032H
0940 F190              ACALL   ?L?COM001A
   46:       writePIO8(ATAPI_CONTROL_REG, 0);
   47:    }
0942         ?C0004?ATARESET:
   48:    EZUSB_Delay(DELAY_AFTER_RESET);
0942 7FE8              MOV     R7,#0E8H
0944 7E03              MOV     R6,#03H
0946 02065C            LJMP    _EZUSB_Delay
----- FUNCTION resetATAPIDevice (END) -------


----- FUNCTION ?L?COM000F (BEGIN) -----
0949 7C00              MOV     R4,#00H
094B 7F2E              MOV     R7,#02EH
----- FUNCTION _writePIO8 (BEGIN) -----
 FILE: 'gpif.c'
  149: void writePIO8(char addr, WORD indata)
  150: {
;---- Variable 'indata' assigned to Register 'R4/R5' ----
;---- Variable 'addr' assigned to Register 'R7' ----
  151: 
094D         ?C0011?GPIF:
  152:    // make sure GPIF is not busy
  153:     while (!gpifIdle())
094D E5BB              MOV     A,GPIFTRIG
094F 30E7FB            JNB     ACC.7,?C0011?GPIF
  154:         {
  155:         }
0952         ?C0012?GPIF:
  156: 
  157:    GPIFWFSELECT = 0;    // PIO write is waveform 0
0952 90E6C0            MOV     DPTR,#0E6C0H
0955 E4                CLR     A
0956 F0                MOVX    @DPTR,A
  158: 
  159:    // Write the address/chip selects
  160: #if COMPACT_FLASH
  161:    if (bCompactFlash)
  162:       OUTATAPI = (addr | (~ATAPI_ADDR_MASK & ATAPI_IDLE_VALUE)) & ~CF_CE1_; // Drive CF_CE low
  163:    else
  164: #endif
  165:       OUTATAPI = (addr | (~ATAPI_ADDR_MASK & ATAPI_IDLE_VALUE));
0957 EF                MOV     A,R7
0958 4480              ORL     A,#080H
095A F580              MOV     IOA,A
  166: 
  167:     // trigger the GPIF
  168: //    if (EP2FIFOCFG & bmWORDWIDE)
  169:       XGPIFSGLDATH = MSB(indata);                       // Single bus transaction on the GPIF
095C EC                MOV     A,R4
095D 90E6F0            MOV     DPTR,#0E6F0H
0960 F0                MOVX    @DPTR,A
  170:     XGPIFSGLDATLX = LSB(indata);                   // Single bus transaction on the GPIF
0961 ED                MOV     A,R5
0962 A3                INC     DPTR
0963 F0                MOVX    @DPTR,A
0964         ?C0013?GPIF:
  171: 
  172:    // make sure GPIF is not busy
  173:     while (!gpifIdle())
0964 E5BB              MOV     A,GPIFTRIG
0966 30E7FB            JNB     ACC.7,?C0013?GPIF
  174:         {
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 4


  175:         }
0969         ?C0014?GPIF:
  176: 
  177:     // Clear the address/chip selects
  178:     OUTATAPI = ATAPI_IDLE_VALUE;
0969 7580BE            MOV     IOA,#0BEH
  179: 
  180: }   
096C 22                RET     
----- FUNCTION _writePIO8 (END) -------


----- FUNCTION stuffLBAandSector (BEGIN) -----
 FILE: 'ide.c'
  907: WORD stuffLBAandSector(bit readWrite)      // Stuff the LBA registers
  908: {
  909:    WORD sectorcount;
  910: 
  911:    writeATA_DRIVESEL_REG();
096D D14B              ACALL   writeATA_DRIVESEL_REG
  912: 
  913:    // First stuff the length register (number of sectors to read)
  914:    if (dataTransferLenMSW & 0xfffe)
096F E553              MOV     A,dataTransferLen+01H
0971 54FE              ANL     A,#0FEH
0973 4552              ORL     A,dataTransferLen
0975 6015              JZ      ?C0202?IDE
  915:    {
  916:       if (bExtAddrSupport)
0977 300408            JNB     bExtAddrSupport,?C0203?IDE
  917:          writePIO8(ATA_SECTOR_COUNT_REG, 1);     // if (bExtAddrSupport) we need to stuff the MSB
097A 7D01              MOV     R5,#01H
097C 7C00              MOV     R4,#00H
097E 7F24              MOV     R7,#024H
0980 314D              ACALL   _writePIO8
0982         ?C0203?IDE:
  918:       writePIO8(ATA_SECTOR_COUNT_REG, 0);     // 0 means 256 blocks of 512 bytes -- Max drive xfer, max TC
0982 F147              ACALL   ?L?COM002F
  919:       sectorcount = 0x100;
0984 756801            MOV     sectorcount,#01H
0987 756900            MOV     sectorcount+01H,#00H
  920:    }
098A 803D              SJMP    ?C0204?IDE
098C         ?C0202?IDE:
  921:    else
  922:    {
  923:       // Round sectorcount up for reads, down for writes
  924:       if (readWrite)
098C 302316            JNB     readWrite,?C0205?IDE
  925:          sectorcount = (dataTransferLenLSW + ATA_SECTOR_SIZE-1)/ATA_SECTOR_SIZE + (dataTransferLenMSW & 1) * 0x80
>> ;
098F F17B              ACALL   ?L?COM0030
0991         ?C0260?IDE:
0991 C3                CLR     C
0992 33                RLC     A
0993 CE                XCH     A,R6
0994 33                RLC     A
0995 CE                XCH     A,R6
0996 D8F9              DJNZ    R0,?C0260?IDE
0998 FD                MOV     R5,A
0999 AC06              MOV     R4,AR6
099B E555              MOV     A,dataTransferLen+03H
099D 24FF              ADD     A,#0FFH
099F E554              MOV     A,dataTransferLen+02H
09A1 3401              ADDC    A,#01H
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 5


09A3 800E              SJMP    ?C0283?IDE
09A5         ?C0205?IDE:
  926:       else
  927:          sectorcount = (dataTransferLenLSW)/ATA_SECTOR_SIZE + (dataTransferLenMSW & 1) * 0x80;
09A5 F17B              ACALL   ?L?COM0030
09A7         ?C0261?IDE:
09A7 C3                CLR     C
09A8 33                RLC     A
09A9 CE                XCH     A,R6
09AA 33                RLC     A
09AB CE                XCH     A,R6
09AC D8F9              DJNZ    R0,?C0261?IDE
09AE FD                MOV     R5,A
09AF AC06              MOV     R4,AR6
09B1 E554              MOV     A,dataTransferLen+02H
09B3         
09B3 C3                CLR     C
09B4 13                RRC     A
09B5 2D                ADD     A,R5
09B6 F569              MOV     sectorcount+01H,A
09B8 E4                CLR     A
09B9 3C                ADDC    A,R4
09BA F568              MOV     sectorcount,A
09BC         ?C0206?IDE:
  928: 
  929:       if (bExtAddrSupport)
09BC 300402            JNB     bExtAddrSupport,?C0207?IDE
  930:          writePIO8(ATA_SECTOR_COUNT_REG, 0);      // for extended addressing
09BF F147              ACALL   ?L?COM002F
09C1         ?C0207?IDE:
  931:       writePIO8(ATA_SECTOR_COUNT_REG, sectorcount);       // divide len into blocks
09C1 AD69              MOV     R5,sectorcount+01H
09C3 AC68              MOV     R4,sectorcount
09C5 7F24              MOV     R7,#024H
09C7 314D              ACALL   _writePIO8
  932:    }
09C9         ?C0204?IDE:
  933: 
  934:    if (bExtAddrSupport)
09C9 30040E            JNB     bExtAddrSupport,?C0208?IDE
  935:       {
  936:       writePIO8(ATA_LBA_LSB_REG,  ((BYTE *) &dwLBA)[0]);    // LBA (31:24)
09CC E50A              MOV     A,dwLBA
09CE F140              ACALL   ?L?COM002E
  937:       writePIO8(ATA_LBA_2SB_REG,  0);                       // LBA (39:32)
09D0 E4                CLR     A
09D1 FD                MOV     R5,A
09D2 7F28              MOV     R7,#028H
09D4 314D              ACALL   _writePIO8
  938:       writePIO8(ATA_LBA_MSB_REG,  0);                       // LBA (47:40)

⌨️ 快捷键说明

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