📄 rbc.lst
字号:
572 1 /*
573 1 // config TPBulkXfer Paras
574 1 */
575 1 Xfer_Space &= BOTXFERSPACE_MASK;
576 1 BOTXfer_atATA = 1;
577 1 BOTXfer_wResidue = CBW_wXferLen;
578 1
579 1 TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
580 1 RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
581 1
582 1 BOTFSMstate = USBFSM4BOT_DATAIN;
583 1
584 1 return (TRUE);
585 1
586 1 #undef cdbRead
587 1 }
588
589
590
591 BOOLEAN RBC_Write(void)
592 {
593 1 #define cdbWrite RBC_CDB.RbcCdb_Write
594 1
595 1 Hal4ATA_SectCntInBlk = ATADevExt_IDData.MaximumBlockTransfer << BITNUM4EP2PKT_PER_SECTOR;
596 1 /*
597 1 // Setting ATA Hardware
598 1 */
599 1 ATABF_IDEXfer_dir = 0;
600 1 Hal4ATA_ReadWriteSetting();
601 1
602 1 /*
603 1 // Config TPBulkXfer Paras
604 1 */
605 1 Xfer_Space &= BOTXFERSPACE_MASK;
606 1 BOTXfer_atATA = 1;
607 1 BOTXfer_wResidue = CBW_wXferLen;
608 1
609 1 TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);
610 1 RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
611 1
612 1 BOTFSMstate = USBFSM4BOT_DATAOUT;
613 1
C51 COMPILER V7.06 RBC 02/17/2004 14:42:23 PAGE 11
614 1 return (TRUE);
615 1
616 1 #undef cdbWrite
617 1 }
618
619 BOOLEAN RBC_ReadCapacity(void)
620 {
621 1 #define cdbReadCap RBC_CDB.RbcCdb_ReadCapacity
622 1
623 1 /*
624 1 // Calculate last sector.
625 1 */
626 1 cdbReadCap.tmpVar.l[1] = ((INT32)ATADevExt_IDData.CurrentSectorCapacity.u0) - 1;
627 1
628 1 // 32bits info
629 1 //ATADevExt_IDData.CurrentSectorCapacity.ints.i0 = Hal4Sys_ATADataPortInW()
630 1 //ATADevExt_IDData.CurrentSectorCapacity.ints.i1 = Hal4Sys_ATADataPortInW()
631 1 /* struct
632 1 {
633 1 INT8 c3; // MSB for 8051 Keil C
634 1 INT8 c2;
635 1 INT8 c1;
636 1 INT8 c0; // LSB for 8051 Keil C
637 1 } chars0;
638 1 */
639 1 /* store it in big endian */
640 1 cdbReadCap.tmpVar.CapData.LBA_3 = ( INT8 ) cdbReadCap.tmpVar.l0[1].chars0.c3;
641 1 cdbReadCap.tmpVar.CapData.LBA_2 = ( INT8 ) cdbReadCap.tmpVar.l0[1].chars0.c2;
642 1 cdbReadCap.tmpVar.CapData.LBA_1 = ( INT8 ) cdbReadCap.tmpVar.l0[1].chars0.c1;
643 1 cdbReadCap.tmpVar.CapData.LBA_0 = ( INT8 ) cdbReadCap.tmpVar.l0[1].chars0.c0;
644 1
645 1 /*
646 1 // Bytes Per Block is 512Bytes
647 1 // 00020000 is 0x200 in big endian
648 1 */
649 1 cdbReadCap.tmpVar.CapData.BlockLen_3 = 0;
650 1 cdbReadCap.tmpVar.CapData.BlockLen_2 = 0;
651 1 cdbReadCap.tmpVar.CapData.BlockLen_1 = 0x02;
652 1 cdbReadCap.tmpVar.CapData.BlockLen_0 = 0;
653 1 /*
654 1 // Adjust TPBulkXfer Paras
655 1 */
656 1 Xfer_Space &= BOTXFERSPACE_MASK;
657 1 BOTXfer_atRAM = 1;
658 1
659 1 BOTXfer_wResidue = sizeof(READ_CAPACITY_DATA);
660 1 BOTXfer_pData = (PINT8)&(cdbReadCap.tmpVar);
661 1
662 1 TPBulksup_ErrorHandler(CASE6, BOTXfer_wResidue);
663 1 RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
664 1
665 1 BOTFSMstate = USBFSM4BOT_DATAIN;
666 1
667 1 return(TRUE);
668 1 #undef cdbReadCap
669 1 }
670
671 BOOLEAN RBC_OnOffUnit(void)
672 {
673 1 #define cdbOnOffUnit RBC_CDB.RbcCdb_OnOffUnit
674 1
675 1 //BOTXfer_wResidue = 0;
C51 COMPILER V7.06 RBC 02/17/2004 14:42:23 PAGE 12
676 1
677 1 switch(cdbOnOffUnit.Flags.bits1.PowerConditions)
678 1 {
679 2 case PWR_NOCHANGE:
680 2 switch(cdbOnOffUnit.Flags.bits1.MediumState)
681 2 {
682 3 case MEDIUM_LOAD:
683 3 break;
684 3 case MEDIUM_UNLOAD:
685 3 break;
686 3 case MEDIUM_STOP:
687 3 break;
688 3 case MEDIUM_READY:
689 3 break;
690 3 }
691 2 break;
692 2 case PWR_ACTIVE:
693 2 break;
694 2 case PWR_IDLE:
695 2 break;
696 2 case PWR_STANDBY:
697 2 break;
698 2 case PWR_SLEEP:
699 2 break;
700 2 case PWR_DEVCTRL:
701 2 default:
702 2 break;
703 2 }
704 1
705 1
706 1 RBC_PropertyData.bits.MediumState = cdbOnOffUnit.Flags.bits1.MediumState;
707 1 RBC_PropertyData.bits.PowerState = cdbOnOffUnit.Flags.bits1.PowerConditions;
708 1
709 1 TPBulksup_ErrorHandler(CASE1,0);
710 1 RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
711 1
712 1 TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
713 1
714 1 return TRUE;
715 1 #undef cdbOnOffUnit
716 1 }
717
718 BOOLEAN RBC_SyncCache(void)
719 {
720 1 #define cdbSyncRBC RBC_CDB.RbcCdb_SyncCache
721 1
722 1 //BOTXfer_wResidue = 0;
723 1 TPBulksup_ErrorHandler(CASE1,0);
724 1 RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
725 1
726 1 TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
727 1 return TRUE;
728 1 #undef cdbSyncRBC
729 1 }
730
731
732 BOOLEAN RBC_Verify(void)
733 {
734 1 #define cdbVerifyRBC RBC_CDB.RbcCdb_Verify
735 1
736 1 if( CBW_wXferLen == 0 )
737 1 {
C51 COMPILER V7.06 RBC 02/17/2004 14:42:23 PAGE 13
738 2 //BOTXfer_wResidue = 0;
739 2 TPBulksup_ErrorHandler(CASE1,0);
740 2 RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
741 2 TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
742 2 }
743 1 else
744 1 {
745 2 /*
746 2 // Config TPBulkXfer Paras
747 2 */
748 2 Xfer_Space &= BOTXFERSPACE_MASK;
749 2 BOTXfer_atROM = 1;
750 2 BOTXfer_wResidue = CBW_wXferLen;
751 2
752 2 TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);
753 2 RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
754 2
755 2 BOTFSMstate = USBFSM4BOT_DATAOUT;
756 2 }
757 1 return TRUE;
758 1 #undef cdbVerifyRBC
759 1 }
760
761
762 /*
763 ////////////////////////////////////////////////////////////////////////////////////
764 // SCSI Primary Command Support
765 ////////////////////////////////////////////////////////////////////////////////////
766 */
767
768 BOOLEAN SPC_Inquiry(void)
769 {
770 1 #define cdbInquirySPC RBC_CDB.SpcCdb_Inquiry
771 1 BOOLEAN retStatus = FALSE;
772 1
773 1
774 1 if(cdbInquirySPC.EnableVPD)
775 1 {
776 2 switch(cdbInquirySPC.PageCode)
777 2 {
778 3 case VPDPAGE_SERIAL_NUMBER:
779 3
780 3 BOTXfer_pData =(PINT8) &SerialPage;
781 3 BOTXfer_wResidue = sizeof(VPD_SERIAL_PAGE);
782 3 break;
783 3
784 3 case VPDPAGE_DEVICE_IDENTITY:
785 3
786 3 retStatus = TRUE;
787 3 BOTXfer_pData = (PINT8)&DeviceIDPage;
788 3 BOTXfer_wResidue = sizeof(VPD_DEVICE_ID_PAGE);
789 3 break;
790 3
791 3 default:
792 3 //retStatus = FALSE;
793 3 TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
794 3 RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_ILLEGAL_COMMAND,0x00);
795 3
796 3 TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
797 3 return retStatus;
798 3 }
799 2 }
C51 COMPILER V7.06 RBC 02/17/2004 14:42:23 PAGE 14
800 1 else if(cdbInquirySPC.CmdSupportData)
801 1 {
802 2 //retStatus = FALSE;
803 2 TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
804 2 RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_ILLEGAL_COMMAND,0x00);
805 2
806 2 TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
807 2 return retStatus;
808 2 }
809 1 else
810 1 {
811 2
812 2 BOTXfer_pData =(PINT8) &inquiryData;
813 2 BOTXfer_wResidue = sizeof(STD_INQUIRYDATA);
814 2 }
815 1
816 1 retStatus = TRUE;
817 1 Xfer_Space &= BOTXFERSPACE_MASK;
818 1 BOTXfer_atROM = 1;
819 1
820 1 if( BOTXfer_wResidue > CBW_wXferLen )
821 1 {
822 2 BOTXfer_wResidue = CBW_wXferLen;
823 2 TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
824 2 RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
825 2 }
826 1 else if ( BOTXfer_wResidue == CBW_wXferLen )
827 1 {
828 2 TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
829 2 RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
830 2 }
831 1 else
832 1 {
833 2 TPBulksup_ErrorHandler(CASE5,BOTXfer_wResidue);
834 2 RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
835 2 }
836 1
837 1 BOTFSMstate = USBFSM4BOT_DATAIN;// Goto USBFSM4BOT_DATAIN
838 1
839 1 return retStatus;
840 1 #undef cdbInquirySPC
841 1 }
842
843 BOOLEAN SPC_ModeSelect(void)
844 {
845 1 #define cdbModeSelectSPC RBC_CDB.SpcCdb_ModeSelect
846 1 BOOLEAN retStatus = FALSE;
847 1
848 1 //
849 1 //Just Retrieve and discard data from USB FIFO
850 1
851 1 Xfer_Space &= BOTXFERSPACE_MASK;
852 1 BOTXfer_atROM = 1;
853 1
854 1 BOTXfer_pData = (PINT8)0;
855 1 BOTXfer_wResidue = cdbModeSelectSPC.ParameterLen;
856 1
857 1 if(cdbModeSelectSPC.SavePage != 1)
858 1 {
859 2 if(CBW_wXferLen < BOTXfer_wResidue)
860 2 {
861 3 BOTXfer_wResidue = CBW_wXferLen;
C51 COMPILER V7.06 RBC 02/17/2004 14:42:23 PAGE 15
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -