📄 mass_stg.lst
字号:
809 *****************************************************************************************/
810 void Analysis_UFI(void)
811 {
812 1
813 1 if(flags.epin1 && csw) //Bulk in interrupt
814 1 {
815 2 flags.epin1 = 0;
816 2 SFR_WR(INDEX, 0x01);
817 2 FIFO_WR((uchar *)pCS, FIFO1, 0x0D);
818 2 SFR_WR(EINCSRL, 0x01);
819 2 //while(SFR_RD(EINCSRL) & BIT0);
820 2 csw = 0;
821 2
822 2 }
823 1
824 1 if(flags.epout1) //Bulk out interrupt
825 1 {
826 2 flags.epout1 = 0;
827 2 BulkOut_Process();
828 2
829 2 }
830 1
831 1 }
832 /******************************************************************************************
833 name: exchange
834 function: exchange the Big Endian to the Little Endian
835 pars: dat
836 returns: temp
837 ******************************************************************************************/
838 ulong exchange(ulong dat)
839 {
840 1 uint temp1,temp2;
C51 COMPILER V7.06 MASS_STG 10/19/2007 15:26:26 PAGE 15
841 1 ulong temp;
842 1 temp1 = (uint)(dat>>16);
843 1 temp2 = (uint)dat;
844 1 temp1 = temp1>>8 | temp1<<8;
845 1 temp2 = temp2>>8 | temp2<<8;
846 1 temp = ((ulong)temp2<<16) | ((ulong)temp1);
847 1 return temp;
848 1
849 1
850 1 }
851 /*****************************************************************************************
852 name: BulkOut_Process
853 function: bulk out endpoint process
854 par: no
855 returns: no
856 ******************************************************************************************/
857 void BulkOut_Process()
858 {
859 1 uchar temp1, temp2,temp3,temp4, status, LBAL, LBAH,lbal,lbah,flag, SaddrL, SaddrH;
860 1 ulong temp;
861 1 uint cnt, i, j, t, PageNum, LBA, lba;
862 1 xdata uchar CBWbuf[31];
863 1 CBW *pCB;
864 1 CSW CSW0;
865 1
866 1
867 1 SFR_WR(INDEX, 1);
868 1 status = SFR_RD(EOUTCSRL);
869 1 if(status & BIT0) //get the received data length
870 1 {
871 2 temp1 = SFR_RD(EOUTCNTL);
872 2 temp2 = SFR_RD(EOUTCNTH);
873 2 cnt = (((uint)temp2)<<8) | ((uint)temp1);
874 2 }
875 1 for(i=0;i<31;i++)
876 1 CBWbuf[i] = SFR_RD(FIFO1); //buffer the Bulk out data
877 1
878 1 temp1 = SFR_RD(EOUTCSRL);
879 1 temp1 &= ~BIT0;
880 1 SFR_WR(EOUTCSRL, temp1);
881 1 pCB = (pCBW)CBWbuf; //Converte to the CBW format
882 1
883 1 //make the CSW blok
884 1 CSW0.CSWTag = pCB->CBWTag;
885 1 CSW0.CSWSignature = 0x55534253;
886 1 temp = exchange(pCB->CBWDataLength);
887 1 if(temp<MaxSize)
888 1 {
889 2 CSW0.CSWDataLength = 0;
890 2 }
891 1 else
892 1 {
893 2 CSW0.CSWDataLength = 0;
894 2 }
895 1 pCS = & CSW0; //Send the address of CSW to the write FIFO
896 1
897 1
898 1 //analysis the CBWCB
899 1 temp1 = pCB->CBWCB[0];
900 1 LBAL = pCB->CBWCB[5];
901 1 LBAH = pCB->CBWCB[4];
902 1 SaddrH = 0xFF;
C51 COMPILER V7.06 MASS_STG 10/19/2007 15:26:26 PAGE 16
903 1 if(LBAL & 0x20)
904 1 SaddrL = 0xE0;
905 1 else
906 1 SaddrL = 0xC0;
907 1 LBA = (uint)LBAL | ((uint)LBAH)<<8;
908 1 PageNum = (0x00FF & (uint)(pCB->CBWCB[8])) | (0x00FF & (uint)(pCB->CBWCB[7])) << 8;
909 1
910 1 switch (temp1)
911 1 {
912 2 case Format_Unit:
913 2
914 2 break;
915 2
916 2 case Inquiry: //SCSI Inquiry Command process
917 2
918 2 FIFO_WR(Return_Inquiry, FIFO1, 0x24);
919 2 SFR_WR(EINCSRL, 1);
920 2 csw = 1;
921 2 while(SFR_RD(EINCSRL) & BIT0); //WAIT for send compelete
922 2
923 2 break;
924 2
925 2 case Read_Format: //SCSI Read Format Capacity process
926 2
927 2 FIFO_WR(Return_Read_Format,FIFO1, 0x14);
928 2 SFR_WR(EINCSRL, 1);
929 2 csw = 1;
930 2 while(SFR_RD(EINCSRL) & BIT0); //Wait for send compelete
931 2
932 2 break;
933 2
934 2 case Read_Cap:
935 2
936 2 FIFO_WR(Return_Read_Cap, FIFO1, 0x8); //SCSI Read Capacity process
937 2 SFR_WR(EINCSRL, 1);
938 2 CSW0.CSWStatus = 0;
939 2 csw = 1;
940 2 while(SFR_RD(EINCSRL) & BIT0); //Wait for Send compelete
941 2
942 2 break;
943 2
944 2 case Prevent_Allow:
945 2
946 2 FIFO_WR((uchar *)pCS, FIFO1, 0x0D);
947 2 SFR_WR(EINCSRL, 1);
948 2 csw = 0;
949 2 while(SFR_RD(EINCSRL) & BIT0);
950 2 break;
951 2
952 2 case Test_Ready:
953 2
954 2 //FIFO_WR((uchar *)pCS, FIFO1, 0x0D);
955 2 //SFR_WR(EINCSRL, 1);
956 2 flags.epin1 = 1;
957 2 csw = 1; //Wait for send compelete
958 2
959 2 break;
960 2
961 2 case Read_10:
962 2
963 2 for(t=0;t<PageNum;t++) //SCSI READ10 Process, read data from Flash and send to HOST
964 2 {
C51 COMPILER V7.06 MASS_STG 10/19/2007 15:26:26 PAGE 17
965 3 page_read(0x0, LBAL+(uchar)t, LBAH);
966 3 for(i=0;i<8;i++)
967 3 {
968 4 FIFO_WR(buf + i*MaxSize, FIFO1, MaxSize);
969 4 SFR_WR(EINCSRL, 1);
970 4 while(SFR_RD(EINCSRL) & BIT0);
971 4
972 4 }
973 3
974 3 }
975 2 csw = 1;
976 2 break;
977 2
978 2 case Mode_Sense6:
979 2
980 2 FIFO_WR(Sense, FIFO1, 0x08);
981 2 SFR_WR(EINCSRL, 1);
982 2 csw = 1;
983 2 while(SFR_RD(EINCSRL) & BIT0);
984 2 //csw = 1;
985 2 break;
986 2
987 2 case Verify:
988 2
989 2 flags.epin1 = 1;
990 2 csw = 1;
991 2 break;
992 2
993 2 case Write_10: //SCSI WIRTE10 Process, write data to NandFlash
994 2
995 2 lba = LBA;
996 2 block_buffer(LBA);
997 2 for(i=0;i<PageNum;i++) //write Host send data to the 512B xdata buffer
998 2 {
999 3
1000 3 lbal = (uchar)(lba & 0x00ff);
1001 3 lbah = (uchar)((lba & 0xff00)>>8);
1002 3 for(j=0;j<8;j++)
1003 3 {
1004 4 for(t=0;t<64;t++)
1005 4 buf[t+64*j] = SFR_RD(FIFO1);
1006 4 SFR_WR(EOUTCSRL, 0x0);
1007 4
1008 4 }
1009 3 if(flag = page_program(buf, 0, lbal, lbah, 512)) //program one Sector data to NandFlash
1010 3 LED = 0;
1011 3 lba++;
1012 3
1013 3 if((i+1)%32==0)
1014 3 {
1015 4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -