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

?? atapi.c

?? S3C2443 WINCE6.0 BSP
?? C
?? 第 1 頁 / 共 3 頁
字號:
}

void SetUdmaMode(UDMAMODE umode) 
{
	UINT8 nMode;
	UINT32 uTdvh1;
	UINT32 uTdvs;
	UINT32 uTrp;
	UINT32 uTss;
	UINT32 uTackenv;
	UINT32 i;

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

#ifdef __EVT1
	g_vIOPORTRegs->GPADAT &= ~(1<<5); // GPA10 RDATA_fOEN setting
//	rGPACDH = 0xaa8a; // GPA10 RDATA_OEN setting
//	rGPBCON = rGPBCON & ~(3<<12) | (1<<12); // GPB6 output setting (nXBREQ)
//	rGPBDAT &= ~(1<<6); // GPB6 -> L, buffer Output enable 
#else
	g_vIOPORTRegs->GPBCON = (g_vIOPORTRegs->GPBCON & ~(0xf<<10)) | (5<<10); // GPB5,6 output mode
	g_vIOPORTRegs->GPBCON = (g_vIOPORTRegs->GPBCON &  ~(0x3<<8)) |( 1<<8); // GPB4 output mode		
	g_vIOPORTRegs->GPBCON = (g_vIOPORTRegs->GPBCON &  ~(0x3<<0)) |( 1<<0); // GPB4 output mode			
	g_vIOPORTRegs->GPBDAT |= (3<<5); // GPB5,6 -> H	
#endif	
	
//	ChangeBufferControl(PIO_CPU);    
	
	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]));
	}	

        g_vATAPIRegs->ATA_IRQ =0xff;
        g_vATAPIRegs->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);

	WaitForNoBusyStatus();

	
	switch(umode) {
		case UDMA0:
			nMode = 0;
                    g_vATAPIRegs->ATA_UDMA_TIME = uUdmaTime[0];
			break;		
		case UDMA1:
			nMode = 1;
                    g_vATAPIRegs->ATA_UDMA_TIME = uUdmaTime[1];
			break;
		case UDMA2:
			nMode = 2;
                    g_vATAPIRegs->ATA_UDMA_TIME = uUdmaTime[2];
			break;
		case UDMA3:
			nMode = 3;
                    g_vATAPIRegs->ATA_UDMA_TIME = uUdmaTime[3];
			break;
		case UDMA4:
			nMode = 4;
                    g_vATAPIRegs->ATA_UDMA_TIME = uUdmaTime[4];
			break;
		default:
                    RETAILMSG(1,(TEXT("UDMA mode is supported between 0 to 4 !!!! . %d\r\n"),umode));
			break;
		}
	g_oDevice[0].CurrentUdmaMode = nMode;
	

}



int CheckDevice(void) 
{
	UINT8 rRead;

	if (!(ReadDeviceReg(DEV_SECTOR, &rRead)))
		return FALSE;
	if (rRead != 0x10) 
		g_oDevice[0].DeviceType = ATA_ABSENT;
	
	if (!(ReadDeviceReg(DEV_LOWLBA, &rRead)))
		return FALSE;
	if (rRead != 0x10) 
		g_oDevice[0].DeviceType = ATA_ABSENT;

	if (!(ReadDeviceReg(DEV_MIDLBA, &rRead)))
		return FALSE;
	if (rRead == 0x00) {
		g_oDevice[0].DeviceType = ATA_ATA;
		//DbgAta(("ATA_ATA\n"));
	}
	else if(rRead == 0x14) 
		g_oDevice[0].DeviceType = ATA_ATAPI;

	return TRUE;
}


int ReadSector_PioDma(UINT32 uLBA, UINT32 uDesAddress) 
{

	if (!(StartReadingBlocks(uLBA,  0x1, uDesAddress)))
		return FALSE;	
	return IsReadingBlocksDone();
}

int StartReadingBlocks(UINT32 uStBlock, UINT32 uBlocks, UINT32 uBufAddr)
{

	UINT32 deviceCmd = (g_eMode == UDMA) ? READDMA : READSECTOR;
	RETAILMSG(RTL_MSG,(TEXT("### Current MOde is %d %d\r\n"),g_eMode,PIO_DMA));
	
	/*Track Buffer 1 Setting*/
	g_vATAPIRegs->ATA_TBUF_START = (UINT32)PIODMA_BUFFER_PA;
	g_vATAPIRegs->ATA_TBUF_SIZE = uBlocks*ATA_SECTORSIZE;
	g_vATAPIRegs->ATA_XFR_NUM = uBlocks*ATA_SECTORSIZE;

	if (!(SetAtaDevice(uStBlock, uBlocks)))
		return FALSE;
	if (!(WriteOnTaskFileReg(DEV_COMMAND, deviceCmd)))
		return FALSE;
	if (!(WaitForNoBusyStatus()))
		return FALSE;
	
	SetConfigMode(g_eMode,FALSE);

//	ChangeBufferControl(UDMA);
#if 0
 	if (g_eMode == UDMA) // apply at specific set using buffer control
	{
		SetBufferDirection(READDMA);
	}   
#endif	
	if (!(SetTransferCommand(ATA_CMD_START)))
		return FALSE;
	return TRUE;
}

#if 0
void ChangeBufferControl(ATA_MODE mode) // added by junon for second UDMA test b'd 060902
{
	if (mode == UDMA)
	{
            g_vIOPORTRegs->GPBDAT = g_vIOPORTRegs->GPBDAT & ~((1<<4)|(1)); // GPB0->low,GPB1->low => UDMA mode 	
	}
	else // PIO
       {
            g_vIOPORTRegs->GPBDAT = g_vIOPORTRegs->GPBDAT & ~((1<<4) |(1))|(1<<4); // GPB0->low,GPB1->high => ATA mode	  	
	}
}
#endif


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

int ReadSectors_Udma(DWORD dStartSec, BYTE *pTargetBuf, UINT16 usNumSec)
{
	UINT32 uCurrentCount;
	UINT32 uRemainderCount;
	UINT32 uCurrentLba;
	UINT32 uCurrentDstAddr;
	UINT32 uRound,uLoop;
    UINT32 start_time;
    UINT32 end_time;
       int dwRet;

        RETAILMSG(RTL_MSG,(TEXT("ReadSectors_Udma::: 0x%x 0x%x 0x%x \r\n"),dStartSec,pTargetBuf,usNumSec));
	uRemainderCount = usNumSec;
	uRound = 0;	

	while(uRemainderCount != 0) {
		if(uRemainderCount>256) {
			uCurrentCount = 256; //0 means 256
			uRemainderCount -= 256;
		} else {
			uCurrentCount = uRemainderCount;
			uRemainderCount = 0;
		}
		uCurrentLba = dStartSec + uRound*256;
		uCurrentDstAddr = pTargetBuf + uRound*256*ATA_SECTORSIZE;
	
#ifdef USE_MUTEX
            GetMutex(g_hMutex);
#endif //USE_MUTEX

            StartReadingBlocks(uCurrentLba, uCurrentCount, uCurrentDstAddr);
            IsReadingBlocksDone();

#ifdef USE_MUTEX
            ReleaseMutex(g_hMutex);
#endif //USE_MUTEX

            memcpy((PBYTE)uCurrentDstAddr,g_vDmaBuffer,uCurrentCount*ATA_SECTORSIZE);
            uRound++;
	}

	return TRUE;
}


int WriteSectors_Udma(DWORD dStartSec, BYTE *pTargetBuf, UINT16 usNumSec)
{
	UINT32 uCurrentCount;
	UINT32 uRemainderCount;
	UINT32 uCurrentLba;
	UINT32 uCurrentSrcAddr;
	UINT32 uRound;
	
	uRemainderCount = usNumSec;
	uRound = 0;	

	
	while(uRemainderCount != 0) {
		if(uRemainderCount>256) {
			uCurrentCount = 256; //0 means 256
			uRemainderCount -= 256;
		} else {
			uCurrentCount = uRemainderCount;
			uRemainderCount = 0;
		}
		uCurrentLba = dStartSec + uRound*256;
		uCurrentSrcAddr = pTargetBuf + uRound*256*ATA_SECTORSIZE;
                memcpy(g_vDmaBuffer,(PBYTE)uCurrentSrcAddr,uCurrentCount*ATA_SECTORSIZE);

#ifdef USE_MUTEX
            GetMutex(g_hMutex);
#endif //USE_MUTEX

		StartWritingBlocks(uCurrentLba, uCurrentCount, uCurrentSrcAddr);
		IsWritingBlocksDone();

#ifdef USE_MUTEX
            ReleaseMutex(g_hMutex);
#endif //USE_MUTEX

               uRound++;

	}

	return TRUE;
}

void SetConfigMode(ATA_MODE mode, int isWriteMode)
{
	switch(mode)
	{
		case PIO_CPU:
			g_uCfgReg = ((g_uCfgReg&0x1F3) | (0<<2)); // set PIO_CPU class
			break;
		case PIO_DMA:
			g_uCfgReg = ((g_uCfgReg&0x1F3) | (1<<2)); // set PDMA class
			if (isWriteMode == TRUE)
				g_uCfgReg |= 0x10; // DMA write mode
			else
				g_uCfgReg &= (~0x10); // DMA read mode
			break;
		case UDMA:
			g_uCfgReg = ((g_uCfgReg&0x1F3) | (2<<2)); // set UDMA class
			g_uCfgReg |= 0x200; // set ATA DMA auto mode (enable multi block transfer)
			if (isWriteMode == TRUE)
				g_uCfgReg |= 0x10; // DMA write mode
			else
				g_uCfgReg &= (~0x10); // DMA read mode
			break;
		default:
			break;
	}
	g_vATAPIRegs->ATA_CFG = g_uCfgReg;
}

int SetTransferCommand(ATA_TRANSFER_CMD command)
{
	UINT8 cmd = (command == ATA_CMD_STOP) ? 0 :
			(command == ATA_CMD_START) ? 1 :
			(command == ATA_CMD_ABORT) ? 2 : 3;
	if (!(WaitForDeviceAccessReady()))
		return FALSE;
	g_vATAPIRegs->ATA_COMMAND = cmd;
	return TRUE;
}


int IsReadingBlocksDone(void)
{
	RETAILMSG(RTL_MSG,(TEXT("### PIO_DMA Check Point 3.\r\n")));
	return IsWritingBlocksDone();
}

int IsWritingBlocksDone(void)
{
	RETAILMSG(RTL_MSG,(TEXT("### PIO_DMA Check Point 4.\r\n")));
	if (!(WaitForTransferDone()))
		return FALSE;	
	RETAILMSG(RTL_MSG,(TEXT("### PIO_DMA Check Point 6.\r\n")));
	return IsDmaDone();
}

int WaitForTransferDone(void)
{
	UINT32 x;
	UINT32 count=1;
	UINT16 retVal=TRUE;

	do {
		count++;

		if(!(WaitForDeviceAccessReady()))	// timeout
			return FALSE; 
		if(count == 10000000 )					// timeout
		{
			retVal = FALSE;
			break;
		}

		x = g_vATAPIRegs->ATA_STATUS;
	} while((x & 3)!=0);

	return retVal;
}

int IsDmaDone(void)
{
	if (!(SetTransferCommand(ATA_CMD_ABORT)))
		return FALSE;
	RETAILMSG(RTL_MSG,(TEXT("### PIO_DMA Check Point 7.\r\n")));
//       SetBufferDirection(0); // clear to H
//       ChangeBufferControl(PIO_CPU);
    
	SetConfigMode(PIO_CPU, TRUE);
	RETAILMSG(RTL_MSG,(TEXT("### PIO_DMA Check Point 8.\r\n")));
	if (!(WaitForNoBusyStatus()))
		return FALSE;
	RETAILMSG(RTL_MSG,(TEXT("### PIO_DMA Check Point 9.\r\n")));

	if (g_eMode == UDMA)
	{
		g_uCfgReg &= (~0x200); // disable ATA DMA auto mode
		g_vATAPIRegs->ATA_CFG = g_uCfgReg;
	}
	return TRUE;
}


int WriteSector_PioDma(UINT32 uLBA, UINT32 uSrcAddress) 
{

	if (!(StartWritingBlocks(uLBA, 1, uSrcAddress)))
		return FALSE;
	return IsWritingBlocksDone();
}

int StartWritingBlocks(UINT32 uStBlock, UINT32 uBlocks, UINT32 uBufAddr)
{

	UINT32 deviceCmd = (g_eMode == UDMA) ? WRITEDMA : WRITESECTOR;

	g_vATAPIRegs->ATA_SBUF_START = (UINT32)PIODMA_BUFFER_PA;
	g_vATAPIRegs->ATA_SBUF_SIZE = uBlocks*ATA_SECTORSIZE;
	g_vATAPIRegs->ATA_XFR_NUM = uBlocks*ATA_SECTORSIZE;

	if (!(SetAtaDevice(uStBlock, uBlocks)))
		return FALSE;
	if (!(WriteOnTaskFileReg(DEV_COMMAND, deviceCmd)))
		return FALSE;

	if (!(WaitForNoBusyStatus()))
		return FALSE;
	
	SetConfigMode(g_eMode,TRUE);
//	ChangeBufferControl(UDMA);
#if 0    
	if (g_eMode == UDMA) // apply at specific set using buffer control
	{
		SetBufferDirection(WRITEDMA); // for SMDK buffer direction only
	}
#endif

	if (!(SetTransferCommand(ATA_CMD_START)))
		return FALSE;
	
	return TRUE;

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人在线观看| 日韩精品中文字幕一区| 国产日产欧美一区二区视频| 国产精品一区二区在线观看不卡| 欧美精品一区二| 91免费版在线看| 亚洲夂夂婷婷色拍ww47| 精品视频免费在线| 久久精品国产免费| 国产精品久久久久久久岛一牛影视| 91在线观看一区二区| 亚洲成a人片综合在线| 精品久久久久久久久久久久包黑料| 国产一区二区三区四区五区入口| 国产精品乱码人人做人人爱| 欧美视频在线一区| 黄色精品一二区| 国产精品国产精品国产专区不蜜| 欧美午夜一区二区三区免费大片| 日本欧美肥老太交大片| 欧美激情在线观看视频免费| 色中色一区二区| 91玉足脚交白嫩脚丫在线播放| 洋洋成人永久网站入口| 激情综合网最新| 日韩一区在线免费观看| 在线不卡中文字幕| 国产99久久久国产精品| 亚洲成人av一区| 国产欧美日产一区| 91精品国模一区二区三区| 国产精品白丝jk黑袜喷水| 一二三区精品福利视频| 久久―日本道色综合久久| 欧日韩精品视频| 国产在线视视频有精品| 亚洲一区在线免费观看| 亚洲国产精品成人综合| 日韩一区国产二区欧美三区| 91香蕉视频在线| 国产精品一区二区无线| 日韩高清中文字幕一区| 丝袜美腿高跟呻吟高潮一区| 国产精品第13页| 精品精品国产高清a毛片牛牛| 色域天天综合网| 国产成人午夜片在线观看高清观看| 亚洲成av人片在线观看无码| 国产精品麻豆网站| 久久久九九九九| 欧美一级生活片| 欧美日韩成人一区| 91美女片黄在线观看| 国产成人亚洲综合a∨婷婷| 毛片av中文字幕一区二区| 玉足女爽爽91| 亚洲欧洲日韩在线| 国产精品天美传媒| 欧美激情艳妇裸体舞| 久久综合色鬼综合色| 日韩限制级电影在线观看| 欧美日韩在线一区二区| 在线观看一区二区视频| 91视频国产观看| 成人18精品视频| 99精品视频一区二区| 国产91丝袜在线观看| 国产精品自拍毛片| 国产精品白丝av| 国产成人自拍在线| 粉嫩蜜臀av国产精品网站| 国产综合色在线| 国产一区二区三区免费播放| 国内精品伊人久久久久影院对白| 蜜臀久久99精品久久久久宅男 | 99久久er热在这里只有精品66| 国产在线视频一区二区| 国产一区欧美二区| 国产寡妇亲子伦一区二区| 国产一区二区在线电影| 国产一区二区三区在线观看免费| 国产精品亚洲专一区二区三区| 国产精品1区2区| 国产mv日韩mv欧美| 91麻豆6部合集magnet| 色菇凉天天综合网| 欧美酷刑日本凌虐凌虐| 日韩欧美国产系列| 国产区在线观看成人精品| 中文欧美字幕免费| 亚洲欧美偷拍另类a∨色屁股| 亚洲欧美日韩精品久久久久| 亚洲午夜在线观看视频在线| 日韩和欧美的一区| 久久99在线观看| 不卡av免费在线观看| 91国在线观看| 91精品国产综合久久久久久漫画| 日韩欧美亚洲国产另类| 国产日韩欧美电影| 亚洲激情一二三区| 91同城在线观看| 欧美日本一道本在线视频| 精品久久久久久久一区二区蜜臀| 欧美国产乱子伦| 亚洲综合激情网| 韩国一区二区在线观看| proumb性欧美在线观看| 欧美日韩日日摸| 国产丝袜在线精品| 亚洲观看高清完整版在线观看| 麻豆视频观看网址久久| 99久精品国产| 日韩一区二区免费高清| 国产精品二区一区二区aⅴ污介绍| 夜夜夜精品看看| 国产精品66部| 欧美另类高清zo欧美| 国产精品色在线| 麻豆久久久久久久| 色综合久久天天| www国产亚洲精品久久麻豆| 一区二区三区中文字幕在线观看| 狠狠色丁香婷婷综合| 欧洲国内综合视频| 国产三级精品在线| 奇米色一区二区三区四区| av激情亚洲男人天堂| 欧美成人一区二区三区片免费 | 欧美三级电影一区| 欧美激情一二三区| 麻豆成人久久精品二区三区红| 一本色道亚洲精品aⅴ| 久久美女艺术照精彩视频福利播放| 亚洲午夜电影在线| 大尺度一区二区| 精品国产乱码久久久久久蜜臀 | 欧美va天堂va视频va在线| 一区二区视频在线看| 国产一区二区精品久久99| 欧美疯狂做受xxxx富婆| 国产精品久久三| 国产美女主播视频一区| 欧美刺激午夜性久久久久久久| 亚洲自拍偷拍欧美| 91在线观看污| 国产精品国产三级国产a| 国产一区在线观看视频| 欧美电影免费观看完整版| 亚洲成av人片在线| 欧美中文一区二区三区| 亚洲桃色在线一区| 成人h动漫精品一区二| 久久久久久久综合| 国产一区二区福利| 久久亚洲春色中文字幕久久久| 免费av成人在线| 日韩欧美国产午夜精品| 三级不卡在线观看| 欧美猛男男办公室激情| 亚洲国产综合色| 欧美视频一二三区| 亚洲国产精品天堂| 欧美日韩综合在线免费观看| 亚洲自拍偷拍九九九| 欧美午夜精品久久久久久孕妇| 亚洲丝袜美腿综合| 91美女片黄在线观看91美女| 亚洲精品日韩一| 欧美视频精品在线| 丝袜亚洲另类欧美| 欧美tickle裸体挠脚心vk| 国产真实乱子伦精品视频| 久久亚洲春色中文字幕久久久| 国产精品一区二区免费不卡| 中文av一区特黄| 91小视频免费看| 午夜一区二区三区视频| 欧美精品一卡二卡| 亚洲一区二区三区四区在线| 欧美性猛交xxxxxx富婆| 午夜不卡av在线| 日韩精品一区二区三区四区 | 亚洲免费观看高清完整版在线观看 | 国产成人av一区| 国产日产欧产精品推荐色| 成人app网站| 亚洲激情自拍偷拍| 欧美日韩大陆一区二区| 久久99这里只有精品| 欧美国产禁国产网站cc| 97精品国产露脸对白| 亚洲第一激情av| 精品免费99久久| 99精品在线免费| 日韩 欧美一区二区三区| 久久久青草青青国产亚洲免观| 蜜臀a∨国产成人精品| 日韩美女主播在线视频一区二区三区| 国产一区久久久|