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

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

?? hal4ata.c

?? 詳細介紹CF卡和IDE硬盤及相應軟件模塊CF的設計思想及實現過程。
?? C
字號:
/*
//////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999 - 2003 PHILIPS Semiconductors - APIC
//
// Module Name:
//
//     HAL4ATA.c
//
// Abstract:
//
//     This is HAL for IDE controllers.
//
// Author:
//
//     Hilbert Zhang ZhenYu
//
// Environment:
//
//     kernel mode only
//
// Notes:
//
// Revision History:
//     Create Date: Nov. 19 1999
//
//////////////////////////////////////////////////////////////////////////////
// Implementation Notes:
*/

#include  "config.h"                /* special function register declarations   */

#undef   GLOBAL_EXT

#include "SysCnfg.h"

#include "BasicTyp.h"
#include "common.h"

#include "Hal4Sys.h"

#include "ATA.h"
#include "RBC.h"
#include "RBCCmd.h"
#include "Hal4ATA.h"

#include "TPBulk.h"


//*************************************************************************
//  Public Data
//*************************************************************************

STRUC_EXT TPBLK_STRUC		TPBulk_Block;
#define     TPBulk_CBW				TPBulk_Block.TPBulk_CommandBlock
#define	    RBC_CDB					TPBulk_CBW.cdbRBC
#define     RBC_LUN					TPBulk_CBW.bCBW_LUN
#define     TPBulk_CSW				TPBulk_Block.TPBulk_CommandStatus
#define     Hal4ATA_Atapi			RBC_CDB

STRUC_EXT   HW_ATA_DEVICES_EXTENSION	Hal4ATA_DevExt;
#define     ATADevExt_IDData            Hal4ATA_DevExt.IdentifyData

STRUC_EXT BITFLAGS     bFlags;

#define             MCUBF_Timer  					bFlags.bits.timer
#define             D12BF_SetupOverwritten  		bFlags.bits.setup_overwritten
#define             D12BF_Configuration	  			bFlags.bits.;configuration
#define             REQBF_DCPRequest_dir  			bFlags.bits.DCPRequst_Dir
#define             REQBF_DCPRequest_EPdir  		bFlags.bits.DCPRequst_EPDir
#define             REQBF_StallDCPRequest   		bFlags.bits.Stall_DCPRequest
#define             BOTBF_StallAtBulkOut  			bFlags.bits.BO_Stalled
#define             BOTBF_StallAtBulkIn  			bFlags.bits.BI_Stalled
#define             BOTXfer_Abort  					bFlags.bits.Abort_BOT
#define             ATABF_IsAttached  				bFlags.bits.ATABF_IsAttached
#define             ATABF_IsSupportMultiSector  	bFlags.bits.ATABF_IsSupportMultiSector
#define             ATABF_IDEXfer_dir	 			bFlags.bits.ATABF_IDEXfer_dir
#define             ATABF_IsSkipSetParameters 	 	bFlags.bits.ATABF_IsSkipSetParameters


INT8_EXT    Hal4ATA_SectCntInBlk;

//*************************************************************************
//  Private Data
//*************************************************************************

// Static
char_bit	_Hal4ATA_StatusByte;
#define		Hal4ATA_StatusByte  _Hal4ATA_StatusByte.char_
#define		Hal4ATA_StatusByte_ERR  _Hal4ATA_StatusByte.bit_.b0
#define		Hal4ATA_StatusByte_IDX  _Hal4ATA_StatusByte.bit_.b1
#define		Hal4ATA_StatusByte_CORR _Hal4ATA_StatusByte.bit_.b2
#define		Hal4ATA_StatusByte_DRQ  _Hal4ATA_StatusByte.bit_.b3
#define		Hal4ATA_StatusByte_DSC  _Hal4ATA_StatusByte.bit_.b4
#define		Hal4ATA_StatusByte_DF   _Hal4ATA_StatusByte.bit_.b5
#define		Hal4ATA_StatusByte_DRDY _Hal4ATA_StatusByte.bit_.b6
#define		Hal4ATA_StatusByte_BSY  _Hal4ATA_StatusByte.bit_.b7

char_bit	_Hal4ATA_DevReg;
#define    	Hal4ATA_DevReg _Hal4ATA_DevReg.char_	//= 0xA0;
#define		Hal4ATA_DevReg_DEV  _Hal4ATA_DevReg.bit_.b4
#define		Hal4ATA_DevReg_b5   _Hal4ATA_DevReg.bit_.b5
#define		Hal4ATA_DevReg_LBA  _Hal4ATA_DevReg.bit_.b6
#define		Hal4ATA_DevReg_b7   _Hal4ATA_DevReg.bit_.b7

// Temp
FLEXI_INT32		Hal4ATA_Track;
INT8			Hal4ATA_drvSelect;





//*************************************************************************
//  Subroutines -- Level 1
//*************************************************************************

void
Hal4ATA_GetStatus(void)
{
	Hal4ATA_StatusByte = (uint8)Hal4Sys_ATAPortInB(IDE_ASTATUS);
}

uint8
Hal4ATA_WaitOnBusyNDrdy(void)
{
    uint8 retStatus = FALSE;
    while(TRUE)
	{
		Hal4ATA_GetStatus();
        // if IDE_STATUS_BUSY && !IDE_STATUS_DRDY
        //Hal4ATA_StatusByte_ERR  = Hal4ATA_StatusByte^0
		if (Hal4ATA_StatusByte_ERR != 0 || Hal4ATA_StatusByte_DF != 0)
        {
            break;
        }
        else 
			if(Hal4ATA_StatusByte_BSY !=0 || Hal4ATA_StatusByte_DRDY !=1)
			//if(Hal4ATA_StatusByte_BSY !=0 )
				Hal4Sys_Wait4US();
        	else
        	{
            	retStatus = TRUE;
           		break;
        	}
	}
	return retStatus;
}


uint8
Hal4ATA_WaitOnBusyNDrq(void)
{
    uint8 retStatus = FALSE;
    while(TRUE)
	{	Hal4ATA_GetStatus();
		if (Hal4ATA_StatusByte_ERR != 0 || Hal4ATA_StatusByte_DF != 0)
        {
            break;
        }
        else 
			if(Hal4ATA_StatusByte_BSY !=0 || Hal4ATA_StatusByte_DRQ !=1)
				Hal4Sys_Wait4US();
        	else
        	{
		   		retStatus = TRUE;
            	break;
        	}
	}
    return TRUE;
}



uint8
Hal4ATA_WaitOnBusy(void)
{
    uint8 retStatus = FALSE;
    while(TRUE)
	{
		Hal4ATA_GetStatus();
		if (Hal4ATA_StatusByte_ERR != 0 || Hal4ATA_StatusByte_DF != 0)
        {
            break;
        }
        else 
			if(Hal4ATA_StatusByte_BSY)
        	{
				Hal4Sys_Wait4US();
        	}
			else
        	{
            	retStatus = TRUE;
				break;
        	}
	}
   return retStatus;
}



//*************************************************************************
//  Subroutines -- Level 2
//*************************************************************************

uint8
Hal4ATA_SelDevice(void)
{
    uint8 retStatus = FALSE;
    if(Hal4ATA_WaitOnBusy())
    {
	// ATAREG4OUT_DEVICE_HEAD =  ATAREG_GRP0+6 = 0x56
	// ATAREG_GRP0 =0x50
	// BUFF_DIR_RD, !D12CS, !BUFF_EN, !IDE_CS1, !IDE_CS0,  A2, 	A1, A0
	//0x56		0		1		0			1		0		1	1	0
      	Hal4Sys_ATAPortOutB(IDE_DEVICE_HEAD,Hal4ATA_DevReg);
       	retStatus = Hal4ATA_WaitOnBusyNDrdy();
    }
    return retStatus;
}



//*************************************************************************
//  Subroutines -- level 4
//*************************************************************************


uint8
Hal4ATA_IssueIDEIdentify(void)
{
    INT16 i;
    uint8 retStatus = FALSE;
    // Select device.
	if(Hal4ATA_SelDevice())
    {
	    // Send IDE IDENTIFY command.
		// IDE_COMMAND_IDENTIFY=0xEC ;
	    Hal4Sys_ATAPortOutB(IDE_COMMAND, IDE_COMMAND_IDENTIFY);

	    if(Hal4ATA_WaitOnBusyNDrq())
        {
            
	        // Suck out 256 words. After waiting for one model that asserts busy
	        // after receiving the Packet Identify command.
	       
	        if(Hal4ATA_InitDevExt())
                retStatus = TRUE;
        }

	  
	    // Work around for some IDE and one model Atapi that will present more than
	    // 256 words for the Identify data.
	   
	    for (i=10000; i != 0; i--)
        {
		    Hal4ATA_GetStatus();
		    if (Hal4ATA_StatusByte_DRQ)
            {
			    
			    // Suck out any remaining bytes and throw away.
			   
			    Hal4Sys_ATADataPortInW();
		    }
		    else
			    break;
	    }
    }
	return retStatus;
} /* end IssueIdentify()*/


uint8
Hal4ATA_InitDevExt(void)
{
    INT8 c;
    if(Hal4ATA_WaitOnBusyNDrq())
    {
        ATADevExt_IDData.GeneralConfiguration = Hal4Sys_ATADataPortInW();//INT16  00
        ATADevExt_IDData.NumberOfCylinders = Hal4Sys_ATADataPortInW();//INT16  01
        Hal4Sys_ATADataPortInW();
        ATADevExt_IDData.NumberOfHeads = Hal4Sys_ATADataPortInW();//INT16  03

        for(c = 2 ; c != 0; c--)
            Hal4Sys_ATADataPortInW();
        ATADevExt_IDData.SectorsPerTrack = Hal4Sys_ATADataPortInW();//INT16  06

        for(c = 40 ; c != 0; c--) // 7 -47
            Hal4Sys_ATADataPortInW();
        ATADevExt_IDData.MaximumBlockTransfer = Hal4Sys_ATADataPortInW();//INT8 47

        Hal4Sys_ATADataPortInW(); // 48
        ATADevExt_IDData.Capabilities = Hal4Sys_ATADataPortInW();//INT16  49

        for(c = 4; c != 0; c--)
            Hal4Sys_ATADataPortInW();
        ATADevExt_IDData.NumberOfCurrentCylinders = Hal4Sys_ATADataPortInW();//INT16  54
        ATADevExt_IDData.NumberOfCurrentHeads = Hal4Sys_ATADataPortInW();//INT16  55
        ATADevExt_IDData.CurrentSectorsPerTrack = Hal4Sys_ATADataPortInW();//INT16  56
        ATADevExt_IDData.CurrentSectorCapacity.ints.i0 = Hal4Sys_ATADataPortInW();//INT32  57
        ATADevExt_IDData.CurrentSectorCapacity.ints.i1 = Hal4Sys_ATADataPortInW();//

        if(ATADevExt_IDData.CurrentSectorCapacity.u0 == 0)
        {
            ATADevExt_IDData.NumberOfCurrentCylinders = ATADevExt_IDData.NumberOfCylinders;
            ATADevExt_IDData.NumberOfCurrentHeads = ATADevExt_IDData.NumberOfHeads ;//INT16  55
            ATADevExt_IDData.CurrentSectorsPerTrack = ATADevExt_IDData.SectorsPerTrack;//INT16  56
            ATADevExt_IDData.CurrentSectorCapacity.u0 = (INT32)ATADevExt_IDData.NumberOfCurrentCylinders * ATADevExt_IDData.NumberOfCurrentHeads * ATADevExt_IDData.CurrentSectorsPerTrack;
        }
        return(TRUE);
    }
    else
        return(FALSE);
}


uint8
Hal4ATA_IsLBAmode(void)
{  	Hal4ATA_DevReg_LBA = 1;
	return(Hal4ATA_DevReg_LBA);
}


uint8
Hal4ATA_SetFeature(void)
{ /*  uint8 retStatus = FALSE;
   Hal4Sys_ATAPortOutB(ATAREG4OUT_FEATURE,0x03);
   Hal4Sys_ATAPortOutB(ATAREG4OUT_SECTOR_COUNT, 0x08);

   Hal4Sys_ATAPortOutB(ATAREG4OUT_SECTOR_NUMBER,0);
   Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_LOW,0);
   Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_HIGH,0);

   Hal4Sys_ATAPortOutB(ATAREG4OUT_COMMAND, 0xEF);
    while(TRUE)
    {
        if(Hal4ATA_WaitOnBusyNDrdy())
        {
            retStatus = TRUE;
            break;
        }
    }
   return retStatus;*/
   return TRUE;
}



//*************************************************************************
//  Subroutines -- level 5 ATA transaction
//*************************************************************************
uint8
Hal4ATA_IdeHardReset(void)
{
	//INT8 c;
    uint8 retStatus = FALSE;

     IOCLR = IDE_RST; 						// 復位引腳置低
     Hal4Sys_WaitInUS(320); // >25 US
  	 IOSET = IDE_RST; 						// 復位引腳置高
 //   for(c = 10; c != 0; c--)
    	Hal4Sys_WaitInUS(500000); // 50MS

    if(Hal4ATA_SelDevice())
	{
//	    Hal4ATA_DevReg_DEV = FALSE;
 //	   Hal4Sys_ATAPortOutB(ATAREG4OUT_DEVICE_HEAD,Hal4ATA_DevReg);
//	}

    while(TRUE)
    {
        if(Hal4ATA_WaitOnBusyNDrdy())
        {
            retStatus = TRUE;
            break;
        }
    }
 	}
    return retStatus;
}


uint8
Hal4ATA_FindIDEDevice(void)
{
    INT8    c;
    ATABF_IsAttached = FALSE;
	Hal4ATA_DevReg = 0xA0;
    Hal4ATA_DevReg_DEV = FALSE;
	if(Hal4ATA_IdeHardReset())
    {	Hal4ATA_SetFeature();
	    for ( c = 2; c != 0; c--, Hal4ATA_DevReg_DEV^=1 )
	    {   if(Hal4ATA_SelDevice())
            {
		        if ( Hal4ATA_IssueIDEIdentify() )
		        {   ATABF_IsAttached = TRUE;
                    break;
		        }
            }
	    }

        if(ATABF_IsAttached)
        {  	Hal4ATA_IsLBAmode();// 設為LAB模式
        } // IDE HD is found
    } // IDE Reset OK
    return ATABF_IsAttached;
} /*end Hal4ATA_FindIDEDevice()*/


uint8
Hal4ATA_ReadWriteSetting(void)
{
    uint8 retStatus = FALSE;
    
	// Select device  .
	
	if(Hal4ATA_SelDevice())
    {   //Assume Sector Counter <256
        Hal4Sys_ATAPortOutB(IDE_SECCNT, RBC_CDB.RbcCdb_Read.XferLength_0);
	    /* IN LBA mode */
		if( ATABF_IDEXfer_dir )    // ATABF_Xfer_dir==1 Read(from Dev to Host)
  	    {
			Hal4Sys_ATAPortOutB(IDE_SECTOR,RBC_CDB.RbcCdb_Read.LBA_0);
			Hal4Sys_ATAPortOutB(IDE_CYLINDER_LOW,RBC_CDB.RbcCdb_Read.LBA_1);
			Hal4Sys_ATAPortOutB(IDE_CYLINDER_HIGH,RBC_CDB.RbcCdb_Read.LBA_2);
 	        Hal4Sys_ATAPortOutB(IDE_DEVICE_HEAD, (RBC_CDB.RbcCdb_Read.LBA_3&0x0f) | Hal4ATA_DevReg );
	    	Hal4Sys_ATAPortOutB(IDE_COMMAND, IDE_COMMAND_READ);
		}
	   	else
	   	{    	// write command.
		    Hal4Sys_ATAPortOutB(IDE_SECTOR,RBC_CDB.RbcCdb_Write.LBA_0);
		    Hal4Sys_ATAPortOutB(IDE_CYLINDER_LOW,RBC_CDB.RbcCdb_Write.LBA_1);
		    Hal4Sys_ATAPortOutB(IDE_CYLINDER_HIGH,RBC_CDB.RbcCdb_Write.LBA_2);
            Hal4Sys_ATAPortOutB(IDE_DEVICE_HEAD, (RBC_CDB.RbcCdb_Write.LBA_3&0x0f) | Hal4ATA_DevReg );
	    	Hal4Sys_ATAPortOutB(IDE_COMMAND,IDE_COMMAND_WRITE);
		}
	}
   	retStatus = Hal4ATA_WaitOnBusyNDrq();
    return retStatus;
} /* end Hal4ATA_ReadWriteSetting()*/


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一线二线三线精华| 51精品秘密在线观看| 欧美影院一区二区| 久久欧美一区二区| 日韩高清在线一区| 在线视频国内一区二区| 国产欧美日韩另类一区| 日本sm残虐另类| 欧美性生活久久| 国产精品久久久久久久久久免费看| 日韩中文字幕麻豆| 色婷婷狠狠综合| 国产精品免费视频一区| 国产一区二区美女| 欧美一区二区三区白人| 亚洲国产另类av| 色综合天天狠狠| 亚洲欧美在线高清| 国产99一区视频免费| 久久精品视频一区| 国产麻豆日韩欧美久久| 欧美电影免费提供在线观看| 日本中文字幕一区| 8x8x8国产精品| 日本在线不卡视频| 3d动漫精品啪啪1区2区免费| 午夜久久久久久| 欧美三级视频在线播放| 亚洲电影第三页| 欧美三日本三级三级在线播放| 成人欧美一区二区三区| 不卡一区在线观看| 综合久久久久久| 色婷婷综合久久久中文字幕| 成人免费在线视频| 欧美在线你懂得| 午夜伊人狠狠久久| 欧美一级二级三级蜜桃| 蜜臀av一区二区| 久久众筹精品私拍模特| 国产激情一区二区三区| 国产欧美日韩一区二区三区在线观看| 国产一本一道久久香蕉| 国产精品久久夜| 色菇凉天天综合网| 日韩主播视频在线| 久久亚洲捆绑美女| 北条麻妃国产九九精品视频| 国产精品高清亚洲| 欧美三级在线视频| 精品系列免费在线观看| 国产亚洲福利社区一区| 99久久伊人网影院| 亚洲国产欧美一区二区三区丁香婷| 欧美美女一区二区在线观看| 国内精品国产成人国产三级粉色 | 欧美国产精品劲爆| 国产成人精品影视| 亚洲激情自拍偷拍| 日韩三区在线观看| 成人手机电影网| 亚洲r级在线视频| 久久精品一级爱片| 色噜噜久久综合| 极品少妇xxxx偷拍精品少妇| 国产精品另类一区| 欧美视频中文字幕| 91香蕉视频mp4| 亚洲电影视频在线| 久久九九影视网| 欧美亚洲自拍偷拍| 国产精品一二三区| 亚洲成人av中文| 国产欧美日韩视频一区二区| 欧美日韩国产小视频在线观看| 黑人精品欧美一区二区蜜桃| 亚洲日本在线视频观看| 日韩美女天天操| 色婷婷av一区二区三区gif| 久久国产成人午夜av影院| 成人免费在线视频观看| 久久久久久久久久久久久夜| 欧美日韩一区二区电影| 94-欧美-setu| 国产一区二区在线视频| 舔着乳尖日韩一区| 亚洲少妇最新在线视频| 久久久精品免费免费| 欧美丰满美乳xxx高潮www| av成人老司机| 国产91精品欧美| 九九九精品视频| 青青草原综合久久大伊人精品| 中文字幕亚洲综合久久菠萝蜜| 亚洲精品在线三区| 在线电影欧美成精品| 色香色香欲天天天影视综合网| 国产精品77777| 另类小说综合欧美亚洲| 三级一区在线视频先锋 | 欧美色大人视频| 91美女片黄在线观看| 成人av影院在线| 国产成人亚洲综合a∨婷婷| 毛片av中文字幕一区二区| 亚洲成人免费观看| 亚洲丰满少妇videoshd| 一区二区三区在线高清| 亚洲人成精品久久久久| 中文字幕不卡的av| 国产精品拍天天在线| 日本一区二区视频在线| 国产目拍亚洲精品99久久精品| 久久综合九色综合欧美亚洲| 欧美tickling网站挠脚心| 日韩美女视频在线| 精品国产乱码久久久久久免费| 日韩欧美一区在线观看| 欧美一级理论性理论a| 欧美不卡激情三级在线观看| 精品国内片67194| 欧美韩日一区二区三区四区| 中文字幕中文乱码欧美一区二区| 国产精品久久久久婷婷| 亚洲美女免费视频| 日日摸夜夜添夜夜添精品视频| 午夜精品久久一牛影视| 久久福利视频一区二区| 国产美女精品在线| 91免费小视频| 欧美日韩黄视频| 欧美本精品男人aⅴ天堂| 久久久久久99精品| 亚洲欧美日本在线| 性欧美疯狂xxxxbbbb| 激情久久五月天| 成人涩涩免费视频| 在线视频一区二区免费| 日韩一区二区麻豆国产| 久久久亚洲精华液精华液精华液| 国产精品不卡一区| 亚洲成国产人片在线观看| 麻豆精品视频在线观看视频| 国产盗摄视频一区二区三区| 色天使色偷偷av一区二区| 7777精品久久久大香线蕉| 国产亚洲视频系列| 亚洲一区二区视频| 麻豆精品在线播放| 99精品视频一区二区三区| 欧美日韩电影在线| 国产欧美一区二区三区沐欲| 一区二区三区91| 久久成人久久鬼色| 91国产精品成人| 亚洲精品在线网站| 亚洲一二三级电影| 国产精品一区2区| 欧美日本在线观看| 国产精品麻豆一区二区 | 在线播放91灌醉迷j高跟美女| 日韩免费电影网站| 亚洲综合在线电影| 国产美女久久久久| 555www色欧美视频| 一区二区三区视频在线看| 麻豆91精品91久久久的内涵| 99re热这里只有精品视频| 日韩精品影音先锋| 亚洲成人动漫在线观看| 波多野结衣精品在线| 精品人在线二区三区| 午夜精品久久久久久久久久久| 国产精品456| 欧美大片国产精品| 亚洲电影一级片| 日本道色综合久久| 中文一区二区在线观看| 精东粉嫩av免费一区二区三区| 欧美撒尿777hd撒尿| 亚洲人123区| caoporn国产一区二区| 久久伊人蜜桃av一区二区| 久久精工是国产品牌吗| 欧美日本高清视频在线观看| 亚洲日本在线a| 91亚洲精华国产精华精华液| 国产免费观看久久| 国产大片一区二区| 国产亚洲精品aa| 国产乱码字幕精品高清av| 欧美成人精品二区三区99精品| 亚洲国产精品久久人人爱| 欧洲av一区二区嗯嗯嗯啊| 最近日韩中文字幕| 99国产精品国产精品毛片| 亚洲私人黄色宅男| 91在线小视频| 亚洲欧美一区二区三区久本道91| caoporn国产一区二区|