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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ata.cpp

?? 三星公司S3c2443的測試程序源碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號(hào):
}

/**********************************
 * PIO mode maximum transfer rate
 * PIO0 : 3.3MB/s
 * PIO1 : 5.2MB/s
 * PIO2 : 8.3MB/s
 * PIO3 : 11.1MB/s
 * PIO4 : 16.7MB/s
 *
***********************************/
 
void ATA::SetPioMode(PIOMODE  pmode) 
{
	U8 nMode = (pmode == PIO0) ? 0 :
				(pmode == PIO1) ? 1 :
				(pmode == PIO2) ? 2 :
				(pmode == PIO3) ? 3 :
				(pmode == PIO4) ? 4 : 0;
	
	U32 uT1;
	U32 uT2;
	U32 uTeoc;
	U32 i;
	
	U32 uPioTime[5];
	U32 m_uPioT1[5] = {200,50,30,50,30};    // min = {70,50,30,30,25};
	U32 m_uPioT2[5] = {300,300,290,100,70}; // min = {290,290,290,80,70};
	U32 m_uPioTeoc[5] = {100,40,20,30,20};  // min = {20,15,10,10,10};
	
	U32 uCycleTime = (U32)(1000000000/HCLK);


	for (i=0; i<5; i++)
	{
		uT1   = (m_uPioT1[i]  /uCycleTime + 1)&0xff;
		uT2   = (m_uPioT2[i]  /uCycleTime + 1)&0xff;
		uTeoc = (m_uPioTeoc[i]/uCycleTime + 1)&0x0f;
		uPioTime[i] = (uTeoc<<12)|(uT2<<4)|uT1;
//		DbgAta(("PIO%dTIME = %x\n", i, uPioTime[i]));
	}
	
	Outp32(ATA_IRQ, 0xff);
	Outp32(ATA_IRQ_MASK, ATAPI_MASK);


    WriteOnTaskFileReg(DEV_CONTROL,0);
	WriteOnTaskFileReg(DEV_FEATURE,0x03); //set transfer mode based on value in Sector Count register
	WriteOnTaskFileReg(DEV_SECTOR,0x08|(nMode&0x7)); // PIO flow control transfer mode
	WriteOnTaskFileReg(DEV_LOWLBA,0x00);
	WriteOnTaskFileReg(DEV_MIDLBA,0x00);
	WriteOnTaskFileReg(DEV_HIGHLBA,0x00);
	WriteOnTaskFileReg(DEV_DEVICE,0x40);
	
	WriteOnTaskFileReg(DEV_COMMAND,SETFEATURES); //set feature command

	WaitForDeviceReady();

	switch(pmode) { // modified by Bryan W. Lee (Oct. 19th, 2005)
		case PIO1:
			m_uCfgReg &= (~0x2); //IORDY disable
			Outp32(ATA_PIO_TIME, uPioTime[1]);
			break;
		case PIO2:
			m_uCfgReg &= (~0x2); //IORDY disable
			Outp32(ATA_PIO_TIME, uPioTime[2]);
			break;
		case PIO3:
			m_uCfgReg |= 0x2; //IORDY enable
			Outp32(ATA_PIO_TIME, uPioTime[3]);
			break;
		case PIO4:
			m_uCfgReg |= 0x2; //IORDY enable
			Outp32(ATA_PIO_TIME, uPioTime[4]);
			break;
		default:
			m_uCfgReg &= (~0x2); //IORDY disable
			Outp32(ATA_PIO_TIME, uPioTime[0]);
			break;
		}
	Outp32(ATA_CFG, m_uCfgReg);
	m_eCurrentPioMode = pmode;

}

//uSector: the number of sectors per block
// if the block count is not supported, an Abort Command error is posted,
// and the Read Multiple and Write Multiple commands are disabled.
void ATA::SetMultiple(U32 uSector) 
{
	m_uCurrentMultiple = uSector;

    WriteOnTaskFileReg(DEV_CONTROL,0);
	WriteOnTaskFileReg(DEV_SECTOR,uSector&0xff);
	WriteOnTaskFileReg(DEV_LOWLBA,0x00);
	WriteOnTaskFileReg(DEV_MIDLBA,0x00);
	WriteOnTaskFileReg(DEV_HIGHLBA,0x00);
	WriteOnTaskFileReg(DEV_DEVICE,0x40);
	WriteOnTaskFileReg(DEV_COMMAND,0xC6); //Set Multiple mode (implemented in ATA IP ??)

	WaitForDeviceReady();
}

/**********************************
 * UDMA mode maximum transfer rate
 * UDMA0 : 16.7MB/s
 * UDMA1 : 25.0MB/s
 * UDMA2 : 33.3MB/s
 * UDMA3 : 44.4MB/s
 * UDMA4 : 66.7MB/s
 * UDMA5 : 100 MB/s 
 *
***********************************/
void ATA::SetUdmaMode(UDMAMODE umode) 
{
	U8 nMode;
	U32 uTdvh1;
	U32 uTdvs;
	U32 uTrp;
	U32 uTss;
	U32 uTackenv;
	U32 i;

	U32 uUdmaTime[5];
	U32 uUdmaTdvh[5] = {20,20,10,10,10}; //{7,7,7,7,7};
	U32 uUdmaTdvs[5] = {100,60,50,35,20}; //{70,48,31,20,7};
	U32 uUdmaTrp[5] = {160,125,100,100,100};
	U32 uUdmaTss[5] = {50,50,50,50,50};
	U32 uUdmaTackenvMin[5] = {20,20,20,20,20};
	U32 uUdmaTackenvMax[5] = {70,70,70,55,55};	
	U32 uCycleTime = (U32)(1000000000/HCLK);

	// added GPB setting for SMDK buffer mechanism 060812
	rGPBDAT |= (3<<5); // GPB5,6 -> H
	rGPBCON = rGPBCON & ~(0xf<<10) | (5<<10); // GPB5,6 output mode
	
	for (i=0; i<5; i++)
	{
		uTdvh1	= (uUdmaTdvh[i] / uCycleTime + 1)&0x0f;
		uTdvs	= (uUdmaTdvs[i] / uCycleTime + 1)&0xff;
		uTrp	= (uUdmaTrp[i]  / uCycleTime + 1)&0xff;
		uTss	= (uUdmaTss[i]  / uCycleTime + 1)&0x0f;
		uTackenv= (uUdmaTackenvMin[i]/uCycleTime + 1)&0x0f;
		uUdmaTime[i] = (uTdvh1<<24)|(uTdvs<<16)|(uTrp<<8)|(uTss<<4)|uTackenv;
//		DbgAta(("UDMA%dTIME = %x\n", i, uUdmaTime[i]));
	}	

	Outp32(ATA_IRQ, 0xff);
	Outp32(ATA_IRQ_MASK, ATAPI_MASK);

    WriteOnTaskFileReg(DEV_CONTROL,0);
	WriteOnTaskFileReg(DEV_FEATURE,0x03);
	WriteOnTaskFileReg(DEV_SECTOR,0x40|(nMode&0x7));
	WriteOnTaskFileReg(DEV_LOWLBA,0x00);
	WriteOnTaskFileReg(DEV_MIDLBA,0x00);
	WriteOnTaskFileReg(DEV_HIGHLBA,0x00);
	WriteOnTaskFileReg(DEV_DEVICE,0x40);
	WriteOnTaskFileReg(DEV_COMMAND,SETFEATURES);

	WaitForDeviceReady();

	
	switch(umode) {
		case UDMA0:
			nMode = 0;
			Outp32(ATA_UDMA_TIME, uUdmaTime[0]);
			break;		
		case UDMA1:
			nMode = 1;
			Outp32(ATA_UDMA_TIME, uUdmaTime[1]);
			break;
		case UDMA2:
			nMode = 2;
			Outp32(ATA_UDMA_TIME, uUdmaTime[2]);
			break;
		case UDMA3:
			nMode = 3;
			Outp32(ATA_UDMA_TIME, uUdmaTime[3]);
			break;
		case UDMA4:
			nMode = 4;
			Outp32(ATA_UDMA_TIME, uUdmaTime[4]);
			break;
		default:
			DbgAta(("Wrong UDMA mode in SetUdmaMode()\n"));
			break;
		}
	m_uCurrentUdmaMode = nMode;
	

}

bool ATA::OpenMedia(void)
{
	ATA_MODE mode;
	
	Init();

	IdentifyDevice();

	// Decide what mode is best choice in this media.
	if (m_uMaxUdmaMode == 0)
	{
		mode = PIO_DMA;
	}
	else
	{
		mode = UDMA;
	}

	SetAtaMode(mode);
	if (mode == PIO_CPU || mode == PIO_DMA)
	{
		SetPioMode(m_eMaxPioMode);				
	}
	else 
	{
		UDMAMODE udmaMode = 
			(m_uMaxUdmaMode == 0) ? UDMA0 :
			(m_uMaxUdmaMode == 1) ? UDMA1 :
			(m_uMaxUdmaMode == 2) ? UDMA2 :
			(m_uMaxUdmaMode == 3) ? UDMA3 : UDMA4;
		SetPioMode(PIO0);
		SetUdmaMode(udmaMode);		
	}

	return true;
}

bool ATA::OpenMedia(ATA_MODE mode)
{	
	Init();

	IdentifyDevice();

	SetAtaMode(mode);
	if (mode == PIO_CPU || mode == PIO_DMA)
	{
		SetPioMode(m_eMaxPioMode);				
	}
	else 
	{
		UDMAMODE udmaMode = 
			(m_uMaxUdmaMode == 0) ? UDMA0 :
			(m_uMaxUdmaMode == 1) ? UDMA1 :
			(m_uMaxUdmaMode == 2) ? UDMA2 :
			(m_uMaxUdmaMode == 3) ? UDMA3 : UDMA4;
		SetPioMode(PIO0);
		SetUdmaMode(udmaMode);		
	}

	return true;
}

bool ATA::CloseMedia(void)
{
	SetAtaOnOff(0);

	// Output pad disable, Card power off, PC card mode
	Outp32(ATA_MUX, 0x06);

	return true;
}

bool ATA::ReadBlocks(U32 uStBlock, U32 uBlocks, U32 uBufAddr)
{
//	Assert(uStBlock+uBlocks <= m_uMaxSectors);
	
	U32 k;
	ATA_MODE mode = m_eMode;
	bool status;
	
	switch(mode) 
	{
		case PIO_CPU:
			status = ReadSectors_Pio( uStBlock, uBlocks, uBufAddr);
			break;
			
		case PIO_DMA:
			for(k=0; k<uBlocks; k++) 
			{
				ReadSector_PioDma(uStBlock+k, uBufAddr+ATA_SECTORSIZE*k);
				WaitForTransferDone();
			}
			status = true; // need to move..
			break;
			
		case UDMA:
			status = ReadSectors_Udma( uStBlock, uBlocks, uBufAddr);
			break;
			
		default:
			DbgAta(("Not supported mode in ReadBlocks()\n"));
			break;
	}
	return status;
}

bool ATA::WriteBlocks(U32 uStBlock, U32 uBlocks, U32 uBufAddr)
{
//	Assert(uStBlock+uBlocks <= m_uMaxSectors);
	
	U32 k;
	ATA_MODE mode = m_eMode;
	bool status;
	
	switch(mode) 
	{
		case PIO_CPU:
			status = WriteSectors_Pio( uStBlock, uBlocks, uBufAddr);
			break;
			
		case PIO_DMA:
			for(k=0; k<uBlocks; k++)
			{
				WriteSector_PioDma(uStBlock+k, uBufAddr+ATA_SECTORSIZE*k);
				WaitForTransferDone();
			}
			status = true;
			break;
		case UDMA:			
			status = WriteSectors_Udma( uStBlock, uBlocks, uBufAddr);
			break;
		default:
			DbgAta(("Not supported mode in WriteBlocks()\n"));
			break;
	}
	
	return status;
}


void SetBufferDirection(U32 dir) // only for SMDK b'd 060812
{
	switch(dir)
	{
		case READDMA :
			rGPBDAT &= ~(3<<5); // GPB5 -> L, buffer direction - read setting 
								// GPB6 -> L, buffer Output enable 
			break;
		case WRITEDMA :
			rGPBDAT |= (1<<5); 	// GPB5 -> H, buffer direction - write setting 
			rGPBDAT &= ~(1<<6); // GPB6 -> L, buffer Output enable 060812
			break;
		default : // clear
			rGPBDAT |= (3<<5); 	// GPB5 -> H, buffer direction - write setting 
								// GPB6 -> H, buffer Output disable 
			break;
	}		
}


bool ATA::StartReadingBlocks(U32 uStBlock, U32 uBlocks, U32 uBufAddr)
{
//	Assert(!(m_eMode == PIO_CPU));
	
	U32 deviceCmd = (m_eMode == UDMA) ? READDMA : READSECTOR;
	
	/*Track Buffer 1 Setting*/
	Outp32(ATA_TBUF_START, uBufAddr);
	Outp32(ATA_TBUF_SIZE, uBlocks*ATA_SECTORSIZE);
	Outp32(ATA_XFR_NUM, uBlocks*ATA_SECTORSIZE);

	SetAtaDevice(uStBlock, uBlocks);
	WriteOnTaskFileReg(DEV_COMMAND, deviceCmd);

	WaitForDeviceReady();
	
	SetConfigMode(m_eMode, false);
	if (m_eMode == UDMA) // apply at specific set using buffer control
	{
		printf("Ready for reading data in UDMA. Change dip SW & Press Enter..\n");
		getchar();
		SetBufferDirection(READDMA);
	}
	
	SetTransferCommand(ATA_CMD_START);
	
	return true;
}

bool ATA::IsReadingBlocksDone(void)
{
	return IsWritingBlocksDone();
}

void ATA::ContinueReadingBlocks(void)
{

}


bool ATA::StartWritingBlocks(U32 uStBlock, U32 uBlocks, U32 uBufAddr)
{
//	Assert(!(m_eMode == PIO_CPU));

	U32 deviceCmd = (m_eMode == UDMA) ? WRITEDMA : WRITESECTOR;

	
	/*Source Buffer Setting*/
	Outp32(ATA_SBUF_START, uBufAddr);
	Outp32(ATA_SBUF_SIZE, uBlocks*ATA_SECTORSIZE);
	Outp32(ATA_XFR_NUM,   uBlocks*ATA_SECTORSIZE);
	
	SetAtaDevice(uStBlock, uBlocks);
	WriteOnTaskFileReg(DEV_COMMAND, deviceCmd);

	WaitForDeviceReady();

	SetConfigMode(m_eMode, true);	
	if (m_eMode == UDMA) // apply at specific set using buffer control
	{
		printf("Ready for writing data in UDMA. Change dip SW & Press Enter..\n");
		getchar();
		SetBufferDirection(WRITEDMA); // for SMDK buffer direction only
	}

	SetTransferCommand(ATA_CMD_START);

	return true;
}

bool ATA::IsWritingBlocksDone(void)
{
	WaitForTransferDone();

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人99久久亚洲综合精品| 国产精品77777| 国产一区二区三区免费观看| aa级大片欧美| 26uuu欧美日本| 亚洲高清不卡在线观看| 成人一区在线观看| 日韩欧美色电影| 亚洲午夜国产一区99re久久| 成人福利视频在线看| 欧美videossexotv100| 五月婷婷色综合| 在线视频一区二区免费| 国产亚洲精品bt天堂精选| 人人精品人人爱| 欧美三级电影精品| 中文字幕一区二区三区在线播放| 久久99久久精品欧美| 欧美日韩免费高清一区色橹橹 | 亚洲国产激情av| 蜜桃av噜噜一区二区三区小说| 欧美天堂亚洲电影院在线播放| 国产精品欧美一区喷水| 国产露脸91国语对白| 欧美va亚洲va香蕉在线| 奇米色一区二区| 欧美一区二区视频观看视频| 亚洲va欧美va人人爽午夜 | 亚洲色图视频免费播放| 成人免费视频caoporn| 国产色产综合色产在线视频| 国内精品伊人久久久久av影院 | 国内成+人亚洲+欧美+综合在线| 欧美放荡的少妇| 水蜜桃久久夜色精品一区的特点 | 日韩免费观看高清完整版| 亚洲主播在线播放| 欧美在线你懂的| 亚洲五月六月丁香激情| 欧美日韩另类一区| 日本在线不卡一区| 精品久久久网站| 国产精品亚洲人在线观看| 国产欧美日韩麻豆91| 国产宾馆实践打屁股91| 亚洲天堂免费看| 欧美三片在线视频观看 | 亚洲欧美成人一区二区三区| 色噜噜狠狠一区二区三区果冻| 一区二区在线观看免费视频播放| 91福利视频在线| 日韩国产欧美在线视频| 久久综合色之久久综合| 成人精品国产福利| 亚洲精品成a人| 91精品国产一区二区三区| 精品一区二区三区香蕉蜜桃 | 日韩美女在线视频 | 亚洲第一福利视频在线| 欧美一区二区三区白人| 久久国内精品自在自线400部| 欧美电影免费提供在线观看| 成人免费毛片aaaaa**| 国产精品嫩草久久久久| 欧美三日本三级三级在线播放| 久久精品av麻豆的观看方式| 国产精品美日韩| 制服丝袜一区二区三区| 精油按摩中文字幕久久| 中文字幕制服丝袜一区二区三区 | 99精品国产热久久91蜜凸| 亚洲自拍欧美精品| 国产午夜精品美女毛片视频| 91在线高清观看| 日日夜夜精品视频免费| 国产精品情趣视频| 欧美日韩成人激情| 国产精品456| 亚洲成人综合在线| 久久久久久电影| 一本色道久久综合亚洲aⅴ蜜桃| 香蕉乱码成人久久天堂爱免费| 久久综合九色综合久久久精品综合 | 国产成人啪免费观看软件 | 毛片av一区二区| 中文字幕亚洲一区二区av在线| 91久久线看在观草草青青| 久久99国产精品麻豆| 亚洲国产一区视频| 国产精品久久久一区麻豆最新章节| 欧美色涩在线第一页| av激情亚洲男人天堂| 精品一区二区日韩| 午夜日韩在线观看| 亚洲精品成人少妇| 国产日产欧美一区| 精品理论电影在线| 日韩亚洲欧美在线| 欧美日韩的一区二区| 一本大道久久a久久综合婷婷| 国产高清不卡一区二区| 久久国产麻豆精品| 全国精品久久少妇| 午夜视频在线观看一区| 亚洲国产精品视频| 亚洲一区二区三区不卡国产欧美| 中文字幕亚洲一区二区va在线| 久久久蜜桃精品| 精品日韩欧美在线| 91麻豆精品国产91久久久久久久久 | 91精品婷婷国产综合久久竹菊| 欧美性受xxxx| 日本高清视频一区二区| 日本高清成人免费播放| 日本韩国视频一区二区| 日本乱码高清不卡字幕| 日本高清不卡在线观看| 91国产视频在线观看| 91亚洲精华国产精华精华液| 99久久精品国产导航| 不卡的av在线| 色综合天天视频在线观看| 91欧美激情一区二区三区成人| av动漫一区二区| 91视视频在线直接观看在线看网页在线看 | 另类小说图片综合网| 激情欧美一区二区三区在线观看| 麻豆视频观看网址久久| 国产一区二区三区观看| 国产在线观看一区二区| 粉嫩av亚洲一区二区图片| 成人av综合一区| 丁香五精品蜜臀久久久久99网站| 不卡一区二区三区四区| 色综合久久久网| 日本高清无吗v一区| 日韩三级视频在线看| 久久亚洲捆绑美女| 国产精品视频九色porn| 亚洲一区二区3| 精品在线一区二区三区| 久久99精品一区二区三区三区| 成人手机电影网| 欧美男女性生活在线直播观看 | 欧美日韩精品电影| 日韩欧美亚洲国产另类| 国产精品亲子伦对白| 亚洲成人动漫精品| 国产一区二区免费看| 成人不卡免费av| 欧美丰满嫩嫩电影| 中文字幕电影一区| 亚洲成年人网站在线观看| 久久精品国产一区二区三| 成人性视频免费网站| 欧美日韩亚洲不卡| 国产亚洲一区二区在线观看| 亚洲一区av在线| 国产一区二区三区在线观看免费| 国产精品一级片在线观看| 在线一区二区三区四区| 26uuu国产在线精品一区二区| 亚洲婷婷国产精品电影人久久| 九九视频精品免费| 欧美午夜精品久久久久久超碰| 国产校园另类小说区| 亚洲成人免费观看| 成人综合在线网站| 日韩一区二区三区四区| 亚洲精品高清在线| 国产成人精品在线看| 欧美一区二区三区免费观看视频 | 91蝌蚪porny成人天涯| 精品国产区一区| 水蜜桃久久夜色精品一区的特点 | 亚洲国产一区二区三区青草影视| 国产91色综合久久免费分享| 91精品欧美综合在线观看最新| 亚洲色大成网站www久久九九| 国产一区视频在线看| 欧美午夜在线观看| 136国产福利精品导航| 国产乱码精品一区二区三区五月婷| 欧美精品123区| 亚洲小说春色综合另类电影| 成人av网站在线| 国产网站一区二区三区| 久久精品国产色蜜蜜麻豆| 欧美久久一二三四区| 亚洲午夜精品17c| 在线视频国内一区二区| 日韩毛片精品高清免费| 国产**成人网毛片九色 | 国产在线播放一区三区四| 欧美日韩第一区日日骚| 亚洲成人一区在线| 欧美二区三区91| 免费在线观看精品| 91精品欧美综合在线观看最新| 日韩精品福利网|