📄 fx2_ata.cod
字号:
0D54 F0 MOVX @DPTR,A
447: XAUTODAT2 = ActiveLunConfigData.NumCylindersMSB; // #Cyl MSB
0D55 E52E MOV A,ActiveLunConfigData
0D57 F0 MOVX @DPTR,A
448: XAUTODAT2 = ActiveLunConfigData.NumCylindersLSB; // #Cyl LSB
0D58 E52F MOV A,ActiveLunConfigData+01H
0D5A F0 MOVX @DPTR,A
449: XAUTODAT2 = 0;
0D5B E4 CLR A
0D5C F0 MOVX @DPTR,A
450: XAUTODAT2 = 0;
0D5D F0 MOVX @DPTR,A
451: }
0D5E ?C0071?IDE:
452: if(pagenum == 0x1B || pagenum == 0x3f)
0D5E E55E MOV A,pagenum
0D60 641B XRL A,#01BH
0D62 6005 JZ ?C0076?IDE
0D64 E55E MOV A,pagenum
0D66 B43F13 CJNE A,#03FH,?C0075?IDE
0D69 ?C0076?IDE:
453: {
454: XAUTODAT2 = 0x1b; // fill out the page num
0D69 90E67C MOV DPTR,#0E67CH
0D6C 741B MOV A,#01BH
0D6E F0 MOVX @DPTR,A
455: XAUTODAT2 = 12-2; // set individual Page Length -- return 12 for all commands
0D6F 740A MOV A,#0AH
0D71 F0 MOVX @DPTR,A
456: XAUTODAT2 = 0;
0D72 E4 CLR A
0D73 F0 MOVX @DPTR,A
457: XAUTODAT2 = 0x01; // set TLUN = 1 for page 0x1B
0D74 04 INC A
0D75 F0 MOVX @DPTR,A
458: AUTOPTRL2 += 8; // 8 zeroes too.
0D76 7408 MOV A,#08H
0D78 259E ADD A,AUTOPTRL2
0D7A F59E MOV AUTOPTRL2,A
459: }
0D7C ?C0075?IDE:
460: if(pagenum == 0x1 || pagenum == 0x3f)
0D7C E55E MOV A,pagenum
0D7E 6401 XRL A,#01H
0D80 6005 JZ ?C0078?IDE
0D82 E55E MOV A,pagenum
0D84 B43F07 CJNE A,#03FH,?C0077?IDE
0D87 ?C0078?IDE:
461: {
462: XAUTODAT2 = 0x1; // fill out the page num
0D87 90E67C MOV DPTR,#0E67CH
0D8A 7401 MOV A,#01H
0D8C F1BF ACALL ?L?COM0031
463: XAUTODAT2 = 12-2; // set individual Page Length -- return 12 for all commands
464: AUTOPTRL2 += 10; // 10 zeroes too.
465: }
0D8E ?C0077?IDE:
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 21
466:
467: if(pagenum == 0x8 || pagenum == 0x3f)
0D8E E55E MOV A,pagenum
0D90 6408 XRL A,#08H
0D92 6005 JZ ?C0080?IDE
0D94 E55E MOV A,pagenum
0D96 B43F07 CJNE A,#03FH,?C0079?IDE
0D99 ?C0080?IDE:
468: {
469: XAUTODAT2 = 0x8; // fill out the page num
0D99 90E67C MOV DPTR,#0E67CH
0D9C 7408 MOV A,#08H
0D9E F1BF ACALL ?L?COM0031
470: XAUTODAT2 = 12-2; // set individual Page Length -- return 12 for all commands
471: AUTOPTRL2 += 10; // 10 zeroes too.
472: }
0DA0 ?C0079?IDE:
473:
474: loadEP8BC(AUTOPTRL2);
0DA0 AF9E MOV R7,AUTOPTRL2
0DA2 7E00 MOV R6,#00H
0DA4
0DA4 121799 LCALL _loadEP8BC
475: sensePtr = senseOk;
0DA7
0DA7 F1AF ACALL ?L?COM0022
476: return(USBS_PASSED);
0DA9 C3 CLR C
0DAA 22 RET
477: } // end case
478:
479: default:
0DAB ?C0081?IDE:
480: {
481: // relinquish control of the bulk buffer occupied by the CBW
482: EP2BCL = 0x80;
0DAB D169 ACALL ?L?COM000B
483:
484: sensePtr = senseInvalidOpcode;
0DAD F1DD ACALL ?L?COM0026
485: failedIn();
0DAF
0DAF 1207F7 LCALL failedIn
486: return(USBS_FAILED);
0DB2 D3 SETB C
487: }
488: }
489: }
0DB3 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
0DB4 7F05 MOV R7,#05H
0DB6 F190 ACALL ?L?COM001A
61: writeATA_DRIVESEL_REG();
0DB8 F164 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();
0DBA D14B ACALL writeATA_DRIVESEL_REG
67:
68: writePIO8(ATAPI_NULL_REG, ~0xE0); // Make sure that the bus is NOT still floating at 0xa0
0DBC 7D1F MOV R5,#01FH
0DBE 7CFF MOV R4,#0FFH
0DC0 7F3E MOV R7,#03EH
0DC2 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))))
0DC4 7F2C MOV R7,#02CH
0DC6 D128 ACALL _readPIO8
0DC8 EF MOV A,R7
0DC9 54F0 ANL A,#0F0H
0DCB FF MOV R7,A
0DCC A201 MOV C,bMasterSlave
0DCE E4 CLR A
0DCF 33 RLC A
0DD0 FE MOV R6,A
0DD1 C4 SWAP A
0DD2 54F0 ANL A,#0F0H
0DD4 44E0 ORL A,#0E0H
0DD6 B50703 CJNE A,AR7,?C0008?ATARESET
0DD9 D3 SETB C
0DDA 8001 SJMP ?C0009?ATARESET
0DDC ?C0008?ATARESET:
0DDC C3 CLR C
0DDD ?C0009?ATARESET:
0DDD 5034 JNC ?C0010?ATARESET
0DDF ?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)
0DDF 7F2A MOV R7,#02AH
0DE1 D128 ACALL _readPIO8
0DE3 BFEB09 CJNE R7,#0EBH,?C0011?ATARESET
0DE6 7F28 MOV R7,#028H
0DE8 D128 ACALL _readPIO8
0DEA BF1402 CJNE R7,#014H,?C0011?ATARESET
78: {
79: bScsi = 1;
0DED D203 SETB bScsi
80: }
0DEF ?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.
0DEF 200103 JB bMasterSlave,?C0012?ATARESET
86: {
87: bDevicePresent = 1;
0DF2 D200 SETB bDevicePresent
0DF4 22 RET
88: return;
89: }
0DF5 ?C0012?ATARESET:
90:
91: if (bScsi)
0DF5 300313 JNB bScsi,?C0013?ATARESET
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 23
92: {
93: SendDeviceIdentifyCommand();
0DF8 F14E ACALL SendDeviceIdentifyCommand
94: if (readATAPI_STATUS_REG() & ATAPI_STATUS_DRDY_BIT)
0DFA 1201F6 LCALL readATAPI_STATUS_REG
0DFD EF MOV A,R7
0DFE 30E612 JNB ACC.6,?C0010?ATARESET
95: {
96: bit oldEA = EA;
0E01 121272 LCALL ?L?COM002C
97: EA = 0;
98:
99: FetchDeviceIdentifyIntoEp8();
100: bDevicePresent = 1;
0E04 D200 SETB bDevicePresent
101: EA = oldEA;
0E06 A222 MOV C,oldEA
0E08 92AF MOV EA,C
102: }
103: }
0E0A 22 RET
0E0B ?C0013?ATARESET:
104: else if (readATAPI_STATUS_REG())
0E0B 1201F6 LCALL readATAPI_STATUS_REG
0E0E EF MOV A,R7
0E0F 6002 JZ ?C0010?ATARESET
105: bDevicePresent = 1;
0E11 D200 SETB bDevicePresent
106: }
0E13 ?C0010?ATARESET:
0E13 22 RET
----- FUNCTION detectSCSIvsATA (END) -------
----- FUNCTION ?L?COM0007 (BEGIN) -----
0E14 90E691 MOV DPTR,#0E691H
0E17 7480 MOV A,#080H
0E19 F0 MOVX @DPTR,A
0E1A ?L?COM0008:
0E1A 750807 MOV sensePtr,#HIGH senseOk
0E1D 750934 MOV sensePtr+01H,#LOW senseOk
0E20 D223 SETB ?checkForMedia?BIT
0E22 12003E LCALL checkForMedia
0E25 7434 MOV A,#LOW senseOk
0E27 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;
0E28 ?C0026?GPIF:
233:
234: while (!gpifIdle());
0E28 E5BB MOV A,GPIFTRIG
0E2A 30E7FB JNB ACC.7,?C0026?GPIF
0E2D ?C0027?GPIF:
235:
236: GPIFWFSELECT = (1 << 4); // PIO read is waveform 1
0E2D 90E6C0 MOV DPTR,#0E6C0H
0E30 7410 MOV A,#010H
0E32 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));
0E33 EF MOV A,R7
0E34 4480 ORL A,#080H
0E36 F580 MOV IOA,A
245:
246: // trigger the GPIF
247: retval = XGPIFSGLDATLX; // Single bus transaction on the GPIF
0E38 90E6F1 MOV DPTR,#0E6F1H
0E3B E0 MOVX A,@DPTR
0E3C FF MOV R7,A
;---- Variable 'retval' assigned to Register 'R7' ----
0E3D ?C0028?GPIF:
248:
249: while (!gpifIdle()); // wait till GPIF is done before getting real data
0E3D E5BB MOV A,GPIFTRIG
0E3F 30E7FB JNB ACC.7,?C0028?GPIF
0E42 ?C0029?GPIF:
250:
251: retval = XGPIFSGLDATLNOX; // get data from last GPIF transaction
0E42 90E6F2 MOV DPTR,#0E6F2H
0E45 E0 MOVX A,@DPTR
0E46 FF MOV R7,A
252: OUTATAPI = ATAPI_IDLE_VALUE; // Clear the address/chip selects
0E47 7580BE MOV IOA,#0BEH
253:
254: return(retval);
255: }
0E4A 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: }
0E4B F1B6 ACALL ?L?COM002D
0E4D ACF0 MOV R4,B
0E4F 44E0 ORL A,#0E0H
0E51 FD MOV R5,A
0E52 7F2C MOV R7,#02CH
0E54 214D AJMP _writePIO8
----- FUNCTION writeATA_DRIVESEL_REG (END) -------
----- FUNCTION ?L?COM0009 (BEGIN) -----
0E56 E4 CLR A
0E57 F50A MOV dwLBA,A
0E59 90F010 MOV DPTR,#0F010H
0E5C E0 MOVX A,@DPTR
0E
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -