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

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

?? ata_driver.c

?? 飛思卡爾MC9S12uf32的一些實用驅動程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
/******************************************************************************
*                                                  
*  (c) copyright Freescale Semiconductor Hong Kong Ltd 2004
*  ALL RIGHTS RESERVED
*                                                                       
*******************************************************************************  
** THIS  CODE IS ONLY INTENDED AS AN EXAMPLE FOR DEMONSTRATING THE FREESCALE **
** MICROCONTROLLERS.  IT  HAS ONLY BEEN GIVEN A MIMIMUM LEVEL OF TEST. IT IS **
** PROVIDED  'AS  SEEN'  WITH  NO  GUARANTEES  AND  NO  PROMISE  OF SUPPORT. **
*******************************************************************************  
*                                                                           
* FILE:        ata_driver.c	 REVISION 0.1
*  
* DESCRIPTION:  Major part of ATA Driver module. (APIs & Functions)
*
* NOTES:       All modules remain at their reset addresses
*                                                  
* UPDATED HISTORY:
*
* REV   YYYY.MM.DD  AUTHOR        DESCRIPTION OF CHANGE
* ---   ----------  ------        --------------------- 
* 0.0   2002.06.27  Derek Lau     Initial version
* 0.1   2004.04.08  Derek Lau			Demo version
*
******************************************************************************/                                                                        
/* Freescale  is  not  obligated  to  provide  any  support, upgrades or new */
/* releases  of  the Software. Freescale may make changes to the Software at */
/* any time, without any obligation to notify or provide updated versions of */
/* the  Software  to you. Freescale expressly disclaims any warranty for the */
/* Software.  The  Software is provided as is, without warranty of any kind, */
/* either  express  or  implied,  including, without limitation, the implied */
/* warranties  of  merchantability,  fitness  for  a  particular purpose, or */
/* non-infringement.  You  assume  the entire risk arising out of the use or */
/* performance of the Software, or any systems you design using the software */
/* (if  any).  Nothing  may  be construed as a warranty or representation by */
/* Freescale  that  the  Software  or  any derivative work developed with or */
/* incorporating  the  Software  will  be  free  from  infringement  of  the */
/* intellectual property rights of third parties. In no event will Freescale */
/* be  liable,  whether in contract, tort, or otherwise, for any incidental, */
/* special,  indirect, consequential or punitive damages, including, but not */
/* limited  to,  damages  for  any loss of use, loss of time, inconvenience, */
/* commercial loss, or lost profits, savings, or revenues to the full extent */
/* such  may be disclaimed by law. The Software is not fault tolerant and is */
/* not  designed,  manufactured  or  intended by Freescale for incorporation */
/* into  products intended for use or resale in on-line control equipment in */
/* hazardous, dangerous to life or potentially life-threatening environments */
/* requiring  fail-safe  performance,  such  as  in the operation of nuclear */
/* facilities,  aircraft  navigation  or  communication systems, air traffic */
/* control,  direct  life  support machines or weapons systems, in which the */
/* failure  of  products  could  lead  directly to death, personal injury or */
/* severe  physical  or  environmental  damage  (High  Risk Activities). You */
/* specifically  represent and warrant that you will not use the Software or */
/* any  derivative  work of the Software for High Risk Activities.           */
/* Freescale  and the Freescale logos are registered trademarks of Freescale */
/* Semiconductor Inc.                                                        */ 
/*****************************************************************************/

#include	"FreescaleDef.h"			// Get my definitions (Constants & Macros)
#include	"uf32reg.h"			// Get the DP256 registers.
#include	"mk_extern.h"		// Get Mini-Kernel global prototypes
#include	"ata_includes.h"	// Get ATA Driver Configuration
#include	"usbms_extern.h"	// Get USB Mass Storage Drvier global
#include	"usbms_includes.h"
#include	"ata_extern.h"		// Get ATA exported global prototypes
#include	"utl_includes.h"

// code is placed in the main code area.
#pragma CODE_SEG	DEFAULT

// PIO0 - PIO4 timing
const muint16 kATARPIOReg1[] = 
	{kATARPIO0Reg1,kATARPIO1Reg1,kATARPIO2Reg1,kATARPIO3Reg1,kATARPIO4Reg1};
const muint16 kATAPIOReg1[] = 
	{kATAPIO0Reg1,kATAPIO1Reg1,kATAPIO2Reg1,kATAPIO3Reg1,kATAPIO4Reg1};
const muint16 kATAPIOReg2[] = 
	{kATAPIO0Reg2,kATAPIO1Reg2,kATAPIO2Reg2,kATAPIO3Reg2,kATAPIO4Reg2};
const muint16 kATAPIOReg3[] = 
	{kATAPIO0Reg3,kATAPIO1Reg3,kATAPIO2Reg3,kATAPIO3Reg3,kATAPIO4Reg3};
const muint16 kATAPIOReg4[] = 
	{kATAPIO0Reg4,kATAPIO1Reg4,kATAPIO2Reg4,kATAPIO3Reg4,kATAPIO4Reg4};

// UDMA0 - UDMA4 timing
const muint16 kATAUDMAReg1[] = 
	{kATAUDMA0Reg1,kATAUDMA1Reg1,kATAUDMA2Reg1, 
	kATAUDMA3Reg1,kATAUDMA4Reg1,kATAUDMA5Reg1};
const muint16 kATAUDMAReg2[] = 
	{kATAUDMA0Reg2,kATAUDMA1Reg2,kATAUDMA2Reg2,	
	kATAUDMA3Reg2,kATAUDMA4Reg2,kATAUDMA5Reg2};
const muint16 kATAUDMAReg3[] = 
	{kATAUDMA0Reg3,kATAUDMA1Reg3,kATAUDMA2Reg3,	
	kATAUDMA3Reg3,kATAUDMA4Reg3,kATAUDMA5Reg3};
const muint16 kATAUDMAReg4[] = 
	{kATAUDMA0Reg4,kATAUDMA1Reg4,kATAUDMA2Reg4,	
	kATAUDMA3Reg4,kATAUDMA4Reg4,kATAUDMA5Reg4};
const muint16 kATAUDMAReg5[] = 
	{kATAUDMA0Reg5,kATAUDMA1Reg5,kATAUDMA2Reg5,	
	kATAUDMA3Reg5,kATAUDMA4Reg5,kATAUDMA5Reg5};
const muint16 kATAUDMAReg6[] = 
	{kATAUDMA0Reg6,kATAUDMA1Reg6,kATAUDMA2Reg6,	
	kATAUDMA3Reg6,kATAUDMA4Reg6,kATAUDMA5Reg6};
const muint16 kATAUDMAReg7[] = 
	{kATAUDMA0Reg7,kATAUDMA1Reg7,kATAUDMA2Reg7,	
	kATAUDMA3Reg7,kATAUDMA4Reg7,kATAUDMA5Reg7};
const muint16 kATAUDMAReg8[] = 
	{kATAUDMA0Reg8,kATAUDMA1Reg8,kATAUDMA2Reg8,	
	kATAUDMA3Reg8,kATAUDMA4Reg8,kATAUDMA5Reg8};
const muint16 kATAUDMAReg9[] = 
	{kATAUDMA0Reg9,kATAUDMA1Reg9,kATAUDMA2Reg9,	
	kATAUDMA3Reg9,kATAUDMA4Reg9,kATAUDMA5Reg9};

// Multi-word DMA0 - MDMA2 timing
const muint16 kATAMDMAReg1[] =
	{kATAMDMA0Reg1,kATAMDMA1Reg1,kATAMDMA2Reg1};
const muint16 kATAMDMAReg2[] =
	{kATAMDMA0Reg2,kATAMDMA1Reg2,kATAMDMA2Reg2};
const muint16 kATAMDMAReg3[] =
	{kATAMDMA0Reg3,kATAMDMA1Reg3,kATAMDMA2Reg3};
const muint16 kATAMDMAReg4[] =
	{kATAMDMA0Reg4,kATAMDMA1Reg4,kATAMDMA2Reg4};

// PIO, UMDA, MDMA mode setting in ATA Set Feature
const muint8 kATAPIO2Mode[] = 
	{kATAFCmdXfPIO0,kATAFCmdXfPIO1,kATAFCmdXfPIO2,
	kATAFCmdXfPIO3,kATAFCmdXfPIO4};
const muint8 kATAUDMA2Mode[] = 
	{kATAFCmdXfUDMA0,kATAFCmdXfUDMA1,kATAFCmdXfUDMA2,
	kATAFCmdXfUDMA3,kATAFCmdXfUDMA4};
const muint8 kATAMDMA2Mode[] = 
	{kATAFCmdXfMDMA0,kATAFCmdXfMDMA1,kATAFCmdXfMDMA2};



void ATA_Delay(muint16 delay)
{
	muint16 BegTime,CurTime;
	
	BegTime = MK_GetCurrentTime();

	do
	{
		CurTime = MK_GetCurrentTime();
	} 
	while ( ((CurTime-BegTime) < delay) || ((BegTime - CurTime) < delay));

}

volatile ATAErrorCode ATA_WaitRegBusy(void)
{

	muint16 j;

		for (j=0; j<0x100; j++)
		{
			if (!(ATA_HSR_H & ((1<<ATATIP) | (1<<ATADRAB))))
			{
				return(kCSWPass);
			}
		}
	mSetBit(DBRST,QC12DCR);
	ATA_DCR_L = 0;
	return (kCSWFailed);
}


void ATA_PreInit(void)
{
	gATAPIOMode = 0xff;
	gATASenseKey = kSCSISKNotReady;

}	

ATAErrorCode ATA_Init(muint8 resetpin, volatile muint8 *resetport)
{
	#ifdef CUSTOMER_BOARD3
		MODRR |= 0x03;
	#endif	

	mClearBit(resetpin,*resetport);	// set resetpin to zero
	mSetBit(resetpin,*(resetport+2));	// set resetpin to output

	ATA_SetRPIOTiming(1);
	ATA_HCFG_H	= (1<<ATASMR)+(1<<ATAFR)+(1<<ATACLKEN)+(1<<ATAXNW)+(1<<ATAIORDY);
	ATA_HCFG_H	= (1<<ATACLKEN)+(1<<ATAXNW)+(1<<ATAIORDY);


	ATA_Delay(20);						// delay 20ms

	mClearBit(resetpin,*(resetport+2));	// set resetpin to input
	ATA_Delay(100);						// delay 100ms

	return ATA_GetSetDeviceInfo();
}


// ==================================================================
//   ATA_SoftwareReset() -
//
//     To issues reset command to the ATA device.
//
//	Input -		=	nil
//				
//	Output - 	=	nil
//
//	Function 
//
// ==================================================================

ATAErrorCode ATA_SoftwareReset(void)
{
	ATAErrorCode error;

	ATA_DCTR_B = (1<<ATASRST);	// reset device 
	error = ATA_WaitRegBusy();
	if (error)
		return(error);

	ATA_Delay(2);				// delay 2ms
	ATA_DCTR_B = 0;
	error = ATA_WaitRegBusy();
	if (error)
		return(error);

	ATA_Delay(3);				// delay 3ms

	return (ATA_WaitATABusy());
}


// ==================================================================
//   ATA_PacketCommand() -
//
//     To set command to ATAPI device
//
//	Input -		=	ATAPI command pointer
//				
//	Output - 	=	ATAErrorCode
//
//	Function returns error code
//
// ==================================================================
ATAErrorCode ATA_PacketCommand(muint16 *pCommand)
{
	muint8	i;
	ATAErrorCode	error;
	muint8	atadcrl;

	if (mCheckBit(bitATAUDMAMode,gATAStatus))				// if udma mode supported
	{
		if ( (*pCommand == (kSCSIRead10<<kOneByte)) || (*pCommand == (kSCSIRead12<<kOneByte)))
		{													// if udma read
			ATA_DFR_B = 0x01;								// inform device udma mode
			atadcrl = (1<<ATAUDMA) | (1<<ATAUDMARD);		// prepare udma read for host
		}
		else												// if udma write
		{
			if ((*pCommand == (kSCSIWrite10<<kOneByte)) || 	\
				(*pCommand == (kSCSIWrite12<<kOneByte)) ||	\
				(*pCommand == (kSCSIVerify10<<kOneByte)))
			{
				ATA_DFR_B = 0x01;							// inform device udma mode
				atadcrl = (1<<ATAUDMA) | (1<<ATAUDMAWR);	// prepare udma write for host
			}
			else
			{
				ATA_DFR_B = 0;
				atadcrl = 0;
			}
		}
	}
	else													// udma not support
	{
		ATA_DFR_B = 0x00;
		atadcrl = 0;
	}
	
	error = ATA_WaitRegBusy();
	if (error)
		return(error);		
	
	ATA_DSCR_B = 0x00;
	error = ATA_WaitRegBusy();
	if (error)
		return(error);		

	ATA_LBAM_B = 0xFE;										// Maximum byte of transfer
	error = ATA_WaitRegBusy();
	if (error)
		return(error);			
    
    ATA_LBAH_B = 0xFF;
	error = ATA_WaitRegBusy();
	if (error)
		return(error);		

	ATA_DDHR_B = 0x00;
	error = ATA_WaitRegBusy();
	if (error)
		return(error);			
    
	ATA_DCR = (kATACmdPacket << 8);							// issue command
	error = ATA_WaitRegBusy();
	if (error)
		return(error);

	error = ATA_WaitATABusy();								// wait for ATA not busy
	if (error)
		return(error);

	for (i=0; i<gATAPacketLen; i++)		// write 6 or 8 words of command
	{
		ATA_DDR = *pCommand++;
		
		error = ATA_WaitRegBusy();
		if (error)
			return(error);			// PIO
	}
	
	if (atadcrl)
	{
		ATA_DCR_L = atadcrl;
		return(kATAPass);
	}

	return(ATA_WaitATABusy());
}


// ==================================================================
//   ATA_Command() -
//
//     To set command to ATA device
//
//	Input -		=	7 command parameters
//				
//	Output - 	=	
//
//	Function returns error code
//
// ==================================================================
muint8 ATA_Command(sATACommand *psATACommand)
{
	muint8 error;
	
	error = ATA_WaitATABusy();
		
	if (error)
		return(error);

	ATA_DFR_B	= psATACommand->features;
	error = ATA_WaitRegBusy();
	if (error)
		return(error);	
    	
    ATA_DSCR_B = psATACommand->count;
	error = ATA_WaitRegBusy();
	if (error)
		return(error);			
    
    ATA_LBAL_B = psATACommand->lba_low;
	error = ATA_WaitRegBusy();
	if (error)
		return(error);		
    
    ATA_LBAM_B = psATACommand->lba_mid;
	error = ATA_WaitRegBusy();
	if (error)
		return(error);		

    ATA_LBAH_B = psATACommand->lba_high;
	error = ATA_WaitRegBusy();
	if (error)
		return(error);		
    
    ATA_DDHR_B = psATACommand->device;
	error = ATA_WaitRegBusy();
	if (error)
		return(error);		
    
	ATA_DCR = ( (muint16) psATACommand->command << 8);
	
	error = ATA_WaitRegBusy();
	if (error)
		return(error);

	ATA_DCR_L = psATACommand->dmamode;

	return (ATA_WaitATABusy());

}

// ==================================================================
//   ATA_LBAATACommand() -
//
//     To set command to ATA device
//
//	Input -		=	7 command parameters
//				
//	Output - 	=	
//
//	Function returns error code
//
// ==================================================================
ATAErrorCode ATA_LBAATACommand(muint8 Block, muint8 ATACmd)
{
	volatile ATAErrorCode error;
	muint8	*pLBA;

	pLBA = (muint8*) &gATALBA;

	error = ATA_WaitRegBusy();
	if (error)
		return(error);
	
	(void) ATA_WaitATABusy();

	if (*pLBA & 0xf0)				// if memory > 128G
  {
   	ATA_DSCR_B = 0;					// high byte of sector count
		error = ATA_WaitRegBusy();
		if (error)
			return(error);			

    ATA_LBAL_B = *pLBA;		// LBA 31:24
		error = ATA_WaitRegBusy();
		if (error)
			return(error);			

   	ATA_LBAM_B = 0;					// LBA 39:32
		error = ATA_WaitRegBusy();
		if (error)
			return(error);			

   	ATA_LBAH_B = 0;
		error = ATA_WaitRegBusy();		// LBA 47:40
		if (error)
			return(error);
	}	

  ATA_DSCR_B = Block;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品中文字幕一区二区三区| 欧美日韩亚州综合| 91在线一区二区三区| 欧美精品免费视频| 欧美国产成人在线| 日韩影院在线观看| 欧美色成人综合| 国产精品国产三级国产aⅴ入口| 午夜精品久久久久久久久久| av成人动漫在线观看| 日韩一级片网址| 丝袜美腿亚洲综合| 色哟哟国产精品| 国产精品国产三级国产普通话蜜臀 | 欧美精品日日鲁夜夜添| 国产精品国产三级国产普通话蜜臀| 久久99日本精品| 欧美猛男超大videosgay| 国产精品激情偷乱一区二区∴| 国产一区啦啦啦在线观看| 91精品国产欧美一区二区成人| 亚洲免费三区一区二区| 99免费精品视频| 中日韩av电影| 国产不卡一区视频| 久久午夜老司机| 国产呦精品一区二区三区网站| 欧美一级高清片在线观看| 亚洲高清免费观看高清完整版在线观看| 国产精品性做久久久久久| 精品久久国产老人久久综合| 久久99深爱久久99精品| 日韩久久精品一区| 精品一区二区三区视频在线观看| 欧美一区二区三区在| 天堂一区二区在线| 欧美一区二区三区视频在线观看| 日本视频中文字幕一区二区三区| 91精品国产综合久久久蜜臀粉嫩 | 国产.欧美.日韩| 欧美激情一区二区三区在线| 懂色中文一区二区在线播放| 久久久777精品电影网影网| 国产成a人亚洲精品| 国产精品成人免费精品自在线观看| 99视频热这里只有精品免费| 亚洲天堂成人网| 欧美少妇一区二区| 美国十次综合导航| 久久丝袜美腿综合| 99免费精品视频| 午夜精品久久久久久久久| 日韩欧美国产精品一区| 国产九色sp调教91| 一区二区三区资源| 欧美麻豆精品久久久久久| 六月丁香婷婷久久| 国产精品久久久久影院亚瑟| 欧美日韩国产综合久久| 蜜桃传媒麻豆第一区在线观看| 久久一日本道色综合| 91蝌蚪porny| 蜜臀av性久久久久蜜臀av麻豆| 久久综合狠狠综合久久激情| 91色porny在线视频| 日韩激情视频网站| 久久久国产精品麻豆| 日本福利一区二区| 蜜臀久久久99精品久久久久久| 国产精品看片你懂得| 欧美男男青年gay1069videost | 午夜国产不卡在线观看视频| 日韩欧美黄色影院| 不卡av免费在线观看| 亚洲成人av一区二区| 国产人久久人人人人爽| 欧美日韩一区 二区 三区 久久精品| 国产最新精品免费| 午夜视频在线观看一区二区三区| 久久久青草青青国产亚洲免观| 欧美日韩午夜在线| 成人一道本在线| 韩国毛片一区二区三区| 亚洲国产日韩综合久久精品| 中文一区在线播放| 欧美一二三四在线| 欧美视频一区二区在线观看| 成人av影院在线| 国内精品久久久久影院薰衣草 | 国产精品美女一区二区三区| 日韩欧美的一区| 91国产免费观看| www.色综合.com| 国产福利一区在线| 久草精品在线观看| 香蕉久久一区二区不卡无毒影院 | 美腿丝袜亚洲色图| 一区二区三区欧美日| 欧美国产日本韩| 久久久久久亚洲综合| 日韩你懂的电影在线观看| 欧美日韩国产不卡| 日本高清不卡aⅴ免费网站| 99在线精品观看| 成人福利视频网站| 风间由美性色一区二区三区| 精品一区二区三区蜜桃| 蜜桃视频在线观看一区二区| 日韩精品五月天| 婷婷综合在线观看| 日本人妖一区二区| 亚洲成精国产精品女| 亚洲一卡二卡三卡四卡无卡久久 | 国产精品久久久久久久久免费桃花| 久久亚洲一级片| 精品99一区二区三区| 欧美tickling网站挠脚心| 欧美变态凌虐bdsm| 精品国免费一区二区三区| 26uuu久久综合| 久久久久久久久一| 国产精品国模大尺度视频| 中文字幕一区二区三区在线不卡| 国产精品人妖ts系列视频| 中文字幕中文在线不卡住| 亚洲欧美日韩在线播放| 洋洋av久久久久久久一区| 亚洲国产一区二区视频| 免费在线观看一区二区三区| 日本强好片久久久久久aaa| 国产在线不卡一区| 91片在线免费观看| 欧美日韩一区不卡| 精品国产1区二区| 国产精品二三区| 亚洲国产成人va在线观看天堂| 日本午夜精品视频在线观看 | 国产精品久久看| 亚洲国产乱码最新视频| 美日韩一区二区三区| 成人一区二区三区视频在线观看 | 天天综合天天综合色| 精品一区二区三区免费| 99国产欧美另类久久久精品| 欧美日韩国产小视频在线观看| 欧美电影免费观看完整版| 中文字幕制服丝袜成人av| 日韩精品免费专区| 成人午夜短视频| 777亚洲妇女| 国产精品久久久久婷婷| 日本不卡1234视频| 91小视频免费观看| 欧美mv日韩mv亚洲| 一区二区在线观看视频在线观看| 日本美女一区二区| 91最新地址在线播放| 久久亚洲精品小早川怜子| 亚洲美女屁股眼交| 国模套图日韩精品一区二区| 在线观看av不卡| 中文字幕乱码久久午夜不卡| 香港成人在线视频| yourporn久久国产精品| 日韩一区二区三区精品视频| 国产精品超碰97尤物18| 精品一区二区影视| 欧美日韩一区小说| 最新不卡av在线| 国产酒店精品激情| 欧美一级黄色大片| 亚洲午夜视频在线观看| 国产不卡视频在线观看| 欧美成人a∨高清免费观看| 一区二区三区中文字幕| 不卡高清视频专区| 国产亚洲欧美在线| 激情久久五月天| 日韩精品最新网址| 视频一区欧美精品| 在线观看亚洲精品| 亚洲欧美成aⅴ人在线观看| 国产精品一区二区你懂的| 日韩视频一区二区| 日韩电影一区二区三区| 91久久精品一区二区二区| ㊣最新国产の精品bt伙计久久| 久久99国产精品免费| 欧美大片顶级少妇| 美女免费视频一区二区| 欧美一级午夜免费电影| 亚瑟在线精品视频| 欧美二区三区91| 丝袜美腿成人在线| 7777精品伊人久久久大香线蕉| 亚洲v精品v日韩v欧美v专区| 欧美美女一区二区三区| 日韩一区欧美二区| 日韩精品中文字幕在线一区| 久久精品72免费观看|