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

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

?? intel28f128_16x2.c

?? umon bootloader source code, support mips cpu.
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* intel28f128_16x2.c:
 * Support for INTEL 28f128.
 * A 16-bit device in a 2-device-wide bank.
 */
#include "config.h"
#if INCLUDE_FLASH
#include "stddefs.h"
#include "genlib.h"
#include "cpu.h"
#include "flash.h"
#include "intel28f128_16x2.h"

#define SR_WAIT	100000
#define WR_WAIT	50

#define DEV_WIDTH	4

#define WSMS	0x00800080
#define WSMS_L	0x00000080
#define WSMS_H	0x00800000
#define ESS		0x00400040
#define ES		0x00200020
#define PSS		0x00040004
#define PS		0x00100010

extern struct flashinfo	Fdev;
extern int FlashProtectWindow;

/* Manufacturer and device ids... */
#define INTEL28F128J	0x00890018

#define	ftype			    volatile unsigned long

#define FWrite(to,frm)		(*(ftype *)(to) = *(ftype *)(frm))
#define Write_to(add, val)	(*(ftype *)(add) = (val))
#define Write_01_to(add)	(*(ftype *)(add) = 0x00010001)
#define Write_20_to(add)	(*(ftype *)(add) = 0x00200020)
#define Write_40_to(add)	(*(ftype *)(add) = 0x00400040)
#define Write_60_to(add)	(*(ftype *)(add) = 0x00600060)
#define Write_70_to(add)	(*(ftype *)(add) = 0x00700070)
#define Write_d0_to(add)	(*(ftype *)(add) = 0x00d000d0)

#define Write_50_to_base()	(*(ftype *)(fdev->base) = 0x00500050)
#define Write_60_to_base()	(*(ftype *)(fdev->base) = 0x00600060)
#define Write_70_to_base()	(*(ftype *)(fdev->base) = 0x00700070)
#define Write_90_to_base()	(*(ftype *)(fdev->base) = 0x00900090)
#define Write_d0_to_base()	(*(ftype *)(fdev->base) = 0x00d000d0)
#define Write_ff_to_base()	(*(ftype *)(fdev->base) = 0x00FF00FF)

#define Read_from(add)		(*(ftype *)(add))
#define Read_0000_from_base()	(*(ftype *)(fdev->base+(0x00000000<<2)))
#define Read_0001_from_base()	(*(ftype *)(fdev->base+(0x00000001<<2)))
#define Read_5555_from_base()	(*(ftype *)(fdev->base+(0x5555<<1)))

#define Is_ff(add)		(*(ftype *)(add) == 0xFFFFFFFF)
#define Is_not_ff(add)		(*(ftype *)(add) != 0xFFFFFFFF)
#define Is_Equal(p1,p2)		(*(ftype *)(p1) == *(ftype *)(p2))
#define Is_Not_Equal(p1,p2)	(*(ftype *)(p1) != *(ftype *)(p2))
#define Not32BitAligned(ptr)	((long)ptr & 3)

/* Intel28f128_16x2_erase():
 * Based on the 'snum' value, erase the appropriate sector(s).
 * Return 0 if success, else -1.
 */
int
Intel28f128_16x2_erase(struct flashinfo *fdev,int snum)
{
	int	ret, sector;
	volatile int i;

	ret = 0;

	/* Erase the request sector(s): */
	for (sector=0; sector < fdev->sectorcnt; sector++) {
		if ((!FlashProtectWindow) && (fdev->sectors[sector].protected)) {
			continue;
		}
		if ((snum == ALL_SECTORS) || (snum == sector)) {
			register ulong *lp, *lp1;
			int	noterased;

			/* See if the sector is already erased: */
			noterased = 0;
			lp = (ulong *)fdev->sectors[sector].begin; 
			lp1 = (ulong *)((char *)lp + fdev->sectors[sector].size - 1); 
			while(lp <= lp1) {
				if (*lp++ != 0xffffffff) {
					noterased = 1;
					break;
				}
			}
			if (noterased) {
				/* Issue the setup/confirm sequence: */
				Write_20_to(fdev->sectors[sector].begin);/* setup */
				Write_d0_to(fdev->sectors[sector].begin);/* confirm */

				/* Wait for sector erase to complete by polling RSR... */
				while(1) {
					ulong rsr;

					Write_70_to_base();
					rsr = Read_0000_from_base();
					if (!(rsr & WSMS_H && rsr & WSMS_L)) { /* Wait till ready */
						for (i=0; i<SR_WAIT; i++);
						continue;
					}
					if (rsr & ESS) { /* Should not be suspended */
						ret = -1;
					}
					if (rsr & ES) { /* Should not have error */
						ret = -1;
					}
					break;
				}
				Write_50_to_base();	/* Clear status register */
				Write_ff_to_base();	/* Go to read-array mode */
			}
			if (ret == -1)
				break;
		}
	}
	for (i=0; i<SR_WAIT; i++);
	return(ret);
}

/* EndIntel28f128_16x2_erase():
 * Function place holder to determine the end of the above function.
 */
void
EndIntel28f128_16x2_erase(void)
{}


/* Intel28f128_16x2_write():
 * Copy specified number of bytes from source to destination.  The destination
 * address is assumed to be flash space.
 */
int
Intel28f128_16x2_write(struct flashinfo *fdev,uchar *dest,uchar *src,
	long bytecnt)
{
	ftype			stat;
	volatile long	cnt, buf4[1];
	volatile int	i, tot, ret, delta;
	volatile uchar	*bp4;

#ifdef FLASH_TRACE
	printf("fwrite(dest=0x%lx,src=0x%lx,size=%d)\n",
		(ulong)dest,(ulong)src,bytecnt);
#endif

	/* If the destination address is not properly aligned, then build a
	 * fake source buffer using bytes below dest.  Then call this function
	 * recursively to do that operation.
	 */
	if (Not32BitAligned(dest)) {
		uchar	*tmpdest;

		delta = (long)dest & 3;
		tmpdest = dest - delta;

		bp4 = (uchar *)buf4;
		for(i=0;delta>0;i++,delta--) {
			*bp4++ = *(dest-delta);
		}
		for(;i<4;i++) {
			if (bytecnt > 0) {
				*bp4++ = *src++;
				bytecnt--;
			}
			else {
				*bp4++ = *dest;
			}
			dest++;
		}
#ifdef FLASH_TRACE
		printf("pre-align:  0x%lx = %08lx\n",(ulong)tmpdest,buf4[0]);
#endif

		if (Intel28f128_16x2_write(fdev,tmpdest,(uchar *)buf4,4) == -1)
			return(-1);
	}

#ifdef FLASH_TRACE
	printf("bc=%d\n",bytecnt);
#endif
	ret = 0;
	cnt = bytecnt & ~3;

	for (tot=0;tot<cnt;tot+=4) {
		bp4 = (uchar *)buf4;
		*bp4++ = *src++;				/* Just in case src is not aligned... */
		*bp4++ = *src++;				
		*bp4++ = *src++;				
		*bp4++ = *src++;				

#ifdef FLASH_TRACE
		printf("fwrite1:    0x%lx = %08lx\n",(ulong)dest,buf4[0]);
#endif

		Write_40_to(dest);	/* flash program setup */
		FWrite(dest, buf4); /* write value */
		do {
			Write_70_to_base();
			stat = Read_0000_from_base();
		} while ( ! (stat & WSMS_H && stat & WSMS_L) );
		Write_50_to_base(); /* Clear status register */
		Write_ff_to_base(); /* Go to read-array mode */
		if ( Is_Not_Equal(dest, buf4)) {
			ret = -1;
			break;
		}
		dest += 4; 
	}

onemore:
	for (;tot<cnt;tot+=4) {
		bp4 = (uchar *)buf4;
		*bp4++ = *src++;				/* Just in case src is not aligned... */
		*bp4++ = *src++;
		*bp4++ = *src++;
		*bp4++ = *src++;

#ifdef FLASH_TRACE
		printf("fwrite2:    0x%lx = %08lx\n",(ulong)dest,buf4[0]);
#endif
		Write_40_to(dest);	/* flash program setup */
		FWrite(dest, buf4); /* write value */
		do {
			Write_70_to_base();
			stat = Read_0000_from_base();
		} while ( ! (stat & WSMS_H && stat & WSMS_L) );
		Write_50_to_base(); /* Clear status register */
		Write_ff_to_base(); /* Go to read-array mode */
		if (Is_Not_Equal(dest,buf4)) {
			ret = -1;
			break;
		}

		dest += 4; 
	}

	/* If cnt != bytecnt then bytecnt is not mod4, so one more write must be
	 * be done.  To do this, we must combine the source data with data that
	 * is already in the flash above the intended final address...
	 */
	if (cnt != bytecnt) {
		bp4 = (uchar *)buf4;
		for(delta=0;cnt != bytecnt;delta++,cnt++)
			*bp4++ = *src++;
		for(;delta != 4;delta++)
			*bp4++ = *(dest+delta);
		src = (uchar *)buf4;

		tot = cnt-1;
		goto onemore;
	}
	return(ret);
}

/* EndIntel28f128_16x2_write():
 * Function place holder to determine the end of the above function.
 */
void
EndIntel28f128_16x2_write(void)
{}

/* Intel28f128_16x2_ewrite():
 * Erase all sectors that are part of the address space to be written,
 * then write the data to that address space.  This is basically a
 * concatenation of the above erase & write done in one step.  This is
 * necessary primarily for re-writing the bootcode; because after the boot
 * code is erased, there is nowhere to return so the re-write must be done
 * while executing out of ram also.  It is only needed in systems that are
 * executing the monitor out of the same device that is being updated.
 */
int
Intel28f128_16x2_ewrite(struct flashinfo *fdev,uchar *destA,uchar *srcA,
	long bytecnt)
{
	int	    sector, efail, i;
	void	(*reset)();
	uchar	*src1;
	ftype	val;
	uchar   *src, *dest;
	ulong   rsr;

ewrite_again:
	efail = 0;
	src = srcA;
	dest = destA;
	Write_50_to_base(); /* clear status register */
	Write_ff_to_base(); /* set device in read-array mode */

	/* For each sector, if it overlaps any of the destination space */
	/* then erase that sector. */
	for (sector = 0; sector < fdev->sectorcnt; sector++) {
		if ((((uchar *)dest) > (fdev->sectors[sector].end)) ||
		    (((uchar *)dest+bytecnt-1) < (fdev->sectors[sector].begin))) {
			continue;
		}

		/* Issue the ERASE setup/confirm sequence: */
		Write_20_to(fdev->sectors[sector].begin);/* setup */
		Write_d0_to(fdev->sectors[sector].begin);/* confirm */

		/* Wait for sector erase to complete by polling RSR... */
		while(1) {
			ulong rsr;

			Write_70_to_base();
			rsr = Read_0000_from_base();
			if (!(rsr & WSMS_H && rsr & WSMS_L)) { /* Wait till ready */
				for (i=0; i<SR_WAIT; i++);
				continue;
			}

			if (rsr & (ESS|ES))	/* Failure if suspension or error. */
				efail = 1;

			break;
		}
		Write_50_to_base();		/* Clear status register */
		Write_ff_to_base();		/* Go to read-array mode */

		if (efail)				/* If erase failed, return -1 */
			return(-1);
	}


	src1 = (uchar *)&val;

	for(i = 0; i < bytecnt; i += DEV_WIDTH) {

		/* Just in case src is not aligned... */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
岛国精品一区二区| 中文字幕一区av| 亚洲欧洲精品成人久久奇米网| 亚洲免费在线观看视频| 韩国三级中文字幕hd久久精品| 一本大道久久a久久精品综合| 精品少妇一区二区三区在线播放 | 亚洲不卡在线观看| 国产一区二区在线观看视频| 欧美日韩高清一区二区| 国产精品色在线| 精品一区二区久久| 欧美精选一区二区| 亚洲九九爱视频| 成人ar影院免费观看视频| 精品剧情v国产在线观看在线| 亚洲国产wwwccc36天堂| 91免费观看视频| 中文字幕在线不卡视频| 国产精品夜夜嗨| 久久综合网色—综合色88| 男人操女人的视频在线观看欧美| 欧美日韩另类一区| 亚洲一二三四久久| 在线视频你懂得一区二区三区| 中文字幕亚洲成人| av亚洲精华国产精华| 国产精品欧美极品| 高清不卡一区二区在线| 国产日韩三级在线| 粉嫩蜜臀av国产精品网站| 国产丝袜欧美中文另类| 国产不卡视频一区| 中文一区二区在线观看| 国产精品一区免费视频| 日本一区二区在线不卡| 成人国产视频在线观看| 亚洲图片你懂的| 91豆麻精品91久久久久久| 亚洲国产精品久久久久秋霞影院 | 亚洲无线码一区二区三区| 日本大香伊一区二区三区| 亚洲色图视频网| 欧美亚洲丝袜传媒另类| 日韩黄色一级片| 精品女同一区二区| 国产69精品久久久久777| 国产精品久99| 欧美午夜寂寞影院| 亚洲成人av一区| 亚洲精品一区二区三区福利| 国产99久久久国产精品潘金网站| 亚洲色图一区二区| 欧美日本一道本在线视频| 久草中文综合在线| 欧美韩日一区二区三区| 在线精品视频一区二区三四| 日韩中文字幕亚洲一区二区va在线| 欧美一区二区三区免费大片| 国产精品538一区二区在线| 亚洲精品欧美在线| 日韩视频中午一区| 成人免费视频视频| 亚洲18色成人| 国产色综合一区| 欧美日韩在线电影| 国产精品99久久久久久久女警 | 国产亚洲视频系列| 色丁香久综合在线久综合在线观看| 亚洲成人激情av| 中文乱码免费一区二区| 欧美男男青年gay1069videost| 国产馆精品极品| 天天综合色天天综合| 国产精品久久久久天堂| 91精品国产一区二区三区| 99re这里只有精品6| 蜜臀精品久久久久久蜜臀 | 91蝌蚪porny| 久久99久久精品| 一区二区三区不卡视频 | 国产.欧美.日韩| 午夜精品爽啪视频| 亚洲婷婷综合久久一本伊一区| 在线视频观看一区| 国产高清在线观看免费不卡| 日韩av网站在线观看| 一区二区三区在线高清| 欧美激情综合网| 日韩精品一区二区三区四区视频| 色婷婷精品久久二区二区蜜臂av | 中文字幕一区二区三| 欧美va亚洲va在线观看蝴蝶网| 色av成人天堂桃色av| 波多野洁衣一区| 国产一区日韩二区欧美三区| 日韩一区欧美二区| 亚洲福利一二三区| 亚洲影视在线播放| 最新国产精品久久精品| 久久蜜臀精品av| 精品噜噜噜噜久久久久久久久试看| 欧美喷水一区二区| 欧美体内she精视频| 91丨porny丨在线| 成a人片亚洲日本久久| 成人黄动漫网站免费app| 国产成人综合自拍| 福利电影一区二区| 成人一道本在线| 成人动漫一区二区在线| 成人av集中营| av午夜精品一区二区三区| 成人高清视频免费观看| 97久久超碰国产精品电影| 99热这里都是精品| av资源站一区| 91天堂素人约啪| 一本到一区二区三区| 在线精品视频一区二区| 欧美日韩一卡二卡三卡| 制服丝袜激情欧洲亚洲| 欧美一级欧美三级在线观看 | 国产精品素人一区二区| 久久久美女毛片| 中文字幕欧美日本乱码一线二线| 欧美国产精品久久| 日韩毛片一二三区| 亚洲大片在线观看| 久久国产欧美日韩精品| 国产精品69久久久久水密桃| 波多野结衣中文字幕一区| 91高清视频免费看| 91精品国产丝袜白色高跟鞋| 久久久亚洲精品一区二区三区 | 视频一区在线视频| 韩国三级电影一区二区| www.久久精品| 欧洲日韩一区二区三区| 日韩精品一区二区三区四区| 欧美经典一区二区| 亚洲一区二区在线观看视频 | fc2成人免费人成在线观看播放| 91网站在线播放| 欧美精品久久久久久久久老牛影院| 日韩网站在线看片你懂的| 欧美国产精品专区| 性欧美疯狂xxxxbbbb| 国产福利不卡视频| 91国偷自产一区二区开放时间| 欧美一区二区三区免费在线看| 久久精品水蜜桃av综合天堂| 亚洲天堂福利av| 免播放器亚洲一区| 丁香天五香天堂综合| 在线不卡中文字幕播放| 中文在线资源观看网站视频免费不卡| 亚洲综合视频网| 国产91露脸合集magnet| 欧美精品丝袜中出| 中文字幕在线不卡| 久久不见久久见中文字幕免费| 91在线视频播放| 欧美成人aa大片| 亚洲图片欧美色图| 不卡的电视剧免费网站有什么| 91精品久久久久久久99蜜桃| 亚洲少妇中出一区| 国产成人啪免费观看软件| 欧美精品丝袜中出| 一区二区三区欧美激情| 成熟亚洲日本毛茸茸凸凹| 欧美一级日韩不卡播放免费| 亚洲精品你懂的| caoporm超碰国产精品| 久久午夜国产精品| 九九国产精品视频| 91精品国产乱| 天天综合色天天| 欧美最猛性xxxxx直播| 国产精品九色蝌蚪自拍| 国产高清在线精品| 久久婷婷久久一区二区三区| 日韩av中文字幕一区二区| 欧美三级视频在线| 亚洲综合一二区| 欧美亚洲综合另类| 亚洲综合一区在线| 欧美伊人久久大香线蕉综合69| 国产精品剧情在线亚洲| 国产福利一区在线| 国产午夜精品在线观看| 国产精品中文字幕日韩精品| 26uuu精品一区二区| 精品一区精品二区高清| 精品久久久久久无| 国产麻豆日韩欧美久久| 国产视频一区二区在线观看| 国产91丝袜在线播放0| 国产精品午夜免费|