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

📄 fx2_ata.cod

📁 Cy68013的应用——USB2.0接口转IDE、CF卡接口
💻 COD
📖 第 1 页 / 共 5 页
字号:
09D6 7F2A              MOV     R7,#02AH
09D8 314D              ACALL   _writePIO8
  939:       }
09DA         ?C0208?IDE:
  940: 
  941:    writePIO8(ATA_LBA_LSB_REG,  ((BYTE *) &dwLBA)[3]);    // LBA (7:0)
09DA E50D              MOV     A,dwLBA+03H
09DC F140              ACALL   ?L?COM002E
  942:    writePIO8(ATA_LBA_2SB_REG,  ((BYTE *) &dwLBA)[2]);    // LBA (15:8)
09DE E50C              MOV     A,dwLBA+02H
09E0 FD                MOV     R5,A
09E1 7F28              MOV     R7,#028H
09E3 314D              ACALL   _writePIO8
  943:    writePIO8(ATA_LBA_MSB_REG,  ((BYTE *) &dwLBA)[1]);    // LBA (23:16)
09E5 E50B              MOV     A,dwLBA+01H
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 6


09E7 FD                MOV     R5,A
09E8 7F2A              MOV     R7,#02AH
09EA 314D              ACALL   _writePIO8
  944: 
  945:    if (!bExtAddrSupport)
09EC 200412            JB      bExtAddrSupport,?C0209?IDE
  946:       {      
  947:       writePIO8(ATA_DRIVESEL_REG, ((BYTE *) &dwLBA)[0] | 0xe0 | ((BYTE)bMasterSlave << 4));
09EF F1B6              ACALL   ?L?COM002D
09F1 FF                MOV     R7,A
09F2 E50A              MOV     A,dwLBA
09F4 44E0              ORL     A,#0E0H
09F6 FD                MOV     R5,A
09F7 E5F0              MOV     A,B
09F9 FC                MOV     R4,A
09FA ED                MOV     A,R5
09FB 4F                ORL     A,R7
09FC FD                MOV     R5,A
09FD 7F2C              MOV     R7,#02CH
09FF 314D              ACALL   _writePIO8
  948:       }
0A01         ?C0209?IDE:
  949: 
  950:    dwLBA += sectorcount;
0A01 E4                CLR     A
0A02 FC                MOV     R4,A
0A03 FD                MOV     R5,A
0A04 E50D              MOV     A,dwLBA+03H
0A06 2569              ADD     A,sectorcount+01H
0A08 F50D              MOV     dwLBA+03H,A
0A0A E50C              MOV     A,dwLBA+02H
0A0C 3568              ADDC    A,sectorcount
0A0E F50C              MOV     dwLBA+02H,A
0A10 ED                MOV     A,R5
0A11 350B              ADDC    A,dwLBA+01H
0A13 F50B              MOV     dwLBA+01H,A
0A15 EC                MOV     A,R4
0A16 350A              ADDC    A,dwLBA
0A18 F50A              MOV     dwLBA,A
  951:    return sectorcount;
0A1A AE68              MOV     R6,sectorcount
0A1C AF69              MOV     R7,sectorcount+01H
  952: }
0A1E 22                RET     
----- FUNCTION stuffLBAandSector (END) -------


----- FUNCTION generalIDEInCommand (BEGIN) -----
 FILE: 'ide.c'
   70: bit generalIDEInCommand()
   71: {
   72:    BYTE cmd;
   73:    bit status;
   74: 
   75:    bShortPacketSent = 0;
0A1F C220              CLR     bShortPacketSent
   76:    
   77:    cmd = EP2FIFOBUF[0xf];  
0A21 90F00F            MOV     DPTR,#0F00FH
0A24 E0                MOVX    A,@DPTR
0A25 F55D              MOV     cmd,A
   78: 
   79:    switch (cmd)
0A27 1203B7            LCALL   ?C?CCASE
0A2A 0BAF              DW      ?C0037?IDE
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 7


0A2C 00                DB      00H
0A2D 0BC4              DW      ?C0041?IDE
0A2F 03                DB      03H
0A30 0BAF              DW      ?C0037?IDE
0A32 04                DB      04H
0A33 0B01              DW      ?C0017?IDE
0A35 08                DB      08H
0A36 0A5E              DW      ?C0002?IDE
0A38 12                DB      012H
0A39 0BA1              DW      ?C0033?IDE
0A3B 15                DB      015H
0A3C 0C97              DW      ?C0062?IDE
0A3E 1A                DB      01AH
0A3F 0C0A              DW      ?C0043?IDE
0A41 1B                DB      01BH
0A42 0C0A              DW      ?C0043?IDE
0A44 1E                DB      01EH
0A45 0B39              DW      ?C0026?IDE
0A47 23                DB      023H
0A48 0B39              DW      ?C0026?IDE
0A4A 25                DB      025H
0A4B 0B01              DW      ?C0017?IDE
0A4D 28                DB      028H
0A4E 0B12              DW      ?C0020?IDE
0A50 2B                DB      02BH
0A51 0B01              DW      ?C0017?IDE
0A53 2F                DB      02FH
0A54 0BA1              DW      ?C0033?IDE
0A56 55                DB      055H
0A57 0C97              DW      ?C0062?IDE
0A59 5A                DB      05AH
0A5A 0000              DW      00H
0A5C 0DAB              DW      ?C0081?IDE
   80:    {
   81:       // Minimum processing for a case in this switch statement:
   82:       case INQUIRY:
0A5E         ?C0002?IDE:
   83:       {
   84:          BYTE i;
   85:          
   86:          // relinquish control of the bulk buffer occupied by the CBW
   87:          EP2BCL = 0x80;     
0A5E D169              ACALL   ?L?COM000B
   88: 
   89:          waitForInBuffer();
0A60 F138              ACALL   waitForInBuffer
   90:          // CompactFlash uses a lot of local stuff
   91:          if (bCompactFlash)
0A62 300526            JNB     bCompactFlash,?C0003?IDE
   92:             {
   93:             AUTOPTRL2 = LSB(EP8FIFOBUF);
0A65 E4                CLR     A
0A66 F59E              MOV     AUTOPTRL2,A
   94: 
   95:             // Clear out the EP buffer
   96:             for (i = SCSI_IDENTIFY_LEN; i; i--)
0A68 755E2C            MOV     i,#02CH
0A6B         ?C0004?IDE:
   97:                XAUTODAT2 = 0;
0A6B 90E67C            MOV     DPTR,#0E67CH
0A6E E4                CLR     A
0A6F F0                MOVX    @DPTR,A
0A70 D55EF8            DJNZ    i,?C0004?IDE
0A73         ?C0005?IDE:
   98: 
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 8


   99:             // Load fields we use
  100:             EP8FIFOBUF[SCSI_INQUIRY_REMOVABLE_BYTE] |= SCSI_INQUIRY_REMOVABLE_BIT;
0A73 90FC01            MOV     DPTR,#0FC01H
0A76 E0                MOVX    A,@DPTR
0A77 4480              ORL     A,#080H
0A79 F0                MOVX    @DPTR,A
  101:             mymemmovexx(EP8FIFOBUF+SCSI_INQUIRY_MANUFACTURER, (void *)"Cypress Semi", sizeof("Cypress Semi"));
0A7A 7C07              MOV     R4,#HIGH 01000721H
0A7C 7D21              MOV     R5,#LOW 01000721H
0A7E 7B0D              MOV     R3,#0DH
0A80 7A00              MOV     R2,#00H
0A82 7F08              MOV     R7,#08H
0A84 7EFC              MOV     R6,#0FCH
0A86 120758            LCALL   _mymemmovexx
  102:             }
0A89 806C              SJMP    ?C0007?IDE
0A8B         ?C0003?IDE:
  103: 
  104:          else
  105:             {
  106:             SendDeviceIdentifyCommand();
0A8B F14E              ACALL   SendDeviceIdentifyCommand
  107: 
  108:             FetchDeviceIdentifyIntoEp8();
0A8D 121278            LCALL   FetchDeviceIdentifyIntoEp8
  109:    
  110:             // copy the IDENTIFY data into the top of EP8FIFOBUF
  111:             mymemmovexx(EP8FIFOBUF+256, EP8FIFOBUF, 256);
0A90 7B00              MOV     R3,#00H
0A92 7A01              MOV     R2,#01H
0A94 7D00              MOV     R5,#00H
0A96 7CFC              MOV     R4,#0FCH
0A98 7F00              MOV     R7,#00H
0A9A 7EFD              MOV     R6,#0FDH
0A9C 120758            LCALL   _mymemmovexx
  112:    
  113:             // clear out the bottom of EP8FIFOBUF.  This is where we are going to build
  114:             // the response to the IDENTIFY command.
  115:             AUTOPTRL2 = LSB(EP8FIFOBUF);
0A9F E4                CLR     A
0AA0 F59E              MOV     AUTOPTRL2,A
  116:             for (i = SCSI_IDENTIFY_LEN; i; i--)
0AA2 755E2C            MOV     i,#02CH
0AA5         ?C0008?IDE:
  117:                XAUTODAT2 = 0;
0AA5 90E67C            MOV     DPTR,#0E67CH
0AA8 E4                CLR     A
0AA9 F0                MOVX    @DPTR,A
0AAA D55EF8            DJNZ    i,?C0008?IDE
0AAD         ?C0009?IDE:
  118:    
  119:             // Place the fields that we need into the SCSI block
  120:             AUTOPTRL2 = LSB(EP8FIFOBUF+SCSI_INQUIRY_MANUFACTURER);
0AAD 759E08            MOV     AUTOPTRL2,#08H
  121:             for (i = 0; i < SCSI_INQUIRY_MANUFACTURER_LEN; i++)
0AB0 E4                CLR     A
0AB1 F55E              MOV     i,A
0AB3         ?C0011?IDE:
  122:                {
  123:                // swap bytes within words.  This is stored backwards!
  124:                XAUTODAT2 = EP8FIFOBUF[(ATAPI_INQUIRY_MANUFACTURER * 2 + (i ^ 1)) + 256];
0AB3 E55E              MOV     A,i
0AB5 6401              XRL     A,#01H
0AB7 2436              ADD     A,#036H
0AB9 F582              MOV     DPL,A
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 9


0ABB E4                CLR     A
0ABC 34FD              ADDC    A,#0FDH
0ABE F583              MOV     DPH,A
0AC0 E0                MOVX    A,@DPTR
0AC1 90E67C            MOV     DPTR,#0E67CH
0AC4 F0                MOVX    @DPTR,A
  125:                }
0AC5 055E              INC     i
0AC7 E55E              MOV     A,i
0AC9 B418E7            CJNE    A,#018H,?C0011?IDE
0ACC         ?C0012?IDE:
  126:             
  127:             EP8FIFOBUF[SCSI_INQUIRY_REVISION+1] = EP8FIFOBUF[(ATAPI_INQUIRY_REVISION * 2) + 256]+'0';
0ACC 90FD92            MOV     DPTR,#0FD92H
0ACF E0                MOVX    A,@DPTR
0AD0 2430              ADD     A,#030H
0AD2 90FC21            MOV     DPTR,#0FC21H
0AD5 F0                MOVX    @DPTR,A
  128:             EP8FIFOBUF[SCSI_INQUIRY_REVISION+3] = EP8FIFOBUF[(ATAPI_INQUIRY_REVISION * 2 +2) + 256]+'0';
0AD6 90FD94            MOV     DPTR,#0FD94H
0AD9 E0                MOVX    A,@DPTR
0ADA 2430              ADD     A,#030H
0ADC 90FC23            MOV     DPTR,#0FC23H
0ADF F0                MOVX    @DPTR,A
  129:             EP8FIFOBUF[SCSI_INQUIRY_REMOVABLE_BYTE] |= SCSI_INQUIRY_REMOVABLE_BIT & EP8FIFOBUF[(ATAPI_INQUIRY_REM
>> OVABLE_BYTE) + 256];
0AE0 90FC01            MOV     DPTR,#0FC01H
0AE3 C083              PUSH    DPH
0AE5 C082              PUSH    DPL
0AE7 E0                MOVX    A,@DPTR
0AE8 FF                MOV     R7,A
0AE9 90FD00            MOV     DPTR,#0FD00H
0AEC E0                MOVX    A,@DPTR
0AED 5480              ANL     A,#080H
0AEF FE                MOV     R6,A
0AF0 EF                MOV     A,R7
0AF1 4E                ORL     A,R6
0AF2 D082              POP     DPL
0AF4 D083              POP     DPH
0AF6 F0                MOVX    @DPTR,A
  130:             }
0AF7         ?C0007?IDE:
  131: 
  132:          EP8FIFOBUF[SCSI_INQUIRY_REVISION_LEN] = 0x1F;
0AF7 90FC04            MOV     DPTR,#0FC04H
0AFA 741F              MOV     A,#01FH
0AFC F0                MOVX    @DPTR,A
  133:          loadEP8BC(SCSI_IDENTIFY_LEN);
0AFD 7F2C              MOV     R7,#02CH
  134:          sensePtr = senseOk;
  135:          return(USBS_PASSED);
0AFF 8106              AJMP    ?C0263?IDE
  136:       }
  137:       
  138:       case READ_06:
  139:       case READ_10:
  140:       case VERIFY_10:
0B01         ?C0017?IDE:
  141:       {
  142:          sensePtr = senseOk;
0B01 D11A              ACALL   ?L?COM0008
0B03 B5090A            CJNE    A,sensePtr+01H,?C0018?IDE
0B06 7407              MOV     A,#HIGH senseOk
0B08 B50805            CJNE    A,sensePtr,?C0018?IDE
  143:          checkForMedia(1);
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 10


  144: 
  145:          if (sensePtr == senseOk)
  146:          {
  147:             return(ideReadCommand(cmd));   
0B0B AF5D              MOV     R7,cmd
0B0D 021087            LJMP    _ideReadCommand
  148:          }
0B10         ?C0018?IDE:
  149:          else
  150:          {
  151:             // relinquish control of the bulk buffer occupied by the CBW
  152:             EP2BCL = 0x80;     
  153:             
  154:             failedIn();         
  155:             return(USBS_FAILED);
0B10 8023              SJMP    ?C0264?IDE
  156:          }
  157:       }
  158:                 
  159:       case SEEK_10:
0B12         ?C0020?IDE:
  160:       {
  161:          sensePtr = senseOk;
0B12 D11A              ACALL   ?L?COM0008
0B14 6509              XRL     A,sensePtr+01H
0B16 7004              JNZ     ?C0241?IDE
0B18 7407              MOV     A,#HIGH senseOk
0B1A 6508              XRL     A,sensePtr
0B1C         ?C0241?IDE:
0B1C 7017              JNZ     ?C0021?IDE
  162:          checkForMedia(1);
  163: 
  164:          if (sensePtr == senseOk)
  165:             {
  166:             // Cannot just call readcommand because it aborts on no dataTransferLen.
  167:             IDEPrepareForXfer();

⌨️ 快捷键说明

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