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

📄 fx2_ata.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;
0C31 750807            MOV     sensePtr,#HIGH senseCantEject
0C34 75094C            MOV     sensePtr+01H,#LOW senseCantEject
  315:                return(USBS_FAILED);
0C37 D3                SETB    C
0C38 22                RET     
  316:                }
0C39         ?C0046?IDE:
  317:             else // start unit or other command we didn't consider -- should return okay.
  318:                {
  319:                sensePtr = senseOk;
  320:                return(USBS_PASSED);
0C39 A1A7              AJMP    ?C0269?IDE
  321:                }
  322:             }
0C3B         ?C0045?IDE:
  323: 
  324:          sensePtr = senseOk;
0C3B D11A              ACALL   ?L?COM0008
0C3D 6509              XRL     A,sensePtr+01H
0C3F 7004              JNZ     ?C0245?IDE
0C41 7407              MOV     A,#HIGH senseOk
0C43 6508              XRL     A,sensePtr
0C45         ?C0245?IDE:
0C45 6002              JZ      ?C0050?IDE
  325:          checkForMedia(1);
  326:          if (sensePtr != senseOk)
  327:             return(USBS_FAILED);
0C47 D3                SETB    C
0C48 22                RET     
0C49         ?C0050?IDE:
  328: 
  329:          waitForBusyBit();
0C49 1174              ACALL   waitForBusyBit
  330:          if (cmd == PREVENT_ALLOW_MEDIUM_REMOVAL)
0C4B E55D              MOV     A,cmd
0C4D B41E0D            CJNE    A,#01EH,?C0051?IDE
  331:             {
  332:             if (options & 1)
0C50 E55E              MOV     A,options
0C52 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);
0C55 7DDE              MOV     R5,#0DEH
0C57 800E              SJMP    ?C0268?IDE
0C59         ?C0052?IDE:
  334:             else
  335:                writePIO8(ATA_COMMAND_REG, ATA_COMMAND_MEDIA_UNLOCK);
0C59 7DDF              MOV     R5,#0DFH
0C5B         
  336:             }
0C5B 800A              SJMP    ?C0268?IDE
0C5D         ?C0051?IDE:
  337:          else      // STOP_START_UNIT:
  338:             if ((options & 3) == 2)
0C5D E55E              MOV     A,options
0C5F 5403              ANL     A,#03H
0C61 FF                MOV     R7,A
0C62 BF0204            CJNE    R7,#02H,?C0054?IDE
  339:                writePIO8(ATA_COMMAND_REG, ATA_COMMAND_MEDIA_EJECT);
0C65 7DED              MOV     R5,#0EDH
0C67         
0C67 3149              ACALL   ?L?COM000F
0C69         ?C0054?IDE:
  340: 
  341:          waitForBusyBit();
0C69 1174              ACALL   waitForBusyBit
  342: 
  343:          if (readATAPI_STATUS_REG() & ATAPI_STATUS_ERROR_BIT)
0C6B 1201F6            LCALL   readATAPI_STATUS_REG
0C6E EF                MOV     A,R7
0C6F 30E023            JNB     ACC.0,?C0056?IDE
  344:             {
  345:             BYTE error = loadSensePtrFromErrorRegister(1);
0C72 D223              SETB    ?loadSensePtrFromErrorRegister?BIT
0C74 121018            LCALL   loadSensePtrFromErrorRegister
0C77 8F5F              MOV     error,R7
  346:             if (error & 4)  // command not supported -- Non removable media, return PASS
0C79 E55F              MOV     A,error
0C7B 30E202            JNB     ACC.2,?C0057?IDE
  347:                {
  348:                sensePtr = senseOk;
0C7E         
  349:                return(USBS_PASSED);
0C7E A1A7              AJMP    ?C0269?IDE
  350:                }
0C80         ?C0057?IDE:
  351:             else if ((error & 2) && (options & 3) == 2)
0C80 E55F              MOV     A,error
0C82 30E10E            JNB     ACC.1,?C0058?IDE
0C85 E55E              MOV     A,options
0C87 5403              ANL     A,#03H
0C89 FF                MOV     R7,A
0C8A BF0206            CJNE    R7,#02H,?C0058?IDE
  352:                sensePtr = senseCantEject;
0C8D 750807            MOV     sensePtr,#HIGH senseCantEject
0C90 75094C            MOV     sensePtr+01H,#LOW senseCantEject
0C93         ?C0058?IDE:
  353:             return(USBS_FAILED);
0C93 D3                SETB    C
0C94 22                RET     
  354:             }
0C95         ?C0056?IDE:
  355:          else
  356:             return(USBS_PASSED);
0C95 C3                CLR     C
0C96 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:
0C97         ?C0062?IDE:
  362:       {               
  363:          BYTE pagenum;
  364:          
  365:          pagenum = EP2FIFOBUF[CBW_DATA_START+2] & 0x3F; // identify page (see p.141 SCSI 2ed.)
0C97 90F011            MOV     DPTR,#0F011H
0C9A E0                MOVX    A,@DPTR
0C9B 543F              ANL     A,#03FH
0C9D F55E              MOV     pagenum,A
  366:    
  367:          EP2BCL = 0x80; // relinquish control of the bulk buffer occupied by the CBW
0C9F D114              ACALL   ?L?COM0007
0CA1 6509              XRL     A,sensePtr+01H
0CA3 7004              JNZ     ?C0246?IDE
0CA5 7407              MOV     A,#HIGH senseOk
0CA7 6508              XRL     A,sensePtr
0CA9         ?C0246?IDE:
0CA9 6002              JZ      ?C0063?IDE
  368: 
  369:          sensePtr = senseOk;
  370:          checkForMedia(1);
  371:          if (sensePtr != senseOk)
  372:             {
  373:             failedIn();
0CAB         
  374:             return(USBS_FAILED);
0CAB A1AF              AJMP    ?C0271?IDE
  375:             }
0CAD         ?C0063?IDE:
  376: 
  377:          waitForInBuffer();
0CAD F138              ACALL   waitForInBuffer
  378:          
  379:          if((pagenum != 0x05) && (pagenum != 0x3F)
0CAF E55E              MOV     A,pagenum
0CB1 6405              XRL     A,#05H
0CB3 6020              JZ      ?C0064?IDE
0CB5 E55E              MOV     A,pagenum
0CB7 643F              XRL     A,#03FH
0CB9 601A              JZ      ?C0064?IDE
0CBB E55E              MOV     A,pagenum
0CBD 6401              XRL     A,#01H
0CBF 6014              JZ      ?C0064?IDE
0CC1 E55E              MOV     A,pagenum
0CC3 6408              XRL     A,#08H
0CC5 600E              JZ      ?C0064?IDE
0CC7 E55E              MOV     A,pagenum
0CC9 641B              XRL     A,#01BH
0CCB 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;
0CCD 750807            MOV     sensePtr,#HIGH senseInvalidFieldInCDB
0CD0 750931            MOV     sensePtr+01H,#LOW senseInvalidFieldInCDB
  383:             failedIn();
0CD3         
  384:             return(USBS_FAILED);
0CD3 A1AF              AJMP    ?C0271?IDE
  385:          }
0CD5         ?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;
0CD5 90FC00            MOV     DPTR,#0FC00H
0CD8 E4                CLR     A
0CD9 F0                MOVX    @DPTR,A
  407:          mymemmovexx(EP8FIFOBUF+1, EP8FIFOBUF, 100-1); // clear buffer - <100 bytes in all responses
0CDA 7B63              MOV     R3,#063H
0CDC FA                MOV     R2,A
0CDD FD                MOV     R5,A
0CDE 7CFC              MOV     R4,#0FCH
0CE0 7F01              MOV     R7,#01H
0CE2 7EFC              MOV     R6,#0FCH
0CE4 120758            LCALL   _mymemmovexx
  408: 
  409:          AUTOPTRL2 = LSB(EP8FIFOBUF);
0CE7 E4                CLR     A
0CE8 F59E              MOV     AUTOPTRL2,A
  410:          if (cmd == MODE_SENSE_10)
0CEA E55D              MOV     A,cmd
0CEC B45A1A            CJNE    A,#05AH,?C0065?IDE
  411:             {
  412:             XAUTODAT2 = MSB(0);
0CEF 90E67C            MOV     DPTR,#0E67CH
0CF2 E4                CLR     A
0CF3 F0                MOVX    @DPTR,A
  413:             if (pagenum == 0x3f)
0CF4 E55E              MOV     A,pagenum
0CF6 B43F05            CJNE    A,#03FH,?C0066?IDE
  414:                XAUTODAT2 = LSB(8-2 + 12*4);      // return 12 bytes for each page
0CF9 7436              MOV     A,#036H
0CFB F0                MOVX    @DPTR,A
0CFC 8006              SJMP    ?C0067?IDE
0CFE         ?C0066?IDE:
  415:             else
  416:                XAUTODAT2 = LSB(8-2 + 12*1);      // return 12 bytes for each page
0CFE 90E67C            MOV     DPTR,#0E67CH
0D01 7412              MOV     A,#012H
0D03 F0                MOVX    @DPTR,A
0D04         ?C0067?IDE:
  417:             AUTOPTRL2 = LSB(EP8FIFOBUF) + 8;     // The rest of the header is zeroes.  Start the pages at byte 8.
>>      
0D04 759E08            MOV     AUTOPTRL2,#08H
  418:             }
0D07 8013              SJMP    ?C0068?IDE
0D09         ?C0065?IDE:
  419:          else
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 19


  420:             {
  421:             if (pagenum == 0x3f)
0D09 E55E              MOV     A,pagenum
0D0B 90E67C            MOV     DPTR,#0E67CH
0D0E 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.
0D11 7433              MOV     A,#033H
0D13 F0                MOVX    @DPTR,A
0D14 8003              SJMP    ?C0070?IDE
0D16         ?C0069?IDE:
  423:             else
  424:                XAUTODAT2 = LSB(4-1 + 12*1);      
0D16 740F              MOV     A,#0FH
0D18 F0                MOVX    @DPTR,A
0D19         ?C0070?IDE:
  425:             AUTOPTRL2 = LSB(EP8FIFOBUF) + 4;          
0D19 759E04            MOV     AUTOPTRL2,#04H
  426:             }
0D1C         ?C0068?IDE:
  427: 
  428:          if((pagenum == 0x05) || (pagenum == 0x3F))
0D1C E55E              MOV     A,pagenum
0D1E 6405              XRL     A,#05H
0D20 6006              JZ      ?C0072?IDE
0D22 E55E              MOV     A,pagenum
0D24 643F              XRL     A,#03FH
0D26 7036              JNZ     ?C0071?IDE
0D28         ?C0072?IDE:
  429:             {  
  430:             XAUTODAT2 = 5;               // fill out the page num - fields are all 0x0
0D28 90E67C            MOV     DPTR,#0E67CH
0D2B 7405              MOV     A,#05H
0D2D F0                MOVX    @DPTR,A
  431:             XAUTODAT2 = 12-2;            // set individual Page Length -- return 12 for all commands
0D2E 740A              MOV     A,#0AH
0D30 F0                MOVX    @DPTR,A
  432: 
  433:             if(EZUSB_HIGHSPEED())
0D31 90E680            MOV     DPTR,#0E680H
0D34 E0                MOVX    A,@DPTR
0D35 90E67C            MOV     DPTR,#0E67CH
0D38 30E706            JNB     ACC.7,?C0073?IDE
  434:                {
  435:                XAUTODAT2 = 0xFF;         // HS Transfer Rate (MSB) (field limited to 65Mb/Sec)
0D3B 74FF              MOV     A,#0FFH
0D3D F0                MOVX    @DPTR,A
  436:                XAUTODAT2 = 0xFF;         // HS Transfer Rate (LSB)
0D3E F0                MOVX    @DPTR,A
  437:                }
0D3F 8006              SJMP    ?C0074?IDE
0D41         ?C0073?IDE:
  438:             else
  439:                {
  440:                XAUTODAT2 = 0x2E;         // FS Transfer Rate (MSB) (12Mb/Sec) 
0D41 742E              MOV     A,#02EH
0D43 F0                MOVX    @DPTR,A
  441:                XAUTODAT2 = 0xE0;         // FS Transfer Rate (LSB)
0D44 74E0              MOV     A,#0E0H
0D46 F0                MOVX    @DPTR,A
  442:                }
0D47         ?C0074?IDE:
  443:             XAUTODAT2 = ActiveLunConfigData.NumHeads;        // #Heads
0D47 90E67C            MOV     DPTR,#0E67CH
0D4A E530              MOV     A,ActiveLunConfigData+02H
0D4C F0                MOVX    @DPTR,A
LX51 LINKER/LOCATER V3.30                                                             08/23/2002  14:36:35  PAGE 20


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

⌨️ 快捷键说明

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