亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vend_cbw.c

?? CY7C68033芯片 USB DEVICE 代碼;標準c代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
//-----------------------------------------------------------------------------
void GetNandCfg()
{
    BYTE n, ID, ntype, bank;
    bit nand=0;

    gZones = cMaxZone;          // 512: default = 8 zone
#ifdef USE_2NAND
    CE0_ON();
#else
    IOD = 0xFE;                 // start from Bank0
#endif
    GetNandType();              // Get ID & Status byte
    GetNandType();              // Get ID & Status byte
    ID     = EP6FIFOBUF[0];     // get NAND ID  
    ntype  = EP6FIFOBUF[1];     // get NAND ID  
    for (bank=0; bank<2 && nand==0; bank++)
    {
        for (n=0; n<cMaxBlkChk; n++)
        {          
            if (bNand2k==0) gPhyAdd = n << 5; else gPhyAdd = n << 6;
            if ( (nReadCfgPage()==cOK) &&     // make sure no ECC error
                 (CheckSignature()==cOK)  )   // check signature and NAND configuration
            {
                nand = 1;                     // CFG found break out loop
                break;
            }
        }
#ifdef USE_2NAND
        CE0_OFF(), CE1_ON();
#else
        IOD=0xFD;                             // bank1: Scan on bank1
#endif
    }
    if (nand)  // If found, extract the VID, PID and Strings
    {   // Use the first 256 byte of halfKBuffer
        mymemmovexx(pDscrVID, EP6FIFOBUF+cVID_OFFSET, 4);
        mymemmovexx(halfKBuffer+cHALF_BUFF_OFFSET, EP6FIFOBUF+cINQUIRY_OFFSET, cNAND_CFG_LENGTH);
    }
    else
    {   //Fill the string index with zero, if FW is not found in the NAND
        //mymemmovexx(pStr3Offset, halfKBuffer+cHALF_BUFF_OFFSET, 3);       
        //mymemmovexx(pVendorOffset, halfKBuffer+cHALF_BUFF_OFFSET, 3);       
        AUTOPTR1H = MSB(halfKBuffer);       // load EP6FIFOBUF into AUTOPTR1H
        AUTOPTR1L = LSB(&(BYTE)Str3Offset);
        P_XAUTODAT1 = 0;
        P_XAUTODAT1 = 0;
        P_XAUTODAT1 = 0;
        AUTOPTR1L = LSB(&(BYTE)VendorOffset);
        P_XAUTODAT1 = 0;
    }

    //===============================================================
    //  Auto Detect number of Nand chips
    //===============================================================
#ifdef USE_2NAND   // Maxium detection only 1 NAND
    bank = 1;
    GetNandType();           
    if (ntype == EP6FIFOBUF[1]) bank=2;
#else
    for (bank=1; bank<8; bank++)
    {
       IOD = nBank[bank];          // select bank
       GetNandType();           
       if (ntype != EP6FIFOBUF[1]) break;
    } 
#endif

    DISABLE_NAND();

#ifndef NAND_2K
    bInterLeave = !(bank&1);       // even nand chip, interleave on
#endif

    gDriveCapacity = 0;    
    do
    {
       // Compute capacity of NAND based on bank variable
       switch (gZones)
       {
          case 4:  // 512, Zones = 4; 2K = Zones = 4
             if (bNand2k)
                gDriveCapacity += (TOTAL_SECTORS*4);
             else
                gDriveCapacity += TOTAL_SECTORS/2;
             break;
          case 2:  // 2K, Zones = 2;
             gDriveCapacity += (TOTAL_SECTORS*2);
             break;
          default:  //case 8:  // 512, Zones = 8; case 1:  // 2K,  Zones = 1
             gDriveCapacity += TOTAL_SECTORS;
             break;
       }
    } while (--bank>0);

    // bSoftErr=0= will correct repeat soft error on ECC
    // if (!bNand2k) bSoftErr=1;   // !!! need to work with Manufacturing tool

    if (ID==0x98 || ID == 0xec) bInternalMove = b30nsCycle = 1;
#ifdef USE_2LUN
    gDriveCapacity   -= (cLUN1_Capacity+1);
#else
    gDriveCapacity--;  
#endif
}

//-----------------------------------------------------------------------------
// bit CheckSignature(void)
//  return the signature in the configuration data.  In addition, it get
//  the gCodePage and gBootImage from configuration data.
//  
//typedef struct 
//{
//  char bSignature[6]; //"SMTDMG"
//  WORD wNextBlk;      // pointer to next FW image block (no parity)
//    char bCodePage;   //      This number should be in multiple block and < 30
//    char bBootImage;  //      0-3, number of 512P in a Page
//    char bNandDev;    // 0xa: MFG tool need to detect number of NAND chips
//    char bPage;       // 0xb: 5: 2^5=32 (512P); 6=2^6=64 (2KP)
//    char bMaxBlk;     // 0xc: 2^bMaxBlk i.e. 13=8K => 8K*512*32=128MB
//    char bNandCfg;    // 0xd: bit0=cache read, bit1=prog cache, bit2=30ns/50ns
//    char bFwCfg;      // 0xe: bit0=WriteProtec, bit1=ECC enable
//    char bFwRev;      // 0xf: 0-3=LSB, 4-7: MSB
//    char bPads[512-16]; 
//} NandCfg;
//-----------------------------------------------------------------------------
bit CheckSignature()
{
    AUTOPTR1H = MSB(EP6FIFOBUF);       // load EP6FIFOBUF into AUTOPTR1H
    AUTOPTR1L = LSB(EP6FIFOBUF);       // load EPFIFOBUF into  AUTOPTR1L
    // Check for "SMTDMG" signature
    if (P_XAUTODAT1 != 'S' ||
        P_XAUTODAT1 != 'M' ||
        P_XAUTODAT1 != 'T' ||
        P_XAUTODAT1 != 'D' ||
        P_XAUTODAT1 != 'M' ||
        P_XAUTODAT1 != 'G')
    {
        return 1;
    }
    // This code will ignore all the Option, except these variables below
    gZones   = 1 << (EP6FIFOBUF[0xc]-10);  // Number of Zones in a NAND block
    // Possible Zones will be defined as follows:
    // 8: 512, 8 Zones; 128MB     
    // 1: 2K,  1 Zone;  128MB
    // 4: 512, 4 Zones; 64MB       4: 2K, 4 Zone; 512MB
    // 2: 2K,  2 Zones; 256MB

    NandCfg  =  EP6FIFOBUF[0xd];           // bNandCfg
    FwCfg    =  EP6FIFOBUF[0xe];           // bFwCfg
    return nReadCfgPage();                 // this is Vendor configuration page
}

//-----------------------------------------------------------------------------
// NX2LP NAND Command support for Manufacturing tools and Validation
// CBW SCSI hook on the command 0xC8
//-----------------------------------------------------------------------------
bit handleVendorCBW()
{
   BYTE bank, cmd = EP2FIFOBUF[0x10];
   WORD add, len = dataTransferLen;
 
   bank = EP2FIFOBUF[CBW_DATA_START+6];

#ifdef USE_2NAND
   if (bank>1) DISABLE_NAND(); 
   else if (bank==0) CE0_ON(); else CE1_ON();
#else
   IOD = nBank[bank];
#endif

   add = gPhyAdd = dwLBA;  
   P_OUTPKTEND = 0x82;

   switch (cmd)
   { 
      case CBW_NAND_ERASE_ALL:
         gPhyAdd=0;
         // NAND page size
         if (bNand2k) cmd = c2KPageSize; else cmd = c512PageSize;
         len = gZones << 10;   // Zones * 1024
         do
         {  
             nand_blk_erase(gPhyAdd);
             gPhyAdd += cmd;
         } while (--len > 0);
         break;

      case CBW_NAND_READ_PAGE:
         waitForInBuffer();
         NandSetAdd(cNAND_READ_DATA, 0);
         NandRead(cEP4, len-1);
         P_INPKTEND = 4;
         break;

      case CBW_NAND_ERASE_BLK:
         if (bNand2k==0) gPhyAdd <<= 5; else gPhyAdd <<= 6;
         nand_blk_erase(gPhyAdd);     
         break;
     
      case CBW_NAND_WRITE_PAGE:
         while (!(P_EP2CS & bmEPEMPTY))  // commit any packets that have already shown up
            P_OUTPKTEND = 0x02;
         P_EP2FIFOCFG = bmAUTOOUT | bmOEP;
         NandSetAdd(cNAND_WRITE_DATA, 0);
         FifoWr(cEP2, len-1);             // write out the data area        
         NandSendCmd(cNAND_PROGRAM_PAGE);
         P_EP2FIFOCFG = 0;
         gCurZone = 0xff;                // require fresh LUT table    
         break;

      case CBW_NAND_READ_REDUNDANT:  
         Fifo6In();
         cmd = cNAND_READ_REDUNDANT;
         if (bNand2k) cmd = cNAND_READ_DATA; 
         for (bank=0; bank<64; bank++)
         {
             NandSetAdd(cmd, 4); 
             NandRead(cEP6, cNAND_REDUNDANT_SIZE);
             xPhyAdd++;
         }
         NandSendCmd(cNAND_RESET);
         goto ep8_out;

      case CBW_8051_LUT_DUMP:        //dump LUT
         add = (WORD)gLog2Phy;
         goto mem_rd;

      case CBW_NAND_READ_FLASH_ID:
         GetNandType();         
         ep8_out:
         add = (WORD)EP6FIFOBUF;
         // fall through
      case CBW_8051_MEM_READ:     // data should be less than 64K
         mem_rd:
         while (len>wPacketSize)
         {
            mymemmovexx(EP4FIFOBUF, (char xdata*)add, wPacketSize);
            len -= wPacketSize;
            add += wPacketSize;
            EP4BCH = MSB(wPacketSize);
            EP4BCL = LSB(wPacketSize);
            waitForInBuffer();
         }
         if (len)
         {
            mymemmovexx(EP4FIFOBUF, (char xdata*)add, len);
            EP4BCH = MSB(len); EP4BCL = LSB(len);
         }
         break;

      case CBW_8051_MEM_WRITE:            // len should not be more 1K
         while ((P_EP2CS & bmEPEMPTY));   // Wait for host to send data
         mymemmovexx((volatile char xdata*)add, EP2FIFOBUF, len); 
         loadEP2BC();
         break;   

      case CBW_8051_RENUM:      // re-enumeration
         sendUSBS(USBS_PASSED); 
         EZUSB_Delay(200);      
         EZUSB_Discon(TRUE);    // renumerate until setup received
         break;   
   }
   dataTransferLen = 0;
   DISABLE_NAND();
   return(USBS_PASSED);
}
//-----------------------------------------------------------------------------
// void loadEP2BC()
//-----------------------------------------------------------------------------
void loadEP2BC()
{
   WORD len = dataTransferLen;
   bit bShortPacketReceived = 0;
   // Toss away all of the data received with the command
   while (len && !bShortPacketReceived)
   {
      if(!(P_EP2CS & bmEPEMPTY))   
      {
         len -= min(EP2BC, len);
         if (EP2BC != wPacketSize)
            bShortPacketReceived = 1;   
         OUTPKTEND = 0x82;
      }
   }
   
}



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区系列电影| 久久婷婷一区二区三区| 欧美区一区二区三区| 精品88久久久久88久久久| 国产精品你懂的在线欣赏| 日本不卡一区二区三区高清视频| 国产精品 欧美精品| 91精品国产91久久久久久最新毛片| 亚洲国产精品t66y| 激情丁香综合五月| 欧美日韩激情一区二区三区| 成人免费视频在线观看| 国产剧情av麻豆香蕉精品| 欧美精品自拍偷拍| 亚洲福利国产精品| 91在线视频18| 国产精品网站在线观看| 久久精品国产免费| 欧美另类videos死尸| 亚洲精品乱码久久久久| 丁香六月综合激情| 亚洲卡通动漫在线| 福利一区在线观看| 精品国产一区二区在线观看| 日韩制服丝袜av| 欧美另类变人与禽xxxxx| 一二三区精品视频| 日本乱人伦aⅴ精品| 日本一区二区三区视频视频| 国产乱国产乱300精品| 欧美成人伊人久久综合网| 蜜臀a∨国产成人精品| 欧美精品tushy高清| 日韩精品一二区| 91精品国产高清一区二区三区蜜臀| 亚洲男人的天堂在线观看| 色素色在线综合| 亚洲日本中文字幕区| 91国产免费看| 五月婷婷综合网| 91麻豆精品国产91久久久久久 | 日韩欧美国产一区二区三区| 亚洲二区在线观看| 欧美二区三区91| 五月综合激情婷婷六月色窝| 日韩午夜在线影院| 久久国产精品色| 久久美女高清视频| 成人性生交大合| 中文字幕日韩精品一区| 一本大道综合伊人精品热热| 亚洲国产美国国产综合一区二区| 欧美色成人综合| 五月激情六月综合| 欧美成人艳星乳罩| av一区二区不卡| 亚洲成人av中文| 欧美精品久久天天躁| 九一九一国产精品| 国产偷国产偷亚洲高清人白洁| 国产福利视频一区二区三区| 中文字幕亚洲在| 国产精品萝li| 在线观看欧美精品| 久久精品国产亚洲aⅴ| 国产精品伦理一区二区| 欧美欧美欧美欧美首页| 国产精品自拍毛片| 亚洲精品久久久蜜桃| 日韩欧美国产电影| 成人国产在线观看| 五月婷婷欧美视频| 久久久久久久一区| 欧美日韩国产不卡| 国产精一品亚洲二区在线视频| 一区二区三区中文字幕在线观看| 日韩欧美成人激情| 91视视频在线观看入口直接观看www | 久久综合精品国产一区二区三区| 国产女人水真多18毛片18精品视频 | 久久久噜噜噜久噜久久综合| 国产精品免费观看视频| 日韩av一区二区在线影视| 99热这里都是精品| 国产欧美日韩亚州综合| 韩国欧美国产1区| 欧美色欧美亚洲另类二区| 99久久综合狠狠综合久久| 日韩视频一区二区三区在线播放| 蜜臀av性久久久久蜜臀av麻豆| 日本久久一区二区| 免费不卡在线观看| 岛国一区二区三区| 日韩福利电影在线| 欧美美女网站色| 欧美一级久久久| 久久免费美女视频| 国产福利一区在线| 国产精品欧美经典| 久久影音资源网| 国产精品黄色在线观看| 成人精品在线视频观看| 国产精品国产精品国产专区不蜜 | 国产一区二区伦理| 日本亚洲最大的色成网站www| 亚洲视频1区2区| 亚洲成va人在线观看| 国产一区 二区| 中文字幕一区二区三| 欧美自拍偷拍一区| 蜜桃精品视频在线观看| 精品人伦一区二区色婷婷| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产高清精品在线| 国产精品进线69影院| 欧美日韩免费一区二区三区视频| 欧美日韩一区高清| 亚洲精品中文在线影院| 欧美视频中文一区二区三区在线观看| 国产在线不卡视频| 国产乱子轮精品视频| 精品一二线国产| 国产自产v一区二区三区c| 麻豆国产精品官网| 国产制服丝袜一区| 成人免费观看视频| 99视频国产精品| 91免费看片在线观看| 欧洲在线/亚洲| 欧美欧美欧美欧美首页| 欧美电影免费观看高清完整版在| 日韩一区二区三区电影| 精品国产乱码久久久久久图片| 亚洲精品一区二区三区福利| 久久免费国产精品| 中文字幕精品在线不卡| 一区二区三区久久| 麻豆91精品视频| 国产一区二区三区免费| av电影在线不卡| 欧美日韩一本到| 精品久久人人做人人爽| 国产精品视频你懂的| 亚洲午夜激情av| 久久99精品国产麻豆婷婷| 成人av资源网站| 3atv一区二区三区| 久久久蜜桃精品| 亚洲黄色av一区| 狠狠色丁香婷综合久久| 97久久精品人人澡人人爽| 欧美日韩国产欧美日美国产精品| 精品噜噜噜噜久久久久久久久试看| 中文字幕一区三区| 日本三级亚洲精品| 成人激情开心网| 在线综合+亚洲+欧美中文字幕| 国产欧美精品一区二区色综合| 一区二区三区免费在线观看| 国产一区二区三区电影在线观看| 日本丰满少妇一区二区三区| 精品国产污网站| 亚洲欧美乱综合| 国产精品资源站在线| 欧美日韩1234| 亚洲色图另类专区| 国内精品不卡在线| 欧美日韩在线免费视频| 国产精品午夜久久| 美国十次综合导航| 日本精品视频一区二区三区| 久久新电视剧免费观看| 午夜电影一区二区| 一道本成人在线| 日本一区二区三区四区 | 99riav一区二区三区| 91精品婷婷国产综合久久竹菊| 国产精品初高中害羞小美女文| 国产精品77777| 欧美一区午夜视频在线观看| 亚洲蜜臀av乱码久久精品| 国产精品456| 日韩女优av电影在线观看| 亚洲亚洲人成综合网络| 99在线热播精品免费| 日本一区二区三区四区| 国产在线一区二区| 日韩一区二区三区观看| 日韩在线一二三区| 欧美视频一区二区在线观看| 《视频一区视频二区| jiyouzz国产精品久久| 久久久久久久久久久久电影| 日韩高清在线观看| 777午夜精品视频在线播放| 尤物在线观看一区| 一本到不卡精品视频在线观看| 中文字幕一区二区三区四区| 国产激情偷乱视频一区二区三区| 精品福利一区二区三区免费视频|