📄 fx2_ata.cod
字号:
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 1
ASSEMBLER CODE PACKING OF MODULE: fx2_ata (DSCR)
000B 021BF5 LJMP 01BF5H
0033 801A SJMP 0100004FH
----- FUNCTION checkForMedia (BEGIN) -----
FILE: 'ide.c'
1032: bit checkForMedia(bit commandProcessing)
1033: {
1034: #if COMPACT_FLASH
1035: // Check for new media every time, not just when the last command addressed a CF
1036: // If there's no media, just set the noFlashMedia flag. If the host tries to execute
1037: // a command w/o media, we report "no media".
1038: // On the transition from no media to media, we must wait until the host tries to
1039: // send a command, then report "media changed".
1040: if (OUTATAPI & CF_DETECT_)
1041: {
1042: noFlashMedia = 1;
1043: }
1044:
1045: if (bCompactFlash && commandProcessing)
1046: {
1047: // If there's no media, the noMedia flag will be set above. Just load sensePtr and return.
1048: // We cannot do this above because we the CF only owns the sensePtr when its LUN is selected.
1049: if (OUTATAPI & CF_DETECT_)
1050: {
1051: sensePtr = senseNoMedia;
1052: return (0);
1053: }
1054: else // CF detected case
1055: {
1056: // If the noFlashMedia flag is set, we're transitioning from no media to media inserted.
1057: if (noFlashMedia)
1058: {
1059: //bFirstTime = 1; // Force hard reset, no matter what
1060: //resetATAPIDevice();
1061: cfHardwareReset();
1062:
1063: ATAPIIdDevice(); // Identify the device
1064:
1065: // move the drive identification stuff to LUN0. Compact flash is always LUN0.
1066: LunBits[0] = ActiveLunBits;
1067: mymemmove((BYTE *)&DeviceConfigData[0],(BYTE *)&ActiveLunConfigData, sizeof(DEVICE_CONFIG_DATA));
1068: sensePtr = senseMediaChanged;
1069: noFlashMedia = 0;
1070: return (0); // 0 will force the code through the error path.
1071: }
1072: return (1);
1073: }
1074: }
1075: else
1076: #endif
1077: return(1);
003E D3 SETB C
1078: }
003F 22 RET
----- FUNCTION checkForMedia (END) -------
----- FUNCTION resume_isr (BEGIN) -----
FILE: 'fw.c'
494: void resume_isr(void) interrupt WKUP_VECT
495: {
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 2
496: EZUSB_CLEAR_RSMIRQ();
004F 53D8EF ANL EICON,#0EFH
497: }
0052 32 RETI
----- FUNCTION resume_isr (END) -------
----- FUNCTION readATAPI_STATUS_REG (BEGIN) -----
FILE: 'gpif.c'
224: BYTE readATAPI_STATUS_REG()
225: {
226: return(readPIO8(ATAPI_STATUS_REG));
227: }
01F6 7F2E MOV R7,#02EH
01F8 020E28 LJMP _readPIO8
----- FUNCTION readATAPI_STATUS_REG (END) -------
----- FUNCTION resetATAPIDevice (BEGIN) -----
FILE: 'atareset.c'
21: void resetATAPIDevice()
22: {
23:
24: sensePtr = senseDeviceReset;
0916 750807 MOV sensePtr,#HIGH senseDeviceReset
0919 750952 MOV sensePtr+01H,#LOW senseDeviceReset
25:
26: if (bFirstTime)
091C 301907 JNB bFirstTime,?C0001?ATARESET
27: EZUSB_Delay(DELAY_AFTER_POWERUP); // Wait for stable power -- Sony CDU4811 and Maxtor 34098 (40G
>> ) are good tests for this
091F 7FD0 MOV R7,#0D0H
0921 7E07 MOV R6,#07H
0923 12065C LCALL _EZUSB_Delay
0926 ?C0001?ATARESET:
28:
29:
30: /////////////////////////////////////////////////////////////////////////////////////
31: // Perform hardware reset ONCE on reset, then obey the skip pin reset flag
32: if ((bFirstTime) || !(SKIP_PIN_RESET))
0926 30190D JNB bFirstTime,?C0002?ATARESET
0929 ?C0003?ATARESET:
33: {
34: hardwareReset();
0929 F1E4 ACALL hardwareReset
35: bFirstTime = 0;
092B C219 CLR bFirstTime
36: EZUSB_Delay(90); // Mitsumi CR-4808TE(CYSD007) is a good test for this number.
092D 7F5A MOV R7,#05AH
092F 7E00 MOV R6,#00H
0931 12065C LCALL _EZUSB_Delay
37: // give devices a chance to recover after ATA reset
38: }
0934 800C SJMP ?C0004?ATARESET
0936 ?C0002?ATARESET:
39:
40: /////////////////////////////////////////////////////////////////////////////////////
41: // Perform software reset and retest for SCSI vs ATA
42: else if (SRST_ENABLE)
43: {
44: writePIO8(ATAPI_CONTROL_REG, ATAPI_CONTROL_REG_SOFT_RESET);
0936 7D04 MOV R5,#04H
0938 7C00 MOV R4,#00H
093A 7F1C MOV R7,#01CH
093C 314D ACALL _writePIO8
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 3
45: EZUSB_Delay(50);
093E 7F32 MOV R7,#032H
0940 F190 ACALL ?L?COM001A
46: writePIO8(ATAPI_CONTROL_REG, 0);
47: }
0942 ?C0004?ATARESET:
48: EZUSB_Delay(DELAY_AFTER_RESET);
0942 7FE8 MOV R7,#0E8H
0944 7E03 MOV R6,#03H
0946 02065C LJMP _EZUSB_Delay
----- FUNCTION resetATAPIDevice (END) -------
----- FUNCTION ?L?COM000F (BEGIN) -----
0949 7C00 MOV R4,#00H
094B 7F2E MOV R7,#02EH
----- FUNCTION _writePIO8 (BEGIN) -----
FILE: 'gpif.c'
149: void writePIO8(char addr, WORD indata)
150: {
;---- Variable 'indata' assigned to Register 'R4/R5' ----
;---- Variable 'addr' assigned to Register 'R7' ----
151:
094D ?C0011?GPIF:
152: // make sure GPIF is not busy
153: while (!gpifIdle())
094D E5BB MOV A,GPIFTRIG
094F 30E7FB JNB ACC.7,?C0011?GPIF
154: {
155: }
0952 ?C0012?GPIF:
156:
157: GPIFWFSELECT = 0; // PIO write is waveform 0
0952 90E6C0 MOV DPTR,#0E6C0H
0955 E4 CLR A
0956 F0 MOVX @DPTR,A
158:
159: // Write the address/chip selects
160: #if COMPACT_FLASH
161: if (bCompactFlash)
162: OUTATAPI = (addr | (~ATAPI_ADDR_MASK & ATAPI_IDLE_VALUE)) & ~CF_CE1_; // Drive CF_CE low
163: else
164: #endif
165: OUTATAPI = (addr | (~ATAPI_ADDR_MASK & ATAPI_IDLE_VALUE));
0957 EF MOV A,R7
0958 4480 ORL A,#080H
095A F580 MOV IOA,A
166:
167: // trigger the GPIF
168: // if (EP2FIFOCFG & bmWORDWIDE)
169: XGPIFSGLDATH = MSB(indata); // Single bus transaction on the GPIF
095C EC MOV A,R4
095D 90E6F0 MOV DPTR,#0E6F0H
0960 F0 MOVX @DPTR,A
170: XGPIFSGLDATLX = LSB(indata); // Single bus transaction on the GPIF
0961 ED MOV A,R5
0962 A3 INC DPTR
0963 F0 MOVX @DPTR,A
0964 ?C0013?GPIF:
171:
172: // make sure GPIF is not busy
173: while (!gpifIdle())
0964 E5BB MOV A,GPIFTRIG
0966 30E7FB JNB ACC.7,?C0013?GPIF
174: {
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 4
175: }
0969 ?C0014?GPIF:
176:
177: // Clear the address/chip selects
178: OUTATAPI = ATAPI_IDLE_VALUE;
0969 7580BE MOV IOA,#0BEH
179:
180: }
096C 22 RET
----- FUNCTION _writePIO8 (END) -------
----- FUNCTION stuffLBAandSector (BEGIN) -----
FILE: 'ide.c'
907: WORD stuffLBAandSector(bit readWrite) // Stuff the LBA registers
908: {
909: WORD sectorcount;
910:
911: writeATA_DRIVESEL_REG();
096D D14B ACALL writeATA_DRIVESEL_REG
912:
913: // First stuff the length register (number of sectors to read)
914: if (dataTransferLenMSW & 0xfffe)
096F E553 MOV A,dataTransferLen+01H
0971 54FE ANL A,#0FEH
0973 4552 ORL A,dataTransferLen
0975 6015 JZ ?C0202?IDE
915: {
916: if (bExtAddrSupport)
0977 300408 JNB bExtAddrSupport,?C0203?IDE
917: writePIO8(ATA_SECTOR_COUNT_REG, 1); // if (bExtAddrSupport) we need to stuff the MSB
097A 7D01 MOV R5,#01H
097C 7C00 MOV R4,#00H
097E 7F24 MOV R7,#024H
0980 314D ACALL _writePIO8
0982 ?C0203?IDE:
918: writePIO8(ATA_SECTOR_COUNT_REG, 0); // 0 means 256 blocks of 512 bytes -- Max drive xfer, max TC
0982 F147 ACALL ?L?COM002F
919: sectorcount = 0x100;
0984 756801 MOV sectorcount,#01H
0987 756900 MOV sectorcount+01H,#00H
920: }
098A 803D SJMP ?C0204?IDE
098C ?C0202?IDE:
921: else
922: {
923: // Round sectorcount up for reads, down for writes
924: if (readWrite)
098C 302316 JNB readWrite,?C0205?IDE
925: sectorcount = (dataTransferLenLSW + ATA_SECTOR_SIZE-1)/ATA_SECTOR_SIZE + (dataTransferLenMSW & 1) * 0x80
>> ;
098F F17B ACALL ?L?COM0030
0991 ?C0260?IDE:
0991 C3 CLR C
0992 33 RLC A
0993 CE XCH A,R6
0994 33 RLC A
0995 CE XCH A,R6
0996 D8F9 DJNZ R0,?C0260?IDE
0998 FD MOV R5,A
0999 AC06 MOV R4,AR6
099B E555 MOV A,dataTransferLen+03H
099D 24FF ADD A,#0FFH
099F E554 MOV A,dataTransferLen+02H
09A1 3401 ADDC A,#01H
LX51 LINKER/LOCATER V3.30 08/23/2002 14:36:35 PAGE 5
09A3 800E SJMP ?C0283?IDE
09A5 ?C0205?IDE:
926: else
927: sectorcount = (dataTransferLenLSW)/ATA_SECTOR_SIZE + (dataTransferLenMSW & 1) * 0x80;
09A5 F17B ACALL ?L?COM0030
09A7 ?C0261?IDE:
09A7 C3 CLR C
09A8 33 RLC A
09A9 CE XCH A,R6
09AA 33 RLC A
09AB CE XCH A,R6
09AC D8F9 DJNZ R0,?C0261?IDE
09AE FD MOV R5,A
09AF AC06 MOV R4,AR6
09B1 E554 MOV A,dataTransferLen+02H
09B3
09B3 C3 CLR C
09B4 13 RRC A
09B5 2D ADD A,R5
09B6 F569 MOV sectorcount+01H,A
09B8 E4 CLR A
09B9 3C ADDC A,R4
09BA F568 MOV sectorcount,A
09BC ?C0206?IDE:
928:
929: if (bExtAddrSupport)
09BC 300402 JNB bExtAddrSupport,?C0207?IDE
930: writePIO8(ATA_SECTOR_COUNT_REG, 0); // for extended addressing
09BF F147 ACALL ?L?COM002F
09C1 ?C0207?IDE:
931: writePIO8(ATA_SECTOR_COUNT_REG, sectorcount); // divide len into blocks
09C1 AD69 MOV R5,sectorcount+01H
09C3 AC68 MOV R4,sectorcount
09C5 7F24 MOV R7,#024H
09C7 314D ACALL _writePIO8
932: }
09C9 ?C0204?IDE:
933:
934: if (bExtAddrSupport)
09C9 30040E JNB bExtAddrSupport,?C0208?IDE
935: {
936: writePIO8(ATA_LBA_LSB_REG, ((BYTE *) &dwLBA)[0]); // LBA (31:24)
09CC E50A MOV A,dwLBA
09CE F140 ACALL ?L?COM002E
937: writePIO8(ATA_LBA_2SB_REG, 0); // LBA (39:32)
09D0 E4 CLR A
09D1 FD MOV R5,A
09D2 7F28 MOV R7,#028H
09D4 314D ACALL _writePIO8
938: writePIO8(ATA_LBA_MSB_REG, 0); // LBA (47:40)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -