📄 ide.lst
字号:
238 2 {
239 3 // relinquish control of the bulk buffer occupied by the CBW
240 3 OUTPKTEND = 0x82;
241 3
242 3 waitForInBuffer();
243 3 AUTOPTRL2 = LSB(EP4FIFOBUF);
244 3
245 3 // First two bytes are 0x70 and 0x00
246 3 P_XAUTODAT2 = 0x70;
247 3 P_XAUTODAT2 = 0x00;
248 3
249 3 // Clear the rest of the buffer
250 3 memset16(EP4FIFOBUF+2, 0, 1);
251 3 P_XAUTODAT2 = senseArray[sensePtr][0];
252 3
253 3 AUTOPTRL2 = 7;
254 3 P_XAUTODAT2 = 18-8; // Length of data following this byte
255 3
256 3 AUTOPTRL2 = 12;
257 3 P_XAUTODAT2 = senseArray[sensePtr][1];
258 3 P_XAUTODAT2 = senseArray[sensePtr][2];
259 3
260 3 loadEP4BC(18);
261 3 sensePtr = senseOk;
262 3 return(USBS_PASSED);
263 3 }
264 2
265 2 case STOP_START_UNIT:
266 2 cmd = EP2FIFOBUF[CBW_DATA_START+4];
267 2 if ((cmd&3)==2) { bEject = 1; }
268 2
269 2 case PREVENT_ALLOW_MEDIUM_REMOVAL:
270 2 OUTPKTEND = 0x82;
271 2
272 2 return(USBS_PASSED);
273 2
274 2 case MODE_SENSE_06:
275 2 case MODE_SENSE_10:
276 2 {
277 3 BYTE pagenum;
278 3
279 3 pagenum = EP2FIFOBUF[CBW_DATA_START+2] & 0x3F; // identify page (see p.141 SCSI 2ed.)
280 3
281 3 OUTPKTEND = 0x82;
282 3
283 3 waitForInBuffer();
284 3
285 3 if((pagenum != 0x05) && (pagenum != 0x3F)
286 3 && (pagenum != 0x01) && (pagenum != 0x08) && (pagenum != 0x1B))
287 3 { // only respond to requests for certain pages (the mandatory ones plus page 5)
288 4 sensePtr = senseInvalidFieldInCDB;
289 4 failedIn();
290 4 return(USBS_FAILED);
291 4 }
292 3
293 3 memset16(EP4FIFOBUF, 0, 128/16);
294 3 AUTOPTRL2 = LSB(EP4FIFOBUF);
295 3 if (cmd == MODE_SENSE_10)
296 3 {
297 4 P_XAUTODAT2 = MSB(0); // Byte 0
C51 COMPILER V7.50 IDE 10/12/2007 17:05:44 PAGE 6
298 4 if (pagenum == 0x3f)
299 4 P_XAUTODAT2 = LSB(8-2 + 12*4); // return 12 bytes for each page (byte 1)
300 4 else
301 4 P_XAUTODAT2 = LSB(8-2 + 12*1); // return 12 bytes for each page (byte 1)
302 4 P_XAUTODAT2 = 0; // Media type (return 0. Seems to be ignored by the h
-ost)
303 4 #ifndef NO_WP
304 4 P_XAUTODAT2 = (bWriteProtectEnable && !NAND_WP_SWITCH) ? 0x80 : 0; // Copy WP bit to th
-e header (byte 3)
305 4 #else
P_XAUTODAT2 = 0;
#endif
308 4 AUTOPTRL2 = LSB(EP4FIFOBUF) + 8; // The rest of the header is zeroes. Start the pages at
-byte 8.
309 4 }
310 3 else
311 3 {
312 4 if (pagenum == 0x3f)
313 4 P_XAUTODAT2 = LSB(4-1 + 12*4); // Header is 4 bytes long, data from each page is 12 by
-tes.
314 4 else
315 4 P_XAUTODAT2 = LSB(4-1 + 12*1);
316 4 P_XAUTODAT2 = 0; // Next byte is 00
317 4 #ifndef NO_WP
318 4 P_XAUTODAT2 = (bWriteProtectEnable && !NAND_WP_SWITCH) ? 0x80 : 0; // Copy WP bit to th
-e header (byte 2)
319 4 #else
P_XAUTODAT2 = 0;
#endif
322 4 AUTOPTRL2 = LSB(EP4FIFOBUF) + 4;
323 4 }
324 3
325 3 if((pagenum == 0x05) || (pagenum == 0x3F))
326 3 {
327 4 P_XAUTODAT2 = 5; // fill out the page num - fields are all 0x0
328 4 P_XAUTODAT2 = 12-2; // set individual Page Length -- return 12 for all commands
329 4
330 4 if(EZUSB_HIGHSPEED())
331 4 {
332 5 P_XAUTODAT2 = 0xFF; // HS Transfer Rate (MSB) (field limited to 65Mb/Sec)
333 5 P_XAUTODAT2 = 0xFF; // HS Transfer Rate (LSB)
334 5 }
335 4 else
336 4 {
337 5 P_XAUTODAT2 = 0x2E; // FS Transfer Rate (MSB) (12Mb/Sec)
338 5 P_XAUTODAT2 = 0xE0; // FS Transfer Rate (LSB)
339 5 }
340 4 P_XAUTODAT2 = 0x20; // #Heads
341 4 P_XAUTODAT2 = 0x10; // #SectorsPerTrack
342 4 P_XAUTODAT2 = (NAND_ATA_SECTOR_SIZE >> 8) & 0xff; // Data Bytes per sector (truncated)
343 4 P_XAUTODAT2 = (NAND_ATA_SECTOR_SIZE >> 0) & 0xff; // Data Bytes per sector
344 4 P_XAUTODAT2 = 0xff;
345 4 P_XAUTODAT2 = 0xff;
346 4 P_XAUTODAT2 = 0;
347 4 P_XAUTODAT2 = 0;
348 4 }
349 3 if(pagenum == 0x1B || pagenum == 0x3f)
350 3 {
351 4 P_XAUTODAT2 = 0x1b; // fill out the page num
352 4 P_XAUTODAT2 = 12-2; // set individual Page Length -- return 12 for all commands
353 4 P_XAUTODAT2 = 0;
354 4 P_XAUTODAT2 = 0x01; // set TLUN = 1 for page 0x1B
C51 COMPILER V7.50 IDE 10/12/2007 17:05:44 PAGE 7
355 4 AUTOPTRL2 += 8; // 8 zeroes too.
356 4 }
357 3 if(pagenum == 0x1 || pagenum == 0x3f)
358 3 {
359 4 P_XAUTODAT2 = 0x1; // fill out the page num
360 4 P_XAUTODAT2 = 12-2; // set individual Page Length -- return 12 for all commands
361 4 AUTOPTRL2 += 10; // 10 zeroes too.
362 4 }
363 3
364 3 if(pagenum == 0x8 || pagenum == 0x3f)
365 3 {
366 4 P_XAUTODAT2 = 0x8; // fill out the page num
367 4 P_XAUTODAT2 = 12-2; // set individual Page Length -- return 12 for all commands
368 4 AUTOPTRL2 += 10; // 10 zeroes too.
369 4 }
370 3
371 3 loadEP4BC(AUTOPTRL2);
372 3 sensePtr = senseOk;
373 3 return(USBS_PASSED);
374 3 } // end case
375 2
376 2 ///// OUT commmand
377 2 ///////////////////////////////////////////////////////////
378 2 // Spoofed commands
379 2 case MODE_SELECT_06: // Note that these are in BOTH the read and write areas in case they are sen
-t with no data
380 2 case MODE_SELECT_10:
381 2 {
382 3 // relinquish control of the bulk buffer occupied by the CBW
383 3 OUTPKTEND = 0x82;
384 3 loadEP2BC();
385 3 dataTransferLen=0;
386 3 checkForMedia(1);
387 3
388 3 if (sensePtr == senseOk)
389 3 return(USBS_PASSED);
390 3 else
391 3 return(USBS_FAILED);
392 3 }
393 2
394 2 default:
395 2 {
396 3 // relinquish control of the bulk buffer occupied by the CBW
397 3 OUTPKTEND = 0x82;
398 3 sensePtr = senseInvalidOpcode;
399 3 if (directionIn)
400 3 failedIn();
401 3 else
402 3 stallEP2OUT();
403 3 return(USBS_FAILED);
404 3 }
405 2 }
406 1 }
407
408 /////////////////////////////////////////////////////////////////////////////////
409 // Wait for IN buffer available from the Host
410 //////////////////////////////////////////////////////////////////////////////////
411 void waitForInBuffer()
412 {
413 1 while((P_EP4CS & bmEPFULL)); // Wait for an available buffer from the host
414 1 }
415
C51 COMPILER V7.50 IDE 10/12/2007 17:05:44 PAGE 8
416
417 /////////////////////////////////////////////////////////////////////////////////
418 //
419 // Called to manually send IN data to the host once the data has already been
420 // placed in EP4FIFOBUF. This routine is only called on the last packet sent to
421 // the host. If dataTransferLen is not 0, failedIN() will STALL the IN endpoint.
422 //
423 // Input:
424 // EP2FIFOBUF -- Contains LBA (Logical block address)
425 //
426 // Output:
427 // dataTransferLen -- Reduced by the amount of data sent
428 // bShortPacketSent -- Set if a short packet has been sent
429 //
430 //////////////////////////////////////////////////////////////////////////////////
431 void loadEP4BC(WORD dataLen)
432 {
433 1 WORD packetLen;
434 1 bit bPaddedPacket = 0;
435 1
436 1 packetLen = min((WORD)dataTransferLen, dataLen);
437 1
438 1 // July-12-05: Add support for USBCV
439 1 // When dataTransferLen==0 just return and ready to send CSW
440 1 if (packetLen==0) return;
441 1
442 1 if (packetLen || (SHORT_PACKET_BEFORE_STALL))
443 1 {
444 2 // pad the really short responses
445 2 if (dataTransferLen <= wPacketSize)
446 2 {
447 3 bPaddedPacket = 1;
448 3 EP4BCH = MSB(dataTransferLenLSW);
449 3 EP4BCL = LSB(dataTransferLenLSW);
450 3 }
451 2 else
452 2 {
453 3 EP4BCH = MSB(packetLen);
454 3 EP4BCL = LSB(packetLen);
455 3 }
456 2 dataTransferLen -= packetLen;
457 2 }
458 1 if (packetLen & (wPacketSize - 1))
459 1 bShortPacketSent = 1;
460 1
461 1 if (!bPaddedPacket)
462 1 failedIn(); // This doesn't set status, just STALLs the IN endpoint if needed.
463 1 }
464
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1109 ----
CONSTANT SIZE = 42 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 4
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
C51 COMPILER V7.50 IDE 10/12/2007 17:05:44 PAGE 9
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -