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

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

?? onenand.c

?? Samsung S3C2443 Test program source code
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*======================================================================

 Project Name : S3C2443

 Copyright 2006 by Samsung Electronics, Inc.
 All rights reserved.

 Project Description :
 This software is only for verifying functions of the S3C2443. 
 Anybody can use this code without our permission.

 File Name    : OneNAND.c
 Description  : S3C2443 OneNAND access module
 Author       : Junon Jeon
 Dept         : AP
 Created Date : 2006.06.02
 Version      : 0.0
 History
   R0.0 (2006.06.02): Junon draft
		- This code is derived from S5I3000 OneNAND driver.
		
=======================================================================*/

#include <stdio.h>
#include <string.h>

#include "2443addr.h"
#include "Option.h"
#include "OneNand.h"
#include "System.h"
#include "Console.h"
#include "PLL.h"

// Setting address of OneNAND device
//****** Setting base address by using CSn ******
#define OND_BANK				0 	// 0:nCS0 ~ 5:nCS5
#define	__OND_BASEADDR			(OND_BANK * 0x08000000)	
#define __OND_BootRAM_BASE		(__OND_BASEADDR + 0x0)
#define __OND_DataRAM0_BASE		(__OND_BASEADDR + 0x0400)
#define __OND_DataRAM1_BASE		(__OND_BASEADDR + 0x0c00)

#define __OND_BootRAM_Spare		(__OND_BASEADDR + 0x10000)
#define __OND_DataRAM0_Spare	(__OND_BASEADDR + 0x10020)
#define __OND_DataRAM1_Spare	(__OND_BASEADDR + 0x10060)

// Register address of OneNAND device
#define	rOND_MANU				(*(volatile U16 *)(__OND_BASEADDR + 0x1e000))
#define	rOND_DEV				(*(volatile U16 *)(__OND_BASEADDR + 0x1e002))
#define	rOND_VER				(*(volatile U16 *)(__OND_BASEADDR + 0x1e004))
#define	rOND_DBUFSIZE			(*(volatile U16 *)(__OND_BASEADDR + 0x1e006))
#define	rOND_BBUFSIZE			(*(volatile U16 *)(__OND_BASEADDR + 0x1e008))
#define	rOND_BUFAMOUNT			(*(volatile U16 *)(__OND_BASEADDR + 0x1e00a))
#define	rOND_TECH				(*(volatile U16 *)(__OND_BASEADDR + 0x1e00c))

#define	rOND_START_ADDR1		(*(volatile U16 *)(__OND_BASEADDR + 0x1e200))
#define	rOND_START_ADDR2		(*(volatile U16 *)(__OND_BASEADDR + 0x1e202))
#define	rOND_START_ADDR3		(*(volatile U16 *)(__OND_BASEADDR + 0x1e204))
#define	rOND_START_ADDR4		(*(volatile U16 *)(__OND_BASEADDR + 0x1e206))
#define	rOND_START_ADDR5		(*(volatile U16 *)(__OND_BASEADDR + 0x1e208))
#define	rOND_START_ADDR6		(*(volatile U16 *)(__OND_BASEADDR + 0x1e20a))
#define	rOND_START_ADDR7		(*(volatile U16 *)(__OND_BASEADDR + 0x1e20c))
#define	rOND_START_ADDR8		(*(volatile U16 *)(__OND_BASEADDR + 0x1e20e))

#define	rOND_START_BUFFER		(*(volatile U16 *)(__OND_BASEADDR + 0x1e400))
#define	rOND_COMMAND			(*(volatile U16 *)(__OND_BASEADDR + 0x1e440))
#define	rOND_SYS_CONFIG1		(*(volatile U16 *)(__OND_BASEADDR + 0x1e442))
#define	rOND_SYS_CONFIG2		(*(volatile U16 *)(__OND_BASEADDR + 0x1e444))
#define	rOND_CON_STATUS			(*(volatile U16 *)(__OND_BASEADDR + 0x1e480))
#define	rOND_INT_STATUS			(*(volatile U16 *)(__OND_BASEADDR + 0x1e482))
#define	rOND_START_BADDR		(*(volatile U16 *)(__OND_BASEADDR + 0x1e498))
#define	rOND_WPROT_STATUS		(*(volatile U16 *)(__OND_BASEADDR + 0x1e49c))

#define rOND_ECC_STATUS			(*(volatile U16 *)(__OND_BASEADDR + 0x1fe00))
#define rOND_ECC_RES_M0			(*(volatile U16 *)(__OND_BASEADDR + 0x1fe02))
#define rOND_ECC_RES_S0			(*(volatile U16 *)(__OND_BASEADDR + 0x1fe04))
#define rOND_ECC_RES_M1			(*(volatile U16 *)(__OND_BASEADDR + 0x1fe06))
#define rOND_ECC_RES_S1			(*(volatile U16 *)(__OND_BASEADDR + 0x1fe08))
#define rOND_ECC_RES_M2			(*(volatile U16 *)(__OND_BASEADDR + 0x1fe0a))
#define rOND_ECC_RES_S2			(*(volatile U16 *)(__OND_BASEADDR + 0x1fe0c))
#define rOND_ECC_RES_M3			(*(volatile U16 *)(__OND_BASEADDR + 0x1fe0e))
#define rOND_ECC_RES_S3			(*(volatile U16 *)(__OND_BASEADDR + 0x1fe10))

// Values of Command Register - CMD 
#define OND_LD_MS_TO_BUF	0x0000
#define OND_LD_SS_TO_BUF	0x0013
#define OND_PG_MS_FR_BUF	0x0080
#define OND_PG_SS_FR_BUF	0x001a
#define OND_CP_BACK_PRG		0x001b
#define OND_UNLOCK			0x0023
#define OND_LOCK			0x002a
#define OND_LOCK_TIGHT		0x002c
#define OND_ERASE_VERIFY	0x0071
#define OND_BLK_ERASE		0x0094
#define OND_MULTY_ERASE		0x0095
#define	OND_ERASE_SUS		0x00b0
#define OND_ERASE_RESUME	0x0030
#define OND_RST_CORE		0x00f0
#define OND_RST_OND			0x00f3
#define	OND_OTP_ACS			0x0065

#define	DBS(b)		((b<<5)&0x8000)		// BufferRAM of DDP (Device BufferRAM Select)
#define	DFS(b)		((b<<5)&0x8000)		// flash core of DDP (Device Flash Core Select)
#define	FBA(b)		(b&0x03ff)			// NAND Flash Block Address	
#define	FPA(p)		((p<<2)&0xfc)		// NAND Flash Page Address
#define	FSA(s)		(s&0x3)				// NAND Flash Sector Address
#define	BSA(r)		((r<<8)&0x0f00)		// BufferRAM Sector Address
#define	BSC(n)		(n&0x3)				// BufferRAM Sector Count
#define	SBA(b)		(b&0x03ff)			// Start Block Address

// Others
#define	DATABUFFERSIZE	((rOND_DBUFSIZE<<1)/(rOND_BUFAMOUNT>>8))
#define USE_DMA	0


// OneNAND interface library
void OND_HotReset( void);
U32 OND_erase_block( U16);
U32 OND_erase_multi_block_verify( U16, U16, U16);
U32 OND_page_program( U16, U16);
U32 OND_page_load( U16, U16);
void OND_lock_block( U16);
void OND_lock_tight_block( U16);
void OND_unlock_block( U16);
void OND_read( U32 *, U32, U16);
void OND_write( U32 *, U32, U16);

void OneNAND_TimingCheck(void);
void OneNAND_Burst_Read(void);

// Temporary library
void set_dma_control(U8 burst, U8 tw);
void dma_memcpy(U32 s_addr, U32 d_addr, U32 N_LLI, U32 trans_size);
void SMC_Config4OneNAND(U32 nBank);

	
void * function_OND[][2]=
{	
	(void *)OneNAND_ReadID,					"OneNAND Read ID  ",
	(void *)OneNAND_Program,				"OneNAND program  ",
	(void *)OneNAND_Read_Page,				"Read page        ",
	(void *)OneNAND_Write_Page,				"Write page       ",
	(void *)OneNAND_Erase_All,				"Erase all blocks ",
	(void *)OneNAND_Erase_Block,			"Erase block      ",
	(void *)OneNAND_Unlock_Block,			"Unlock block     ",
	(void *)OneNAND_Lock_Block,				"Lock block       ",
	(void *)OneNAND_Performance_Test,		"Performance Test ",
	(void *)OneNAND_TimingCheck,			"Timing Check     ",
	(void *)OneNAND_Burst_Read,				"Read burst(page) ",
	0,0
};

void Test_OneNAND( void)
{
	int	i;

	OND_HotReset();
	SMC_Config4OneNAND(OND_BANK);

	while(1)
	{
		i=0;
		
		while(1)
		{
			printf("%2d:%s",i,function_OND[i][1]);
			i++;
			if((int)(function_OND[i][0])==0)
			{
				printf("\n");
				break;
			}
			if((i%4)==0)
			printf("\n");
		}

		printf("\nPress Enter key to exit : ");

		i = GetIntNum();
		if( i == (-1) ) break;
		if( (i>=0) && (i<sizeof(function_OND)/8-1) )
			( (void (*)(void)) (function_OND[i][0]) )();
	}	
}


//========================= [Drivers] ============================
void OND_HotReset( void)
{
	rOND_INT_STATUS	=	0x0;
	rOND_COMMAND	=	OND_RST_OND;
	
	while ((rOND_INT_STATUS & 0x8010) != 0x8010);	
}


U32 OND_erase_block( U16 block)
{

	rOND_START_ADDR1 = DFS(block) | FBA(block);
	
	rOND_INT_STATUS = 0;
	rOND_COMMAND = OND_BLK_ERASE;

	while (!(rOND_INT_STATUS & (1<<15)));
	
	if (rOND_CON_STATUS & (1<<10)) {
		printf("Fail to erase the block %d\n", block);
		return 0x3;
	}
	
	return 0x0;
}


U32 OND_erase_multi_block_verify( U16 start_block, U16 end_block, U16 do_verify)
{
	U16	block;

	if (end_block < start_block) return 0x1;

	for (block = start_block; block <= end_block; block++)
	{
		OND_unlock_block( block);
		
		rOND_START_ADDR1 = FBA(block);

		rOND_INT_STATUS = 0;
		rOND_COMMAND = OND_MULTY_ERASE;
		
		while (!(rOND_INT_STATUS & (1<<15)));
	}

	rOND_START_ADDR1 = FBA(end_block);
	
	rOND_INT_STATUS = 0;
	rOND_COMMAND = OND_BLK_ERASE;

	while (!(rOND_INT_STATUS & (1<<15)));

	if (do_verify)
	{
		for (block = start_block; block <= end_block; block++)
		{
		
			rOND_START_ADDR1 = FBA(block);
			
			rOND_INT_STATUS = 0;
			rOND_COMMAND = OND_ERASE_VERIFY;
			
			while (!(rOND_INT_STATUS & (1<<15)));

			if (rOND_CON_STATUS & (1<<10)) 
				printf(" Fail to erase-verify the block %d\n", block);
		}
	}
	
	return 0x0;
}


U32 OND_page_program( U16 block, U16 page)
{
		
	rOND_START_ADDR2 = DBS(block);

	rOND_START_ADDR1 = DFS(block) | FBA(block);

	rOND_START_ADDR8 = FPA(page) | FSA(0);

	rOND_START_BUFFER = BSA(0x8) | BSC(0);
	
	rOND_INT_STATUS = 0;
	rOND_COMMAND = OND_PG_MS_FR_BUF;
	
	while (!(rOND_INT_STATUS & (1<<15)));
	
	if (rOND_CON_STATUS & (1<<10)) {
		printf("Fail to program the page (B: %d, P: %d)\n", block, page);
		return 0x1;
	}
	
	return 0x0;
}


U32 OND_page_load( U16 block, U16 page)
{
	
	rOND_START_ADDR1 = DFS(block) | FBA(block);

	rOND_START_ADDR8 = FPA(page) | FSA(0);

	rOND_START_BUFFER = BSA(0x8) | BSC(0);

	rOND_START_ADDR2 = DBS(block);

	rOND_INT_STATUS = 0;
	rOND_COMMAND = OND_LD_MS_TO_BUF;

	while (!(rOND_INT_STATUS & (1<<15)));

	if (rOND_CON_STATUS & (1<<10)) {
		printf("Fail to load the page (B: %d, P: %d)\n", block, page);
		return 0x1;
	}
	
	return 0x0;
}


void OND_write_protection_block( U16 cmd, U16 block)
{

	rOND_START_ADDR1 = DFS(block) | FBA(block);

	rOND_START_BADDR = SBA(block);	
	
	rOND_INT_STATUS = 0;
	rOND_COMMAND = cmd;

	while (!(rOND_INT_STATUS & (1<<15)));
}


void OND_lock_block( U16 block)
{
	OND_write_protection_block( OND_LOCK, block);
}


void OND_lock_tight_block( U16 block)
{
	OND_write_protection_block( OND_LOCK_TIGHT, block);
}


void OND_unlock_block( U16 block)
{
	OND_write_protection_block( OND_UNLOCK, block);
}


//	Read-While-Load Operation
void OND_read( U32 *Address, U32 Size, U16 block)
{
	U32	size;
	U16	page;
	U16	b_temp;
	U32	data_load;
	U32	data_read;
//	U32	st_cnt = 1;
	

	b_temp = 0xffff;
	page = 0;
	data_load = 0;
	data_read = 0;
	
	if (!Size) {
		printf("The size is zero!! Retry this operation!! \n");	
		return;
	}

	while(Size > (data_read*DATABUFFERSIZE)) {  

		if (b_temp!=0xffff) {  // check int pending
			while (!(rOND_INT_STATUS & (1<<15)));

			if (rOND_CON_STATUS & (1<<10)) {
				printf("ECC Fail.\n");
			} else
				data_load++;
		}

		if (Size > (data_load*DATABUFFERSIZE)) {  // data load

			rOND_START_ADDR1 = DFS(block) | FBA(block);

			rOND_START_ADDR8 = FPA(page) | FSA(0);

			if (data_load&1)
				rOND_START_BUFFER = BSA(0xc) | BSC(0); // DataRAM1
			else
				rOND_START_BUFFER = BSA(0x8) | BSC(0); // DataRAM0

			rOND_START_ADDR2 = DBS(block);

			rOND_INT_STATUS = 0;

			rOND_COMMAND = OND_LD_MS_TO_BUF;

		}

		if (data_load > data_read) {  // data read. 105 us @50MHz 8,16,cont.-words

			rOND_START_ADDR2 = DBS(b_temp);
		
			if ((Size-(data_read*DATABUFFERSIZE)) >= DATABUFFERSIZE) // edit by junon
				size = DATABUFFERSIZE;
			else
				size = Size-(data_read*DATABUFFERSIZE);
			
// for memory copy time check			
//if (data_load == 3)
//	StartStopwatch();
//			printf("Address = 0x%x\n", (U32)Address);

#if USE_DMA
			if (data_read&0x1) // 87 us @50MHz 8,16,cont.-words
				dma_memcpy( __OND_DataRAM1_BASE, (U32)Address, 0, size );
			else
				dma_memcpy( __OND_DataRAM0_BASE, (U32)Address, 0, size );
#else
			if (data_read&0x1) // 87 us @50MHz 8,16,cont.-words
				memcpy( Address, (U32 *)__OND_DataRAM1_BASE, size );
			else
				memcpy( Address, (U32 *)__OND_DataRAM0_BASE, size );
#endif

// for memory copy time check			
//if (data_load == 3)
//{
//	st_cnt = EndStopwatch();
//	printf("\n load cycle time : %d us", st_cnt);
//}

			Address+=(DATABUFFERSIZE>>2);
			data_read++;
		}

		b_temp = block;		
		page = (page+1)&0x3f;
		if (page==0) block++;
	}
}


//	Write-While-Program Operation, unit : page
void OND_write( U32 *Address, U32 Size, U16 block)
{
	U16	page;
	U32	data_program;
	U32	data_write;

	page = 0;
	data_program = 0;
	data_write = 0;

	if (!Size) {
		printf("The size is zero!! Retry this operation!! \n");	
		return;
	}

	while( Size >= (data_program*DATABUFFERSIZE)) { // edit by junon

		if (data_write > 0) {

			if (page==0) {
				OND_unlock_block(block);
				OND_erase_block(block);
			}

			rOND_START_ADDR1 = DFS(block) | FBA(block);
			rOND_START_ADDR8 = FPA(page) | FSA(0);

			if (data_program&1)	
				rOND_START_BUFFER = BSA(0xc) | BSC(0);
			else				
				rOND_START_BUFFER = BSA(0x8) | BSC(0);

			rOND_INT_STATUS = 0;
			rOND_COMMAND = OND_PG_MS_FR_BUF;

			page = (page+1) & 0x3f;
			if (page==0) block++;
		}
		
		// write data to DataRAM0 or 1
		if (Size >= (data_write*DATABUFFERSIZE)) {  // edit by junon
			if (data_write <= (data_program+1)) {

				rOND_START_ADDR2 = DBS(block);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本亚洲天堂网| 亚洲成人综合在线| 在线观看日产精品| 美女视频一区二区| 一区二区三区鲁丝不卡| 日韩女优视频免费观看| 色拍拍在线精品视频8848| 日本亚洲电影天堂| 亚洲视频每日更新| 久久亚洲综合av| 欧美人与z0zoxxxx视频| 成人视屏免费看| 日本aⅴ精品一区二区三区| 中文在线资源观看网站视频免费不卡| 91同城在线观看| 亚洲成在人线免费| 亚洲精品视频观看| 国产日韩精品一区| 欧美成人艳星乳罩| 日本福利一区二区| 99vv1com这只有精品| 久久99国产精品免费网站| 亚洲三级视频在线观看| 国产色产综合色产在线视频| 欧美日韩1区2区| 欧美日韩在线精品一区二区三区激情| 国产原创一区二区| 老司机午夜精品| 亚洲一区二区在线观看视频| 亚洲日本在线天堂| 国产欧美1区2区3区| 日韩免费观看高清完整版在线观看 | 亚洲精品一区二区三区四区高清| 99久久久久久| 国产99久久精品| 蜜臀av性久久久久蜜臀aⅴ流畅| 一区二区视频免费在线观看| 日本一区二区动态图| 日韩精品一区二区三区在线 | 精品国产乱码久久久久久1区2区| 91麻豆精品国产91久久久| 在线国产亚洲欧美| 欧美性生活影院| 色婷婷精品久久二区二区蜜臀av | 日本亚洲电影天堂| 奇米一区二区三区| 日韩精品一级二级| 精品一区二区在线看| 蜜桃视频在线观看一区二区| 五月综合激情婷婷六月色窝| 亚洲综合在线第一页| 樱花草国产18久久久久| 亚洲成年人网站在线观看| 亚洲在线免费播放| 免费成人小视频| 美腿丝袜在线亚洲一区 | 99久久er热在这里只有精品15| 国产精品一二三四| 成人看片黄a免费看在线| 成人av网站免费| 色哟哟亚洲精品| 在线精品亚洲一区二区不卡| 日韩一区二区三免费高清| 欧美一区二区三区成人| 久久一二三国产| 国产精品毛片久久久久久| 国产亚洲精品超碰| 亚洲自拍与偷拍| 日韩制服丝袜先锋影音| 国产在线精品一区二区不卡了| 国产精品123区| 欧美专区在线观看一区| 欧美日韩精品一区二区天天拍小说 | 国产网站一区二区三区| 国产精品久久久久久久久免费相片| 国产欧美日韩在线| 国产精品国产三级国产aⅴ中文| 亚洲精品国产无天堂网2021| 男女性色大片免费观看一区二区 | 日本欧美肥老太交大片| 亚洲综合久久av| 国产精品亚洲综合一区在线观看| 青娱乐精品在线视频| 亚洲国产欧美在线人成| 天堂一区二区在线| 香蕉乱码成人久久天堂爱免费| 精品国产91亚洲一区二区三区婷婷 | 人人超碰91尤物精品国产| 亚洲国产精品久久一线不卡| 奇米888四色在线精品| 激情综合五月天| 国产.欧美.日韩| 色天使久久综合网天天| 日韩欧美在线1卡| 久久久亚洲国产美女国产盗摄 | 高清视频一区二区| 亚洲一级电影视频| 国产一区二区中文字幕| 欧美丰满嫩嫩电影| 国产成人在线观看| 亚洲桃色在线一区| 精品国产乱码久久久久久牛牛| 国产精品久久久久精k8| 国产一区二区网址| 欧洲精品一区二区三区在线观看| 日本一区二区三区高清不卡| 亚洲大片精品永久免费| 成人涩涩免费视频| 日韩一区国产二区欧美三区| 亚洲欧洲日产国产综合网| 精品一区二区在线视频| 欧美亚洲综合色| 亚洲蜜臀av乱码久久精品| 另类小说综合欧美亚洲| 欧美日韩一区高清| 最新日韩在线视频| 国产精品99久久久久久久女警| 日韩网站在线看片你懂的| 亚洲精品国产a久久久久久| www.综合网.com| 久久久久国产精品麻豆| 久久丁香综合五月国产三级网站| 欧美视频中文字幕| 中文字幕av资源一区| 国产精品一区二区久激情瑜伽| 91精品久久久久久久91蜜桃| 偷拍与自拍一区| aaa欧美日韩| 亚洲男人的天堂一区二区| 麻豆精品视频在线观看免费| 欧美一区二区黄| 亚洲网友自拍偷拍| 91免费在线看| **欧美大码日韩| 国产一区不卡视频| 国产精品视频一二三区| 精品一区二区免费看| 欧美一级xxx| 久久精品99久久久| 91精品国产色综合久久ai换脸| 一级女性全黄久久生活片免费| av不卡在线播放| 亚洲色欲色欲www| 一本到高清视频免费精品| 成人免费一区二区三区视频| 91一区二区三区在线观看| 国产精品毛片久久久久久| 成人福利视频在线| 国产精品久久久久久久久免费桃花| 91网上在线视频| 一区二区在线看| 欧美日本精品一区二区三区| 亚洲成a天堂v人片| 日韩一级片网址| 美女一区二区三区在线观看| 欧美成人福利视频| 国产精品亚洲第一| 久久视频一区二区| 9i看片成人免费高清| 亚洲六月丁香色婷婷综合久久| 欧美久久婷婷综合色| 一区二区三区视频在线看| 欧美日韩一级二级| 亚洲一区二区影院| 在线视频综合导航| 亚洲第一av色| 欧美大片免费久久精品三p| 麻豆专区一区二区三区四区五区| 中文字幕免费在线观看视频一区| 成人小视频免费观看| 午夜欧美大尺度福利影院在线看 | 久久国产精品99久久久久久老狼| 国产喂奶挤奶一区二区三区| 99久久国产综合色|国产精品| 成人欧美一区二区三区白人 | 97se亚洲国产综合自在线| 亚洲色图在线播放| 精品国产亚洲在线| 9色porny自拍视频一区二区| 日韩高清不卡一区| 久久久久久夜精品精品免费| 国产精品1024久久| 国产又粗又猛又爽又黄91精品| 日韩精品电影一区亚洲| 亚洲成人av免费| 首页国产欧美久久| 久久av老司机精品网站导航| 天天亚洲美女在线视频| 天堂蜜桃一区二区三区| 午夜电影一区二区三区| 日本伊人色综合网| 国产老妇另类xxxxx| 99re这里只有精品首页| av电影天堂一区二区在线观看| 久久不见久久见免费视频1| 国模套图日韩精品一区二区| 久久se这里有精品| 一本色道综合亚洲| 日韩色在线观看| 一区二区三区国产精品|