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

📄 fx2_ata_revc.cod

📁 Cy68013的应用——USB2.0接口转IDE、CF卡接口
💻 COD
📖 第 1 页 / 共 5 页
字号:
  312:                (cmd == STOP_START_UNIT && ((options & 3) == 2)))           // STOP_START_UNIT(EJECT):
  313:                {
  314:                sensePtr = senseCantEject;
0C2D 750807            MOV     sensePtr,#HIGH senseCantEject
0C30 750946            MOV     sensePtr+01H,#LOW senseCantEject
  315:                return(USBS_FAILED);
0C33 D3                SETB    C
0C34 22                RET     
  316:                }
0C35         ?C0046?IDE:
  317:             else // start unit or other command we didn't consider -- should return okay.
  318:                {
  319:                sensePtr = senseOk;
  320:                return(USBS_PASSED);
0C35 A1A3              AJMP    ?C0269?IDE
  321:                }
  322:             }
0C37         ?C0045?IDE:
  323: 
  324:          sensePtr = senseOk;
0C37 D115              ACALL   ?L?COM0008
0C39 6509              XRL     A,sensePtr+01H
0C3B 7004              JNZ     ?C0245?IDE
0C3D 7407              MOV     A,#HIGH senseOk
0C3F 6508              XRL     A,sensePtr
0C41         ?C0245?IDE:
0C41 6002              JZ      ?C0050?IDE
  325:          checkForMedia(1);
  326:          if (sensePtr != senseOk)
  327:             return(USBS_FAILED);
0C43 D3                SETB    C
0C44 22                RET     
0C45         ?C0050?IDE:
  328: 
  329:          waitForBusyBit();
0C45 1173              ACALL   waitForBusyBit
  330:          if (cmd == PREVENT_ALLOW_MEDIUM_REMOVAL)
0C47 E55D              MOV     A,cmd
0C49 B41E0D            CJNE    A,#01EH,?C0051?IDE
  331:             {
  332:             if (options & 1)
0C4C E55E              MOV     A,options
0C4E 30E004            JNB     ACC.0,?C0052?IDE
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 16


  333:                writePIO8(ATA_COMMAND_REG, ATA_COMMAND_MEDIA_LOCK);
0C51 7DDE              MOV     R5,#0DEH
0C53 800E              SJMP    ?C0268?IDE
0C55         ?C0052?IDE:
  334:             else
  335:                writePIO8(ATA_COMMAND_REG, ATA_COMMAND_MEDIA_UNLOCK);
0C55 7DDF              MOV     R5,#0DFH
0C57         
  336:             }
0C57 800A              SJMP    ?C0268?IDE
0C59         ?C0051?IDE:
  337:          else      // STOP_START_UNIT:
  338:             if ((options & 3) == 2)
0C59 E55E              MOV     A,options
0C5B 5403              ANL     A,#03H
0C5D FF                MOV     R7,A
0C5E BF0204            CJNE    R7,#02H,?C0054?IDE
  339:                writePIO8(ATA_COMMAND_REG, ATA_COMMAND_MEDIA_EJECT);
0C61 7DED              MOV     R5,#0EDH
0C63         
0C63 3149              ACALL   ?L?COM000F
0C65         ?C0054?IDE:
  340: 
  341:          waitForBusyBit();
0C65 1173              ACALL   waitForBusyBit
  342: 
  343:          if (readATAPI_STATUS_REG() & ATAPI_STATUS_ERROR_BIT)
0C67 1201F6            LCALL   readATAPI_STATUS_REG
0C6A EF                MOV     A,R7
0C6B 30E023            JNB     ACC.0,?C0056?IDE
  344:             {
  345:             BYTE error = loadSensePtrFromErrorRegister(1);
0C6E D223              SETB    ?loadSensePtrFromErrorRegister?BIT
0C70 1213F2            LCALL   loadSensePtrFromErrorRegister
0C73 8F5F              MOV     error,R7
  346:             if (error & 4)  // command not supported -- Non removable media, return PASS
0C75 E55F              MOV     A,error
0C77 30E202            JNB     ACC.2,?C0057?IDE
  347:                {
  348:                sensePtr = senseOk;
0C7A         
  349:                return(USBS_PASSED);
0C7A A1A3              AJMP    ?C0269?IDE
  350:                }
0C7C         ?C0057?IDE:
  351:             else if ((error & 2) && (options & 3) == 2)
0C7C E55F              MOV     A,error
0C7E 30E10E            JNB     ACC.1,?C0058?IDE
0C81 E55E              MOV     A,options
0C83 5403              ANL     A,#03H
0C85 FF                MOV     R7,A
0C86 BF0206            CJNE    R7,#02H,?C0058?IDE
  352:                sensePtr = senseCantEject;
0C89 750807            MOV     sensePtr,#HIGH senseCantEject
0C8C 750946            MOV     sensePtr+01H,#LOW senseCantEject
0C8F         ?C0058?IDE:
  353:             return(USBS_FAILED);
0C8F D3                SETB    C
0C90 22                RET     
  354:             }
0C91         ?C0056?IDE:
  355:          else
  356:             return(USBS_PASSED);
0C91 C3                CLR     C
0C92 22                RET     
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 17


  357:          break;
  358:          }
  359: 
  360:       case MODE_SENSE_06:
  361:       case MODE_SENSE_10:
0C93         ?C0062?IDE:
  362:       {               
  363:          BYTE pagenum;
  364:          
  365:          pagenum = EP2FIFOBUF[CBW_DATA_START+2] & 0x3F; // identify page (see p.141 SCSI 2ed.)
0C93 90F011            MOV     DPTR,#0F011H
0C96 E0                MOVX    A,@DPTR
0C97 543F              ANL     A,#03FH
0C99 F55E              MOV     pagenum,A
  366:    
  367:          EP2BCL = 0x80; // relinquish control of the bulk buffer occupied by the CBW
0C9B D10F              ACALL   ?L?COM0007
0C9D 6509              XRL     A,sensePtr+01H
0C9F 7004              JNZ     ?C0246?IDE
0CA1 7407              MOV     A,#HIGH senseOk
0CA3 6508              XRL     A,sensePtr
0CA5         ?C0246?IDE:
0CA5 6002              JZ      ?C0063?IDE
  368: 
  369:          sensePtr = senseOk;
  370:          checkForMedia(1);
  371:          if (sensePtr != senseOk)
  372:             {
  373:             failedIn();
0CA7         
  374:             return(USBS_FAILED);
0CA7 A1AC              AJMP    ?C0271?IDE
  375:             }
0CA9         ?C0063?IDE:
  376: 
  377:          waitForInBuffer();
0CA9 F133              ACALL   waitForInBuffer
  378:          
  379:          if((pagenum != 0x05) && (pagenum != 0x3F)
0CAB E55E              MOV     A,pagenum
0CAD 6405              XRL     A,#05H
0CAF 6020              JZ      ?C0064?IDE
0CB1 E55E              MOV     A,pagenum
0CB3 643F              XRL     A,#03FH
0CB5 601A              JZ      ?C0064?IDE
0CB7 E55E              MOV     A,pagenum
0CB9 6401              XRL     A,#01H
0CBB 6014              JZ      ?C0064?IDE
0CBD E55E              MOV     A,pagenum
0CBF 6408              XRL     A,#08H
0CC1 600E              JZ      ?C0064?IDE
0CC3 E55E              MOV     A,pagenum
0CC5 641B              XRL     A,#01BH
0CC7 6008              JZ      ?C0064?IDE
  380:              && (pagenum != 0x01) && (pagenum != 0x08) && (pagenum != 0x1B))
  381:          { // only respond to requests for certain pages (the mandatory ones plus page 5)
  382:             sensePtr = senseInvalidFieldInCDB;
0CC9 750807            MOV     sensePtr,#HIGH senseInvalidFieldInCDB
0CCC 75092B            MOV     sensePtr+01H,#LOW senseInvalidFieldInCDB
  383:             failedIn();
0CCF         
  384:             return(USBS_FAILED);
0CCF A1AC              AJMP    ?C0271?IDE
  385:          }
0CD1         ?C0064?IDE:
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 18


  386:    
  387:          // If one of the supported pages is requested, return the 8 byte Mode Parameter Header
  388:          // plus a single 12 byte page. Only the Mode Data length (LSB) is significant in the
  389:          // Mode Parameter Header. It has a Vendor Specific Medium Type Code in byte 2, and
  390:          // a 1 bit WP Write Protect bit in byte 3 that are not initialized here.
  391:          // Pages 0x01, and 0x08 do not have significant data - they are spoofed.
  392:          // Page 0x1B has a TLUN field in byte 3 that is initialized to 1 (as per ISD).
  393:          // Page 0x05 does contain information that is needed to boot to HDD and CDROM.
  394:          // Page 0x3F, All Pages, is also responded to.
  395:          // The supported pages are (see INF-8070_1_3.pdf p37 Table 25):
  396:          //   case 0x01:                          // Read-Write Error Recovery Page
  397:          //   case 0x08:                          // Caching Page
  398:          //   case 0x05:                          // Flexible Disk Page: needed to boot from USB
  399:          //   case 0x1B:                          // Removable Block Access Capabilities Page
  400:          //   case 0x3F:                          // All (4) Pages
  401:          
  402:          // The format used is:
  403:          //    Mode parameter header (4 or 8 bytes)
  404:          //    Block descriptors (not supported)
  405:          //    Mode page
  406:          EP8FIFOBUF[0] = 0x00;
0CD1 90FC00            MOV     DPTR,#0FC00H
0CD4 E4                CLR     A
0CD5 F0                MOVX    @DPTR,A
  407:          mymemmovexx(EP8FIFOBUF+1, EP8FIFOBUF, 100-1); // clear buffer - <100 bytes in all responses
0CD6 7B63              MOV     R3,#063H
0CD8 FA                MOV     R2,A
0CD9 FD                MOV     R5,A
0CDA 7CFC              MOV     R4,#0FCH
0CDC 7F01              MOV     R7,#01H
0CDE 7EFC              MOV     R6,#0FCH
0CE0 120752            LCALL   _mymemmovexx
  408: 
  409:          AUTOPTRL2 = LSB(EP8FIFOBUF);
0CE3 E4                CLR     A
0CE4 F59E              MOV     AUTOPTRL2,A
  410:          if (cmd == MODE_SENSE_10)
0CE6 E55D              MOV     A,cmd
0CE8 B45A1A            CJNE    A,#05AH,?C0065?IDE
  411:             {
  412:             XAUTODAT2 = MSB(0);
0CEB 90E67C            MOV     DPTR,#0E67CH
0CEE E4                CLR     A
0CEF F0                MOVX    @DPTR,A
  413:             if (pagenum == 0x3f)
0CF0 E55E              MOV     A,pagenum
0CF2 B43F05            CJNE    A,#03FH,?C0066?IDE
  414:                XAUTODAT2 = LSB(8-2 + 12*4);      // return 12 bytes for each page
0CF5 7436              MOV     A,#036H
0CF7 F0                MOVX    @DPTR,A
0CF8 8006              SJMP    ?C0067?IDE
0CFA         ?C0066?IDE:
  415:             else
  416:                XAUTODAT2 = LSB(8-2 + 12*1);      // return 12 bytes for each page
0CFA 90E67C            MOV     DPTR,#0E67CH
0CFD 7412              MOV     A,#012H
0CFF F0                MOVX    @DPTR,A
0D00         ?C0067?IDE:
  417:             AUTOPTRL2 = LSB(EP8FIFOBUF) + 8;     // The rest of the header is zeroes.  Start the pages at byte 8.
>>      
0D00 759E08            MOV     AUTOPTRL2,#08H
  418:             }
0D03 8013              SJMP    ?C0068?IDE
0D05         ?C0065?IDE:
  419:          else
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 19


  420:             {
  421:             if (pagenum == 0x3f)
0D05 E55E              MOV     A,pagenum
0D07 90E67C            MOV     DPTR,#0E67CH
0D0A B43F05            CJNE    A,#03FH,?C0069?IDE
  422:                XAUTODAT2 = LSB(4-1 + 12*4);      // Header is 4 bytes long, data from each page is 12 bytes.
0D0D 7433              MOV     A,#033H
0D0F F0                MOVX    @DPTR,A
0D10 8003              SJMP    ?C0070?IDE
0D12         ?C0069?IDE:
  423:             else
  424:                XAUTODAT2 = LSB(4-1 + 12*1);      
0D12 740F              MOV     A,#0FH
0D14 F0                MOVX    @DPTR,A
0D15         ?C0070?IDE:
  425:             AUTOPTRL2 = LSB(EP8FIFOBUF) + 4;          
0D15 759E04            MOV     AUTOPTRL2,#04H
  426:             }
0D18         ?C0068?IDE:
  427: 
  428:          if((pagenum == 0x05) || (pagenum == 0x3F))
0D18 E55E              MOV     A,pagenum
0D1A 6405              XRL     A,#05H
0D1C 6006              JZ      ?C0072?IDE
0D1E E55E              MOV     A,pagenum
0D20 643F              XRL     A,#03FH
0D22 7036              JNZ     ?C0071?IDE
0D24         ?C0072?IDE:
  429:             {  
  430:             XAUTODAT2 = 5;               // fill out the page num - fields are all 0x0
0D24 90E67C            MOV     DPTR,#0E67CH
0D27 7405              MOV     A,#05H
0D29 F0                MOVX    @DPTR,A
  431:             XAUTODAT2 = 12-2;            // set individual Page Length -- return 12 for all commands
0D2A 740A              MOV     A,#0AH
0D2C F0                MOVX    @DPTR,A
  432: 
  433:             if(EZUSB_HIGHSPEED())
0D2D 90E680            MOV     DPTR,#0E680H
0D30 E0                MOVX    A,@DPTR
0D31 90E67C            MOV     DPTR,#0E67CH
0D34 30E706            JNB     ACC.7,?C0073?IDE
  434:                {
  435:                XAUTODAT2 = 0xFF;         // HS Transfer Rate (MSB) (field limited to 65Mb/Sec)
0D37 74FF              MOV     A,#0FFH
0D39 F0                MOVX    @DPTR,A
  436:                XAUTODAT2 = 0xFF;         // HS Transfer Rate (LSB)
0D3A F0                MOVX    @DPTR,A
  437:                }
0D3B 8006              SJMP    ?C0074?IDE
0D3D         ?C0073?IDE:
  438:             else
  439:                {
  440:                XAUTODAT2 = 0x2E;         // FS Transfer Rate (MSB) (12Mb/Sec) 
0D3D 742E              MOV     A,#02EH
0D3F F0                MOVX    @DPTR,A
  441:                XAUTODAT2 = 0xE0;         // FS Transfer Rate (LSB)
0D40 74E0              MOV     A,#0E0H
0D42 F0                MOVX    @DPTR,A
  442:                }
0D43         ?C0074?IDE:
  443:             XAUTODAT2 = ActiveLunConfigData.NumHeads;        // #Heads
0D43 90E67C            MOV     DPTR,#0E67CH
0D46 E530              MOV     A,ActiveLunConfigData+02H
0D48 F0                MOVX    @DPTR,A
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 20


  444:             XAUTODAT2 = ActiveLunConfigData.NumSectPerTrack; // #SectorsPerTrack
0D49 E531              MOV     A,ActiveLunConfigData+03H
0D4B F0                MOVX    @DPTR,A
  445:             XAUTODAT2 = (ATA_SECTOR_SIZE >>  8) & 0xff; // Data Bytes per sector (truncated)
0D4C 7402              MOV     A,#02H
0D4E F0                MOVX    @DPTR,A
  446:             XAUTODAT2 = (ATA_SECTOR_SIZE >>  0) & 0xff; // Data Bytes per sector
0D4F E4                CLR     A

⌨️ 快捷键说明

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