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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? flash.c

?? 基于LPC2478硬件平臺的IAP和遠程WEB應(yīng)用。 系統(tǒng)共分為三個部分
?? C
字號:
/****************************************Copyright (c)****************************************************
**                         				ZhangZhou KENENG electronics Co.,LTD.                               
**                                     
**
**
**--------------File Info---------------------------------------------------------------------------------
** File name:			flash.c
** Last modified Date:  2009-03-11
** Last Version:		1.0
** Descriptions:		提供操作片外NOR FLASH的接口,當(dāng)前主要用到初始化函數(shù)
			同時提供其他操作,以備將來BOOTLOADER功能擴展需要。
**		此驅(qū)動專針對SST39VF1601芯片,它是1Mx16寬的芯片。
**		(此驅(qū)動在之前的bootloader代碼中完成,但是沒考慮軟件環(huán)境,
**    現(xiàn)在將其移植到uc/os-II的操作系統(tǒng)中,需要考慮uc/os-II操作系統(tǒng)
**		運行環(huán)境的一些因素,因此做了一些調(diào)整。大體框架不變)
**--------------------------------------------------------------------------------------------------------
** Created by:			heshusheng
** Created date:		2009-03-11
** Version:				1.0
** Descriptions:		The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
*********************************************************************************************************/
//#include "flash.h"
#include		"config.h"
#include		"flash.h"


/********************************************************************************************************
**存儲flash信息;
*********************************************************************************************************/
static flash_info_type flash_info;

/********************************************************************************************************
* 轉(zhuǎn)換地址。將要發(fā)送給SST39VF1601的地址值進行轉(zhuǎn)換,以便于LPC2210輸出。
* 由于SST39VF1601的A0是與LPC2470的A1相連,所以addr要左移1位。
*********************************************************************************************************/
#define  GetAddr(addr)	(volatile uint16  *)(flash_info.base_addr|(addr<<1))

/********************************************************************************************************
*將16位的前后兩個字節(jié)進行顛倒處理
*
*********************************************************************************************************/
#define SWAP_16(x) ((uint16)( \
		(((uint16)(x) & (uint16)0x00ffU) << 8) | \
		(((uint16)(x) & (uint16)0xff00U) >> 8) ))

/********************************************************************************************************
*定義最大地址
*
*********************************************************************************************************/
#define MAX_ADDR()	(flash_info.base_addr + flash_info.size)

/*********************************************************************************************************
* 名    稱:WordProgram()
* 功    能:半字(16位)數(shù)據(jù)編程。
* 入口參數(shù):Addr		編程地址(SST39VF1601內(nèi)部地址)	
*           Data		編程數(shù)據(jù)
* 出口參數(shù):返回TRUE表示操作成功,返回FALSE表示操作失敗
**********************************************************************************************************/
uint8  WordProgram(uint32 iAddr, uint16 iData) 
{  
	 volatile uint16  *ipTmp;
	 uint16  itemp1,itemp2;

	OS_ENTER_CRITICAL( );
	ipTmp = GetAddr(0x5555);	                                        /* 轉(zhuǎn)換地址0x5555                */
	ipTmp[0] = 0xaaaa;			                                        /* 第一個周期,地址0x5555,數(shù)據(jù)0xAA*/
	ipTmp = GetAddr(0x2aaa);
	ipTmp[0] = 0x5555;			                                        /* 第二個周期,地址0x2aaa,數(shù)據(jù)0x55*/
	ipTmp = GetAddr(0x5555);
	ipTmp[0] = 0xa0a0;			                                        /* 第三個周期,地址0x5555,數(shù)據(jù)0xA0*/

	ipTmp = (volatile uint16 *)iAddr;
	*ipTmp = iData;				                                        /* 第四個周期,地址Addr,數(shù)據(jù)Data  */
	OS_EXIT_CRITICAL( );
   
   /*
    *  等待操作完成 (若編程操作沒有完成,每次讀操作DQ6會跳變)
    */
	while (1) 
	{ 
	  itemp1 = *ipTmp;			
	  itemp2 = *ipTmp;
	  if (itemp1 == itemp2) 
	  {  
		 itemp1 = *ipTmp;			
		 itemp2 = *ipTmp;
	      if (itemp1 != iData) 
	          return(FALSE);
			return(TRUE);
		}
	}
}

/*********************************************************************************************************
* 名    稱:flash_erase_sector
* 功    能:擦除指定的扇區(qū) 4Kbyte
* 入口參數(shù):Addr		編程地址
*           no		扇區(qū)數(shù)目
* 出口參數(shù):返回TRUE表示操作成功,返回FALSE表示操作失敗
**********************************************************************************************************/
int flash_erase_sector(long addr, int no)
{
	volatile uint16  *ipTmp;
	uint16  itemp1,itemp2;
	int i;

	for (i = 0; i < no; i++)
	{
		if (addr <= MAX_ADDR())
		{
			OS_ENTER_CRITICAL( );
			ipTmp = GetAddr(0x5555);
			ipTmp[0] = 0xaaaa;
			ipTmp = GetAddr(0x2aaa);
			ipTmp[0] = 0x5555;	
			ipTmp = GetAddr(0x5555);
			ipTmp[0] = 0x8080;	
			ipTmp = GetAddr(0x5555);
			ipTmp[0] = 0xaaaa;
			ipTmp = GetAddr(0x2aaa);
			ipTmp[0] = 0x5555;
			ipTmp = (volatile uint16 *)addr;
	    	*ipTmp = 0x3030;
			OS_EXIT_CRITICAL( );
			/*
		    *  等待操作完成 (若編程操作沒有完成,每次讀操作DQ6會跳變)
		    */
			while (1) 
			{ 
				itemp1 = *ipTmp;			
				itemp2 = *ipTmp;
				if (itemp1 == itemp2) 
					if (itemp1 != 0xffff) 
						return 0;
					else
						break;
			}		
			addr += flash_info.sector_size;
		}
		else
			return 1;
	}
	return 1;
}

/*********************************************************************************************************
* 名    稱:flash_erase_block
* 功    能:擦除指定的塊64Kbyte
* 入口參數(shù):Addr		編程地址
*           no		塊數(shù)目
* 出口參數(shù):返回TRUE表示操作成功,返回FALSE表示操作失敗
**********************************************************************************************************/
int flash_erase_block(long addr, int no)
{
	volatile uint16  *ipTmp;
	uint16  itemp1,itemp2;
	int i;
	for (i = 0; i < no; i++)
	{
		if (addr <= MAX_ADDR())
		{
			OS_ENTER_CRITICAL( );
			ipTmp = GetAddr(0x5555);
			ipTmp[0] = 0xaaaa;
			ipTmp = GetAddr(0x2aaa);
			ipTmp[0] = 0x5555;	
			ipTmp = GetAddr(0x5555);
			ipTmp[0] = 0x8080;	
			ipTmp = GetAddr(0x5555);
			ipTmp[0] = 0xaaaa;
			ipTmp = GetAddr(0x2aaa);
			ipTmp[0] = 0x5555;
			ipTmp = (volatile uint16 *)addr;
	    	*ipTmp = 0x5050;
			OS_EXIT_CRITICAL( );
			/*
		    *  等待操作完成 (若編程操作沒有完成,每次讀操作DQ6會跳變)
		    */
			while (1) 
			{ 
				itemp1 = *ipTmp;			
				itemp2 = *ipTmp;
				if (itemp1 == itemp2) 
					if (itemp1 != 0xffff) 
						return 0;
					else
						break;
			}		
			addr += flash_info.block_size;
		}
		else
			return 1;
	}
	return 1;
}

/*********************************************************************************************************
* 名    稱:flash_erase_chip()
* 功    能:提供接口供給外部調(diào)用,擦除全片數(shù)據(jù)
* 入口參數(shù):
* 出口參數(shù):返回TRUE表示操作成功,返回FALSE表示操作失敗
**********************************************************************************************************/
int flash_erase_chip( void )
{
	volatile uint16  *ipTmp;
	uint16  itemp1,itemp2;

	OS_ENTER_CRITICAL( );
	ipTmp = GetAddr(0x5555);
	ipTmp[0] = 0xaaaa;			                                        /* 第一個周期,地址0x5555,數(shù)據(jù)0xAA*/
	ipTmp = GetAddr(0x2aaa);
	ipTmp[0] = 0x5555;			                                        /* 第二個周期,地址0x2aaa,數(shù)據(jù)0x55*/
	ipTmp = GetAddr(0x5555);
	ipTmp[0] = 0x8080;			                                        /* 第三個周期,地址0x5555,數(shù)據(jù)0x80*/
	ipTmp = GetAddr(0x5555);
	ipTmp[0] = 0xaaaa;			                                        /* 第四個周期,地址0x5555,數(shù)據(jù)0xAA*/
	ipTmp = GetAddr(0x2aaa);
	ipTmp[0] = 0x5555;			                                        /* 第五個周期,地址0x2aaa,數(shù)據(jù)0x55*/
	ipTmp = GetAddr(0x5555);
	ipTmp[0] = 0x1010;			                                        /* 第六個周期,地址0x5555,數(shù)據(jù)0x10*/
	OS_EXIT_CRITICAL( );

	/* 
	*  等待操作完成 (若擦除操作沒有完成,每次讀操作DQ6會跳變) 
	*/
	while (1)				
	{  
	  itemp1 = *ipTmp;
	  itemp2 = *ipTmp;
	  if (itemp1 == itemp2)
	  {  
	      if (itemp1 != 0xffff)
	          return(FALSE);
	      return(TRUE);
	  }
	}
}

/*********************************************************************************************************
* 名    稱:flash_write()
* 功    能:提供接口供給外部調(diào)用,按字節(jié)進行編程。
* 入口參數(shù):src		寫入的數(shù)據(jù)緩存
*		 addr : 寫入的地址,使用0x81******開頭的地址		
*           cnt	:寫入的數(shù)據(jù)長度
* 出口參數(shù):返回TRUE表示操作成功,返回FALSE表示操作失敗
**********************************************************************************************************/
int flash_write(char *src,long addr,long cnt)
{
	long cp, wp;
	uint16 data;
	int count, i, l, rc, port_width;

	if ( (addr + cnt) > MAX_ADDR())
		return FALSE;

	wp = (addr & ~1);
	port_width = 2;

	/*處理非16位對齊的起始地址*/
	if ((l = addr - wp) != 0) {
		data = 0;
		for (i = 0, cp = wp; i < l; ++i, ++cp) {
			data = (data << 8) | (*(char *) cp);
		}
		for (; i < port_width && cnt > 0; ++i) {
			data = (data << 8) | *src++;
			--cnt;
			++cp;
		}
		for (; cnt == 0 && i < port_width; ++i, ++cp) {
			data = (data << 8) | (*(char *) cp);
		}

		if ((rc = WordProgram( wp, SWAP_16 (data))) == 0) {
			return (rc);
		}
		wp += port_width;
	}

	/*處理對齊后的數(shù)據(jù)部分*/
	count = 0;
	while (cnt >= port_width) {
		data = 0;
		for (i = 0; i < port_width; ++i) {
			data = (data << 8) | *src++;
		}
		if ((rc = WordProgram( wp, SWAP_16 (data))) == 0) {
			return (rc);
		}
		wp += port_width;
		cnt -= port_width;
		if (count++ > 0x800) {
			count = 0;
		}
	}

	if (cnt == 0) {
		return (1);
	}

	/*處理非16位對齊的結(jié)尾地址*/
	data = 0;
	for (i = 0, cp = wp; i < port_width && cnt > 0; ++i, ++cp) {
		data = (data << 8) | *src++;
		--cnt;
	}
	for (; i < port_width; ++i, ++cp) {
		data = (data << 8) | (*(char *) cp);
	}

	return (WordProgram ( wp, SWAP_16 (data)));
}

/*********************************************************************************************************
* 名    稱:flash_get_id()
* 功    能:獲取flash id.用于判斷當(dāng)前EMC外接的NOR FLASH的類型
* 入口參數(shù):無
* 出口參數(shù):16位flash id.
**********************************************************************************************************/
static uint16 flash_get_id( void )
{
	volatile uint16  *ipTmp;
	uint16  itemp;

	//enter cfi read mode.
	OS_ENTER_CRITICAL( );
	ipTmp = GetAddr(0x5555);	                                        /* 轉(zhuǎn)換地址0x5555                */
	ipTmp[0] = 0xaaaa;			                                        /* 第一個周期,地址0x5555,數(shù)據(jù)0xAA*/
	ipTmp = GetAddr(0x2aaa);
	ipTmp[0] = 0x5555;			                                        /* 第二個周期,地址0x2aaa,數(shù)據(jù)0x55*/
	ipTmp = GetAddr(0x5555);
	ipTmp[0] = 0x9898;			                                        /* 第三個周期,地址0x5555,數(shù)據(jù)0x98*/
	OS_EXIT_CRITICAL( );

	//SST flash
	ipTmp = GetAddr(0x0000);
	itemp = *ipTmp;
	if ( itemp != 0xbf)
		return FALSE;

	//read id.
	ipTmp = GetAddr(0x0001);
	itemp = *ipTmp;
	
	//exit cfi read mode.
	OS_ENTER_CRITICAL( );
	ipTmp = GetAddr(0x5555);	                                        /* 轉(zhuǎn)換地址0x5555                */
	ipTmp[0] = 0xaaaa;			                                        /* 第一個周期,地址0x5555,數(shù)據(jù)0xAA*/
	ipTmp = GetAddr(0x2aaa);
	ipTmp[0] = 0x5555;			                                        /* 第二個周期,地址0x2aaa,數(shù)據(jù)0x55*/
	ipTmp = GetAddr(0x5555);
	ipTmp[0] = 0xf0f0;			                                        /* 第三個周期,地址0x5555,數(shù)據(jù)0xf0*/
	OS_EXIT_CRITICAL( );
	
	return itemp;
	
}
/*********************************************************************************************************
* 名    稱:flash_init()
* 功    能:提供接口供給外部調(diào)用,NORFLASH 初始化函數(shù)
* 入口參數(shù):無
* 出口參數(shù):無
**********************************************************************************************************/
void flash_init( void )
{
	uint16 id;
	
	//硬件初始化
	PINSEL6 = 0x55555555;
	PINSEL8 = 0x55555555;
	PINSEL9 |= 0x40050155;

	EMCControl = 0x01;
	EMCStaticConfig1 = 0x00000081;
	EMCStaticWaitRd1 = 0x04;
	EMCStaticWaitOen1 = 0x01;

	EMCStaticWaitWen1 = 0x00;
	EMCStaticWaitWr1 = 0x02;

	//讀取flash物理設(shè)備的ID。
	flash_info.base_addr = 0x81000000;
	id = flash_get_id( );
	switch(id)
	{
		//39vf1601
		case 0x234b:
			flash_info.size = 0x200000;
			flash_info.sector_size = 0x1000;
			flash_info.block_size = 0x10000;
			break;
		//add other types of flash.
		default:
			break;
	}
}
/*--------------------------------------------------------------------------------------------------------------------------------
**		END OF FILE
----------------------------------------------------------------------------------------------------------------------------------*/

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品成人a在线观看| 一区二区成人在线视频| 91在线码无精品| 五月激情丁香一区二区三区| 日本一区二区不卡视频| 3atv在线一区二区三区| 97se狠狠狠综合亚洲狠狠| 午夜视频在线观看一区| 国产亚洲成aⅴ人片在线观看| 色综合久久久久综合99| 国产成人综合在线| 六月丁香综合在线视频| 亚洲18色成人| 一色桃子久久精品亚洲| 精品乱人伦小说| 精品视频全国免费看| 成人美女视频在线观看18| 日日欢夜夜爽一区| 亚洲三级电影网站| 久久久久国产一区二区三区四区| 欧美精选一区二区| 91丨porny丨在线| 国产精品99久久久久久久vr | 久久久av毛片精品| 6080日韩午夜伦伦午夜伦| 色偷偷成人一区二区三区91| 国产黄色精品网站| 久久精品国产99国产精品| 亚洲国产精品一区二区www在线 | 99在线精品视频| 国产精品综合一区二区| 激情综合五月天| 免费在线观看一区二区三区| 亚洲电影你懂得| 亚洲一区二区在线观看视频| 亚洲激情五月婷婷| 亚洲在线视频免费观看| 一区二区在线看| 一区二区三区四区蜜桃 | 亚洲aⅴ怡春院| 午夜精品一区二区三区免费视频 | 国产精品99久久久久| 久久91精品久久久久久秒播| 美腿丝袜亚洲一区| 精品无人码麻豆乱码1区2区 | 色婷婷国产精品久久包臀| 国产ts人妖一区二区| 成人性视频免费网站| 国产精品羞羞答答xxdd| 国产成人精品免费在线| 成人综合在线视频| 成人午夜视频在线| 成人黄动漫网站免费app| 成人自拍视频在线| 99久久精品免费看国产| 色综合色狠狠天天综合色| 99久久婷婷国产综合精品| 91丨porny丨户外露出| 欧美最猛黑人xxxxx猛交| 欧美亚洲国产怡红院影院| 欧美午夜一区二区三区免费大片| 欧美日韩免费视频| 日韩免费成人网| 国产日韩av一区| 亚洲欧美日韩成人高清在线一区| 亚洲另类春色校园小说| 亚洲va天堂va国产va久| 日本不卡高清视频| 成人妖精视频yjsp地址| 91色porny蝌蚪| 欧美日韩免费高清一区色橹橹 | 欧美一区二区三区婷婷月色| 久久久久亚洲综合| 一区二区三区久久| 激情亚洲综合在线| 91性感美女视频| 日韩一二三区视频| 国产精品视频一区二区三区不卡| 亚洲国产中文字幕| 国产成人精品1024| 欧美色图片你懂的| 日韩久久久精品| 亚洲欧美一区二区三区国产精品| 日韩高清不卡一区| 99久久精品久久久久久清纯| 日韩一区二区精品葵司在线| 国产精品九色蝌蚪自拍| 男女激情视频一区| 91免费看视频| 26uuu色噜噜精品一区二区| 亚洲色图视频网站| 美女脱光内衣内裤视频久久影院| 99精品视频在线免费观看| 精品三级在线看| 亚洲一二三区视频在线观看| 韩国精品在线观看| 欧美日产国产精品| 亚洲天天做日日做天天谢日日欢| 久久国产尿小便嘘嘘| 欧美性极品少妇| 国产精品二三区| 国产一区二区按摩在线观看| 欧美日韩亚洲综合一区二区三区 | 日本欧美大码aⅴ在线播放| gogo大胆日本视频一区| www成人在线观看| 午夜精品久久久久久久久久久 | 国产乱子伦一区二区三区国色天香| 色香色香欲天天天影视综合网| 久久精品一区蜜桃臀影院| 日韩av网站免费在线| 欧美网站一区二区| 亚洲欧美国产高清| 99久久免费视频.com| 久久久www成人免费无遮挡大片| 日av在线不卡| 宅男在线国产精品| 婷婷国产在线综合| 欧美在线一区二区三区| 中文字幕亚洲在| 成人自拍视频在线观看| 久久久久国产免费免费| 韩日精品视频一区| 欧美精品一区二区三区四区| 久久超碰97中文字幕| 日韩欧美黄色影院| 蜜桃视频一区二区三区在线观看| 欧美人与禽zozo性伦| 午夜精品123| 7777精品伊人久久久大香线蕉完整版| 一级中文字幕一区二区| 91久久香蕉国产日韩欧美9色| 中文字幕中文字幕一区二区| 懂色av中文字幕一区二区三区| 国产亚洲一区二区三区四区| 国内精品视频666| 久久久国产午夜精品| 国产在线一区观看| 国产喷白浆一区二区三区| 成人性生交大片免费| 亚洲欧美综合在线精品| 91视频免费看| 亚洲自拍偷拍麻豆| 欧美猛男gaygay网站| 天堂一区二区在线| 日韩一区二区在线播放| 麻豆国产欧美一区二区三区| 亚洲精品在线网站| 国产成人无遮挡在线视频| 国产欧美日韩激情| 97精品久久久久中文字幕| 亚洲一区免费观看| 欧美一级专区免费大片| 国产麻豆视频精品| 亚洲视频在线观看三级| 欧美少妇一区二区| 天天综合日日夜夜精品| 欧美一区二区三区免费| 激情综合亚洲精品| 亚洲视频电影在线| 欧美日韩一卡二卡| 久久疯狂做爰流白浆xx| 亚洲国产精品高清| 欧洲一区在线观看| 麻豆极品一区二区三区| 国产精品激情偷乱一区二区∴| 在线欧美日韩国产| 久久99久久久久| 国产精品久久久久久妇女6080| 在线中文字幕一区| 精品写真视频在线观看| 亚洲欧美偷拍三级| 日韩欧美国产三级| 91蜜桃视频在线| 老司机午夜精品| 亚洲乱码中文字幕| 日韩精品综合一本久道在线视频| 北条麻妃国产九九精品视频| 天天做天天摸天天爽国产一区 | 亚洲视频精选在线| 日韩三级.com| 色综合久久99| 精品一区二区国语对白| 亚洲一区二区在线观看视频 | 日韩欧美国产午夜精品| 91麻豆蜜桃一区二区三区| 麻豆视频一区二区| 亚洲免费观看高清| 精品国产成人系列| 欧美三日本三级三级在线播放| 国产精品一区二区无线| 性做久久久久久免费观看欧美| 国产精品三级av| 欧美大度的电影原声| 欧美在线一二三| 成人影视亚洲图片在线| 日本伊人色综合网| 一区二区三区四区在线播放| 欧美韩国一区二区| 日韩三级视频中文字幕|