📄 vend_cbw.lst
字号:
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 + -