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

📄 vend_cbw.lst

📁 linux下数据下载器的设计与实现
💻 LST
📖 第 1 页 / 共 2 页
字号:
 277   4                  }
 278   3              }
 279   2      #ifdef USE_2NAND
                      CE0_OFF(), CE1_ON();
              #else
 282   2              IOD=0xFD;                             // bank1: Scan on bank1
 283   2      #endif
 284   2          }
 285   1          if (nand)  // If found, extract the VID, PID and Strings
 286   1          {   // Use the first 256 byte of halfKBuffer
 287   2              mymemmovexx(pDscrVID, EP6FIFOBUF+cVID_OFFSET, 4);
 288   2              mymemmovexx(halfKBuffer+cHALF_BUFF_OFFSET, EP6FIFOBUF+cINQUIRY_OFFSET, cNAND_CFG_LENGTH);
 289   2          }
 290   1          else
 291   1          {   //Fill the string index with zero, if FW is not found in the NAND
 292   2              //mymemmovexx(pStr3Offset, halfKBuffer+cHALF_BUFF_OFFSET, 3);       
 293   2              //mymemmovexx(pVendorOffset, halfKBuffer+cHALF_BUFF_OFFSET, 3);       
 294   2              AUTOPTR1H = MSB(halfKBuffer);       // load EP6FIFOBUF into AUTOPTR1H
 295   2              AUTOPTR1L = LSB(&(BYTE)Str3Offset);
 296   2              P_XAUTODAT1 = 0;
 297   2              P_XAUTODAT1 = 0;
 298   2              P_XAUTODAT1 = 0;
 299   2              AUTOPTR1L = LSB(&(BYTE)VendorOffset);
 300   2              P_XAUTODAT1 = 0;
 301   2          }
C51 COMPILER V7.50   VEND_CBW                                                              10/12/2007 17:05:45 PAGE 6   

 302   1      
 303   1          //===============================================================
 304   1          //  Auto Detect number of Nand chips
 305   1          //===============================================================
 306   1      #ifdef USE_2NAND   // Maxium detection only 1 NAND
                  bank = 1;
                  GetNandType();           
                  if (ntype == EP6FIFOBUF[1]) bank=2;
              #else
 311   1          for (bank=1; bank<8; bank++)
 312   1          {
 313   2             IOD = nBank[bank];          // select bank
 314   2             GetNandType();           
 315   2             if (ntype != EP6FIFOBUF[1]) break;
 316   2          } 
 317   1      #endif
 318   1      
 319   1          DISABLE_NAND();
 320   1      
 321   1      #ifndef NAND_2K
                  bInterLeave = !(bank&1);       // even nand chip, interleave on
              #endif
 324   1      
 325   1          gDriveCapacity = 0;
 326   1      
 327   1          do
 328   1          {
 329   2             // Compute capacity of NAND based on bank variable
 330   2             switch (gZones)
 331   2             {
 332   3                case 4:  // 512, Zones = 4; 2K = Zones = 4
 333   3                   if (bNand2k)
 334   3                      gDriveCapacity += (TOTAL_SECTORS*4);
 335   3                   else
 336   3                      gDriveCapacity += TOTAL_SECTORS/2;
 337   3                   break;
 338   3                case 2:  // 2K, Zones = 2;
 339   3                   gDriveCapacity += (TOTAL_SECTORS*2);
 340   3                   break;
 341   3                default:  //case 8:  // 512, Zones = 8; case 1:  // 2K,  Zones = 1
 342   3                   gDriveCapacity += TOTAL_SECTORS;
 343   3                   break;
 344   3             }
 345   2          } while (--bank>0);
 346   1      
 347   1          // bSoftErr=0= will correct repeat soft error on ECC
 348   1          // if (!bNand2k) bSoftErr=1;   // !!! need to work with Manufacturing tool
 349   1      
 350   1          if (ID==0x98 || ID == 0xec) bInternalMove = b30nsCycle = 1;
 351   1      #ifdef USE_2LUN
                  gDriveCapacity   -= (cLUN1_Capacity+1);
              #else
 354   1          gDriveCapacity--;  
 355   1      #endif
 356   1      }
 357          
 358          //-----------------------------------------------------------------------------
 359          // bit CheckSignature(void)
 360          //  return the signature in the configuration data.  In addition, it get
 361          //  the gCodePage and gBootImage from configuration data.
 362          //  
 363          //typedef struct 
C51 COMPILER V7.50   VEND_CBW                                                              10/12/2007 17:05:45 PAGE 7   

 364          //{
 365          //  char bSignature[6]; //"SMTDMG"
 366          //  WORD wNextBlk;      // pointer to next FW image block (no parity)
 367          //    char bCodePage;   //      This number should be in multiple block and < 30
 368          //    char bBootImage;  //      0-3, number of 512P in a Page
 369          //    char bNandDev;    // 0xa: MFG tool need to detect number of NAND chips
 370          //    char bPage;       // 0xb: 5: 2^5=32 (512P); 6=2^6=64 (2KP)
 371          //    char bMaxBlk;     // 0xc: 2^bMaxBlk i.e. 13=8K => 8K*512*32=128MB
 372          //    char bNandCfg;    // 0xd: bit0=cache read, bit1=prog cache, bit2=30ns/50ns
 373          //    char bFwCfg;      // 0xe: bit0=WriteProtec, bit1=ECC enable
 374          //    char bFwRev;      // 0xf: 0-3=LSB, 4-7: MSB
 375          //    char bPads[512-16]; 
 376          //} NandCfg;
 377          //-----------------------------------------------------------------------------
 378          bit CheckSignature()
 379          {
 380   1          AUTOPTR1H = MSB(EP6FIFOBUF);       // load EP6FIFOBUF into AUTOPTR1H
 381   1          AUTOPTR1L = LSB(EP6FIFOBUF);       // load EPFIFOBUF into  AUTOPTR1L
 382   1          // Check for "SMTDMG" signature
 383   1          if (P_XAUTODAT1 != 'S' ||
 384   1              P_XAUTODAT1 != 'M' ||
 385   1              P_XAUTODAT1 != 'T' ||
 386   1              P_XAUTODAT1 != 'D' ||
 387   1              P_XAUTODAT1 != 'M' ||
 388   1              P_XAUTODAT1 != 'G')
 389   1          {
 390   2              return 1;
 391   2          }
 392   1          // This code will ignore all the Option, except these variables below
 393   1          gZones   = 1 << (EP6FIFOBUF[0xc]-10);  // Number of Zones in a NAND block
 394   1          // Possible Zones will be defined as follows:
 395   1          // 8: 512, 8 Zones; 128MB     
 396   1          // 1: 2K,  1 Zone;  128MB
 397   1          // 4: 512, 4 Zones; 64MB       4: 2K, 4 Zone; 512MB
 398   1          // 2: 2K,  2 Zones; 256MB
 399   1      
 400   1          NandCfg  =  EP6FIFOBUF[0xd];           // bNandCfg
 401   1          FwCfg    =  EP6FIFOBUF[0xe];           // bFwCfg
 402   1          return nReadCfgPage();                 // this is Vendor configuration page
 403   1      }
 404          
 405          //-----------------------------------------------------------------------------
 406          // NX2LP NAND Command support for Manufacturing tools and Validation
 407          // CBW SCSI hook on the command 0xC8
 408          //-----------------------------------------------------------------------------
 409          bit handleVendorCBW()
 410          {
 411   1         BYTE xdata bank, cmd = EP2FIFOBUF[0x10];
 412   1         WORD xdata add, len = dataTransferLen;
 413   1       
 414   1         bank = EP2FIFOBUF[CBW_DATA_START+6];
 415   1      
 416   1      #ifdef USE_2NAND
                 if (bank>1) DISABLE_NAND(); 
                 else if (bank==0) CE0_ON(); else CE1_ON();
              #else
 420   1         IOD = nBank[bank];
 421   1      #endif
 422   1      
 423   1         add = gPhyAdd = dwLBA;  
 424   1         P_OUTPKTEND = 0x82;
 425   1      
C51 COMPILER V7.50   VEND_CBW                                                              10/12/2007 17:05:45 PAGE 8   

 426   1         switch (cmd)
 427   1         { 
 428   2            case CBW_NAND_ERASE_ALL:
 429   2            gPhyAdd=0;
 430   2               // NAND page size
 431   2               if (bNand2k) cmd = c2KPageSize; else cmd = c512PageSize;
 432   2               len = gZones << 10;   // Zones * 1024
 433   2               do
 434   2               {  
 435   3                   nand_blk_erase(gPhyAdd);
 436   3                   gPhyAdd += cmd;
 437   3               } while (--len > 0);
 438   2               break;
 439   2      
 440   2            case CBW_NAND_READ_PAGE:
 441   2               waitForInBuffer();
 442   2               NandSetAdd(cNAND_READ_DATA, 0);
 443   2               NandRead(cEP4, len-1);
 444   2               P_INPKTEND = 4;
 445   2               break;
 446   2      
 447   2            case CBW_NAND_ERASE_BLK:
 448   2                    if (bNand2k==0) gPhyAdd <<= 5; else gPhyAdd <<= 6;
 449   2               nand_blk_erase(gPhyAdd);     
 450   2               break;
 451   2           
 452   2            case CBW_NAND_WRITE_PAGE:
 453   2      
 454   2               while (!(P_EP2CS & bmEPEMPTY))  // commit any packets that have already shown up
 455   2                  P_OUTPKTEND = 0x02;
 456   2               P_EP2FIFOCFG = bmAUTOOUT | bmOEP;
 457   2               NandSetAdd(cNAND_WRITE_DATA, 0);
 458   2               FifoWr(cEP2, len-1);             // write out the data area        
 459   2               NandSendCmd(cNAND_PROGRAM_PAGE);
 460   2               P_EP2FIFOCFG = 0;
 461   2               gCurZone = 0xff;                // require fresh LUT table    
 462   2               break;
 463   2      
 464   2            case CBW_NAND_READ_REDUNDANT:  
 465   2               Fifo6In();
 466   2               cmd = cNAND_READ_REDUNDANT;
 467   2               if (bNand2k) cmd = cNAND_READ_DATA; 
 468   2               for (bank=0; bank<64; bank++)
 469   2               {
 470   3                   NandSetAdd(cmd, 4); 
 471   3                   NandRead(cEP6, cNAND_REDUNDANT_SIZE);
 472   3                   xPhyAdd++;
 473   3               }
 474   2               NandSendCmd(cNAND_RESET);
 475   2               goto ep8_out;
 476   2      
 477   2            case CBW_8051_LUT_DUMP:        //dump LUT
 478   2               add = (WORD)gLog2Phy;
 479   2               goto mem_rd;
 480   2      
 481   2            case CBW_NAND_READ_FLASH_ID:
 482   2               GetNandType();         
 483   2               ep8_out:
 484   2               add = (WORD)EP6FIFOBUF;
 485   2               // fall through
 486   2            case CBW_8051_MEM_READ:     // data should be less than 64K
 487   2               mem_rd:
C51 COMPILER V7.50   VEND_CBW                                                              10/12/2007 17:05:45 PAGE 9   

 488   2               while (len>wPacketSize)
 489   2               {
 490   3                  mymemmovexx(EP4FIFOBUF, (char xdata*)add, wPacketSize);
 491   3                  len -= wPacketSize;
 492   3                  add += wPacketSize;
 493   3                  EP4BCH = MSB(wPacketSize);
 494   3                  EP4BCL = LSB(wPacketSize);
 495   3                  waitForInBuffer();
 496   3               }
 497   2               if (len)
 498   2               {
 499   3                  mymemmovexx(EP4FIFOBUF, (char xdata*)add, len);
 500   3                  EP4BCH = MSB(len); EP4BCL = LSB(len);
 501   3               }
 502   2               break;
 503   2      
 504   2            case CBW_8051_MEM_WRITE:            // len should not be more 1K
 505   2               while ((P_EP2CS & bmEPEMPTY));   // Wait for host to send data
 506   2               mymemmovexx((volatile char xdata*)add, EP2FIFOBUF, len); 
 507   2               loadEP2BC();
 508   2               break;   
 509   2      
 510   2            case CBW_8051_RENUM:      // re-enumeration
 511   2               sendUSBS(USBS_PASSED); 
 512   2               EZUSB_Delay(200);      
 513   2               EZUSB_Discon(TRUE);    // renumerate until setup received
 514   2               break;   
 515   2         }
 516   1         dataTransferLen = 0;
 517   1         DISABLE_NAND();
 518   1         return(USBS_PASSED);
 519   1      }
 520          //-----------------------------------------------------------------------------
 521          // void loadEP2BC()
 522          //-----------------------------------------------------------------------------
 523          void loadEP2BC()
 524          {
 525   1         WORD xdata len = dataTransferLen;
 526   1         bit bShortPacketReceived = 0;
 527   1         // Toss away all of the data received with the command
 528   1         while (len && !bShortPacketReceived)
 529   1         {
 530   2            if(!(P_EP2CS & bmEPEMPTY))   
 531   2            {
 532   3               len -= min(EP2BC, len);
 533   3               if (EP2BC != wPacketSize)
 534   3                  bShortPacketReceived = 1;   
 535   3               OUTPKTEND = 0x82;
 536   3            }
 537   2         }
 538   1         
 539   1      }
 540          
 541          
 542          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1974    ----
   CONSTANT SIZE    =     10    ----
   XDATA SIZE       =   ----      15
   PDATA SIZE       =   ----    ----
C51 COMPILER V7.50   VEND_CBW                                                              10/12/2007 17:05:45 PAGE 10  

   DATA SIZE        =   ----       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       3
   EDATA SIZE       =   ----    ----
   HDATA SIZE       =   ----    ----
   XDATA CONST SIZE =   ----    ----
   FAR CONST SIZE   =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -