📄 ide.lst
字号:
C51 COMPILER V7.50 IDE 11/07/2006 14:52:09 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE IDE
OBJECT MODULE PLACED IN ide.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ide.c ROM(COMPACT) OPTIMIZE(9,SPEED) REGFILE(.\fx2_ata.ORC) BROWSE ORDER IN
-CDIR(c:\cypress\usb\target\inc) DEFINE(GPIF=0,FLASH=0,DEVICE_TYPE_IS_SCSI=1,DEVICE_TYPE_IS_IDE=1,VBUS_DETECT=1) DEBUG OB
-JECTEXTEND CODE
line level source
1 //-----------------------------------------------------------------------------
2 // Copyright (c) 1999 Cypress Semiconductor, Inc. All rights reserved
3 //-----------------------------------------------------------------------------
4 //
5 // This file contains the IDE specific portions of the code. In ATAPI
6 // or SCSI applications, this file should not be needed.
7 //
8 // $Archive: /USB/atapifx2/software/ide.c $
9 // $Date: 1/23/02 9:35a $
10 // $Revision: 53 $
11 //-----------------------------------------------------------------------------
12 #include "Fx2.h"
13 #include "Fx2regs.h"
14 #include "gpif.h"
15 #include "scsi.h"
16
17 static bit ideReadCommand(bit verify);
18 static bit ideWriteCommand();
19 bit ideUdmaWriteCommand();
20 static void IDEnop();
21 static bit checkForMedia();
22 static DWORD dwLBA; // This is global to help the optimizer
23 void dwLBAtoLBARegs(); // Stuff the LBA registers
24
25
26 // From SCSI spec SPC (SCSI primary commands)
27 // Byte 0 -- 70 = Current error
28 // Byte 1 -- Segment number
29 // Byte 2 -- Sense key
30 // Byte 3-6 -- Information (not used)
31 // Byte 7 -- add'l sense length
32 // byte 8-11 -- Command specific information
33 // byte 12 -- ASC (Add'l sense code)
34 // byte 13 -- ASQ (Add'l sense qualifier)
35 // Key
- ASC ASQ
36 // 0 1 2 3 4 5 6 7 8 9
-10 11 12 13 14 15
37 const char code senseCRCError[] = {0x70, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x
-00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00};
38 const char code senseInvalidFieldInCDB[] = {0x70, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x
-00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00};
39 const char code senseOk[] = {0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x
-00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
40 char code * sensePtr;
41
42 extern char NumCylindersMSB; // global #Cyl MSB
43 extern char NumCylindersLSB; // global #Cyl LSB
44 extern char NumHeads; // global #Heads
45 extern char NumSectPerTrack; // global #SectorsPerTrack
46
47 /////////////////////////////////////////////////////////////////////////////////
48 #if DEVICE_TYPE_IS_IDE
C51 COMPILER V7.50 IDE 11/07/2006 14:52:09 PAGE 2
49 /////////////////////////////////////////////////////////////////////////////////
50
51
52 bit generalIDEInCommand()
53 {
54 1 BYTE cmd;
55 1 WORD packetLen;
56 1 bit status;
57 1
58 1 cmd = EP2FIFOBUF[0xf];
59 1
60 1 switch (cmd)
61 1 {
62 2 // Minimum processing for a case in this switch statement:
63 2 case INQUIRY:
64 2 {
65 3 sensePtr = senseOk;
66 3 packetLen = min(dataTransferLen, (WORD) sizeof(SCSIInquiryData));
67 3
68 3 // relinquish control of the bulk buffer occupied by the CBW
69 3 EP2BCL = 0x80;
70 3
71 3 // Send out our stored inquiry data
72 3 waitForInBuffer();
73 3 mymemmovexx(EP8FIFOBUF, SCSIInquiryData_, packetLen); // NOTE: may not be needed anymore since
-FIFO in AUTOIN
74 3
75 3 if (packetLen)
76 3 {
77 4 EP8BCH = MSB(packetLen);
78 4 EP8BCL = LSB(packetLen);
79 4
80 4 dataTransferLen -= packetLen;
81 4 }
82 3
83 3 return(USBS_PASSED);
84 3 }
85 2
86 2 case READ_10:
87 2 {
88 3 sensePtr = senseOk;
89 3 checkForMedia();
90 3
91 3 if (sensePtr == senseOk)
92 3 {
93 4 return(ideReadCommand(0));
94 4 }
95 3 else
96 3 {
97 4 // relinquish control of the bulk buffer occupied by the CBW
98 4 EP2BCL = 0x80;
99 4
100 4 failedIn();
101 4 return(USBS_FAILED);
102 4 }
103 3 }
104 2
105 2 case VERIFY_10:
106 2 {
107 3 sensePtr = senseOk;
108 3 checkForMedia();
109 3 if (sensePtr == senseOk)
C51 COMPILER V7.50 IDE 11/07/2006 14:52:09 PAGE 3
110 3 return(ideReadCommand(1)); // ideReadCommand sets the OUT2BC = 0
111 3 else
112 3 {
113 4 // relinquish control of the bulk buffer occupied by the CBW
114 4 EP2BCL = 0x80;
115 4
116 4 failedIn();
117 4 return(USBS_FAILED);
118 4 }
119 3 }
120 2 case SEEK_10:
121 2 {
122 3 sensePtr = senseOk;
123 3 checkForMedia();
124 3
125 3 // relinquish control of the bulk buffer occupied by the CBW
126 3 EP2BCL = 0x80;
127 3
128 3 if (sensePtr == senseOk)
129 3 {
130 4 return(USBS_PASSED);
131 4 }
132 3 else
133 3 {
134 4 failedIn();
135 4 return(USBS_FAILED);
136 4 }
137 3 }
138 2
139 2 case READ_FORMAT_CAPACITIES:
140 2 case READ_CAPACITY:
141 2 {
142 3 BYTE cap_hdr_offset = 0;
143 3 BYTE num_dwords = 2;
144 3
145 3 // relinquish control of the bulk buffer occupied by the CBW
146 3 EP2BCL = 0x80;
147 3
148 3 sensePtr = senseOk;
149 3 checkForMedia();
150 3
151 3 waitForInBuffer();
152 3 if (sensePtr == senseOk)
153 3 {
154 4 if(cmd == READ_FORMAT_CAPACITIES) // add 4 byte capacity list header
155 4 {
156 5 EP8FIFOBUF[0] = 0x0;
157 5 EP8FIFOBUF[1] = 0x0;
158 5 EP8FIFOBUF[2] = 0x0;
159 5 EP8FIFOBUF[3] = 0x08;
160 5 cap_hdr_offset = 4;
161 5 num_dwords = 3;
162 5 }
163 4 EP8FIFOBUF[0+cap_hdr_offset] = ((BYTE *) &driveCapacity)[0];
164 4 EP8FIFOBUF[1+cap_hdr_offset] = ((BYTE *) &driveCapacity)[1];
165 4 EP8FIFOBUF[2+cap_hdr_offset] = ((BYTE *) &driveCapacity)[2];
166 4 EP8FIFOBUF[3+cap_hdr_offset] = ((BYTE *) &driveCapacity)[3];
167 4 EP8FIFOBUF[4+cap_hdr_offset] = (ATA_SECTOR_SIZE >> 24) & 0xff;
168 4 EP8FIFOBUF[5+cap_hdr_offset] = (ATA_SECTOR_SIZE >> 16) & 0xff;
169 4 EP8FIFOBUF[7+cap_hdr_offset] = (ATA_SECTOR_SIZE >> 0) & 0xff;
170 4 EP8FIFOBUF[6+cap_hdr_offset] = (ATA_SECTOR_SIZE >> 8) & 0xff;
171 4
C51 COMPILER V7.50 IDE 11/07/2006 14:52:09 PAGE 4
172 4 packetLen = min(sizeof(DWORD) * num_dwords, dataTransferLen);
173 4 if (packetLen)
174 4 {
175 5 EP8BCH = MSB(packetLen);
176 5 EP8BCL = LSB(packetLen);
177 5 dataTransferLen -= packetLen;
178 5 }
179 4 status = USBS_PASSED;
180 4 }
181 3 else
182 3 {
183 4 failedIn();
184 4 status = USBS_FAILED;
185 4 }
186 3
187 3 return(status);
188 3 }
189 2
190 2 case TEST_UNIT_READY:
191 2 case PREVENT_ALLOW_MEDIUM_REMOVAL:
192 2 {
193 3 // relinquish control of the bulk buffer occupied by the CBW
194 3 EP2BCL = 0x80;
195 3
196 3 if (dataTransferLen) // This command shouldn't have any data!
197 3 failedIn();
198 3
199 3 checkForMedia();
200 3
201 3 if (sensePtr == senseOk)
202 3 return(USBS_PASSED);
203 3 else
204 3 return(USBS_FAILED);
205 3 }
206 2 case REQUEST_SENSE:
207 2 {
208 3 // relinquish control of the bulk buffer occupied by the CBW
209 3 EP2BCL = 0x80;
210 3
211 3 waitForInBuffer();
212 3
213 3 mymemmovexx(EP8FIFOBUF, (char xdata *) sensePtr, sizeof(senseOk));
214 3
215 3 packetLen = min(sizeof(senseOk), dataTransferLen);
216 3 if (packetLen)
217 3 {
218 4 EP8BCH = MSB(packetLen);
219 4 EP8BCL = LSB(packetLen);
220 4
221 4 dataTransferLen -= packetLen;
222 4 }
223 3 sensePtr = senseOk;
224 3 return(USBS_PASSED);
225 3 }
226 2
227 2 case MODE_SENSE_10:
228 2 {
229 3 BYTE pagenum;
230 3
231 3 pagenum = EP2FIFOBUF[CBW_DATA_START+2] & 0x3F; // identify page (see p.141 SCSI 2ed.)
232 3
233 3 EP2BCL = 0x80; // relinquish control of the bulk buffer occupied by the CBW
C51 COMPILER V7.50 IDE 11/07/2006 14:52:09 PAGE 5
234 3
235 3 waitForInBuffer();
236 3
237 3 if((pagenum != 0x05) && (pagenum != 0x3F)
238 3 && (pagenum != 0x01) && (pagenum != 0x08) && (pagenum != 0x1B))
239 3 { // only respond to requests for certain pages (the mandatory ones plus page 5)
240 4 sensePtr = senseInvalidFieldInCDB;
241 4 failedIn();
242 4 return(USBS_FAILED);
243 4 }
244 3
245 3 // If one of the supported pages is requested, return the 8 byte Mode Parameter Header
246 3 // plus a single 12 byte page. Only the Mode Data length (LSB) is significant in the
247 3 // Mode Parameter Header. It has a Vendor Specific Medium Type Code in byte 2, and
248 3 // a 1 bit WP Write Protect bit in byte 3 that are not initialized here.
249 3 // Pages 0x01, and 0x08 do not have significant data - they are spoofed.
250 3 // Page 0x1B has a TLUN field in byte 3 that is initialized to 1 (as per ISD).
251 3 // Page 0x05 does contain information that is needed to boot to HDD and CDROM.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -