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

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

?? atareset.c

?? HIGH_SPEED_USB_To_ATA(IDE)Firmware相關代碼(EZ USB FX2芯片)
?? C
字號:
//-----------------------------------------------------------------------------
//  Copyright (c) 1999-2001 Cypress Semiconductor, Inc. All rights reserved
//-----------------------------------------------------------------------------
//
// This file contains the device initialization code.  
//
// $Archive: /USB/atapifx2/software/atareset.c $
// $Date: 1/23/02 9:37a $
// $Revision: 44 $
//-----------------------------------------------------------------------------
#include "fx2.h"
#include "fx2regs.h"
#include "gpif.h"

char NumCylindersMSB; // global #Cyl MSB
char NumCylindersLSB; // global #Cyl LSB
char NumHeads;        // global #Heads
char NumSectPerTrack; // global #SectorsPerTrack

char MaxPIO;
char udmaMode;      // global to keep track of which udma mode we are in
xdata BYTE halfKBuffer[BUFFER_SIZE];
idata char localSerialNumber[ATAPI_INQUIRY_SERIAL_LEN*2];
bit bExtAddrSupport;

void resetATAPIDevice()
{
   // Select ATAPI device, read it back
   bit done = 0;
   BYTE driveStatus;
   #define MAX_COUNT 200

   BYTE count;

   while (!done)
   {
      // Pound the reset line
      hardwareReset();

      EZUSB_Delay(900);            // Mitsumi CR-4808TE(CYSD007) is a good test for this number.

      // Wait for the completion
      for (count = 0, driveStatus = readATAPI_STATUS_REG(); 
           count < MAX_COUNT 
               && ((driveStatus & ATAPI_STATUS_BUSY_BIT) || (driveStatus == 0x7f)) ; 
           driveStatus = readATAPI_STATUS_REG(), count++)
      {
         EZUSB_Delay(50);            // Wait 50 ms to be polite
      }
        
      if (count == MAX_COUNT)  
         continue;

      // Byte count should be a special code -- 0xeb14
      if (readPIO8(ATAPI_BYTE_COUNT_MSB) == 0xeb && readPIO8(ATAPI_BYTE_COUNT_LSB) == 0x14)
      {
         done = 1;
         scsi = 1;
      }
      else
      // device = ide
      {
         writePIO8(ATAPI_NULL_REG, 0xff);        // Pre-load the bus with 0xff -- Make sure someone drives the 00's
         if ((readPIO8(ATA_ERROR_REG) & 0x7f) == 1)
         {
            done = 1;
            scsi = 0;
         }
         else
            EZUSB_Delay(500);           // Wait 500 ms to make sure it's really ready.
      }

   }

   EZUSB_Delay(500);           // Wait 500 ms to make sure it's really ready.

   #if DEVICE_TYPE_IS_SCSI
   if (scsi)
      SCSITestUnitReady();
   #endif
}



void ATAPIIdDevice()
{
   BYTE i;
   BYTE driveStatus;

   // Wait for the register block to be non-busy and for a "drive ready" condition
   do
   {
      writePIO8(ATAPI_DRIVESEL_REG, 0xa0);
      driveStatus = readATAPI_STATUS_REG();
   } while((driveStatus & (ATAPI_STATUS_BUSY_BIT | ATAPI_STATUS_DRDY_BIT)) != (ATAPI_STATUS_DRDY_BIT));    // Do-while

   writePIO8(ATA_ERROR_REG, 0);            // Copied from Phoenix BIOS
   writePIO8(ATA_SECTOR_COUNT_REG, 1);
   writePIO8(ATA_LBA_LSB_REG     , 0xff);
   writePIO8(ATA_LBA_2SB_REG     , 0xff);
   writePIO8(ATA_LBA_MSB_REG     , 0);
   writePIO8(ATAPI_DRIVESEL_REG, 0xa0);
   writePIO8(ATAPI_CONTROL_REG, 0);        // Added later -- Make sure the nIEN bit is clear (active)


   // Send Identify device command
   if (scsi)
      writePIO8(ATAPI_COMMAND_REG, ATAPI_COMMAND_ID_DEVICE);
   else
      writePIO8(ATAPI_COMMAND_REG, IDE_COMMAND_ID_DEVICE);

   waitForIntrq();
        
   // Wait for the register block to be non-busy and to have data ready
   do
   {
      driveStatus = readATAPI_STATUS_REG();
      if (driveStatus & ATAPI_STATUS_ERROR_BIT) // don't get stuck here with an error
         return;     
   } while((driveStatus & (ATAPI_STATUS_BUSY_BIT | ATAPI_STATUS_DRQ_BIT)) != (ATAPI_STATUS_DRQ_BIT));    // Do-while

   // Read the data from the drive
   {
      char timeout = 10;
      
      while (!readPIO16toXdata(ATAPI_DATA_REG, halfKBuffer, BUFFER_SIZE, IGNORE_DRIVE_LEN))
         if (!timeout--)
            break;
   }

   // Place the fields that we need into the SCSI block
   for (i = 0; i < SCSI_INQUIRY_MANUFACTURER_LEN; i++)
   {
      // swap bytes within words.  This is stored backwards!
      SCSIInquiryData_[SCSI_INQUIRY_MANUFACTURER+i] = halfKBuffer[ATAPI_INQUIRY_MANUFACTURER * 2 + (i ^ 1)];
   }

   SCSIInquiryData_[SCSI_INQUIRY_REVISION+1] = halfKBuffer[ATAPI_INQUIRY_REVISION * 2]+'0';
   SCSIInquiryData_[SCSI_INQUIRY_REVISION+3] = halfKBuffer[ATAPI_INQUIRY_REVISION * 2 +2]+'0';
   SCSIInquiryData_[SCSI_INQUIRY_REMOVABLE_BYTE] |= SCSI_INQUIRY_REMOVABLE_BIT & halfKBuffer[ATAPI_INQUIRY_REMOVABLE_BYTE];
        
   // BUG -- what is this doing? Reduce the command set for ATA
   if (!scsi)
      SCSIInquiryData_[SCSI_INQUIRY_DATA_FORMAT] = 0;
        
   // Copy serial number to our local storage area, converting zeroes to text.
   // It's stored as double byte characters, so zero every other byte.
   for (i = 0; i < ATAPI_INQUIRY_SERIAL_LEN; i++)
   {
      if (halfKBuffer[i+ATAPI_INQUIRY_SERIAL])
         localSerialNumber[i+i] = halfKBuffer[i+ATAPI_INQUIRY_SERIAL];
      else
         localSerialNumber[i+i] = '0';
      localSerialNumber[i+i+1] = 0;
   }

   // Check for large disk (48 bit) support.  ATA-6 spec below....
   // 6.2.1
   //    4) The contents of words (61:60) and (103:100) shall not be used to determine if 48-bit addressing is
   //       supported. IDENTIFY DEVICE bit 10 word 83 indicates support for 48-bit addressing.
   if (halfKBuffer[IDENTIFY_48BIT_ADDRESSING+1] & (1<<2))
      {
      bExtAddrSupport = 1;
      // This is actually smaller than a loop of 4!!
      // Yes, this only supports 0x100 00 00 00 sectors, which is 220,000GB (industry GB, not true)
      ((BYTE *)&driveCapacity)[3] = halfKBuffer[0+IDE_ID_TOTAL_48_BIT_SECTORS_LSW];
      ((BYTE *)&driveCapacity)[2] = halfKBuffer[1+IDE_ID_TOTAL_48_BIT_SECTORS_LSW];
      ((BYTE *)&driveCapacity)[1] = halfKBuffer[2+IDE_ID_TOTAL_48_BIT_SECTORS_LSW];
      ((BYTE *)&driveCapacity)[0] = halfKBuffer[3+IDE_ID_TOTAL_48_BIT_SECTORS_LSW];
      }
   else
      {
      bExtAddrSupport = 0;
      // This is actually smaller than a loop of 4!!
      ((BYTE *)&driveCapacity)[3] = halfKBuffer[0+IDE_ID_TOTAL_SECTORS_LSW];
      ((BYTE *)&driveCapacity)[2] = halfKBuffer[1+IDE_ID_TOTAL_SECTORS_LSW];
      ((BYTE *)&driveCapacity)[1] = halfKBuffer[2+IDE_ID_TOTAL_SECTORS_LSW];
      ((BYTE *)&driveCapacity)[0] = halfKBuffer[3+IDE_ID_TOTAL_SECTORS_LSW];
      }

   NumCylindersMSB = halfKBuffer[IDENTIFY_NUM_CYLINDERS_MSB];
   NumCylindersLSB = halfKBuffer[IDENTIFY_NUM_CYLINDERS_LSB];
   NumHeads = halfKBuffer[IDENTIFY_NUM_HEADS];
   NumSectPerTrack = halfKBuffer[IDENTIFY_NUM_SECT_PER_TRACK];

   // check for PIO3 support (or greater)
   // 64 = word index to ID Device parameter block - LSB=value, MSB=reserved
   // if( (!scsi) && ( MaxPIO = halfKBuffer[(64*2)]) ).  WaveDataPio4 is used
   // for both PIO3 and PIO4, with PIO3 @ 30MHz, and PIO4 @ 48Mhz
   MaxPIO = halfKBuffer[IDENTIFY_ADVANCED_PIO];
   udmaMode = 0;

   // Check for UDMA support
   if ((halfKBuffer[IDENTIFY_FIELD_VALIDITY] & bmBIT2) &&
       (halfKBuffer[IDENTIFY_UDMA_MODES] & (UDMA_MODE2 | UDMA_MODE4)))
   {
      if (halfKBuffer[IDENTIFY_UDMA_MODES] & UDMA_MODE4)
      {
         udmaMode = TRANSFER_MODE_UDMA4;
      }
      else if (halfKBuffer[IDENTIFY_UDMA_MODES] & UDMA_MODE2)
      {
         udmaMode = TRANSFER_MODE_UDMA2;
      }
   }

   // If UDMA is supported, enable it.  If not, enable the highest PIO mode
   if (udmaMode)
   {
      configureATATransferMode(udmaMode);
      udmaErrorCount = 0;
      mymemmovexx(&GPIF_WAVE_DATA, (BYTE xdata *) WaveDataPio4, sizeof(WaveDataPio4));
   }
   else if(MaxPIO)
   {
      if(MaxPIO & PIO4) 
      {
         IFCONFIG |= 0x40;       // SET CLOCK TO 48MHZ
         configureATATransferMode(PIO_MODE4);                  // SCR_PIO4=0x0C, PIO-mode4
      }
      else if(MaxPIO & PIO3) 
      {
         configureATATransferMode(PIO_MODE3);                  // SCR_PIO3=0x0B, PIO-mode3
      }

      mymemmovexx(&GPIF_WAVE_DATA, (BYTE xdata *) WaveDataPio4, sizeof(WaveDataPio4));
   }


   driveCapacity -= 1;  // The command that reads drive capacity actually wants the last valid LBA.
   return;
}

void configureATATransferMode(BYTE mode)
{
      // select the drive and set new speed
      writePIO8(ATAPI_DRIVESEL_REG, 0xa0);
      writePIO8(ATA_SECTOR_COUNT_REG, mode);      
      writePIO8(ATAPI_FEATURE_REG, 0x03);                            // opcode 0x03 used for transfer mode
      writePIO8(ATAPI_COMMAND_REG, ATAPI_COMMAND_SET_FEATURES);      // execute the command   
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区精品3399| 欧美日韩午夜精品| 7777精品伊人久久久大香线蕉 | 综合久久国产九一剧情麻豆| 欧美性生交片4| 韩日欧美一区二区三区| 久久精品一区二区三区四区| 午夜a成v人精品| 日韩欧美精品三级| 国产白丝网站精品污在线入口| 久久久久久久久久久99999| 国产精品一品二品| 午夜视频在线观看一区二区三区 | 国产精品精品国产色婷婷| 91在线播放网址| 免费av成人在线| 中文字幕av资源一区| 欧美日韩国产高清一区二区三区 | 婷婷激情综合网| 麻豆国产一区二区| 亚洲免费av观看| 26uuu精品一区二区在线观看| 粗大黑人巨茎大战欧美成人| 亚洲精品高清在线| 国产精品美女久久久久高潮| 日韩欧美国产三级| 中文字幕精品三区| 午夜精品久久久久久久| 国产精一品亚洲二区在线视频| www.在线成人| 国产精品一区二区三区四区| caoporn国产精品| 欧美乱妇23p| 在线视频一区二区三| 国产一区二区三区免费看| 亚洲国产精品久久人人爱| 亚洲免费资源在线播放| 免费人成黄页网站在线一区二区| 韩国毛片一区二区三区| 色国产综合视频| www.久久精品| 宅男噜噜噜66一区二区66| 国产欧美一区二区精品性色超碰| 日韩欧美一级二级三级| 中文字幕视频一区| 中文字幕中文字幕中文字幕亚洲无线 | 亚洲午夜精品在线| 国产91精品久久久久久久网曝门 | 极品少妇xxxx精品少妇| 老司机免费视频一区二区三区| 亚洲国产wwwccc36天堂| 国产精品一品视频| 欧美一区二区三区在线观看视频 | 免费不卡在线视频| 精品视频1区2区| 中文字幕字幕中文在线中不卡视频| 免费在线看一区| 91.麻豆视频| 夜色激情一区二区| 亚洲h精品动漫在线观看| 午夜一区二区三区在线观看| 高清成人免费视频| 精品国产乱码久久久久久牛牛| 亚洲精品在线电影| 久草精品在线观看| 日韩午夜在线影院| 日韩视频123| 日韩中文字幕区一区有砖一区 | 老司机一区二区| 欧美欧美欧美欧美首页| 亚洲夂夂婷婷色拍ww47| 91污在线观看| 国产精品久久久久一区二区三区共| 国产成人综合在线观看| 99久久国产综合精品女不卡| 欧美综合亚洲图片综合区| 日韩伦理电影网| 色综合色狠狠天天综合色| 欧美色大人视频| 午夜av电影一区| 91精品国产欧美日韩| 日韩精品三区四区| 日韩精品自拍偷拍| 国产乱一区二区| 国产精品久久精品日日| 91麻豆免费看| 丝袜诱惑制服诱惑色一区在线观看| 欧美日韩久久不卡| 青青草国产成人99久久| 久久亚洲欧美国产精品乐播| 国产成人三级在线观看| 欧美国产1区2区| 色狠狠色噜噜噜综合网| 天堂一区二区在线免费观看| 欧美xxxx在线观看| 国产蜜臀av在线一区二区三区| 国产成人免费在线视频| 亚洲人成7777| 日韩精品在线网站| 成人av手机在线观看| 欧美成人精品高清在线播放| 国产成人精品免费| 一区二区三区在线免费播放| 91精品国产综合久久婷婷香蕉 | 成人永久aaa| 亚洲国产日韩在线一区模特 | 中文字幕av一区二区三区| 色拍拍在线精品视频8848| 视频一区在线播放| 国产欧美1区2区3区| 欧美性色aⅴ视频一区日韩精品| 蜜臀91精品一区二区三区| 中文字幕在线一区| 日韩一区二区免费在线电影| 成人高清免费在线播放| 日韩中文字幕1| 国产精品电影院| 日韩一区二区在线免费观看| 成人丝袜高跟foot| 麻豆一区二区99久久久久| 日韩伦理电影网| 精品噜噜噜噜久久久久久久久试看 | 精品久久久久久久久久久久包黑料| 成人av午夜电影| 久久99精品视频| 亚洲一区二区三区不卡国产欧美| 精品日韩在线观看| 欧美日韩一区二区电影| 国产成人综合网站| 精品亚洲国内自在自线福利| 亚洲综合在线视频| 亚洲欧洲精品一区二区三区| 精品第一国产综合精品aⅴ| 欧美群妇大交群中文字幕| 色综合激情五月| av成人动漫在线观看| 国产综合色精品一区二区三区| 日韩av网站免费在线| 色婷婷综合久色| 高清不卡一区二区| 国产精品亚洲第一区在线暖暖韩国| 视频一区视频二区中文字幕| 夜夜嗨av一区二区三区网页| 国产精品久久久久四虎| 久久尤物电影视频在线观看| 日韩三级中文字幕| 91精品国产丝袜白色高跟鞋| 欧美日韩国产一级| 欧美亚洲免费在线一区| 91麻豆自制传媒国产之光| 91在线观看美女| 色婷婷av一区| 欧美在线观看一二区| 欧美日韩1234| 91精品国产免费| 久久亚洲一区二区三区四区| 国产日韩av一区二区| 欧美激情一区三区| 亚洲精品自拍动漫在线| 一区二区激情小说| 首页欧美精品中文字幕| 日本不卡在线视频| 韩国v欧美v亚洲v日本v| 国产a级毛片一区| 99精品在线观看视频| 欧美三级韩国三级日本一级| 欧美视频在线一区| 日韩美女一区二区三区四区| 久久色视频免费观看| 最新不卡av在线| 日韩不卡免费视频| 国产伦精品一区二区三区免费迷| 成人一区二区三区在线观看| 91色九色蝌蚪| 在线成人午夜影院| 久久久久久久久久美女| 国产精品国产三级国产普通话三级| 亚洲人成精品久久久久| 婷婷综合另类小说色区| 国产一区二区日韩精品| 色婷婷综合久久久中文一区二区| 欧美日韩不卡一区二区| 国产欧美精品日韩区二区麻豆天美 | 欧美大片日本大片免费观看| 国产亚洲精品精华液| 亚洲综合久久久| 精品一区二区三区的国产在线播放| 东方欧美亚洲色图在线| 欧美三级日韩三级| 国产亚洲精品超碰| 午夜在线电影亚洲一区| 顶级嫩模精品视频在线看| 这里只有精品免费| 亚洲欧洲中文日韩久久av乱码| 日韩精品亚洲一区二区三区免费| 成人av一区二区三区| 精品国产免费久久| 亚洲mv大片欧洲mv大片精品| 成人av网站免费| 久久婷婷综合激情|