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

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

?? flash.c

?? 可移到ucos上的文件系統(tǒng)
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* flashcom.c:
 *	This file contains the portions of the flash code that are device
 *	independent.  Refer to the appropriate device sub-directory for the
 *	code that is specific to the flash device on the target.
 *
 *	General notice:
 *	This code is part of a boot-monitor package developed as a generic base
 *	platform for embedded system designs.  As such, it is likely to be
 *	distributed to various projects beyond the control of the original
 *	author.  Please notify the author of any enhancements made or bugs found
 *	so that all may benefit from the changes.  In addition, notification back
 *	to the author will allow the new user to pick up changes that may have
 *	been made by other users after this version of the code was distributed.
 *
 *	Author:	Ed Sutter
 *	email:	esutter@lucent.com		(home: lesutter@worldnet.att.net)
 *	phone:	908-582-2351			(home: 908-889-5161)
 */
#include "config.h"

#if INCLUDE_FLASH
#include "cpu.h"
#include "flashdev.h"
#include "flash.h"
#include "genlib.h"
#include "ctype.h"

#define printf mprintf	//m

typedef unsigned char uchar;
typedef unsigned long ulong;

extern struct flashdesc FlashNamId[];

int		FlashCurrentBank;
int		sectortoaddr(int,int *,uchar **);

extern	int FlashInit(void);

#define	SRANGE_ERROR	-1
#define	SRANGE_SINGLE	1
#define	SRANGE_RANGE	2
#define	SRANGE_ALL		3
	
/* FlashProtectWindow:
 *	Must be set to allow any flash operation to be done on space assumed
 *	to be software protected.
 */
int FlashProtectWindow;

/* FlashBank[]:
 *	This table contains all of the information that is needed to keep the
 *	flash code somewhat generic across multiple flash devices.
 */
extern struct	flashinfo FlashBank[FLASHBANKS];

#ifdef DISABLE_INTERRUPTS_DURING_FLASHOPS
#define FLASH_INTSOFF()				intsoff()
#define FLASH_INTSRESTORE(ival)		intsrestore(ival)
#else
#define FLASH_INTSOFF()				0
#define FLASH_INTSRESTORE(ival)
#endif

/* showflashtype():
 *	Find a match between the incoming id and an entry in the FlashNamId[]
 *	table.  The FlashNamId[] table is part of the device-specific code.
 */
int
showflashtype(ulong id)
{
	struct flashdesc *fdp;

	fdp = FlashNamId;
	while(fdp->desc) {
		if (id == fdp->id) {
			printf("Device = %s\n",fdp->desc);
			return(0);
		}
		fdp++;
	}
	printf("Flash id 0x%lx not recognized\n",id);
	return(-1);
}

int
showflashinfo(struct flashinfo *fdev)
{
	int	i;

	if (showflashtype(fdev->id) < 0)
		return(-1);

	printf("  Base addr   : 0x%08lx\n",(ulong)(fdev->base));
	printf("  Sectors     : %d\n",fdev->sectorcnt);
	printf("  Bank width  : %d\n",fdev->width);
	printf("  Sector     Begin       End        Size     SW-Protected?\n");
	for(i=0;i<fdev->sectorcnt;i++) {
		printf("    %2d    0x%08lx  0x%08lx  0x%06lx      %s\n",
		    fdev->sectors[i].snum,
			(ulong)(fdev->sectors[i].begin),
			(ulong)(fdev->sectors[i].end),
		    fdev->sectors[i].size,
		    fdev->sectors[i].protected ? "yes" : " no");
	}
	return(0);
}

/* flashopload():
 *	Copy flash operation to ram space.  
 *	Note that this function assumes that cache is disabled at this point.
 *	This is important because we are copying text into bss space and if
 *	cache was on, there could be a coherency problem.
 */
int
flashopload(ulong *begin,ulong *end,ulong *copy,int size)
{
	volatile ulong	*bp;
	int	ret;

	/* Verify space availability: */
	if (((int)end - (int)begin) >= size) {
		printf("flashopload overflow ((0x%lx-0x%lx) > 0x%x)\n",
			(ulong)end,(ulong)begin,size);
		return(-1);
	}

	ret = 0;
	/* Copy function() to RAM, then verify: */
	bp = begin;
	while(bp <= end) {
		*copy = *bp;
		if (*copy++ != *bp++) {
			printf("flashopload failed\n");
			ret = -1;
			break;
		}
	}

	return(ret);
}

/* flashtype():
 *	Use the device-specific function pointer to call the routine
 *	relocated to RAM space.
 */
int
flashtype(fdev)
struct flashinfo *fdev;
{
	return(fdev->fltype(fdev));
}

/* flasherase():
 *	Use the device-specific function pointer to call the routine
 *	relocated to RAM space.
 *	Note that flasherase() is called with a sector number.  The sector
 *	number is relative to the entire system, not just the particular device.
 *	This means that if there is more than one flash device in the system that
 *	the actual sector number (relative to the device) may not be the same
 *	value.  This adjustment is made here so that the underlying code that is
 *	pumped into ram for execution does not have to be aware of this.
 */
int
flasherase(fdev,snum)
struct	flashinfo *fdev;
int	snum;
{
	int	size;
	unsigned char *base, *end;

	if (fdev->id == FLASHRAM) {
		if (snum == ALL_SECTORS) {
			size = fdev->end - fdev->base;
			base = fdev->base;
		}
		else {
			sectortoaddr(snum,&size,&base);
		}
		end = base+size;
		while(base < end) {
			*base = 0xff;
			if (*base++ != 0xff)
				return(-1);
		}
		return(0);
	}

	if ((snum != ALL_SECTORS) && (fdev->sectors[0].snum != 0)) {
/*		printf("Adjusting snum from %d to",snum); */
		snum -= fdev->sectors[0].snum;
/*		printf(" %d.\n",snum); */
	}
	return(fdev->flerase(fdev,snum));
}

/* flashwrite():
 *	Use the device-specific function pointer to call the routine
 *	relocated to RAM space.
 *	First make a few checks on the request, then write to flash if all
 *	checks succeed.
 */
int
flashwrite(struct flashinfo *fdev,uchar *dest,uchar *src,long bytecnt)
{
	int	j, lowsector, highsector;
	register uchar	*dp, *sp, *edp;

	if (fdev->id == FLASHRAM) {
		uchar *sp, *dp, *end;
		sp = src;
		dp = dest;
		end = dp+bytecnt;
		while(dp < end) {
			*dp = *sp;
			if (*dp != *sp)
				return(-1);
			dp++; sp++;
		}
		return(0);
	}

	dp = dest;
	sp = src;
	edp = (dest + bytecnt) - 1;

	/* If outside the devices space, return failed.. */
	if ((edp < fdev->sectors[0].begin) ||
	    (dp > fdev->sectors[fdev->sectorcnt-1].end)) {
		printf("flashwrite() failed: dest out of flash range\n");
		return(-1);
	}

	/* Make sure the destination is not within a protected sector */
	if (FlashProtectWindow == FLASH_PROTECT_WINDOW_CLOSED) {

		/* First determine the sectors that overlap with the
		 * flash space to be written...
		 */

		lowsector = highsector = -1;
		for(j=0;j<fdev->sectorcnt;j++) {
			if ((dp >= fdev->sectors[j].begin) &&
			    (dp <= fdev->sectors[j].end))
				lowsector = j;
		}
		for(j=0;j<fdev->sectorcnt;j++) {
			if ((edp >= fdev->sectors[j].begin) &&
			    (edp <= fdev->sectors[j].end))
				highsector = j;
		}
		if ((lowsector == -1) || (highsector == -1)) {
			printf("flashwrite() failed: can't find sector\n");
			return(-1);
		}

		/* Now that the range of affected sectors is known,
		 * verify that those sectors are not protected...
		 */
		for(j=lowsector;j<=highsector;j++) {
			if (fdev->sectors[j].protected) {
				printf("flashwrite() failed: sector protected\n");
				return(-1);
			}
		}
	}

	/* Now make sure that there is no attempt to transition a bit
	 * in the affected range from 0 to 1...  A flash write can only
	 * bring bits low (erase brings them  high).
	 */
	while(dp < edp) {
		if ((*dp & *sp) != *sp) {
			printf("flashwrite() failed: bit 0->1 rqst denied.\n");
			return(-1);
		}
		dp++; 
		sp++;
	}
	return(fdev->flwrite(fdev,dest,src,bytecnt));
}

/* flashewrite():
 *	Use the device-specific function pointer to call the routine
 *	relocated to RAM space.
 */
int
flashewrite(struct flashinfo *fdev,uchar *dest,uchar *src,long bytecnt)
{
	int	i;

	/* Source and destination addresses must be long-aligned. */
	if (((int)src & 3) || ((int)dest & 3))
		return(-1);

	/* If the protection window is closed, then verify that no protected
	 * sectors will be written over...
	 */
	if (FlashProtectWindow == FLASH_PROTECT_WINDOW_CLOSED) {
		for (i=0;i<fdev->sectorcnt;i++) {
			if((((uchar *)dest) > (fdev->sectors[i].end)) ||
			    (((uchar *)dest+bytecnt) < (fdev->sectors[i].begin)))
				continue;
			else
				if (fdev->sectors[i].protected)
					return(-1);
		}
	}
	return(fdev->flewrite(fdev,dest,src,bytecnt));
}

/* addrtosector():
 *	Incoming address is translated to sector number, size of sector
 *	and base of sector.
 *	Return 0 if successful; else -1.
 */
int
addrtosector(uchar *addr,int *sector,int *size,uchar **base)
{
	struct flashinfo *fbnk;
	struct	sectorinfo *sinfo;
	int		dev, sec, i;

	sec = 0;
	for(dev=0;dev<FLASHBANKS;dev++) {
		fbnk = &FlashBank[dev];
		for(i=0;i<fbnk->sectorcnt;i++,sec++) {
			sinfo = &fbnk->sectors[i];
			if ((addr >= sinfo->begin) && (addr <= sinfo->end)) {
				if (sector) {
					*sector = sec;
				}
				if (base) {
					*base = sinfo->begin;
				}
				if (size) {
					*size = sinfo->size;
				}
				return(0);
			}
		}
	}
	printf("addrtosector(0x%lx) failed\n",(ulong)addr);
	return(-1);
}

/* addrtobank():
 *	From the incoming address, return a pointer to the flash bank that
 *	this address is within.
 */
struct flashinfo *
addrtobank(uchar *addr)
{
	struct flashinfo *fbnk;
	int		dev;

	for(dev=0;dev<FLASHBANKS;dev++) {
		fbnk = &FlashBank[dev];
		if ((addr >= fbnk->base) && (addr <= fbnk->end))
			return(fbnk);
	}
	printf("addrtobank(0x%lx) failed\n",(ulong)addr);
	return(0);
}

int
sectortoaddr(int sector,int *size,uchar **base)
{
	struct flashinfo *fbnk;
	struct	sectorinfo *sinfo;
	int		dev, sec, i;

	sec = 0;
	for(dev=0;dev<FLASHBANKS;dev++) {
		fbnk = &FlashBank[dev];
		for(i=0;i<fbnk->sectorcnt;i++,sec++) {
			if (sec == sector) {
				sinfo = &fbnk->sectors[i];
				if (base) *base = sinfo->begin;
				if (size) *size = sinfo->size;
				return(0);
			}
		}
	}
	printf("sectortoaddr(%d) failed\n",sector);
	return(-1);
}

/* flashbankinfo():
 *	Based on the incoming bank number, return the beginning, end and
 *	number of sectors within that bank.
 */
int
flashbankinfo(int bank,uchar **begin,uchar **end,int *sectorcnt)
{
	struct flashinfo *fbnk;

	if (bank >= FLASHBANKS)
		return(-1);

	fbnk = &FlashBank[bank];
	if (begin)
		*begin = fbnk->base;
	if (end)
		*end = fbnk->end;
	if (sectorcnt)
		*sectorcnt = fbnk->sectorcnt;
	return(0);
}

/* lastlargesector():
 *	Incoming bank number is used to populate the sector information
 *	(sector number, sector size and address) of the last large sector
 *	in the specified bank.
 *	Return 0 if successful; else -1.
 */
int
lastlargesector(int bank,int *sector,int *size,uchar **base)
{
	struct flashinfo	*fbnk;
	struct sectorinfo	*sinfo;
	uchar				*largest_sbase;
	int					i, largest_ssize, largest_snum;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美极品另类videosde| 麻豆精品精品国产自在97香蕉| 日韩视频一区二区三区在线播放| 色综合中文字幕| 国产91富婆露脸刺激对白| 狠狠色伊人亚洲综合成人| 欧美aaa在线| 另类专区欧美蜜桃臀第一页| 日韩精品三区四区| 日本vs亚洲vs韩国一区三区| 日韩国产精品大片| 久久国产精品无码网站| 激情六月婷婷久久| 成人国产精品视频| 99久久精品久久久久久清纯| 91丨porny丨中文| 欧美午夜精品一区二区三区| 欧美性猛片xxxx免费看久爱| 欧美一区二区三区的| 欧美一区二区三区影视| 日本一区二区三区国色天香| 国产精品无圣光一区二区| 中文字幕在线观看不卡视频| 中文字幕第一区第二区| 一区二区三区在线视频观看58 | av在线播放成人| 91国产免费看| 日韩一区二区三区视频| 久久亚洲免费视频| 亚洲天堂2016| 开心九九激情九九欧美日韩精美视频电影| 国产一区二区影院| 色综合久久久久久久| 7878成人国产在线观看| 久久久久久久综合日本| 亚洲码国产岛国毛片在线| 青青国产91久久久久久| 高清免费成人av| 91精品国产欧美一区二区成人| 国产视频911| 五月婷婷欧美视频| 国产99久久久久久免费看农村| 色香色香欲天天天影视综合网| 91精品国产综合久久久久久漫画| 久久久国产精华| 亚洲一区二区高清| 国产成人精品亚洲日本在线桃色| 欧美私人免费视频| 国产午夜精品一区二区三区嫩草 | 欧美精品一区二区三区在线播放| 国产精品久久久久久亚洲毛片| 日产国产高清一区二区三区| 91在线视频18| 国产网红主播福利一区二区| 无吗不卡中文字幕| 色婷婷综合久色| 亚洲精品在线网站| 天天综合天天做天天综合| 99精品黄色片免费大全| 国产色综合一区| 国产综合一区二区| 日韩欧美一区二区在线视频| 亚洲一本大道在线| 日本高清成人免费播放| 中文字幕中文字幕中文字幕亚洲无线| 精品一二三四在线| 在线电影一区二区三区| 亚洲午夜私人影院| 一本色道久久综合精品竹菊| 国产精品国产三级国产有无不卡 | 欧美色男人天堂| 日韩美女视频19| 波多野结衣中文一区| 精品国产凹凸成av人导航| 日韩国产精品久久| 欧美一区三区二区| 奇米精品一区二区三区在线观看| 91精选在线观看| 天天av天天翘天天综合网 | 婷婷中文字幕综合| 欧美视频在线播放| 一个色在线综合| 在线亚洲一区二区| 亚洲午夜日本在线观看| 色天使久久综合网天天| 亚洲欧美日韩成人高清在线一区| 成人av午夜影院| 亚洲视频一区二区免费在线观看| 92国产精品观看| 亚洲成人激情自拍| 欧美一区二区三区日韩视频| 久久精工是国产品牌吗| 国产午夜精品久久久久久免费视 | 成人免费看黄yyy456| 国产精品色哟哟| 99国产欧美久久久精品| 亚洲最大成人综合| 91精品国产综合久久久久久久久久 | 中文字幕欧美三区| 99精品视频在线观看| 亚洲最新视频在线观看| 日韩欧美电影一二三| 国产成人aaa| 樱桃视频在线观看一区| 欧美一级淫片007| 大胆欧美人体老妇| 亚洲美女在线一区| 日韩一区二区三区在线视频| 成人性生交大片免费看中文| 曰韩精品一区二区| 日韩欧美国产不卡| jvid福利写真一区二区三区| 亚洲精品国产a久久久久久| 欧美一区二区久久| 成人国产精品视频| 美女免费视频一区二区| 国产精品精品国产色婷婷| 欧美一区二区三区白人| av不卡免费在线观看| 日本91福利区| 一区二区三区四区在线播放| 精品国产凹凸成av人网站| 91麻豆国产福利在线观看| 麻豆精品精品国产自在97香蕉| 亚洲三级在线看| 久久婷婷久久一区二区三区| 在线观看亚洲成人| 粉嫩av亚洲一区二区图片| 天堂成人免费av电影一区| 国产精品美女久久久久久久久| 欧美一级生活片| 欧美三级欧美一级| 99久久亚洲一区二区三区青草 | 精品理论电影在线观看 | 免费观看成人鲁鲁鲁鲁鲁视频| 国产精品另类一区| 久久综合九色综合97_久久久| 欧美日韩精品一二三区| 成人网男人的天堂| 精品一区二区三区久久久| 日本欧美加勒比视频| 亚洲夂夂婷婷色拍ww47| 国产精品国产馆在线真实露脸| 精品国产乱码久久久久久闺蜜| 欧美日韩在线电影| 欧美午夜电影一区| 色噜噜狠狠色综合中国| 91在线国产福利| 不卡高清视频专区| 99re视频这里只有精品| 成人免费电影视频| 成人午夜av电影| 91在线porny国产在线看| 99v久久综合狠狠综合久久| 高清在线观看日韩| 99精品久久免费看蜜臀剧情介绍| 成人永久aaa| 不卡视频一二三四| 国产美女精品一区二区三区| 国产一区二区中文字幕| 精品系列免费在线观看| 国产成人在线观看免费网站| 国产综合久久久久久久久久久久| 亚洲成人黄色小说| 日本v片在线高清不卡在线观看| 青青草视频一区| 激情综合色播五月| 国产一区二区剧情av在线| 国产aⅴ综合色| 91蝌蚪porny九色| 欧美日韩国产在线观看| 91精品中文字幕一区二区三区| 日韩一区二区免费高清| 久久久国产精品午夜一区ai换脸| 国产亚洲一区二区三区四区| 中文字幕一区二区三区不卡 | 一区二区三区四区高清精品免费观看| 亚洲欧洲美洲综合色网| 一区二区三区四区在线免费观看| 视频一区在线播放| 国产一区二区精品久久91| 成人18视频日本| 欧美亚一区二区| 久久先锋影音av| 亚洲少妇最新在线视频| 午夜精品一区在线观看| 另类的小说在线视频另类成人小视频在线| 裸体一区二区三区| 风流少妇一区二区| 欧美三级中文字幕在线观看| 9191久久久久久久久久久| 久久久久久久久久电影| 亚洲精品国久久99热| 日韩中文字幕区一区有砖一区| 日本视频免费一区| 99久久婷婷国产综合精品电影| 91精品国产色综合久久ai换脸| 中文字幕不卡一区| 日本不卡一二三| 日本乱码高清不卡字幕|