📄 fx2_ata_revc.cod
字号:
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 + -