📄 scsicmd.lst
字号:
588 //----------------------------------------------------------------------------
589 void ScsiCmdPreventRemoval()
590 {
591 1 if (ConvertEndian32(BlockWrapper->DataXsferLen) != 0)
592 1 ScsiInvalidFieldError(ScsiLun);
593 1 // We don't support link SCSI commands.
594 1 if (*(BYTE xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 5) & SCSI_CTRL_LINK_BIT)
595 1 {
596 2 SET_ILLEGAL_REQUEST(ScsiLun);
597 2 CmdStatus = COMMAND_FAILED;
598 2 }
599 1
600 1 BulkFreeBuffer(); //Out端点接收使能
601 1
602 1 if (CmdStatus == COMMAND_PASSED)
603 1 BulkPrepareCSW(CmdStatus);
604 1 else
605 1 {
606 2 BulkInStall();
607 2 BulkState = STALL_IN_COMPLETED;
608 2 }
609 1 }
610
611 //----------------------------------------------------------------------------
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 11
612 // ScsiCmdReadCapacity10
613 //----------------------------------------------------------------------------
614 void ScsiCmdReadCapacity10()
615 {
616 1 if (UsbDmaTotalLength > CAPACITY10_DATA_LEN)
617 1 UsbDmaTotalLength = CAPACITY10_DATA_LEN;
618 1
619 1 if (!(0x80 & BlockWrapper->Flags))
620 1 ScsiInvalidFieldError(ScsiLun);
621 1
622 1 BulkFreeBuffer(); //Out端点接收使能
623 1
624 1 if (CmdStatus == COMMAND_PASSED)
625 1 {
626 2 SetBulkInFull();
627 2 ScsiGetLunCapacity();
628 2 BulkSetDmaIn((UINT16)UsbDmaTotalLength);
629 2 BulkState = BULK_DMA_IN_COMPLETED;
630 2 }
631 1 else
632 1 {
633 2 BulkInStall(); //将IN STALL位置1
634 2 BulkState = STALL_IN_COMPLETED; //转到STALL_IN_COMPLETED状态处理
635 2 }
636 1 }
637
638 //----------------------------------------------------------------------------
639 // ScsiCmdRead10
640 //----------------------------------------------------------------------------
641 void ScsiCmdRead10()
642 {
643 1 STATUS Status;
644 1
645 1 SectorStart = *(UINT32 xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 2);
646 1 SectorCount = *(UINT16 xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 7);
647 1
648 1 if(!(BlockWrapper->Flags & 0x80))
649 1 {
650 2 SetSenseErrCmdField();
651 2 }
652 1
653 1 BulkFreeBuffer();//Out端点接收使能
654 1
655 1 if(CmdStatus == COMMAND_PASSED)
656 1 {
657 2 Status = ReadSector(); //derek
658 2
659 2 if(Status != STATUS_SUCCESS)
660 2 {
661 3 CmdStatus = COMMAND_FAILED;
662 3 SetSenseDataRd(Status);
663 3 }
664 2 }
665 1
666 1 if(CmdStatus == COMMAND_PASSED)
667 1 {
668 2 BulkState = BULK_DMA_IN_COMPLETED;
669 2 BulkSetDmaIn(BYTES_PER_SECTOR);
670 2
671 2 }
672 1 else
673 1 {
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 12
674 2 BulkInStall();
675 2 BulkState = STALL_IN_COMPLETED;
676 2 }
677 1 }
678
679 //----------------------------------------------------------------------------
680 // ScsiCmdWrite10
681 //----------------------------------------------------------------------------
682 void ScsiCmdWrite10()
683 {
684 1
685 1 SectorStart = *(UINT32 xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 2);
686 1 SectorCount = *(UINT16 xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 7);
687 1
688 1 if(0x80 & BlockWrapper->Flags)
689 1 {
690 2 SetSenseErrCmdField();
691 2 }
692 1
693 1 BulkFreeBuffer();//Out端点接收使能
694 1
695 1 if(CmdStatus == COMMAND_PASSED)
696 1 {
697 2 FirstWrite = true;
698 2 BulkState = BULK_DMA_OUT_COMPLETED;
699 2
700 2 }
701 1 if(CmdStatus != COMMAND_PASSED)
702 1 {
703 2 BulkInStall();
704 2 BulkState = STALL_IN_COMPLETED;
705 2 }
706 1 }
707
708 //----------------------------------------------------------------------------
709 // ScsiCmdVerify10
710 //----------------------------------------------------------------------------
711 void ScsiCmdVerify10()
712 {
713 1
714 1 if (ConvertEndian32(BlockWrapper->DataXsferLen) != 0)
715 1 ScsiInvalidFieldError(ScsiLun);
716 1
717 1 BulkFreeBuffer(); //Out端点接收使能
718 1
719 1 if (CmdStatus == COMMAND_PASSED)
720 1 BulkPrepareCSW(CmdStatus);
721 1 else
722 1 {
723 2 BulkInStall();
724 2 BulkState = STALL_IN_COMPLETED;
725 2 }
726 1 }
727
728 //----------------------------------------------------------------------------
729 // ScsiCmdModeSelect6
730 //----------------------------------------------------------------------------
731 void ScsiCmdModeSelect6()
732 {
733 1 if (0x80 & BlockWrapper->Flags)
734 1 {
735 2 ScsiInvalidFieldError(ScsiLun);
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 13
736 2 }
737 1 // We don't support this command.
738 1 CmdStatus = COMMAND_FAILED;
739 1
740 1 BulkFreeBuffer(); //Out端点接收使能
741 1
742 1 if (CmdStatus != PHASE_ERROR)
743 1 {
744 2 SET_ILLEGAL_REQUEST(ScsiLun);
745 2 // Wait Data Received Ready.
746 2 BulkWaitOutDataReady(); // Wait Data Received Ready.
747 2 BulkPrepareCSW(CmdStatus);
748 2 }
749 1 else
750 1 {
751 2 BulkInStall();
752 2 BulkState = STALL_IN_COMPLETED;
753 2 }
754 1 }
755
756 //----------------------------------------------------------------------------
757 // OpCode = 0x23.
758 //----------------------------------------------------------------------------
759 void ScsiCmdOpCode23H()
760 {
761 1 BulkFreeBuffer();
762 1
763 1 SetBulkInFull();
764 1 memset((BYTE xdata *)(FIFO_ADDRESS_IN), 0, 12);
765 1 // Emulate PenDrive behavior to run BIOS Boot.
766 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 3) = 0x08;
767 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 5) = 0x01;
768 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 6) = 0xF4;
769 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 8) = 0x02;
770 1 *(BYTE xdata *)(FIFO_ADDRESS_IN + 10) = 0x02;
771 1
772 1 BulkSetDmaIn(12);
773 1 BulkState = BULK_DMA_IN_COMPLETED;
774 1
775 1 }
776
777 /***************************************************************************
778 SCSI COMMAND END
779 ***************************************************************************/
780
781 //----------------------------------------------------------------------------
782 // Do some initializations before a new SCSI command executed.
783 //----------------------------------------------------------------------------
784 void ScsiCmdNewStart()
785 {
786 1 // Update the memory address of BlockWrapper.
787 1 BlockWrapper = (CMD_BLOCK_WRAPPER xdata *)(FIFO_ADDRESS_OUT);
788 1
789 1 // UsbDmaTotalLength is used on other Scsicmd other than reading and writing.
790 1 UsbDmaTotalLength = ConvertEndian32(BlockWrapper->DataXsferLen);
791 1 SectorStart = 0; //reset SectorStart & SectorCount
792 1 SectorCount = 0;
793 1 CmdStatus = COMMAND_PASSED;
794 1 ScsiLun = BlockWrapper->CbwcbLun;
795 1 WrapperTag = BlockWrapper->Tag;
796 1 }
797
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 14
798 //----------------------------------------------------------------------------
799 // Init SCSI used parameters.
800 //----------------------------------------------------------------------------
801 void ScsiInit()
802 {
803 1 BYTE i;
804 1
805 1 SenseKey = NO_SENSE;
806 1 AddSenseCode = 0x00;
807 1 AddSenseCodeQ = 0x00;
808 1
809 1 for (i = 0; i < MAX_DEVICE_NUM ; i++)
810 1 {
811 2 ScsiWriteProtect[i] = false;
812 2 ScsiWriteProtectChange[i] = false;
813 2 }
814 1 }
815
816 //----------------------------------------------------------------------------
817 // Check SCSI Command
818 //----------------------------------------------------------------------------
819 void ScsiCheckCmd()
820 {
821 1 BYTE OpCode;
822 1 ScsiCmdNewStart();
823 1 OpCode = *(BYTE xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET);
824 1 //
825 1 ScsiLunValidCheck();
826 1
827 1 if(CmdStatus == PHASE_ERROR)
828 1 {
829 2 SetSenseDataRd(STATUS_NO_MEDIA);
830 2 BulkInStall();
831 2 BulkState = STALL_IN_COMPLETED;
832 2 return;
833 2 }
834 1
835 1 if(BlockWrapper->Sign != CBW_SIGNATURE)
836 1 {
837 2 SetSenseErrCmdField();
838 2 CmdStatus = PHASE_ERROR;
839 2 BulkInStall();
840 2 BulkState = STALL_IN_COMPLETED;
841 2 return;
842 2 }
843 1
844 1 switch (OpCode)
845 1 {
846 2 case TEST_UNIT_READY_OPCODE: ScsiCmdTestUnitReady(); return;
847 2 case REQUEST_SENSE_OPCODE : ScsiCmdRquestSense(); return;
848 2 case MODE_SELECT6_OPCODE : ScsiCmdModeSelect6(); return;
849 2 case MODE_SENSE6_OPCODE : ScsiCmdModeSense6(); return;
850 2 case INQUIRY_OPCODE : ScsiCmdInquiry(); return;
851 2 case START_STOP_UNIT_OPCODE: ScsiCmdStartStopUnit(); return;
852 2 case PREVENT_REMOVAL_OPCODE: ScsiCmdPreventRemoval();return;
853 2 case READ_CAPACITY10_OPCODE: ScsiCmdReadCapacity10();return;
854 2 case READ10_OPCODE : ScsiCmdRead10(); return;
855 2 case WRITE10_OPCODE : ScsiCmdWrite10(); return;
856 2 case VERIFY10_OPCODE : ScsiCmdVerify10(); return;
857 2 case _23_OPCODE : ScsiCmdOpCode23H(); return;
858 2 case MODE_SENSE10_OPCODE : ScsiCmdModeSense10(); return;
859 2 case READ_BUFFER : ScsiCmdReadBuf(); return; //2007.08.16
C51 COMPILER V7.02b SCSICMD 02/27/2008 12:56:18 PAGE 15
860 2 default:
861 2 CmdStatus = PHASE_ERROR;
862 2 SetSenseErrOpCode();
863 2 BulkInStall();
864 2 BulkState = STALL_IN_COMPLETED;
865 2 }
866 1 }
867
868
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3527 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = 27 13
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -