⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 onenand.c

📁 s3c6400 ADS下官方测试程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	OneNandT_oIntFlag.BlkRwCmpInt = 0;
	OneNandT_oIntFlag.PgmCmpInt = 0;
	
	ONENAND_WriteCmd(Controller, uBlkAddr, uPageAddr, 0x11);
#if 0
	while(!OneNandT_oIntFlag.IntActInt);	//Waiting Interrupt
	while(!OneNandT_oIntFlag.BlkRwCmpInt);	//Waiting Interrupt
	while(!OneNandT_oIntFlag.LoadCmpInt);	//Waiting Interrupt
#else
	//Interrupt肺 背眉 
	//while(!(ONENAND(Controller)->rIntErrStat & (1<<10)));
	//Outp32(&ONENAND(Controller)->rIntErrAck, (1<<10));
	while(!OneNandT_oIntFlag.IntActInt);
	
	//Interrupt肺 背眉 
	//while(!(ONENAND(Controller)->rIntErrStat & (1<<7)));
	//Outp32(&ONENAND(Controller)->rIntErrAck, (1<<7));
	while(!OneNandT_oIntFlag.BlkRwCmpInt);
	
	//Interrupt肺 背眉 
	//while(!(ONENAND(Controller)->rIntErrStat & (1<<5)));
	//Outp32(&ONENAND(Controller)->rIntErrAck, (1<<5));	
	while(!OneNandT_oIntFlag.PgmCmpInt);
#endif
}



//////////
// Function Name : ONENAND_PipelineReadAhead
// Function Description : Initiate a copy of PP pages from the memory to the memory controller
// Input : 	Controller - OneNand Controller Port Number 
//			uBlkAddr - Block Number to write
//			uPageAddr - Page number to write
// Version : v0.1
void ONENAND_PipelineReadAhead(u32 Controller, u32 uBlkAddr, u8 uPageAddr, u8 uPageSize)
{
#if 1
	ONENAND_WriteCmd(Controller, uBlkAddr, uPageAddr, (0x4000|(u16)uPageSize));

	//while(!OneNandT_oIntFlag.IntActInt);
#else
	ONENAND_DirectWrite(Controller, OND_STARTADDR3, uBlkAddr);
	ONENAND_DirectWrite(Controller, OND_STARTADDR4, uPageAddr<<2);
	ONENAND_DirectWrite(Controller, OND_STARTBUF, 0x0800);
	ONENAND_DirectWrite(Controller, OND_STARTADDR1, 0x0800);


#endif
}



//////////
// Function Name : ONENAND_ConfigOTPAccess
// Function Description : Configure the controller to access the OTP area of the flash
// Input : 	Controller - OneNand Controller Port Number 
//			uBlkAddr - Block Number to load
//			uPageAddr - Page number to load
// Version : v0.1
void ONENAND_ConfigOTPAccess(u32 Controller, u32 uBlkAddr, u8 uPageAddr)
{
	OneNandT_oIntFlag.IntActInt = 0;
	
	ONENAND_WriteCmd(Controller, uBlkAddr, uPageAddr, 0x12);
#if 0
	while(!OneNandT_oIntFlag.IntActInt);	//Waiting Interrupt
#else
	//Interrupt肺 背眉 
	//while(!(ONENAND(Controller)->rIntErrStat & (1<<10)));
	//Outp32(&ONENAND(Controller)->rIntErrAck, (1<<10));
	while(!OneNandT_oIntFlag.IntActInt);
#endif
}


//////////
// Function Name : ONENAND_ConfigSpareAccess
// Function Description : Configure the controller to access the spare area of the flash
// Input : 	Controller - OneNand Controller Port Number 
//			uBlkAddr - Block Number to load
//			uPageAddr - Page number to load
// Version : v0.1
void ONENAND_ConfigSpareAccess(u32 Controller, u32 uBlkAddr, u8 uPageAddr)
{
	OneNandT_oIntFlag.IntActInt = 0;
	
	ONENAND_WriteCmd(Controller, uBlkAddr, uPageAddr, 0x13);
#if 0
	while(!OneNandT_oIntFlag.IntActInt);	//Waiting Interrupt
#else
	//Interrupt肺 背眉 
	//while(!(ONENAND(Controller)->rIntErrStat & (1<<10)));
	//Outp32(&ONENAND(Controller)->rIntErrAck, (1<<10));
	while(!OneNandT_oIntFlag.IntActInt);
#endif
}


//////////
// Function Name : ONENAND_ConfigMainAccess
// Function Description : Configure the controller to access the main area of the flash
// Input : 	Controller - OneNand Controller Port Number 
//			uBlkAddr - Block Number to load
//			uPageAddr - Page number to load
// Version : v0.1
void ONENAND_ConfigMainAccess(u32 Controller, u32 uBlkAddr, u8 uPageAddr)
{
	OneNandT_oIntFlag.IntActInt = 0;
	ONENAND_WriteCmd(Controller, uBlkAddr, uPageAddr, 0x14);
#if 0
	while(!OneNandT_oIntFlag.IntActInt);	//Waiting Interrupt
#else
	//Interrupt肺 背眉 
	//while(!(ONENAND(Controller)->rIntErrStat & (1<<10)));
	//Outp32(&ONENAND(Controller)->rIntErrAck, (1<<10));
	while(!OneNandT_oIntFlag.IntActInt);
#endif
}



//////////
// Function Name : ONENAND_EnableIntPin
// Function Description : Interrupt Pin Enable&Disable
// Input : 	Controller - OneNand Controller Port Number 
//			Enable - 1:Enable, 0: Disable
// Version : v0.1
void ONENAND_EnableIntPin(u32 Controller, u32 Enable)
{
	Outp32(&ONENAND(Controller)->rIntPinEnable, Enable&0x01);
}

//////////
// Function Name : ONENAND_WriteIntoDataram
// Function Description : Write into DataRam(Map00)
// Input : 	Controller - OneNand Controller Port Number 
//			uAddr - XIP buffer Address
//			uData - Data to write
// Version : v0.1
void ONENAND_WriteIntoDataram(u32 Controller, u32 uAddr, u32 uData)
{
	Outp32(OneNAND_BUFFER_BASE[Controller] + ((0x1fffe & uAddr)<<0), uData);
}

//////////
// Function Name : ONENAND_ReadOutDataram
// Function Description : Read from DataRam(Map00)
// Input : 	Controller - OneNand Controller Port Number 
//			uAddr - XIP buffer Address
//			uData - Data to read
// Version : v0.1
void ONENAND_ReadOutDataram(u32 Controller, u32 uAddr, u32 *uData)
{
	*uData = Inp32(OneNAND_BUFFER_BASE[Controller]  + ((0x1fffe & uAddr)<<0));
}

//////////
// Function Name : ONENAND_WriteIntoFlash
// Function Description : Normal high-speed write accesses to the memory array(Map01)
// Input : 	Controller - OneNand Controller Port Number 
//			uBlockAddr - Block Address to write
//			uPageAddr - Page Address to write
//			uData - Data to write
// Version : v0.1
void ONENAND_WriteIntoFlash(u32 Controller, u32 uBlockAddr, u8 uPageAddr, u32 uData)
{
	Outp32(OneNAND_ARRAY_BASE[Controller]  + ((FbaMask[Controller] & uBlockAddr)<<FbaShift[Controller]) +((FpaMask[Controller] & uPageAddr)<<FpaShift[Controller]), uData);
}

//////////
// Function Name : ONENAND_ReadOutFlash
// Function Description : Normal high-speed read accesses to the memory array(Map01)
// Input : 	Controller - OneNand Controller Port Number 
//			uBlockAddr - Block Address to read
//			uPageAddr - Page Address to read
//			uData - Data to read
// Version : v0.1
void ONENAND_ReadOutFlash(u32 Controller, u32 uBlockAddr, u8 uPageAddr, u32 *uData)
{
	*uData = Inp32(OneNAND_ARRAY_BASE[Controller]  + ((FbaMask[Controller] & uBlockAddr)<<FbaShift[Controller]) +((FpaMask[Controller] & uPageAddr)<<FpaShift[Controller]));
}

//////////
// Function Name : ONENAND_WriteCmd
// Function Description : Control the special functions of the memory device(Map10)
// Input : 	Controller - OneNand Controller Port Number 
//			uBlockAddr - Block Address to access
//			uPageAddr - Page Address to access
//			uData - Data to access
// Version : v0.1
void ONENAND_WriteCmd(u32 Controller, u32 uBlockAddr, u8 uPageAddr, u32 uData)
{
	Outp32(OneNAND_CMD_BASE[Controller]  + ((FbaMask[Controller] & uBlockAddr)<<FbaShift[Controller]) +((FpaMask[Controller] & uPageAddr)<<FpaShift[Controller]), uData);
}

//////////
// Function Name : ONENAND_ReadCmd
// Function Description : Control the special functions of the memory device(Map10)
// Input : 	Controller - OneNand Controller Port Number 
//			uBlockAddr - Block Address to access
//			uPageAddr - Page Address to access
//			uData - Data to access
// Version : v0.1
void ONENAND_ReadCmd(u32 Controller, u32 BlockAddr, u8 uPageAddr, u32 *uData)
{
	*uData = Inp32(OneNAND_CMD_BASE[Controller]  + ((FbaMask[Controller] & BlockAddr)<<FbaShift[Controller])+((FpaMask[Controller] & uPageAddr)<<FpaShift[Controller]));
}

//////////
// Function Name : ONENAND_DirectWrite
// Function Description : Direct Memory Access(Map11)
// Input : 	Controller - OneNand Controller Port Number 
//			uDeviceAddr - Memory Device Address
//			uData - Data to write
// Version : v0.1
void ONENAND_DirectWrite(u32 Controller, u32 uDeviceAddr, u32 uData)
{
	Outp32(OneNAND_DIRECT_BASE[Controller]  + uDeviceAddr, uData);
}

//////////
// Function Name : ONENAND_DirectRead
// Function Description : Direct Memory Access(Map11)
// Input : 	Controller - OneNand Controller Port Number 
//			uDeviceAddr - Memory Device Address
//			uData - Data to read
// Version : v0.1
void ONENAND_DirectRead(u32 Controller, u32 uDeviceAddr, u32 *uData)
{
	*uData = Inp32(OneNAND_DIRECT_BASE[Controller]  + uDeviceAddr);
}


//////////
// Function Name : ONENAND_DirectRead_DMA
// Function Description : Direct Memory Access(Map11) using DMA
// Input : 	Controller - OneNand Controller Port Number 
//			uDeviceAddr - Memory Device Address
//			uData - Data to read
// Version : v0.1
#if (OND_TRANS_MODE == OND_DMA)
void ONENAND_DirectRead_DMA(u32 Controller, u32 uDeviceAddr, u32 *uData)
{
	u32 uSrcAddr;

	OneNand_DmaDone = 0;
	uSrcAddr = OneNAND_BUFFER_BASE[Controller]  + ((0x1fffe & uDeviceAddr)<<0);

	DMACH_Setup(DMA_A, 0x0, (u32)uSrcAddr, 0, (u32)uData, 0, WORD, ONENAND_PAGESIZE/4, DEMAND, MEM, MEM, BURST4, &g_oONDDmac0);
				
	DMACH_Start(&g_oONDDmac0);
	while(!OneNand_DmaDone);
}
#endif

//////////
// Function Name : ONENAND_EnableInterrupt
// Function Description : Interrupt Status Enable
// Input : 	Controller - OneNand Controller Port Number 
//			eInterrupt - Interrupt Source
// Version : v0.1
void ONENAND_EnableInterrupt(u32 uController, OneNAND_eINTERROR eInterrupt)
{
	u32 uEnableBit;

	uEnableBit = Inp32(&ONENAND(uController)->rIntErrMask);

	Outp32(&ONENAND(uController)->rIntErrMask, (u32)(uEnableBit | eInterrupt));

#if 0
	if(eInterrupt == eOND_INTACT)
	{
		ONENAND_EnableIOBE(uController, 1);
		Outp32(&ONENAND(uController)->rIntPinEnable, 1);
	}
#endif
}

//////////
// Function Name : ONENAND_EnableAllInterrupt
// Function Description : Interrupt Status All Enable
// Input : 	Controller - OneNand Controller Port Number 
// Version : v0.1
void ONENAND_EnableAllInterrupt(u32 uController)
{
	ONENAND_EnableIOBE(uController, 1);
	Outp32(&ONENAND(uController)->rIntErrMask, (u32)(0x3FFF));
	Outp32(&ONENAND(uController)->rIntPinEnable, 1);	
}

//////////
// Function Name : ONENAND_DisableInterrupt
// Function Description : Interrupt Status Disable
// Input : 	Controller - OneNand Controller Port Number 
//			eInterrupt - Interrupt Source
// Version : v0.1
void ONENAND_DisableInterrupt(u32 uController, OneNAND_eINTERROR eInterrupt)
{
	u32 uDisableBit;

	uDisableBit = Inp32(&ONENAND(uController)->rIntErrMask);
	
	Outp32(&ONENAND(uController)->rIntErrMask, (u32)(uDisableBit & (~eInterrupt)));

	if(eInterrupt == eOND_INTACT)
		Outp32(&ONENAND(uController)->rIntPinEnable, 0);	
}

//////////
// Function Name : ONENAND_DisableAllInterrupt
// Function Description : Interrupt Status All Disable
// Input : 	Controller - OneNand Controller Port Number 
// Version : v0.1
void ONENAND_DisableAllInterrupt(u32 uController)
{
	Outp32(&ONENAND(uController)->rIntErrMask, (u32)(0));

	Outp32(&ONENAND(uController)->rIntPinEnable, 0);
}

//////////
// Function Name : ONENAND_AckInterrupt
// Function Description : Interrupt Status Clear(Ack Interrupt)
// Input : 	Controller - OneNand Controller Port Number 
//			eInterrupt - Interrupt Source
// Version : v0.1
void ONENAND_AckInterrupt(u32 uController, OneNAND_eINTERROR eInterrupt)
{
	Outp32(&ONENAND(uController)->rIntErrAck, (u32)eInterrupt);

	//while((Inp32(&ONENAND(uController)->rIntErrStat) & eInterrupt));	// Wait Interrupt Status Clear
}

//////////
// Function Name : ONENAND_ISR
// Function Description : OneNand IRQ routine
// Input : 	None
// Version : v0.1
void __irq ONENAND_ISR(void)
{
	u32 uController;
	u32 uTemp;

	uTemp = INTC_GetVicIrqStatus(1);
	uTemp = (uTemp&(3<<11))>>11; 
	if(uTemp & 1)
	{
		INTC_Disable(NUM_ONENAND0);
		uController = 0;
	}
	else if(uTemp & 2)
	{
		INTC_Disable(NUM_ONENAND1);
		uController = 1;
	}
	else
	{
		return;
	}

	if(OneNand_ISRCallBack.ONENAND_ISR_Func)
		OneNand_ISRCallBack.ONENAND_ISR_Func(uController);	

	if(uController == 0)
	{
		INTC_Enable(NUM_ONENAND0);
	}
	else if(uController == 1)
	{
		INTC_Enable(NUM_ONENAND1);
	}	
	
	INTC_ClearVectAddr();
}


//////////
// Function Name : ONENAND_EraseBlockDirectAccess
// Function Description : Block Erase using Direct Access
// Input : 	uController - OneNand Controller Port Number 
//			uBlock - Block to erase
//Output : 	TRUE - Erase Error
//			FALSE - Erase Success
// Version : v0.1
bool ONENAND_EraseBlockDirectAccess(u32 uController, u32 uBlock)
{
	u32 uStatus;
	
	ONENAND_DirectWrite(uController, OND_STARTADDR1, (DFS(uBlock) | FBA(uBlock)));
	ONENAND_DirectWrite(uController, OND_INTSTATUS, 0);
	ONENAND_DirectWrite(uController, OND_COMMAND, OND_BLK_ERASE);

	uStatus = 0;
	while(!((uStatus&0xFFFF) & (1<<15)))
	{
		ONENAND_DirectRead(uController, OND_INTSTATUS, &uStatus);
	}

	uStatus = 0;
	ONENAND_DirectRead(uController, OND_STATUS, &uStatus);
	if((uStatus&0xFFFF) & (1<<10))
		return TRUE;
	return FALSE;
}


//////////
// Function Name : ONENAND_WritePageDirectAccess
// Function Description : Page Write using Direct Access
// Input : 	uController - OneNand Controller Port Number 
//			uBlock - Block to write
//			uPage - Page to write
//Output : 	TRUE - Erase Error
//			FALSE - Erase Success
// Version : v0.1
bool ONENAND_WritePageDirectAccess(u32 uController, u32 uBlock, u32 uPage)
{
//	u32 uStatus;

	OneNandT_oIntFlag.IntActInt = 0;
	OneNandT_oIntFlag.BlkRwCmpInt = 0;
	OneNandT_oIntFlag.PgmCmpInt = 0;
	
	ONENAND_DirectWrite(uController, OND_STARTADDR2, DBS(uBlock));
	ONENAND_DirectWrite(uController, OND_STARTADDR1, DFS(uBlock) | FBA(uBlock));
	ONENAND_DirectWrite(uController, OND_STARTADDR8, FPA(uPage) | FSA(0));
	ONENAND_DirectWrite(uController, OND_STARTBUF, BSA(0x8) | BSC(0));
	
	ONENAND_DirectWrite(uController, OND_INTSTATUS, 0);
	ONENAND_DirectWrite(uController, OND_COMMAND, OND_PG_MS_FR_BUF);
#if 0
	uStatus = 0;
	while(!((uStatus&0xFFFF) & (1<<15)))
	{
		ONENAND_DirectRead(uController, OND_INTSTATUS, &uStatus);
	}

	uStatus = 0;
	ONENAND_DirectRead(uController, OND_STATUS, &uStatus);
	if((uStatus&0xFFFF) & (1<<12))
		return TRUE;
	return FALSE;
#endif	
	while(!OneNandT_oIntFlag.IntActInt);
	
	while(!OneNandT_oIntFlag.BlkRwCmpInt);
	
	while(!OneNandT_oIntFlag.PgmCmpInt);

	return FALSE;	
}


//////////
// Function Name : ONENAND_ReadPageDirectAccess
// Function Description : Page Read using Direct Access
// Input : 	uController - OneNand Controller Port Number 
//			uBlock - Block to read
//			uPage - Page to read
//Output : 	TRUE - Erase Error
//			FALSE - Erase Success
// Version : v0.1
bool ONENAND_ReadPageDirectAccess(u32 uController, u32 uBlock, u32 uPage)
{
//	u32 uStatus;

	OneNandT_oIntFlag.IntActInt = 0;
	OneNandT_oIntFlag.BlkRwCmpInt = 0;
	OneNandT_oIntFlag.LoadCmpInt = 0;
	
	ONENAND_DirectWrite(uController, OND_STARTADDR1, DFS(uBlock) | FBA(uBlock));
	ONENAND_DirectWrite(uController, OND_STARTADDR8, FPA(uPage) | FSA(0));
	ONENAND_DirectWrite(uController, OND_STARTBUF, BSA(0x8) | BSC(0));
	ONENAND_DirectWrite(uController, OND_STARTADDR2, DBS(uBlock));
	
	ONENAND_DirectWrite(uController, OND_INTSTATUS, 0);
	ONENAND_DirectWrite(uController, OND_COMMAND, OND_LD_MS_TO_BUF);

#if 0
	uStatus = 0;
	while(!((uStatus&0xFFFF) & (1<<15)))
	{
		ONENAND_DirectRead(uController, OND_INTSTATUS, &uStatus);
	}

	uStatus = 0;
	ONENAND_DirectRead(uController, OND_STATUS, &uStatus);
	if((uStatus&0xFFFF) & (1<<13))
		return TRUE;
	return FALSE;
#endif
	while(!OneNandT_oIntFlag.IntActInt);
	
	while(!OneNandT_oIntFlag.BlkRwCmpInt);
	
	while(!OneNandT_oIntFlag.LoadCmpInt);	

	return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -