⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mass_stg.lst

📁 基于c8051F320的优盘制作代码及原理图
💻 LST
📖 第 1 页 / 共 5 页
字号:
 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 + -