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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? ide.c

?? HIGH_SPEED_USB_To_ATA(IDE)Firmware相關(guān)代碼(EZ USB FX2芯片)
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
            stallEP2OUT();
         
         return(USBS_FAILED);
         break;
   }
}   



void waitForInBuffer()
{
   while((EP8CS & bmEPFULL));   // Wait for an available buffer from the host

   return;
}   


static bit ideReadCommand(bit verify)
{   
   BYTE driveStatus;
   WORD sectorcount; 
   BYTE i; 
   WORD wordCtr;

   writePIO8(ATA_DRIVESEL_REG, 0xe0);
   if (waitForBusyBit() == USBS_FAILED)
   {
      // Oddly enough, an error bit is okay here.  It means that the LAST command failed, not this one.
      // A new command is required to clear many error conditions.
   }
        
   ((BYTE *) &dwLBA)[0] = EP2FIFOBUF[CBW_DATA_START+2];
   ((BYTE *) &dwLBA)[1] = EP2FIFOBUF[CBW_DATA_START+3];
   ((BYTE *) &dwLBA)[2] = EP2FIFOBUF[CBW_DATA_START+4];
   ((BYTE *) &dwLBA)[3] = EP2FIFOBUF[CBW_DATA_START+5];

   // relinquish control of the bulk buffer occupied by the CBW
   EP2BCL = 0x80;  

   // This loop breaks up the 32 bit length into 8 bits * sectors.
   // For example, a read of 0x10000 turns into 0x80 sectors.
   while (dataTransferLen)
   {
      dwLBAtoLBARegs();

      // First stuff the length register (number of sectors to read)
      if (dataTransferLenMSW & 0xfffe)
      {
         writePIO8(ATA_SECTOR_COUNT_REG, 1);     // if (bExtAddrSupport) we need to stuff the MSB
         writePIO8(ATA_SECTOR_COUNT_REG, 0);     // 0 means 256 blocks of 512 bytes -- Max drive xfer, max TC
         sectorcount = 0x100;
      }
      else
      {
         sectorcount = (dataTransferLenLSW + ATA_SECTOR_SIZE-1)/ATA_SECTOR_SIZE + (dataTransferLenMSW & 1) * 0x80;
         writePIO8(ATA_SECTOR_COUNT_REG, 0);      // for extended addressing
         writePIO8(ATA_SECTOR_COUNT_REG, sectorcount);       // divide len into blocks
      }
        
      dwLBA += sectorcount;
      
      if (!udmaMode || verify || (dataTransferLenLSW & 0x1ff))    // UDMA cannot handle sub-sector sized reads
      {
         // Execute the read command
         if (bExtAddrSupport)
            {
            if (verify)
               writePIO8(ATA_COMMAND_REG, ATA_COMMAND_VERIFY_10_EXT);
            else
               writePIO8(ATA_COMMAND_REG, ATA_COMMAND_READ_10_EXT);
            }
         else
            {
            if (verify)
               writePIO8(ATA_COMMAND_REG, ATA_COMMAND_VERIFY_10);
            else
               writePIO8(ATA_COMMAND_REG, ATA_COMMAND_READ_10);
            }

           
         // The verify command reads from the drive, but doesn't transfer data
         // to us.
         if (verify)     
         {
            if(waitForBusyBit() == USBS_FAILED)
               return(USBS_FAILED);
            else
               continue;
         }
   
         // set up for GPIF transfer - wordwide
         //EP8GPIFTCH = MSB(wPacketSize >> 1);     
         //EP8GPIFTCL = LSB(wPacketSize >> 1);
         
         while (sectorcount--)
         {
            // Wait for the drive to be non-busy and have either data or an error
            while (1)
            {
               driveStatus = readATAPI_STATUS_REG();                             
               if ((driveStatus & (ATAPI_STATUS_BUSY_BIT | ATAPI_STATUS_DRQ_BIT)) == ATAPI_STATUS_DRQ_BIT)
                  break;
               if (driveStatus & (ATAPI_STATUS_BUSY_BIT | ATAPI_STATUS_ERROR_BIT) == ATAPI_STATUS_ERROR_BIT)
                  break;
            }

            // If there's an error, the drive may still want to send us the data.
            if (driveStatus & ATAPI_STATUS_ERROR_BIT)
               {
               readPIO8(ATAPI_ERROR_REG);
               if (driveStatus & ATAPI_STATUS_DRQ_BIT)
                  for (wordCtr = 0; wordCtr < 0x100; wordCtr++)
                     readPIO8(ATAPI_DATA_REG);
               failedIn();
               return(USBS_FAILED);  
               }
            else
            {
               BYTE bLimit;
               WORD wThisPacketSize;

               if (wPacketSize == 0x40)
                  bLimit = 8;
               else 
                  bLimit = 1;
               for (i = 0; i < bLimit && dataTransferLen; i++)
               {
                  waitForInBuffer();

                  wThisPacketSize = min(wPacketSize, dataTransferLen);
                  readPIO16(ATAPI_DATA_REG, wThisPacketSize+1);
                  while (!gpifIdle())     // Wait for xfer to complete
                     ;
                  EP8BCH = MSB(wThisPacketSize);
                  EP8BCL = LSB(wThisPacketSize);
                  dataTransferLen -= wThisPacketSize; 
               }
            }
         }//while (sectorcount--)
      }
      else  // transfer is udma mode
      {
         initUdmaRead();
         if (bExtAddrSupport)
            writePIO8(ATAPI_COMMAND_REG, ATA_COMMAND_DMAREAD_RETRY_EXT);
         else
            writePIO8(ATAPI_COMMAND_REG, ATA_COMMAND_DMAREAD_RETRY);
         readUDMA((DWORD) sectorcount << 8);     // Words = sectors * 256
         driveStatus = readATAPI_STATUS_REG();
         if (driveStatus & ATAPI_STATUS_ERROR_BIT) 
            {
            if (readPIO8(ATAPI_ERROR_REG) & ATAPI_ERROR_ICRC_BIT)
               {
               sensePtr = senseCRCError;
               }
            // No need to do failedIn() -- All data is already xferred.
            return(USBS_FAILED);
            }

         // Two choices -- Either we're limited to 0x100 sectors, or limited to dataTransferLen.
         // BUGBUG -- No capability here to report Hi > Di.
         if (sectorcount == 0x100)
            dataTransferLenMSW -= 2;
         else
            dataTransferLen = 0;
      }
   }//while (dataTransferLen)
   
   return(USBS_PASSED);
}   

static bit ideWriteCommand()
{
   WORD savebc;
   BYTE driveStatus;
   WORD sectorcount; 
   BYTE i; 
    
   writePIO8(ATA_DRIVESEL_REG, 0xe0);
   if (waitForBusyBit() == USBS_FAILED)
   {
      // Oddly enough, an error bit is okay here.  It means that the LAST command failed, not this one.
      // A new command is required to clear many error conditions.
   }
    
   ((BYTE *) &dwLBA)[0] = EP2FIFOBUF[CBW_DATA_START+2];
   ((BYTE *) &dwLBA)[1] = EP2FIFOBUF[CBW_DATA_START+3];
   ((BYTE *) &dwLBA)[2] = EP2FIFOBUF[CBW_DATA_START+4];
   ((BYTE *) &dwLBA)[3] = EP2FIFOBUF[CBW_DATA_START+5];

   // relinquish control of the bulk buffer occupied by the CBW
   EP2BCL = 0x80;     
  
   // If there's no data length, just exit once we've freed the CBW buffer
   if (!dataTransferLen)
      return USBS_PASSED;

   // Send the command to the drive
   // This loop breaks up the 32 bit length into 8 bits * sectors.
   // For example, a read of 0x10000 turns into 0x80 sectors.
   while (dataTransferLen)
   {
      dwLBAtoLBARegs();      // Stuff the LBA registers
      
      // First stuff the length register (number of sectors to write)
      if (dataTransferLenMSW & 0xfffe)
      {
         writePIO8(ATA_SECTOR_COUNT_REG, 0x1);      // 1 for ext addr support 
         writePIO8(ATA_SECTOR_COUNT_REG, 0x0);      // 0 means 256 blocks of 512
         sectorcount = 0x100;
      }
      else
      {
         sectorcount = (dataTransferLenLSW+ATA_SECTOR_SIZE-1)/ATA_SECTOR_SIZE 
            + (dataTransferLenMSW & 1) * 0x80;
         writePIO8(ATA_SECTOR_COUNT_REG, 0);      // 0 for MSB of ext address
         writePIO8(ATA_SECTOR_COUNT_REG, sectorcount);       // divide len into blocks
      }
        
      dwLBA += sectorcount;

      if (udmaMode && !(dataTransferLenLSW & 0x1ff))
      {
         // Execute the write command
         if (bExtAddrSupport)
            writePIO8(ATA_COMMAND_REG, ATA_COMMAND_DMAWRITE_RETRY_EXT);
         else
            writePIO8(ATA_COMMAND_REG, ATA_COMMAND_DMAWRITE_RETRY);
         
         if (sectorcount == 0x100)
            writeUDMA((DWORD)0x10000);     // 64k Transfers = 128K
         else
            writeUDMA((dataTransferLen+1) >> 1);
         
         // Check status to clear interrupt.
         driveStatus = readATAPI_STATUS_REG();
         
         if (driveStatus & ATAPI_STATUS_ERROR_BIT) 
         {
            driveStatus = readPIO8(ATAPI_ERROR_REG);
            if (driveStatus & ATAPI_ERROR_ICRC_BIT)
            {
               sensePtr = senseCRCError;
            }
            return(USBS_FAILED);
         }
         else
         {
            if (sectorcount == 0x100)
               dataTransferLenMSW -= 2;
            else
               dataTransferLen = 0;
         }
      }
      else
      {
         // Execute the write command
         if (bExtAddrSupport)
            writePIO8(ATA_COMMAND_REG, ATA_COMMAND_WRITE_10_EXT);
         else
            writePIO8(ATA_COMMAND_REG, ATA_COMMAND_WRITE_10);
         
         while (sectorcount--)
         {
            BYTE limit;
   
            // Wait for the drive to be non-busy and have either data or an error
            while (1)
            {
               driveStatus = readATAPI_STATUS_REG();                             
               if ((driveStatus & (ATAPI_STATUS_BUSY_BIT | ATAPI_STATUS_DRQ_BIT)) == ATAPI_STATUS_DRQ_BIT)
                  break;
               if (driveStatus & (ATAPI_STATUS_BUSY_BIT | ATAPI_STATUS_ERROR_BIT) == ATAPI_STATUS_ERROR_BIT)
                  break;
            }
               
            // Normal case -- Got a sector.  Send it to the drive (in 8 chunks)
            if (wPacketSize == 0x40)
               limit = 8;
            else
               limit = 1;
   
            for (i = 0; i < limit; i++)
            {
               while(EP2CS & bmEPEMPTY);       // Wait for host to send data
               savebc = (EP2BCH << 8) | EP2BCL;
                   
               // Terminate xfer on receipt of short packet, otherwise drop
               // into streamlined case
               if (savebc < wPacketSize)
               {
                  EP2BCL = 0;
                  writePIO16(ATAPI_DATA_REG, savebc+1);     // Add 1 to allow odd xfers.
                  
                  dataTransferLen -= savebc + i * wPacketSize;
                  goto stopOnShortPacket;
               }
               else
               {
                  EP2BCL = 0;
                  writePIO16(ATAPI_DATA_REG, wPacketSize);
               }
            }
            dataTransferLen -= ATA_SECTOR_SIZE; // Returned a full sector.
         }  // while (sectorcount) 
      } // else (if udma)
   } // While (dataTransferLen)
    
stopOnShortPacket:

   if (driveStatus & ATAPI_STATUS_ERROR_BIT)
      return(USBS_FAILED);
   else
      return(USBS_PASSED);
}


// Don't have the ability to sense media (yet)
static bit checkForMedia()
{
   return(1);
}

void dwLBAtoLBARegs()      // Stuff the LBA registers
{
   writePIO8(ATA_DRIVESEL_REG, 0xe0);

   if (bExtAddrSupport)
      {
      writePIO8(ATA_LBA_LSB_REG,  ((BYTE *) &dwLBA)[0]);    // LBA (31:24)
      writePIO8(ATA_LBA_2SB_REG,  0);                       // LBA (39:32)
      writePIO8(ATA_LBA_MSB_REG,  0);                       // LBA (47:40)
      }

   writePIO8(ATA_LBA_LSB_REG,  ((BYTE *) &dwLBA)[3]);    // LBA (7:0)
   writePIO8(ATA_LBA_2SB_REG,  ((BYTE *) &dwLBA)[2]);    // LBA (15:8)
   writePIO8(ATA_LBA_MSB_REG,  ((BYTE *) &dwLBA)[1]);    // LBA (23:16)

   if (!bExtAddrSupport)
      {      
      writePIO8(ATA_DRIVESEL_REG, ((BYTE *) &dwLBA)[0] | 0xe0);
      }
}



/////////////////////////////////////////////////////////////////////////////////
#endif      // DEVICE_TYPE_IS_IDE
/////////////////////////////////////////////////////////////////////////////////

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲图片另类小说| 一区二区成人在线| 3d动漫精品啪啪| 国产亚洲午夜高清国产拍精品| 中文字幕在线播放不卡一区| 久久国产精品一区二区| 在线一区二区三区四区五区 | 中文字幕av不卡| 日一区二区三区| 一本色道亚洲精品aⅴ| 一区二区三区日韩精品视频| 国产白丝精品91爽爽久久| 69堂精品视频| 亚洲风情在线资源站| 91视频观看免费| 国产女主播在线一区二区| 精品一区二区三区日韩| 欧美电影一区二区三区| 亚洲国产成人高清精品| 精品国产乱码久久久久久浪潮| 日韩欧美在线网站| 亚洲综合激情网| 91免费观看在线| 亚洲色图视频网| www.av精品| 亚洲婷婷综合色高清在线| 国产91清纯白嫩初高中在线观看| 精品va天堂亚洲国产| 久久99热99| 精品国产麻豆免费人成网站| 久久国产生活片100| 日韩精品中文字幕一区二区三区| 美女被吸乳得到大胸91| 91精品国产综合久久久久久久久久| 亚洲一区免费视频| 欧洲一区在线电影| 性久久久久久久久| 欧美美女喷水视频| 日本欧美一区二区三区| 欧美一区二区不卡视频| 精品一区二区三区香蕉蜜桃| 欧美精品一区二区三区高清aⅴ | 久久青草国产手机看片福利盒子 | 91黄色小视频| 亚洲午夜影视影院在线观看| 欧美天天综合网| 免费久久精品视频| 久久美女高清视频| 91在线观看视频| 夜夜嗨av一区二区三区中文字幕 | 日本不卡1234视频| 久久夜色精品国产欧美乱极品| 国产成人免费xxxxxxxx| 亚洲女与黑人做爰| 欧美一级片在线观看| 高潮精品一区videoshd| 一区二区三区久久| 欧美电影在线免费观看| 福利一区二区在线| 亚洲图片欧美视频| 久久久高清一区二区三区| 99精品视频在线免费观看| 视频一区二区国产| 国产精品激情偷乱一区二区∴| 91麻豆精东视频| 天堂va蜜桃一区二区三区漫画版| 久久九九全国免费| 欧美精品亚洲二区| jlzzjlzz亚洲女人18| 青青草国产成人av片免费| 中文字幕第一区二区| 91精品国产欧美日韩| 成+人+亚洲+综合天堂| 毛片不卡一区二区| 一区二区三区在线观看网站| 精品国产乱子伦一区| 色欧美片视频在线观看| 激情文学综合网| 亚洲成人黄色影院| 国产精品久久久久影院老司| 日韩精品一区国产麻豆| 色噜噜狠狠成人中文综合| 狠狠色狠狠色综合系列| 亚洲a一区二区| 国产精品剧情在线亚洲| 欧美va天堂va视频va在线| 色一区在线观看| 懂色av一区二区夜夜嗨| 久久99日本精品| 日韩中文字幕1| 亚洲另类春色校园小说| 国产日产欧美一区二区三区| 日韩欧美电影一二三| 精品视频一区二区三区免费| 91原创在线视频| 成人免费视频国产在线观看| 久久99国产精品麻豆| 日韩一区欧美二区| 一区二区三区日韩欧美| 日韩美女啊v在线免费观看| 久久蜜臀精品av| 久久亚洲精精品中文字幕早川悠里 | 日韩高清欧美激情| 亚洲大片在线观看| 亚洲一区二区综合| 一区二区在线免费| 亚洲精品国久久99热| 亚洲欧美自拍偷拍| 亚洲欧美激情视频在线观看一区二区三区| 国产欧美一区二区精品忘忧草 | 亚洲二区视频在线| 性感美女极品91精品| 午夜精品一区二区三区免费视频| 亚洲永久精品大片| 亚洲国产精品影院| 日韩av高清在线观看| 日韩av在线播放中文字幕| 亚洲国产视频网站| 日本欧美一区二区三区乱码| 久久精品国产精品亚洲红杏| 日韩精品成人一区二区三区| 日韩不卡免费视频| 经典三级在线一区| 国产成人精品亚洲777人妖| 国产成人亚洲综合a∨婷婷图片| 成人午夜精品在线| 色综合咪咪久久| 制服丝袜亚洲色图| 精品精品国产高清一毛片一天堂| 久久亚洲精品小早川怜子| 国产精品理论片在线观看| 亚洲美女视频一区| 午夜伊人狠狠久久| 人人精品人人爱| 成人看片黄a免费看在线| 在线观看三级视频欧美| 正在播放亚洲一区| 久久婷婷国产综合精品青草| 国产精品成人免费精品自在线观看| 亚洲欧美日韩人成在线播放| 亚洲国产一区视频| 国产在线不卡一区| av在线不卡电影| 欧美高清激情brazzers| 国产亲近乱来精品视频 | 久久国产尿小便嘘嘘尿| 国产91精品精华液一区二区三区| 色综合欧美在线| 日韩网站在线看片你懂的| 久久久久久久久免费| 亚洲色图一区二区三区| 男人操女人的视频在线观看欧美| 成人黄色片在线观看| 欧美区视频在线观看| 国产日韩高清在线| 亚洲成人久久影院| 成人美女在线观看| 欧美一区二区性放荡片| 国产精品国产精品国产专区不片| 亚洲第一二三四区| 成人av影院在线| 欧美va日韩va| 亚洲成人www| 成人毛片在线观看| 日韩三级中文字幕| 亚洲狠狠丁香婷婷综合久久久| 久久av中文字幕片| 欧美日韩综合色| 亚洲欧洲美洲综合色网| 麻豆91精品91久久久的内涵| 在线视频一区二区三| 国产三级三级三级精品8ⅰ区| 性久久久久久久久久久久| fc2成人免费人成在线观看播放| 欧美刺激午夜性久久久久久久| 亚洲综合色自拍一区| 成人免费av在线| wwww国产精品欧美| 精品一区二区综合| 91麻豆精品国产91久久久资源速度 | 美国十次了思思久久精品导航| 在线观看不卡一区| 国产精品乱码一区二三区小蝌蚪| 黄页视频在线91| 精品99一区二区三区| 蜜桃久久精品一区二区| 欧美精品在线观看播放| 五月婷婷欧美视频| 欧美日韩一本到| 五月婷婷久久综合| 欧美日韩精品一区二区三区| 一二三四区精品视频| 在线视频亚洲一区| 亚洲美女视频一区| 日本电影欧美片| 亚洲综合色网站| 欧美日韩精品欧美日韩精品一综合| 一级中文字幕一区二区| 色欧美88888久久久久久影院| 一区二区三区中文在线观看|