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

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

?? flash.c

?? uboot for at91rm9200dk
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * (C) Copyright 2001 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */#include <common.h>#include <mpc8xx.h>#if defined(CFG_ENV_IS_IN_FLASH)# ifndef  CFG_ENV_ADDR#  define CFG_ENV_ADDR	(CFG_FLASH_BASE + CFG_ENV_OFFSET)# endif# ifndef  CFG_ENV_SIZE#  define CFG_ENV_SIZE	CFG_ENV_SECT_SIZE# endif# ifndef  CFG_ENV_SECT_SIZE#  define CFG_ENV_SECT_SIZE  CFG_ENV_SIZE# endif#endif/*---------------------------------------------------------------------*/#undef DEBUG_FLASH#ifdef DEBUG_FLASH#define DEBUGF(fmt,args...) printf(fmt ,##args)#else#define DEBUGF(fmt,args...)#endif/*---------------------------------------------------------------------*/flash_info_t	flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips	*//*----------------------------------------------------------------------- * Functions */static ulong flash_get_size (vu_long *addr, flash_info_t *info);static int write_data (flash_info_t *info, ulong dest, ulong data);static void flash_get_offsets (ulong base, flash_info_t *info);/*----------------------------------------------------------------------- * * The PCU E uses an address map where flash banks are aligned top * down, so that the "first" flash bank ends at top of memory, and * the monitor entry point is at address (0xFFF00100). The second * flash bank is mapped immediately below bank 0. * * This is NOT in conformance to the "official" memory map! * */#define PCU_MONITOR_BASE   ( (flash_info[0].start[0] + flash_info[0].size - 1) \			   - (0xFFFFFFFF - CFG_MONITOR_BASE) )/*----------------------------------------------------------------------- */unsigned long flash_init (void){	volatile immap_t     *immap  = (immap_t *)CFG_IMMR;	volatile memctl8xx_t *memctl = &immap->im_memctl;	unsigned long base, size_b0, size_b1;	int i;	/* Init: no FLASHes known */	for (i=0; i<CFG_MAX_FLASH_BANKS; ++i) {		flash_info[i].flash_id = FLASH_UNKNOWN;	}	/* Static FLASH Bank configuration here - FIXME XXX */	/*	 * Warning:	 *	 * Since the PCU E memory map assigns flash banks top down,	 * we swap the numbering later if both banks are equipped,	 * so they look like a contiguous area of memory.	 */	DEBUGF("\n## Get flash bank 1 size @ 0x%08x\n",FLASH_BASE0_PRELIM);	size_b0 = flash_get_size((vu_long *)FLASH_BASE0_PRELIM, &flash_info[0]);	if (flash_info[0].flash_id == FLASH_UNKNOWN) {		printf ("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n",			size_b0, size_b0<<20);	}	DEBUGF("## Get flash bank 2 size @ 0x%08x\n",FLASH_BASE6_PRELIM);	size_b1 = flash_get_size((vu_long *)FLASH_BASE6_PRELIM, &flash_info[1]);	DEBUGF("## Prelim. Flash bank sizes: %08lx + 0x%08lx\n", size_b0, size_b1);	if (size_b1 > size_b0) {		printf ("## ERROR: "			"Bank 1 (0x%08lx = %ld MB) > Bank 0 (0x%08lx = %ld MB)\n",			size_b1, size_b1<<20,			size_b0, size_b0<<20		);		flash_info[0].flash_id	= FLASH_UNKNOWN;		flash_info[1].flash_id	= FLASH_UNKNOWN;		flash_info[0].sector_count	= -1;		flash_info[1].sector_count	= -1;		flash_info[0].size		= 0;		flash_info[1].size		= 0;		return (0);	}	DEBUGF ("## Before remap: "		"BR0: 0x%08x    OR0: 0x%08x    "		"BR6: 0x%08x    OR6: 0x%08x\n",		memctl->memc_br0, memctl->memc_or0,		memctl->memc_br6, memctl->memc_or6);	/* Remap FLASH according to real size */	base = 0 - size_b0;	memctl->memc_or0 = CFG_OR_TIMING_FLASH | (-size_b0 & 0xFFFF8000);	memctl->memc_br0 = (base & BR_BA_MSK) | BR_PS_16 | BR_MS_GPCM | BR_V;	DEBUGF("## BR0: 0x%08x    OR0: 0x%08x\n",		memctl->memc_br0, memctl->memc_or0);	/* Re-do sizing to get full correct info */	size_b0 = flash_get_size((vu_long *)base, &flash_info[0]);	base = 0 - size_b0;	flash_info[0].size = size_b0;	flash_get_offsets (base, &flash_info[0]);	/* monitor protection ON by default */	flash_protect(FLAG_PROTECT_SET,		      PCU_MONITOR_BASE,		      PCU_MONITOR_BASE+monitor_flash_len-1,		      &flash_info[0]);#ifdef	CFG_ENV_IS_IN_FLASH	/* ENV protection ON by default */	flash_protect(FLAG_PROTECT_SET,		      CFG_ENV_ADDR,		      CFG_ENV_ADDR+CFG_ENV_SECT_SIZE-1,		      &flash_info[0]);#endif	if (size_b1) {		flash_info_t tmp_info;		memctl->memc_or6 = CFG_OR_TIMING_FLASH | (-size_b1 & 0xFFFF8000);		memctl->memc_br6 = ((base - size_b1) & BR_BA_MSK) |				    BR_PS_16 | BR_MS_GPCM | BR_V;		DEBUGF("## New BR6: 0x%08x    OR6: 0x%08x\n",			memctl->memc_br6, memctl->memc_or6);		/* Re-do sizing to get full correct info */		size_b1 = flash_get_size((vu_long *)(base - size_b1),					  &flash_info[1]);		base -= size_b1;		flash_get_offsets (base, &flash_info[1]);		flash_info[1].size = size_b1;#ifdef	CFG_ENV_IS_IN_FLASH		/* ENV protection ON by default */		flash_protect(FLAG_PROTECT_SET,			      CFG_ENV_ADDR,			      CFG_ENV_ADDR+CFG_ENV_SECT_SIZE-1,			      &flash_info[1]);#endif		/*		 * Swap bank numbers so that addresses are in ascending order		 */		tmp_info = flash_info[0];		flash_info[0] = flash_info[1];		flash_info[1] = tmp_info;	} else {		memctl->memc_br1 = 0;		/* invalidate bank */		flash_info[1].flash_id = FLASH_UNKNOWN;		flash_info[1].sector_count = -1;	}	DEBUGF("## Final Flash bank sizes: %08lx + 0x%08lx\n",size_b0,size_b1);	return (size_b0 + size_b1);}/*----------------------------------------------------------------------- */static void flash_get_offsets (ulong base, flash_info_t *info){	int i;	short n;	if (info->flash_id == FLASH_UNKNOWN) {		return;	}	if ((info->flash_id & FLASH_VENDMASK) != FLASH_MAN_AMD) {		return;	}	switch (info->flash_id & FLASH_TYPEMASK) {	case FLASH_AMDL322T:	case FLASH_AMDL323T:	case FLASH_AMDL324T:		/* set sector offsets for top boot block type		*/		base += info->size;		i = info->sector_count;		for (n=0; n<8; ++n) {		/*  8 x 8k boot sectors	*/			base -= 8 << 10;			--i;			info->start[i] = base;		}		while (i > 0) {			/* 64k regular sectors	*/			base -= 64 << 10;			--i;			info->start[i] = base;		}		return;	case FLASH_AMDL322B:	case FLASH_AMDL323B:	case FLASH_AMDL324B:		/* set sector offsets for bottom boot block type	*/		for (i=0; i<8; ++i) {		/*  8 x 8k boot sectors	*/			info->start[i] = base;			base += 8 << 10;		}		while (base < info->size) {	/* 64k regular sectors	*/			info->start[i] = base;			base += 64 << 10;			++i;		}		return;	case FLASH_AMDL640:		/* set sector offsets for dual boot block type		*/		for (i=0; i<8; ++i) {		/*  8 x 8k boot sectors	*/			info->start[i] = base;			base += 8 << 10;		}		n = info->sector_count - 8;		while (i < n) {			/* 64k regular sectors	*/			info->start[i] = base;			base += 64 << 10;			++i;		}		while (i < info->sector_count) { /* 8 x 8k boot sectors	*/			info->start[i] = base;			base += 8 << 10;			++i;		}		return;	default:		return;	}	/* NOTREACHED */}/*----------------------------------------------------------------------- */void flash_print_info  (flash_info_t *info){	int i;	if (info->flash_id == FLASH_UNKNOWN) {		printf ("missing or unknown FLASH type\n");		return;	}	switch (info->flash_id & FLASH_VENDMASK) {	case FLASH_MAN_AMD:	printf ("AMD ");		break;	case FLASH_MAN_FUJ:	printf ("FUJITSU ");		break;	default:		printf ("Unknown Vendor ");	break;	}	switch (info->flash_id & FLASH_TYPEMASK) {	case FLASH_AMDL322B:	printf ("AM29DL322B (32 Mbit, bottom boot sect)\n");				break;	case FLASH_AMDL322T:	printf ("AM29DL322T (32 Mbit, top boot sector)\n");				break;	case FLASH_AMDL323B:	printf ("AM29DL323B (32 Mbit, bottom boot sect)\n");				break;	case FLASH_AMDL323T:	printf ("AM29DL323T (32 Mbit, top boot sector)\n");				break;	case FLASH_AMDL324B:	printf ("AM29DL324B (32 Mbit, bottom boot sect)\n");				break;	case FLASH_AMDL324T:	printf ("AM29DL324T (32 Mbit, top boot sector)\n");				break;	case FLASH_AMDL640:	printf ("AM29DL640D (64 Mbit, dual boot sector)\n");				break;	default:		printf ("Unknown Chip Type 0x%lX\n",					info->flash_id);				break;	}	printf ("  Size: %ld MB in %d Sectors\n",		info->size >> 20, info->sector_count);	printf ("  Sector Start Addresses:");	for (i=0; i<info->sector_count; ++i) {		if ((i % 5) == 0)			printf ("\n   ");		printf (" %08lX%s",			info->start[i],			info->protect[i] ? " (RO)" : "     "		);	}	printf ("\n");	return;}/*----------------------------------------------------------------------- *//*----------------------------------------------------------------------- *//* * The following code cannot be run from FLASH! */static ulong flash_get_size (vu_long *addr, flash_info_t *info){	short i;	ushort value;	vu_short *saddr = (vu_short *)addr;	/* Write auto select command: read Manufacturer ID */	saddr[0x0555] = 0x00AA;	saddr[0x02AA] = 0x0055;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久9999| 国产精品911| 国产成人亚洲综合a∨婷婷图片| 91在线观看下载| 欧美一区二区高清| 亚洲一级电影视频| 国产成人综合在线播放| 欧美二区乱c少妇| 国产精品久久精品日日| 久久99精品网久久| 欧美美女激情18p| 一区二区三区在线观看视频| 成人免费观看视频| 国产午夜亚洲精品不卡 | 成人免费小视频| 国产乱理伦片在线观看夜一区| 337p亚洲精品色噜噜| 亚洲免费视频中文字幕| av午夜精品一区二区三区| 国产网站一区二区| 久久精品国产一区二区三区免费看| 91黄视频在线观看| 亚洲色图一区二区三区| 波多野结衣中文字幕一区 | 国产激情一区二区三区四区 | 国产精品美女久久久久久久久久久| 毛片基地黄久久久久久天堂| 91精品国产麻豆| 日本午夜精品一区二区三区电影 | 2欧美一区二区三区在线观看视频| 日韩成人av影视| 日韩精品一区二区三区视频| 日本不卡123| 日韩精品一区二区三区三区免费| 久久黄色级2电影| 欧美精品一区二区精品网| 国内精品久久久久影院一蜜桃| 日韩三级精品电影久久久| 精品一区二区三区在线播放| 欧美大度的电影原声| 国产一区二区三区四| 国产片一区二区| 9l国产精品久久久久麻豆| 亚洲伦理在线精品| 欧美日韩三级在线| 日韩av一区二区在线影视| 精品国产免费人成在线观看| 国产精品一区免费视频| 日本一区二区三区国色天香| av欧美精品.com| 亚洲第四色夜色| 亚洲精品在线免费播放| 成人久久视频在线观看| 亚洲欧美日韩人成在线播放| 欧美日韩在线播| 国内精品嫩模私拍在线| 最好看的中文字幕久久| 欧美放荡的少妇| 国产高清视频一区| 亚洲国产一区二区在线播放| 精品国产免费久久| 色老汉一区二区三区| 男人的j进女人的j一区| 中文字幕亚洲欧美在线不卡| 欧美日本国产一区| 国产乱码精品一品二品| 一区二区三区在线观看欧美| 精品少妇一区二区三区视频免付费 | 在线综合视频播放| 风流少妇一区二区| 视频一区欧美日韩| 欧美精彩视频一区二区三区| 精品视频色一区| 成人免费视频国产在线观看| 日韩精品91亚洲二区在线观看| 国产精品三级视频| 欧美不卡在线视频| 欧美三级在线视频| 成人h动漫精品一区二区| 日韩精品电影一区亚洲| 亚洲精品视频观看| 欧美激情一区在线观看| 欧美一级免费大片| 欧美在线不卡视频| 99re热这里只有精品免费视频 | 国产成人av影院| 日本三级亚洲精品| 亚洲免费观看高清完整版在线观看| 91麻豆精品国产自产在线 | 欧美一区二区人人喊爽| 日本精品视频一区二区三区| 国产精品一区二区久激情瑜伽| 日韩高清不卡一区二区| 夜夜精品视频一区二区| 亚洲视频免费观看| 中文字幕视频一区| 国产欧美日韩亚州综合| 精品少妇一区二区三区视频免付费 | 香蕉久久夜色精品国产使用方法| 国产精品色一区二区三区| 久久久精品日韩欧美| 欧美大度的电影原声| 91精品中文字幕一区二区三区| 欧美日韩欧美一区二区| 91成人国产精品| 一本久久a久久精品亚洲| a4yy欧美一区二区三区| a级高清视频欧美日韩| 不卡一区二区中文字幕| 91蜜桃在线免费视频| av激情成人网| 色94色欧美sute亚洲13| 欧美在线制服丝袜| 欧美日韩一区久久| 欧美精品久久99久久在免费线 | 日韩av电影天堂| 日本在线观看不卡视频| 日韩国产高清影视| 蜜臀av亚洲一区中文字幕| 久久超碰97人人做人人爱| 久久福利资源站| 国产寡妇亲子伦一区二区| 成人永久免费视频| 一本到不卡精品视频在线观看| 日本韩国精品在线| 欧美日韩色综合| 日韩精品中午字幕| 久久精品视频网| 最新日韩在线视频| 亚洲不卡av一区二区三区| 琪琪一区二区三区| 国产二区国产一区在线观看| 99re成人精品视频| 欧美三级蜜桃2在线观看| 欧美男男青年gay1069videost | 91精品国产色综合久久不卡蜜臀| 在线播放日韩导航| 久久色在线视频| 亚洲免费观看高清完整| 五月天久久比比资源色| 精品一区二区三区的国产在线播放 | 欧美日韩精品一二三区| 欧美一级欧美三级在线观看| 国产午夜亚洲精品羞羞网站| 亚洲卡通动漫在线| 热久久免费视频| av资源站一区| 日韩欧美一区电影| 亚洲欧洲三级电影| 免费的成人av| 91高清在线观看| 国产视频一区二区三区在线观看| 亚洲男帅同性gay1069| 麻豆精品精品国产自在97香蕉| 91色.com| 国产亚洲人成网站| 婷婷亚洲久悠悠色悠在线播放| 久久成人av少妇免费| 在线观看日韩国产| 国产欧美日韩视频在线观看| 日本一不卡视频| 色综合天天综合网天天看片| 久久先锋影音av鲁色资源| 亚洲成av人综合在线观看| 成人精品在线视频观看| 精品国产一区二区国模嫣然| 一区二区三区高清不卡| 国产suv精品一区二区6| 欧美一区二区三区男人的天堂| 中文字幕一区二区视频| 国产一区91精品张津瑜| 91精品国产福利| 亚洲国产人成综合网站| 成人av电影观看| 国产日本欧美一区二区| 精品一区二区在线观看| 在线播放视频一区| 亚洲国产一区视频| 色8久久人人97超碰香蕉987| 国产精品国产a级| 国产河南妇女毛片精品久久久 | 丁香婷婷综合色啪| 26uuu亚洲综合色| 久久97超碰国产精品超碰| 777午夜精品视频在线播放| 樱花草国产18久久久久| 日本乱码高清不卡字幕| 亚洲精品中文字幕乱码三区| 99久久久久久| 亚洲三级在线观看| 91丝袜美女网| 亚洲欧美电影院| 91色porny| 亚洲午夜久久久久久久久电影网 | 成人sese在线| 中文字幕一区二区不卡| av色综合久久天堂av综合| 亚洲欧美日韩国产中文在线| 91在线视频18| 亚洲成人黄色影院|