📄 scsicmd.lst
字号:
290 // Make Mode Page Data Ready
291 //----------------------------------------------------------------------------
292 void ScsiPrepareModePage(BYTE PageCode, UINT16 XferLength)
293 {
294 1 UINT16 TotalPageLen = 0;
295 1 BYTE i = 0;
296 1 PBYTE Page;
297 1 BYTE PageLen;
298 1
299 1 while((Page = ModePageArray[i].PagePtr) != NULL)
300 1 {
301 2 PageLen = 0;
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 6
302 2 if ( (PageCode == 0x3f) || (PageCode == Page[0]) )
303 2 {
304 3 PageLen = ModePageArray[i].Size;
305 3 memcpy((BYTE xdata *)(FIFO_ADDRESS_IN + MODE_PARAM_HEADER_LEN \
306 3 + TotalPageLen), (void *)Page, PageLen);
307 3 }
308 2 TotalPageLen += PageLen;
309 2 i++;
310 2 }
311 1 TotalPageLen += MODE_PARAM_HEADER_LEN;
312 1 memcpy((BYTE xdata *)(FIFO_ADDRESS_IN), (void *)ModeParamHeader6, \
313 1 MODE_PARAM_HEADER_LEN);
314 1 // Length field.(1 Byte)
315 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 0) = (BYTE)(TotalPageLen - 1);
316 1 // (Device-Specific-Parameter)It is write protect reference for WinXP & Win2K.
317 1 QueryDevice();
318 1
319 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 2) = DeviceInfo.WriteProtect ? 0x80: 0x00;
320 1 if (XferLength > TotalPageLen)
321 1 XferLength = TotalPageLen;
322 1
323 1 UsbDmaTotalLength = XferLength;
324 1 }
325
326 //--------------------------------------------------------------------
327 // Prepare Disk Info.
328 //--------------------------------------------------------------------
329 void ScsiPrepareDiskInfo()
330 {
331 1 memset((BYTE xdata *)(FIFO_ADDRESS_IN), 0, SCSI_INFO_START_OFFSET);
332 1
333 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 1) = 0x80;
334 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 3) = 0x01;
335 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 4) = 0x1F;
336 1
337 1 // Vendor Information
338 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 8) = 'F';
339 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 9) = 'a';
340 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 10) = 'm';
341 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 11) = 'e';
342 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 12) = 'G';
343 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 13) = ' ';
344 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 14) = ' ';
345 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 15) = ' ';
346 1
347 1 // Product Identification
348 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 16) = 'U';
349 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 17) = 'S';
350 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 18) = 'B';
351 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 19) = ' ';
352 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 20) = '2';
353 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 21) = '.';
354 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 22) = '0';
355 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 23) = ' ';
356 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 24) = 'D';
357 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 25) = 'i';
358 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 26) = 's';
359 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 27) = 'k';
360 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 28) = ' ';
361 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 29) = ' ';
362 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 30) = ' ';
363 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 31) = ' ';
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 7
364 1
365 1 // Revision Field.
366 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 32) = '1';
367 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 33) = '.';
368 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 34) = '0';
369 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 35) = '0';
370 1 }
371
372 /***************************************************************************
373 Notes of SCSI Command
374 1. Ignore Checking Valid CbwcbLen
375 ***************************************************************************/
376
377 //----------------------------------------------------------------------------
378 // ScsiCmdTestUnitReady
379 //----------------------------------------------------------------------------
380 void ScsiCmdTestUnitReady()
381 {
382 1 if (ConvertEndian32(BlockWrapper->DataXsferLen) != 0)
383 1 ScsiInvalidFieldError(ScsiLun);
384 1
385 1 if (ScsiMediaChange[ScsiLun])
386 1 {
387 2 ScsiMediaChange[ScsiLun] = false;
388 2 ScsiModifySenseWord(ScsiLun, STATUS_MEDIA_CHANGE);
389 2 CmdStatus = COMMAND_FAILED;
390 2 }
391 1 else if (ScsiWriteProtectChange[ScsiLun])
392 1 {
393 2 ScsiWriteProtectChange[ScsiLun] = false;
394 2 ScsiModifySenseWord(ScsiLun, STATUS_MEDIA_CHANGE);
395 2 CmdStatus = COMMAND_FAILED;
396 2 }
397 1 else if(!(ScsiLoadStatus[ScsiLun] & SCSI_LOAD_STATUS_MASK))
398 1 {
399 2 ScsiModifySenseWord(ScsiLun, STATUS_NO_MEDIA);
400 2 CmdStatus = COMMAND_FAILED;
401 2 }
402 1
403 1 BulkFreeBuffer(); //.
404 1
405 1 if (CmdStatus == PHASE_ERROR)
406 1 {
407 2 BulkInStall();
408 2 BulkState = STALL_IN_COMPLETED;
409 2 }
410 1 else
411 1 BulkPrepareCSW(CmdStatus);
412 1 }
413
414 //----------------------------------------------------------------------------
415 // ScsiCmdInquiry
416 //----------------------------------------------------------------------------
417 void ScsiCmdInquiry()
418 {
419 1 BYTE i;
420 1
421 1 // Scsi command start.
422 1 for(i = 0; i < MAX_DEVICE_NUM; i++)
423 1 ScsiLoadStatus[i] = 0;
424 1 if (UsbDmaTotalLength > STANDARD_INQUIRY_DATA_LEN)
425 1 UsbDmaTotalLength = STANDARD_INQUIRY_DATA_LEN;
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 8
426 1 // Don't care LUN's value, we return the same Inquiry Data.
427 1 CmdStatus = COMMAND_PASSED; //
428 1 if (!(0x80 & BlockWrapper->Flags))
429 1 ScsiInvalidFieldError(ScsiLun);
430 1 BulkFreeBuffer(); //
431 1 // Prepare Data.
432 1
433 1 if (CmdStatus != PHASE_ERROR)
434 1 {
435 2 SetBulkInFull();
436 2 ScsiPrepareDiskInfo();
437 2 BulkSetDmaIn((UINT16)UsbDmaTotalLength);
438 2 BulkState = BULK_DMA_IN_COMPLETED;
439 2 }
440 1 else
441 1 {
442 2 BulkInStall();
443 2 BulkState = STALL_IN_COMPLETED;
444 2 }
445 1 }
446
447 //----------------------------------------------------------------------------
448 // ScsiCmdRquestSense
449 //----------------------------------------------------------------------------
450 void ScsiCmdRquestSense()
451 {
452 1 bit ClearSenseWord = true;
453 1
454 1 if (UsbDmaTotalLength > REQUEST_SENSE_DATA_LEN)
455 1 UsbDmaTotalLength = REQUEST_SENSE_DATA_LEN;
456 1
457 1 if ((ScsiLun > LastDevice) || (!(0x80 & BlockWrapper->Flags)))
458 1 {
459 2 //We put unsupport sense word on SenseKey,AddSenseCode,AddSenseCodeQ[MAX_DEVICE_NUM].
460 2 //It needn't to clear beause ScsiLun start from 0 to MAX_DEVICE_NUM - 1.
461 2 ScsiLun = MAX_DEVICE_NUM;
462 2 ClearSenseWord = false;
463 2 }
464 1
465 1 //Force to be Command Passed ????
466 1 CmdStatus = COMMAND_PASSED;
467 1 BulkFreeBuffer();
468 1 // Init Data of RequestSense.
469 1 SetBulkInFull();
470 1 memset((BYTE xdata *)(FIFO_ADDRESS_IN), 0, REQUEST_SENSE_DATA_LEN);
471 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 0) = 0x70;
472 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 7) = 0x0A;
473 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + SENSE_KEY_INDEX) = (0xf & SenseKey);
474 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + ADD_SENSE_CODE_INDEX) = AddSenseCode;
475 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + ADD_SENSE_CODEQ_INDEX)= AddSenseCodeQ;
476 1 if (ClearSenseWord)
477 1 {
478 2 SenseKey = NO_SENSE;
479 2 AddSenseCode = 0x00;
480 2 AddSenseCodeQ = 0x00;
481 2 }
482 1
483 1
484 1 if (CmdStatus != PHASE_ERROR)
485 1 {
486 2 BulkSetDmaIn((UINT16)UsbDmaTotalLength);
487 2 BulkState = BULK_DMA_IN_COMPLETED;
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 9
488 2 }
489 1 else
490 1 {
491 2 BulkInStall();
492 2 BulkState = STALL_IN_COMPLETED;
493 2 }
494 1 }
495
496 //----------------------------------------------------------------------------
497 // ScsiCmdModeSense6
498 //----------------------------------------------------------------------------
499 void ScsiCmdModeSense6()
500 {
501 1 BYTE PageCode = (*(BYTE xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 2) & 0x3f);
502 1
503 1 if ( !(0x80 & BlockWrapper->Flags) )
504 1 ScsiInvalidFieldError(ScsiLun);
505 1
506 1 BulkFreeBuffer(); //Out端点接收使能
507 1
508 1 if (CmdStatus == COMMAND_PASSED)
509 1 {
510 2 SetBulkInFull();
511 2 ScsiPrepareModePage(PageCode, (UINT16)UsbDmaTotalLength);
512 2 BulkSetDmaIn((UINT16)UsbDmaTotalLength);
513 2 BulkState = BULK_DMA_IN_COMPLETED;
514 2 }
515 1 else
516 1 {
517 2 BulkInStall();
518 2 BulkState = STALL_IN_COMPLETED;
519 2 }
520 1 }
521
522 //----------------------------------------------------------------------------
523 // ScsiCmdModeSense10
524 //----------------------------------------------------------------------------
525 void ScsiCmdModeSense10()
526 {
527 1 BulkFreeBuffer();
528 1 SetBulkInFull();
529 1 // Always return the fixed data.
530 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 0) = 0x00;
531 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 1) = 0x06;
532 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 2) = 0x00;
533 1 if (ScsiWriteProtect[ScsiLun])
534 1 {
535 2 *(BYTE xdata *)(FIFO_ADDRESS_IN + 3) = 0x80;
536 2 }
537 1 else
538 1 {
539 2 *(BYTE xdata *)(FIFO_ADDRESS_IN + 3) = 0x00;
540 2 }
541 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 4) = 0x00;
542 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 5) = 0x00;
543 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 6) = 0x00;
544 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 7) = 0x00;
545 1
546 1
547 1 BulkSetDmaIn(8);
548 1 BulkState = BULK_DMA_IN_COMPLETED;
549 1 }
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 10
550 //----------------------------------------------------------------------------
551 // ScsiCmdReadBuf---2007.08.16
552 //----------------------------------------------------------------------------
553 void ScsiCmdReadBuf(void)
554 {
555 1 BulkFreeBuffer();
556 1
557 1 SetBulkInFull();
558 1 memset((BYTE xdata *)DMA_FIFOB0, 0, 8);
559 1
560 1 BulkSetDmaIn(8);
561 1 BulkState = BULK_DMA_IN_COMPLETED;
562 1 }
563
564 //----------------------------------------------------------------------------
565 // ScsiCmdStartStopUnit
566 //----------------------------------------------------------------------------
567 void ScsiCmdStartStopUnit()
568 {
569 1 if (ConvertEndian32(BlockWrapper->DataXsferLen) != 0)
570 1 ScsiInvalidFieldError(ScsiLun);
571 1 // Host request device to unload this LUN.
572 1 if (*(BYTE xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 4) == 0x02)
573 1 ScsiLoadStatus[ScsiLun] &= ~SCSI_LOAD_STATUS_MASK;
574 1
575 1 if (*(BYTE xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 0x04)) // detect start or stop device.
576 1 StorageStart(); // add by C.H. Liang
577 1 else
578 1 StorageEject(); // add by C.H. Liang
579 1
580 1 BulkFreeBuffer(); //
581 1
582 1 CmdStatus = 0x00;
583 1 BulkPrepareCSW(CmdStatus);
584 1 }
585
586 //----------------------------------------------------------------------------
587 // ScsiCmdPreventRemoval
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -