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

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

?? atapi.c

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

void SetLittleEndian(void)
{
	// set Little endian		
	
	g_uCfgReg &= (~0x40); 
	g_vATAPIRegs->ATA_CFG = g_uCfgReg;
}


void SetAtaOnOff(UINT8 OnOff)
{
	UINT32 temp;
	//Inp32(ATA_CONTROL, temp);
	temp = g_vATAPIRegs->ATA_CONTROL;

	if(OnOff==1)
		//Outp32(ATA_CONTROL, temp | 0x1);
		g_vATAPIRegs->ATA_CONTROL = temp | 0x1;
	else if(OnOff == 0)
		//Outp32(ATA_CONTROL, temp &0xfffffffe);
		g_vATAPIRegs->ATA_CONTROL = temp & 0xfffffffe;
}

void Init(void)
{

	SetLittleEndian();
        
	SetAtaOnOff(1);

        Sleep(200);
        
	g_uCfgReg = 0;

	//CheckDevice(); 	
}

void Init12(PIOMODE pmode, UINT32 multisize, UDMAMODE umode)
{	
	SetAtaOnOff(1);
	
	
	g_uCfgReg = 0;
	g_uCfgReg &= (~0x40); // set Little endian
	//Outp32(ATA_CFG, m_uCfgReg);
	g_vATAPIRegs->ATA_CFG = g_uCfgReg;

	SetPioMode(pmode);
	SetMultiple(multisize);
	//SetUdmaMode(umode);
	
	CheckDevice(); 

}



int OpenMedia()
{

        ATA_MODE mode;
        UDMAMODE udmaMode;
        
	Init();
	
	if (!(IdentifyDevice()))
		return FALSE;

	if (g_oDevice[0].MaxUdmaMode == 0 )
	{
		mode = PIO_CPU;
	}
	else
	{
		mode = UDMA;
            RETAILMSG(1,(TEXT("This Driver is Running UNDER UDMA\r\n")));
		//mode = PIO_CPU;  // to only use PIO mode 061024 hsjang
	}

	SetAtaMode(mode);

	if (mode == PIO_CPU || mode == PIO_DMA)
	{
		RETAILMSG(1, (TEXT("### ATAPI MAXPIOMODE %d\r\n"),g_oDevice[0].MaxPioMode));	
		if (!(SetPioMode(g_oDevice[0].MaxPioMode)))
			return FALSE;
	}
	else 
	{
		 udmaMode = 
			(g_oDevice[0].MaxPioMode == 0) ? UDMA0 :
			(g_oDevice[0].MaxPioMode == 1) ? UDMA1 :
			(g_oDevice[0].MaxPioMode == 2) ? UDMA2 :
			(g_oDevice[0].MaxPioMode == 3) ? UDMA3 : UDMA4;
		SetPioMode(PIO0);
		SetUdmaMode(udmaMode);		
	}

	return TRUE;

}

int SetAtaDevice(UINT32 uLBA, UINT32 uSectorCount)
{
	if (!(WriteOnTaskFileReg(DEV_SECTOR,uSectorCount&0xFF)))
		return FALSE;
	if (!(WriteOnTaskFileReg(DEV_LOWLBA,uLBA&0xFF)))
		return FALSE;
	if (!(WriteOnTaskFileReg(DEV_MIDLBA,(uLBA>>8)&0xFF)))
		return FALSE;
	if (!(WriteOnTaskFileReg(DEV_HIGHLBA,(uLBA>>16)&0xFF)))
		return FALSE;
	if (!(WriteOnTaskFileReg(DEV_DEVICE,((uLBA>>24)&0xF)|0x40)))
		return FALSE;

	return TRUE;
}


int AtaDiskRead(DWORD dStartSec, BYTE *pTargetBuf, UINT16 usNumSec)
{

//	Assert(uStBlock+uBlocks <= m_uMaxSectors);
	
	UINT32 k;
	ATA_MODE mode = g_eMode;
	int status;
        Lock();

    RETAILMSG(RTL_MSG,(TEXT("ATADISKREAD::: 0x%x 0x%x 0x%x \r\n"),dStartSec,pTargetBuf,usNumSec));
	switch(mode) 
	{
		case PIO_CPU:
			status = ReadSectors_Pio( dStartSec, pTargetBuf, usNumSec);
			break;
			
		case PIO_DMA:
			for(k=0; k<usNumSec; k++) 
			{
				ReadSector_PioDma(dStartSec+k, pTargetBuf+ATA_SECTORSIZE*k);
				WaitForTransferDone();
			}
			status = TRUE; // need to move..
			break;
			
		case UDMA:
                    status   = ReadSectors_Udma( dStartSec, pTargetBuf, usNumSec);
			//status = ReadSectors_Pio( dStartSec, pTargetBuf, usNumSec);
			break;
			
		default:
			RETAILMSG(1,(TEXT("Not supported mode in ReadBlocks()\n")));
			break;
	}
        UnLock();
	return status;
}

int  ReadSectors_Pio(DWORD dStartSec, BYTE *pTargetBuf, UINT16 usNumSec)
{

	UINT32 resCount;
	UINT32 remainCount;
	UINT32 goingLBA;
	UINT32 goingDstAddr;
	UINT32 wCount;
	UINT8* uAtaHostAddr;
	UINT32 i;
	
	remainCount = usNumSec;
	goingLBA = dStartSec;
	wCount = 0;	

	SetLittleEndian();
	
	while(remainCount != 0) 
	{
		if(remainCount>256) 
		{
			resCount = 256; //0 means 256
			remainCount -= 256;
		} 

		else 
		{
			resCount = remainCount;
			remainCount = 0;
		}

		goingLBA = dStartSec + wCount*256;

		uAtaHostAddr = pTargetBuf + wCount*256*ATA_SECTORSIZE;


		SetAtaDevice(goingLBA, resCount);
		WriteOnTaskFileReg(DEV_COMMAND, READSECTOR);
		
		while(resCount-- ) {
			if (!(WaitForNoBusyStatus()))
				return FALSE;
			for (i=0;i<ATA_SECTORSIZE/2;i++) {
				 GetByteDataFromDevice(uAtaHostAddr);
				 uAtaHostAddr+=2;
			}
		}
		if (!(WaitForNoBusyStatus()))
			return FALSE;
		wCount++;
	}
	return TRUE;
}


int PutDataToDevice(UINT16 *data) 
{
	if (!(WaitForDeviceAccessReady()))
		return FALSE;

	g_vATAPIRegs->ATA_PIO_DTR = *data;
	return TRUE;
}


int AtaDiskWrite(DWORD dStartSec, BYTE *pTargetBuf, UINT16 usNumSec)
{
//	Assert(uStBlock+uBlocks <= m_uMaxSectors);
	
	UINT32 k;
	ATA_MODE mode = g_eMode;
	int status;

    Lock();
    RETAILMSG(RTL_MSG,(TEXT("ATADISKWRITE::: 0x%x 0x%x 0x%x \r\n"),dStartSec,pTargetBuf,usNumSec));
	switch(mode) 
	{
		case PIO_CPU:
			status = WriteSector_Pio( dStartSec, pTargetBuf, usNumSec);
			break;
			
		case PIO_DMA:
			for(k=0; k<usNumSec; k++) 
			{
				ReadSector_PioDma(dStartSec+k, pTargetBuf+ATA_SECTORSIZE*k);
				WaitForTransferDone();
			}
			status = TRUE; // need to move..
			break;
			
		case UDMA:
			//status = WriteSector_Pio( dStartSec, pTargetBuf, usNumSec);
			status = WriteSectors_Udma( dStartSec, pTargetBuf, usNumSec);
			break;
			
		default:
			RETAILMSG(1,(TEXT("Not supported mode in ReadBlocks()\n")));
			break;
	}
    UnLock();
	return status;
}


int WriteSector_Pio(DWORD dStartSec, BYTE *pTargetBuf, UINT16 usNumSec)
{
	UINT32 resCount;
	UINT32 remainCount;
	UINT32 goingLBA;
	UINT32 goingSrcAddr;
	UINT32 wCount;
	UINT16* uAtaHostAddr;
	UINT32 i;
	
	remainCount = usNumSec;
	goingLBA = dStartSec;
	wCount = 0;	

	RETAILMSG(RTL_MSG,(TEXT("+++ ATADISK:::Write() Check Point 1.\r\n")));

	SetLittleEndian();
	
	while(remainCount != 0) 
	{
		RETAILMSG(RTL_MSG,(TEXT("+++ ATADISK:::Write() Check Point 2.\r\n")));		
		if(remainCount>256) 
		{
			resCount = 256; //0 means 256
			remainCount -= 256;
		} 
		else 
		{
			resCount = remainCount;
			remainCount = 0;
		}
		goingLBA = dStartSec+ wCount*256;
		(UINT8 *)uAtaHostAddr =  pTargetBuf + wCount*256*ATA_SECTORSIZE;
		
		if (!(SetAtaDevice(goingLBA, resCount)))
			return FALSE;
		if (!(WriteOnTaskFileReg(DEV_COMMAND, WRITESECTOR)))
			return FALSE;

		while(resCount-- ) 
		{	
			if (!(WaitForNoBusyStatus()))
				return FALSE;
			for (i=0;i<ATA_SECTORSIZE/2;i++) 
			{			
				if (!(PutDataToDevice(uAtaHostAddr)))
					return TRUE;
				uAtaHostAddr++;
			}
		}		
		if (!(WaitForNoBusyStatus()));
			return TRUE;

		wCount++;
	}
	RETAILMSG(RTL_MSG,(TEXT("+++ ATADISK:::Write() Check Point 3.\r\n")));	
	return TRUE;
}

void SetAtaMode(ATA_MODE mode)
{
	g_eMode = mode;
}

int SetPioMode(PIOMODE  pmode) 
{
	UINT8 nMode = (pmode == PIO0) ? 0 :
				(pmode == PIO1) ? 1 :
				(pmode == PIO2) ? 2 :
				(pmode == PIO3) ? 3 :
				(pmode == PIO4) ? 4 : 0;
	
	UINT32 uT1;
	UINT32 uT2;
	UINT32 uTeoc;
	UINT32 i;
	
	UINT32 uPioTime[5];
	UINT32 m_uPioT1[5] = {200,50,30,50,30};    // min = {70,50,30,30,25};
	UINT32 m_uPioT2[5] = {300,300,290,100,70}; // min = {290,290,290,80,70};
	UINT32 m_uPioTeoc[5] = {100,40,20,30,20};  // min = {20,15,10,10,10};
	
	UINT32 uCycleTime = (UINT32)(1000000000/S3C2443_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]));
	}
	
	g_vATAPIRegs->ATA_IRQ=0xff;
	g_vATAPIRegs->ATA_IRQ_MASK = ATAPI_MASK;


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

	switch(pmode) { // modified by Bryan W. Lee (Oct. 19th, 2005)
		case PIO1:
			g_uCfgReg &= (~0x2); //IORDY disable
			g_vATAPIRegs->ATA_PIO_TIME=uPioTime[1];
			break;
		case PIO2:
			g_uCfgReg &= (~0x2); //IORDY disable
			g_vATAPIRegs->ATA_PIO_TIME=uPioTime[2];

			break;
		case PIO3:
			g_uCfgReg |= 0x2; //IORDY enable
			g_vATAPIRegs->ATA_PIO_TIME=uPioTime[3];			
			break;
		case PIO4:
			g_uCfgReg |= 0x2; //IORDY enable
			g_vATAPIRegs->ATA_PIO_TIME=uPioTime[4];
			break;
		default:
			g_uCfgReg &= (~0x2); //IORDY disable
			g_vATAPIRegs->ATA_PIO_TIME=uPioTime[0];
			break;
		}
	g_vATAPIRegs->ATA_CFG = g_uCfgReg;
	//Outp32(ATA_CFG, m_uCfgReg);
	g_oDevice[0].CurrentPioMode = nMode;

	return TRUE;

}

//nSector: 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 SetMultiple(UINT32 nSector) 
{
	g_oDevice[0].CurrentMultiple = nSector;

   	 WriteOnTaskFileReg(DEV_CONTROL,0);
	WriteOnTaskFileReg(DEV_SECTOR,nSector&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 ??)

	WaitForNoBusyStatus();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲人精品午夜| 欧美不卡123| 一区二区三区四区在线免费观看 | 欧美日韩欧美一区二区| 亚洲欧美激情小说另类| 欧美亚洲动漫精品| 亚洲www啪成人一区二区麻豆| 欧美肥妇bbw| 婷婷激情综合网| 日韩欧美在线影院| 国产乱码精品一区二区三区五月婷| 久久久不卡网国产精品二区| www.欧美精品一二区| 亚洲一区av在线| 日韩欧美国产精品| 国产成人午夜精品5599| 亚洲日本青草视频在线怡红院| 欧美性做爰猛烈叫床潮| 精品制服美女久久| 午夜免费久久看| 亚洲成人免费视频| 2021国产精品久久精品| 波多野结衣亚洲| 日本成人在线网站| 国产亚洲综合性久久久影院| 91在线国内视频| 日韩电影一区二区三区| 欧美激情一区不卡| 欧美精品在线视频| 国产成人精品一区二区三区四区 | 成人动漫在线一区| 亚洲国产你懂的| 久久亚洲影视婷婷| 91国产视频在线观看| 久久99国产精品麻豆| 亚洲青青青在线视频| 日韩一卡二卡三卡四卡| 成人黄色免费短视频| 午夜精品免费在线| 国产精品区一区二区三区| 欧美美女一区二区在线观看| 不卡的电影网站| 另类的小说在线视频另类成人小视频在线 | 色综合久久中文综合久久牛| 天堂成人免费av电影一区| 国产精品美日韩| 欧美一级在线视频| 色呦呦国产精品| 国产河南妇女毛片精品久久久| 午夜亚洲国产au精品一区二区| 国产亚洲一区二区三区在线观看| 欧美三区免费完整视频在线观看| 福利一区二区在线观看| 男人操女人的视频在线观看欧美| 中文字幕视频一区二区三区久| 91精品国产欧美一区二区| 欧美性生活影院| 97久久精品人人爽人人爽蜜臀| 精品一区二区免费看| 亚洲成在人线免费| 亚洲女同女同女同女同女同69| 国产亚洲综合色| 久久亚洲一区二区三区明星换脸| 欧美日韩国产一二三| 日本久久一区二区| av一区二区三区在线| 成人午夜视频免费看| 国产综合色产在线精品| 日本欧美肥老太交大片| 亚洲国产日韩a在线播放| 亚洲激情五月婷婷| 亚洲精品亚洲人成人网在线播放| 国产精品丝袜久久久久久app| 久久亚洲综合色| 久久综合中文字幕| 久久久久99精品国产片| 久久久精品黄色| 国产嫩草影院久久久久| 国产日韩av一区| 久久久久久久久久久99999| 久久久久亚洲蜜桃| 国产精品无人区| 国产欧美一区二区精品仙草咪| 精品1区2区在线观看| 久久综合九色综合欧美亚洲| 精品电影一区二区| 久久精品亚洲国产奇米99| 久久综合久久综合亚洲| 精品国产乱码久久久久久免费| 欧美精品一区二区三区蜜臀| 久久蜜臀精品av| 欧美国产禁国产网站cc| 亚洲欧美另类图片小说| 亚洲午夜一二三区视频| 五月激情综合网| 精一区二区三区| 国产99久久久国产精品免费看 | 国产不卡一区视频| 99国产一区二区三精品乱码| 一本色道久久综合亚洲91| 91黄视频在线观看| 欧美精品vⅰdeose4hd| 精品三级av在线| 国产亚洲精品久| 专区另类欧美日韩| 视频在线在亚洲| 国产一区二区三区| 91视频精品在这里| 欧美一区二区久久| 欧美激情一区三区| 亚洲妇熟xx妇色黄| 国产成人免费网站| 欧美视频在线观看一区二区| 日韩免费一区二区三区在线播放| 日本一区二区三区高清不卡| 亚洲激情网站免费观看| 久久精品国产77777蜜臀| 成人激情免费网站| 欧美精品成人一区二区三区四区| 国产无一区二区| 午夜精品福利一区二区三区蜜桃| 国产乱人伦偷精品视频不卡| 欧美亚洲综合久久| 久久免费精品国产久精品久久久久| 亚洲激情五月婷婷| 国产精品亚洲第一| 欧美美女bb生活片| 国产精品久久久久久久久久免费看| 污片在线观看一区二区| 成人午夜电影网站| 欧美日本国产一区| 国产精品不卡一区二区三区| 蜜桃视频在线观看一区| 99国产精品久久| 精品国免费一区二区三区| 一区二区免费在线播放| 国产一区亚洲一区| 欧美精品一卡二卡| 亚洲视频 欧洲视频| 国产一区二区看久久| 欧美少妇性性性| 中文字幕亚洲不卡| 国产91丝袜在线18| 91精品综合久久久久久| 亚洲三级免费观看| 成人免费va视频| 久久亚洲一区二区三区明星换脸| 午夜精品久久久久久久久| 成人午夜大片免费观看| 日韩欧美一级二级三级| 午夜久久久久久久久| 91美女在线观看| 国产精品麻豆视频| 国产精品18久久久久久vr| 日韩午夜中文字幕| 丝袜脚交一区二区| 欧美综合色免费| 亚洲男同性恋视频| 91丨九色丨尤物| 国产精品久久久久久亚洲毛片| 狠狠狠色丁香婷婷综合激情 | 精品国产伦一区二区三区观看体验| 亚洲国产日韩a在线播放性色| av一区二区不卡| 国产精品久久久久久久久免费樱桃| 国产中文字幕精品| 欧美精品一区二区久久久| 日本中文字幕一区| 欧美一区二区三区人| 亚洲高清三级视频| 欧美日韩精品一区二区三区四区 | 一本一道久久a久久精品综合蜜臀| 国产精品女主播av| 99re热这里只有精品免费视频| 国产精品久久久久久一区二区三区| caoporm超碰国产精品| 亚洲三级免费电影| 91电影在线观看| 亚洲图片欧美视频| 欧美一区二区三区喷汁尤物| 另类人妖一区二区av| 久久久久久久综合色一本| 国产精品一卡二| 中文字幕在线不卡一区二区三区 | 国产伦精品一区二区三区在线观看| 精品国产青草久久久久福利| 国产美女一区二区三区| 国产午夜一区二区三区| heyzo一本久久综合| 亚洲欧美电影一区二区| 欧美日韩一区 二区 三区 久久精品| 日韩福利电影在线| www久久精品| 一本色道久久综合狠狠躁的推荐 | 秋霞影院一区二区| 国产校园另类小说区| 欧美综合久久久| 经典三级视频一区| 亚洲日本电影在线| 日韩网站在线看片你懂的|