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

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

?? flash.c

?? AXD下 S3C2440 nor flash program nand flash
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*********************************************************************************************
* File:	flash.c
* Author:	Embest	
* Desc:	source code  of flash 
* History:	
*			Y.J.Guo, Programming modify, April 12, 2005
*********************************************************************************************/
#include "flash.h"


#define OS_CRITICAL_METHOD	0
#define OS_CPU_SR			unsigned int
#define OS_ENTER_CRITICAL()
#define OS_EXIT_CRITICAL()


/*------------------------------------------------------------------------------------------*/
/*	 								static global variables                                 */
/*------------------------------------------------------------------------------------------*/
static unsigned short id_man, id_dev, id_ade;  // Flash ID
//static unsigned int falsh_base_address = 0x0;
//const unsigned int chip_base_addr = 0x0;               
const  unsigned int buffer_len = 32*1024;
static unsigned char sector_buf[buffer_len];


extern void usWait(unsigned long us );
/*********************************************************************************************
* name:		Flash_Delay
* func:		flash delay
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
static void Flash_Delay(void)
{
	volatile unsigned int i;
	
	// delay about 70 us
	//for(i=0; i<231; i++);
	//for(i=0; i<21; i++);		// R.X.Huang 2005-04-28 modified for EduKit II 2410
	for(i=0; i<200; i++);       //A.M.Xiao   2007-10-25 modified 
	
}


/*********************************************************************************************
* name:		FlashID_AM29LV160DB
* func:		about flash ID
* para:		unsigned int base_addr  --  base_addr of flash AM29LV160DB
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
static void FlashID_AM29LV160DB(unsigned int base_addr)
{
    #if OS_CRITICAL_METHOD == 3
        OS_CPU_SR  cpu_sr;
    #endif
	base_addr &= ~AM29LV160DB_FLASH_MASK;

	
	// enter read man_ID mode
	*(volatile unsigned short *)(base_addr + (0x555<<1)) = 0xAA;
	//*(volatile unsigned short *)(base_addr + (0x200554)) = 0xAA;
	*(volatile unsigned short *)(base_addr + (0x2AA<<1)) = 0x55;
	*(volatile unsigned short *)(base_addr + (0x555<<1)) = 0x90;
	//*(volatile unsigned short *)(base_addr + (0x200554)) = 0x90;
	
	// read man_ID 
	id_man = *(volatile unsigned short *)(base_addr);
	
	// enter read dev_ID mode
	//*(volatile unsigned short *)(base_addr + (0x200554)) = 0xAA;
	*(volatile unsigned short *)(base_addr + (0x555<<1)) = 0xAA;
	*(volatile unsigned short *)(base_addr + (0x2AA<<1)) = 0x55;
	//*(volatile unsigned short *)(base_addr + (0x200554)) = 0x90;
	*(volatile unsigned short *)(base_addr + (0x555<<1)) = 0x90;
	
	// read dev_ID 
	id_dev = *(volatile unsigned short *)(base_addr + (0x1<<1));
	id_ade = AM29LV160DB_ADE_ID;

}

/*********************************************************************************************
* name:		FlashEraseSector_AM29LV160DB
* func:		erase flash sector
* para:		unsigned int base_addr  --  base_addr of flash  AM29LV160DB
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
static void FlashEraseSector_AM29LV160DB(unsigned int base_addr)
{
    #if OS_CRITICAL_METHOD == 3
        OS_CPU_SR  cpu_sr;
    #endif
	unsigned int i, sector_addr;

 	sector_addr = (base_addr & AM29LV160DB_FLASH_MASK);
	sector_addr >>= 1;
	sector_addr <<= 1;
	base_addr &= ~AM29LV160DB_FLASH_MASK;

	OS_ENTER_CRITICAL();
	
	// enter erase sector mode 
	
    	
	*(volatile unsigned short *)(base_addr + (0x555<<1)) = 0xAA;
	*(volatile unsigned short *)(base_addr + (0x2AA<<1)) = 0x55;
	*(volatile unsigned short *)(base_addr + (0x555<<1)) = 0x80;
	*(volatile unsigned short *)(base_addr + (0x555<<1)) = 0xAA;
	*(volatile unsigned short *)(base_addr + (0x2AA<<1)) = 0x55;
	*(volatile unsigned short *)(base_addr + (sector_addr)) = 0x30;
	
	
	/*
	
	*(volatile unsigned short *)(base_addr + (0x200554)) = 0xAA;
	*(volatile unsigned short *)(base_addr + (0x2AA)) = 0x55;
	*(volatile unsigned short *)(base_addr + (0x200554)) = 0x80;
	*(volatile unsigned short *)(base_addr + (0x200554)) = 0xAA;
	*(volatile unsigned short *)(base_addr + (0x2AA)) = 0x55;
	*(volatile unsigned short *)(base_addr + (sector_addr)) = 0x30;
	
	*/
	
	// delay about 700 ms
	 usWait(1000000); 
	//for(i=0; i<10000; i++)
		//Flash_Delay();
	OS_EXIT_CRITICAL();
}

/*********************************************************************************************
* name:		FlashProgram_AM29LV160DB
* func:		program  flash
* para:		unsigned int base_addr      --  base_addr of flash AM29LV160DB
*           unsigned short *data_addr   --  address of data to be programmed
*           unsigned int bytes          --  bytes of data to be programmed 
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
static void FlashProgram_AM29LV160DB(unsigned int base_addr, unsigned short *data_addr, unsigned int bytes)
{
    #if OS_CRITICAL_METHOD == 3
        OS_CPU_SR  cpu_sr;
    #endif
	unsigned int i, word_addr;

 	word_addr = (base_addr & AM29LV160DB_FLASH_MASK);
	base_addr &= ~AM29LV160DB_FLASH_MASK;

	if(bytes % 2)
		bytes += 1;
	bytes >>= 1;

	// enter programe mode 
	for(i=0; i<bytes; i++)
	{
		OS_ENTER_CRITICAL();
		
		
		*(volatile unsigned short *)(base_addr + (0x555<<1)) = 0xAA;
		*(volatile unsigned short *)(base_addr + (0x2AA<<1)) = 0x55;
		*(volatile unsigned short *)(base_addr + (0x555<<1)) = 0xA0;		
		*(volatile unsigned short *)(base_addr + (word_addr)) = data_addr[i];
		
		
		/*
		
		*(volatile unsigned short *)(base_addr + (0x200554)) = 0xAA;
		*(volatile unsigned short *)(base_addr + (0x2AA)) = 0x55;
		*(volatile unsigned short *)(base_addr + (0x200554)) = 0xA0;		
		*(volatile unsigned short *)(base_addr + (word_addr)) = data_addr[i];
		
		*/
		// delay 50 us 
		Flash_Delay();
		word_addr += sizeof(unsigned short);
		OS_EXIT_CRITICAL();
	}
}


/*********************************************************************************************
* name:		FlashSectorSize_AM29LV160DB
* func:		get flash sector size of AM29LV160DB
* para:		unsigned int base_addr      --  base_addr of flash AM29LV160DB
* ret:		sector size of AM29LV160DB(unsigned int)
* modify:
* comment:		
*********************************************************************************************/
static unsigned int FlashSectorSize_AM29LV160DB(unsigned int base_addr)
{
	unsigned int sector_addr = (base_addr & AM29LV160DB_FLASH_MASK);

	if(sector_addr >= 0x00 && sector_addr < 0x4000)
		return (16*1024);
	else if(sector_addr >= 0x4000 && sector_addr < 0x6000)
		return (8*1024);
	else if(sector_addr >= 0x6000 && sector_addr < 0x8000)
		return (8*1024);
	else if(sector_addr >= 0x8000 && sector_addr < 0x10000)
		return (32*1024);
	else if(sector_addr >= 0x10000 && sector_addr < 0x200000)
		return (64*1024);
	else
		return 0;
}


/*********************************************************************************************
* name:		FlashID
* func:		read  flash id success or not
* para:		unsigned int base_addr      --  base_addr of flash
* ret:		1: read success;  0: read fail
* modify:
* comment:		
*********************************************************************************************/
int FlashID(unsigned int base_addr)
{
	
	
	uart_printf("now start to check norflash ID......\r\n");
	
	// read AT49BV1614A flash ID 
	FlashID_AT49BV1614A(base_addr);

	if(	id_man == AT49BV1614A_MAN_ID &&
		id_dev == AT49BV1614A_DEV_ID &&
		id_ade == AT49BV1614A_ADE_ID )
	{
	    uart_printf("check norflash ID sucessful......\r\n");
		return 1;
	}

	// read AM29LV160B/DB flash ID 
	FlashID_AM29LV160DB(base_addr);
	if(	id_man == AM29LV160DB_MAN_ID &&
		id_dev == AM29LV160DB_DEV_ID &&
		id_ade == AM29LV160DB_ADE_ID )
	{
		uart_printf("check norflash ID sucessful!\r\n");
		return 1;
	}
    
    uart_printf("check norflash ID failed,try again......\r\n");
	return 0;
}


/*********************************************************************************************
* name:		FlashEraseSector
* func:		erase  flash sectors
* para:		unsigned int base_addr      --  base_addr of flash
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void FlashEraseSector(unsigned int base_addr)
{
	// AT49BV1614A 
	if(	id_man == AT49BV1614A_MAN_ID &&
		id_dev == AT49BV1614A_DEV_ID &&
		id_ade == AT49BV1614A_ADE_ID )
	{
		FlashEraseSector_AT49BV1614A(base_addr);
	}

	// AM29LV160B/DB 
	else if(id_man == AM29LV160DB_MAN_ID &&
		id_dev == AM29LV160DB_DEV_ID &&
		id_ade == AM29LV160DB_ADE_ID )
	{
		FlashEraseSector_AM29LV160DB(base_addr);
	}
}


/*********************************************************************************************
* name:		FlashProgram
* func:		program  flash
* para:		unsigned int base_addr      --  base_addr of flash
*           unsigned short *data_addr   --  address of data to be programmed
*           unsigned int bytes          --  bytes of data to be programmed 
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void FlashProgram(unsigned int base_addr, unsigned short *data_addr, unsigned int bytes)
{
	// AT49BV1614A 
	if(	id_man == AT49BV1614A_MAN_ID &&
		id_dev == AT49BV1614A_DEV_ID &&
		id_ade == AT49BV1614A_ADE_ID )
	{
		FlashProgram_AT49BV1614A(base_addr, data_addr, bytes);
	}

	// AM29LV160B/DB 
	else if(id_man == AM29LV160DB_MAN_ID &&
		id_dev == AM29LV160DB_DEV_ID &&
		id_ade == AM29LV160DB_ADE_ID )
	{
		FlashProgram_AM29LV160DB(base_addr, data_addr, bytes);
	}
}


/*********************************************************************************************
* name:		FlashSectorSize
* func:		get  size of flash's sector
* para:		unsigned int base_addr      --  base_addr of flash
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
unsigned int FlashSectorSize(unsigned int base_addr)
{
	unsigned int size = 0;
	
	// AT49BV1614A 
	if(	id_man == AT49BV1614A_MAN_ID &&
		id_dev == AT49BV1614A_DEV_ID &&
		id_ade == AT49BV1614A_ADE_ID )
	{
		size = FlashSectorSize_AT49BV1614A(base_addr);
	}

	// AM29LV160B/DB 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91天堂素人约啪| 91丨porny丨中文| 天天综合色天天| 亚洲一区二区三区在线播放| 综合av第一页| 国产精品高潮呻吟久久| 日本一区二区三区视频视频| 久久久久久一级片| 久久精子c满五个校花| 久久综合视频网| 久久精品视频一区二区| 久久色中文字幕| 久久久久久久久免费| 精品sm捆绑视频| 国产日韩欧美在线一区| 久久久av毛片精品| 国产精品美女久久久久久久| 国产精品成人免费精品自在线观看| 国产日韩影视精品| 中文字幕在线免费不卡| 亚洲色图.com| 天天操天天综合网| 日本女人一区二区三区| 日韩高清国产一区在线| 久久se精品一区精品二区| 久久99精品久久久久久| 国产成人在线视频网站| av一区二区不卡| 欧美视频一区二区三区四区| 日韩一区二区三区免费观看| 2020国产精品| 亚洲人成7777| 日日噜噜夜夜狠狠视频欧美人| 九九在线精品视频| 成人午夜免费av| 欧美影院午夜播放| 日韩欧美自拍偷拍| 日本一区二区成人| 亚洲成a人v欧美综合天堂下载| 免费欧美在线视频| 成人av在线网站| 欧美福利一区二区| 国产亲近乱来精品视频| 亚洲自拍偷拍网站| 韩国中文字幕2020精品| 成人97人人超碰人人99| 欧美精品视频www在线观看| 精品国产凹凸成av人网站| 中文字幕一区二区三区不卡在线| 亚洲国产成人porn| 国产福利不卡视频| 欧美日韩一区二区欧美激情 | 国产精品久久久久aaaa樱花| 一区二区三区小说| 狠狠色狠狠色综合日日91app| 91片黄在线观看| 日韩欧美中文字幕一区| 1000精品久久久久久久久| 男人的j进女人的j一区| 99久久国产综合精品女不卡| 日韩视频免费观看高清完整版在线观看| 国产欧美日韩激情| 日韩av电影免费观看高清完整版在线观看 | 亚洲人快播电影网| 美女视频免费一区| 欧美中文字幕一区| 国产欧美一区二区精品性色| 亚洲不卡av一区二区三区| 国产a区久久久| 欧美成人猛片aaaaaaa| 一区二区三区鲁丝不卡| 国产成人精品一区二区三区四区| 欧美日韩一区久久| 国产精品久久久久影视| 麻豆精品一区二区| 欧美日韩综合不卡| 亚洲欧洲无码一区二区三区| 国产一区二区三区免费在线观看| 欧美猛男gaygay网站| 自拍偷在线精品自拍偷无码专区| 国产精品一区二区x88av| 欧美精品乱码久久久久久| 亚洲人妖av一区二区| 国产aⅴ综合色| 久久久国产综合精品女国产盗摄| 日本不卡一区二区| 欧美亚洲自拍偷拍| 亚洲欧美日韩国产一区二区三区| 国产伦精品一区二区三区视频青涩| 欧美精品乱码久久久久久| 夜夜爽夜夜爽精品视频| 99综合影院在线| 中文乱码免费一区二区| 国产成人综合在线| 久久精品一区二区三区不卡牛牛 | 久久66热re国产| 3d成人h动漫网站入口| 亚洲妇熟xx妇色黄| 在线观看不卡一区| 亚洲视频一区二区在线观看| 成人动漫一区二区| 国产精品拍天天在线| 国产成人鲁色资源国产91色综| 久久久久国产精品人| 韩国毛片一区二区三区| 久久亚洲私人国产精品va媚药| 亚洲综合无码一区二区| 国产欧美日韩综合精品一区二区| 精品一区二区av| 日韩精品一区国产麻豆| 久久99国产精品免费网站| 欧美电视剧免费观看| 久久国产成人午夜av影院| 日韩一区二区三| 久久99精品国产.久久久久| 日韩一区国产二区欧美三区| 蜜桃av一区二区三区| 日韩精品最新网址| 国产精品一二一区| 国产欧美日韩中文久久| 波波电影院一区二区三区| 国产精品欧美久久久久一区二区| 99视频超级精品| 自拍偷拍国产亚洲| 欧美体内she精高潮| 日韩精品亚洲一区| 精品久久久久久久久久久久久久久 | 亚洲人吸女人奶水| 欧美日韩一级片在线观看| 日本不卡高清视频| 国产日本欧洲亚洲| 91论坛在线播放| 婷婷国产v国产偷v亚洲高清| 日韩欧美专区在线| 不卡高清视频专区| 亚洲综合图片区| 精品乱码亚洲一区二区不卡| 成人免费毛片app| 亚洲已满18点击进入久久| 欧美一区二区三区在线观看视频| 国内成人精品2018免费看| 亚洲欧洲三级电影| 欧美二区三区的天堂| 国产精品一级二级三级| 亚洲一区欧美一区| 欧美一区二区三区在| 国产不卡在线一区| 亚洲高清三级视频| 国产午夜精品一区二区三区嫩草| 色综合久久88色综合天天6| 奇米精品一区二区三区在线观看| 国产人成一区二区三区影院| 欧美午夜片在线观看| 国产精品一区二区在线播放| 樱花草国产18久久久久| 26uuuu精品一区二区| 色噜噜久久综合| 韩国女主播成人在线| 夜夜嗨av一区二区三区中文字幕 | 色噜噜久久综合| 精品一区中文字幕| 亚洲狠狠丁香婷婷综合久久久| 日韩欧美精品三级| 成人福利在线看| 美女一区二区三区在线观看| 中文字幕在线观看一区二区| 欧美一区二区视频在线观看2020 | 一区二区三区成人| 麻豆91精品视频| 精品欧美乱码久久久久久| 一级做a爱片久久| 久久成人久久爱| 国产一区二区三区免费看| 国产成人av一区二区三区在线观看| 欧美在线免费播放| 国产精品久久久久7777按摩| 国产麻豆精品95视频| 国产精品久久久久9999吃药| 亚洲国产精品一区二区www| 国产精选一区二区三区| 91精品国产一区二区人妖| 亚洲乱码精品一二三四区日韩在线 | 国产成人在线视频网址| 色香蕉久久蜜桃| 国产日韩在线不卡| 麻豆专区一区二区三区四区五区| 成人精品在线视频观看| 欧美视频在线一区二区三区 | 亚洲成人久久影院| 国产一区二区精品久久| 69堂亚洲精品首页| 亚洲国产视频一区二区| www.av亚洲| 国产精品丝袜91| 国产乱码精品一区二区三区忘忧草 | 欧美片网站yy| 日韩理论在线观看| 99久久99久久精品国产片果冻| 精品对白一区国产伦| 波多野结衣欧美|