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

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

?? flash.c

?? uboot for at91rm9200dk
?? C
字號:
/* * (C) Copyright 2000-2003 * 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 *//******************************************************************************** Notes: AM29LV320DB - 90EI ( 32 Mbit device )** Sectors - Eight 8 Kb sector** 	   - Sixty three 64 Kb sector** Bottom boot sector******************************************************************************/#include <common.h>#include <mpc8xx.h>/********************************************************************************	Defines******************************************************************************/#ifdef CONFIG_ADDERII#define ADDR0	0x0555#define ADDR1	0x02AA#define FLASH_WORD_SIZE unsigned short#endif#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/********************************************************************************	Global Parameters******************************************************************************/flash_info_t flash_info[CFG_MAX_FLASH_BANKS];/********************************************************************************	Function Prototypes******************************************************************************/static ulong flash_get_size( vu_long *addr, flash_info_t *info );static int write_word( flash_info_t *info, ulong dest, ulong data );static void flash_get_offsets( ulong base, flash_info_t *info );int wait_for_DQ7( flash_info_t *info, int sect );/******************************************************************************** Function :	flash_init** Param    :   void** Notes    :   Initializes the Flash Chip******************************************************************************/ulong flash_init (void){	ulong size_b0 = -1;	int i;	volatile immap_t *immap = (immap_t *) CFG_IMMR;	volatile memctl8xx_t *memctl = &immap->im_memctl;	/* Set Flash to unknown */	for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {		flash_info[i].flash_id = FLASH_UNKNOWN;	}	/* Get the Flash Bank Size */	size_b0 = flash_get_size ((vu_long *) (CFG_FLASH_BASE),				  &flash_info[0]);	if (flash_info[0].flash_id == FLASH_UNKNOWN) {		printf ("## UNKNOWN Flash on Bank 0 - Size = 0x%08lx = %ldMB\n",			size_b0, size_b0 >> 20);	}	/* Remap Flash according to size detected  */	memctl->memc_or0 = 0xFF800774;	memctl->memc_br0 = CFG_BR0_PRELIM;	/* Setup Flash Sector Offsets */	flash_get_offsets (CFG_FLASH_BASE, &flash_info[0]);	/* Monitor Protection ON - default */#if ( CFG_MONITOR_BASE >= CFG_FLASH_BASE  )	flash_protect (FLAG_PROTECT_SET, CFG_MONITOR_BASE,		       (CFG_MONITOR_BASE + monitor_flash_len - 1),		       &flash_info[0]);#endif	/* Protect Environment Variables */#ifdef CFG_ENV_IS_IN_FLASH	flash_protect (FLAG_PROTECT_SET, CFG_ENV_ADDR,		       (CFG_ENV_ADDR + CFG_ENV_SIZE - 1), &flash_info[0]);#endif	return size_b0;}/******************************************************************************** Function : flash_get_offsets** Param    : ulong base, flash_into_t *info** Notes    :******************************************************************************/static void flash_get_offsets (ulong base, flash_info_t * info){	return;}/******************************************************************************** Function : flash_print_info** Param    : flash_info_t** Notes    :******************************************************************************/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;	case FLASH_MAN_BM:		printf ("BRIGHT MICRO ");		break;	default:		printf ("Unknown Vendor ");		break;	}	switch (info->flash_id & FLASH_TYPEMASK) {	case FLASH_AM320B:		printf ("AM29LV320B (32 Mbit, bottom boot sect)\n");		break;	case FLASH_AM320T:		printf ("AM29LV320T (32 Mbit, top boot sector)\n");		break;	default:		printf ("Unknown Chip Type\n");		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;}/******************************************************************************** Function : flash_get_size** Param    : vu_long *addr, flash_info_t *info** Notes    :******************************************************************************/static ulong flash_get_size (vu_long * addr, flash_info_t * info){	short i;	FLASH_WORD_SIZE manu_id, dev_id;	ulong base = (ulong) addr;	volatile FLASH_WORD_SIZE *addr2 = (FLASH_WORD_SIZE *) addr;	/* Write Auto Select Command and read Manufacturer's ID and Dev ID */	addr2[ADDR0] = (FLASH_WORD_SIZE) 0xAAAAAAAA;	addr2[ADDR1] = (FLASH_WORD_SIZE) 0x55555555;	addr2[ADDR0] = (FLASH_WORD_SIZE) 0x90909090;	manu_id = addr2[0];	switch (manu_id) {	case (FLASH_WORD_SIZE) AMD_MANUFACT:		info->flash_id = FLASH_MAN_AMD;		break;	default:		info->flash_id = FLASH_UNKNOWN;		info->sector_count = 0;		info->size = 0;		break;	}	/* Read Device Id */	dev_id = addr2[1];	switch (dev_id) {	case (FLASH_WORD_SIZE) AMD_ID_LV320B:		info->flash_id += FLASH_AM320B;		info->sector_count = 71;	/* 8 - boot sec + 63 normal */		info->size = 0x400000;	/* 4MByte */		break;	default:		info->flash_id = FLASH_UNKNOWN;		break;	}	/* Set up sector start Addresses */	if (info->flash_id & FLASH_BTYPE) {		/* set sector offsets for bottom boot block		 ** Eight 8 Kb Boot sectors		 ** Sixty Three 64Kb sectors		 */		for (i = 0; i < 8; i++) {			info->start[i] = base + (i * 0x00002000);		}		for (i = 8; i < info->sector_count; i++) {			info->start[i] = base + (i * 0x00010000) - 0x00070000;		}	}	/* Reset To read mode */	if (info->flash_id != FLASH_UNKNOWN) {		addr = (ulong *) info->start[0];		*addr = 0xF0F0F0F0;	}	return (info->size);}/********************************************************************************* Function : flash_erase** Param    : flash_info_t *info, int s_first, int s_last** Notes    :******************************************************************************/int flash_erase (flash_info_t * info, int s_first, int s_last){	volatile FLASH_WORD_SIZE *addr = (FLASH_WORD_SIZE *) (info->start[0]);	volatile FLASH_WORD_SIZE *addr2;	int flag, prot, sect, l_sect;	int i;	if ((s_first < 0) || (s_first > s_last)) {		if (info->flash_id == FLASH_UNKNOWN) {			printf ("- missing\n");		} else {			printf ("- no sectors to erase\n");		}		return 1;	}	if (info->flash_id == FLASH_UNKNOWN) {		printf ("Can't erase unknown flash type - aborted\n");		return 1;	}	prot = 0;	for (sect = s_first; sect <= s_last; ++sect) {		if (info->protect[sect]) {			prot++;		}	}	if (prot) {		printf ("Warning: %d protected sectors will not be erased!\n",			prot);	} else {		printf ("\n");	}	l_sect = -1;	/* Disable interrupts which might cause a timeout here */	flag = disable_interrupts ();	/* Start erase on unprotected sectors */	for (sect = s_first; sect <= s_last; sect++) {		if (info->protect[sect] == 0) {	/* not protected */			addr2 = (FLASH_WORD_SIZE *) (info->start[sect]);			if ((info->flash_id & FLASH_VENDMASK) ==			    FLASH_MAN_SST) {				addr[ADDR0] = (FLASH_WORD_SIZE) 0x00AA00AA;				addr[ADDR1] = (FLASH_WORD_SIZE) 0x00550055;				addr[ADDR0] = (FLASH_WORD_SIZE) 0x00800080;				addr[ADDR0] = (FLASH_WORD_SIZE) 0x00AA00AA;				addr[ADDR1] = (FLASH_WORD_SIZE) 0x00550055;				addr2[0] = (FLASH_WORD_SIZE) 0x00500050;	/* block erase */				for (i = 0; i < 50; i++)					udelay (1000);	/* wait 1 ms */			} else {				addr[ADDR0] = (FLASH_WORD_SIZE) 0x00AA00AA;				addr[ADDR1] = (FLASH_WORD_SIZE) 0x00550055;				addr[ADDR0] = (FLASH_WORD_SIZE) 0x00800080;				addr[ADDR0] = (FLASH_WORD_SIZE) 0x00AA00AA;				addr[ADDR1] = (FLASH_WORD_SIZE) 0x00550055;				addr2[0] = (FLASH_WORD_SIZE) 0x00300030;	/* sector erase */			}			l_sect = sect;			/*			 * Wait for each sector to complete, it's more			 * reliable.  According to AMD Spec, you must			 * issue all erase commands within a specified			 * timeout.  This has been seen to fail, especially			 * if printf()s are included (for debug)!!			 */			wait_for_DQ7 (info, sect);		}	}	/* re-enable interrupts if necessary */	if (flag)		enable_interrupts ();	/* wait at least 80us - let's wait 1 ms */	udelay (1000);	/* reset to read mode */	addr = (FLASH_WORD_SIZE *) info->start[0];	addr[0] = (FLASH_WORD_SIZE) 0x00F000F0;	/* reset bank */	printf (" done\n");	return 0;}int wait_for_DQ7 (flash_info_t * info, int sect){	ulong start, now, last;	volatile FLASH_WORD_SIZE *addr =		(FLASH_WORD_SIZE *) (info->start[sect]);	start = get_timer (0);	last = start;	while ((addr[0] & (FLASH_WORD_SIZE) 0x00800080) !=	       (FLASH_WORD_SIZE) 0x00800080) {		if ((now = get_timer (start)) > CFG_FLASH_ERASE_TOUT) {			printf ("Timeout\n");			return -1;		}		/* show that we're waiting */		if ((now - last) > 1000) {			putc ('.');			last = now;		}	}	return 0;}/******************************************************************************** Function : write_buff** Param    : flash_info_t *info, uchar *src, ulong addr, ulong cnt** Notes    :******************************************************************************/int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt){	ulong cp, wp, data;	int i, l, rc;	/* get lower word aligned address */	wp = (addr & ~3);	/*	 * handle unaligned start bytes	 */	if ((l = addr - wp) != 0) {		data = 0;		for (i = 0, cp = wp; i < l; ++i, ++cp) {			data = (data << 8) | (*(uchar *) cp);		}		for (; i < 4 && cnt > 0; ++i) {			data = (data << 8) | *src++;			--cnt;			++cp;		}		for (; cnt == 0 && i < 4; ++i, ++cp) {			data = (data << 8) | (*(uchar *) cp);		}		if ((rc = write_word (info, wp, data)) != 0) {			return (rc);		}		wp += 4;	}	/*	 * handle word aligned part	 */	while (cnt >= 4) {		data = 0;		for (i = 0; i < 4; ++i) {			data = (data << 8) | *src++;		}		if ((rc = write_word (info, wp, data)) != 0) {			return (rc);		}		wp += 4;		cnt -= 4;	}	if (cnt == 0) {		return (0);	}	/*	 * handle unaligned tail bytes	 */	data = 0;	for (i = 0, cp = wp; i < 4 && cnt > 0; ++i, ++cp) {		data = (data << 8) | *src++;		--cnt;	}	for (; i < 4; ++i, ++cp) {		data = (data << 8) | (*(uchar *) cp);	}	return (write_word (info, wp, data));}/******************************************************************************** Function : write_word** Param    : flash_info_t *info, ulong dest, ulong data** Notes    :******************************************************************************/static int write_word (flash_info_t * info, ulong dest, ulong data){	volatile FLASH_WORD_SIZE *addr2 =		(FLASH_WORD_SIZE *) (info->start[0]);	volatile FLASH_WORD_SIZE *dest2 = (FLASH_WORD_SIZE *) dest;	volatile FLASH_WORD_SIZE *data2 = (FLASH_WORD_SIZE *) & data;	ulong start;	int i;	/* Check if Flash is (sufficiently) erased */	if ((*((volatile FLASH_WORD_SIZE *) dest) &	     (FLASH_WORD_SIZE) data) != (FLASH_WORD_SIZE) data) {		return (2);	}	for (i = 0; i < 4 / sizeof (FLASH_WORD_SIZE); i++) {		int flag;		/* Disable interrupts which might cause a timeout here */		flag = disable_interrupts ();		addr2[ADDR0] = (FLASH_WORD_SIZE) 0x00AA00AA;		addr2[ADDR1] = (FLASH_WORD_SIZE) 0x00550055;		addr2[ADDR0] = (FLASH_WORD_SIZE) 0x00A000A0;		dest2[i] = data2[i];		/* re-enable interrupts if necessary */		if (flag)			enable_interrupts ();		/* data polling for D7 */		start = get_timer (0);		while ((dest2[i] & (FLASH_WORD_SIZE) 0x00800080) !=		       (data2[i] & (FLASH_WORD_SIZE) 0x00800080)) {			if (get_timer (start) > CFG_FLASH_WRITE_TOUT) {				return (1);			}		}	}	return (0);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产一区二区视频| 欧美激情在线观看视频免费| 午夜久久电影网| 欧美日韩国产精选| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美顶级少妇做爰| 狠狠狠色丁香婷婷综合激情 | 日本亚洲视频在线| 日韩亚洲欧美中文三级| 国产一区二区成人久久免费影院| 久久久久久久久久久黄色 | 91免费观看在线| 亚洲不卡在线观看| 欧美xxxxxxxxx| 国产 日韩 欧美大片| 亚洲另类在线视频| 777xxx欧美| 麻豆精品视频在线| 国产精品视频在线看| 欧美色网站导航| 理论片日本一区| 中文字幕亚洲欧美在线不卡| 欧美日韩一级视频| 国产自产2019最新不卡| 亚洲人成网站在线| 日韩一区二区在线播放| 岛国av在线一区| 三级影片在线观看欧美日韩一区二区 | 亚洲欧美电影院| 91精品国产一区二区三区香蕉 | 美女视频黄免费的久久| 中文字幕免费一区| 欧美日韩久久一区| 波波电影院一区二区三区| 亚洲午夜一二三区视频| 久久亚洲春色中文字幕久久久| 94-欧美-setu| 韩国v欧美v日本v亚洲v| 亚洲国产人成综合网站| 日本一区二区三区久久久久久久久不| 色婷婷综合久久久| 国产露脸91国语对白| 亚洲国产欧美在线| 中文字幕亚洲视频| 亚洲视频一二区| 日韩欧美一区中文| 色婷婷av一区二区三区之一色屋| 国产一区二区三区黄视频| 亚洲午夜久久久| 国产精品久久久久久久久晋中 | 亚洲午夜成aⅴ人片| 国产精品日韩精品欧美在线| 日韩精品综合一本久道在线视频| 91福利视频网站| 不卡影院免费观看| 国产美女精品人人做人人爽| 丝袜诱惑制服诱惑色一区在线观看| 国产精品久久久久久久第一福利| 精品国产乱码久久久久久1区2区| 欧美高清视频不卡网| 色婷婷一区二区| 97精品国产97久久久久久久久久久久| 国内精品伊人久久久久av影院 | 欧美精品在线观看一区二区| 91香蕉视频mp4| 成人午夜伦理影院| 国产精品一区在线观看乱码| 日韩av网站在线观看| 亚洲一级二级在线| 亚洲欧美韩国综合色| 亚洲欧美综合在线精品| 中文av一区二区| 国产肉丝袜一区二区| 久久久噜噜噜久久人人看 | 日本一区二区综合亚洲| 日韩欧美激情一区| 欧美一级一级性生活免费录像| 欧美专区亚洲专区| 欧美图片一区二区三区| 色屁屁一区二区| 欧美午夜电影在线播放| 欧美日产国产精品| 欧美高清dvd| 欧美一级高清片在线观看| 欧美一二三四在线| 欧美一区二区网站| 欧美sm美女调教| 久久久久97国产精华液好用吗| 日韩精品一区二区三区三区免费| 日韩视频一区二区三区在线播放| 日韩视频一区二区三区| 久久日一线二线三线suv| 亚洲精品一线二线三线| 国产女同性恋一区二区| 综合在线观看色| 亚洲无人区一区| 青青草原综合久久大伊人精品| 精品系列免费在线观看| 成人免费毛片a| 99国产精品99久久久久久| 欧美三区免费完整视频在线观看| 欧美日韩视频一区二区| 欧美不卡一区二区三区| 久久精品欧美日韩| 亚洲日本欧美天堂| 亚洲成av人影院在线观看网| 久久福利资源站| 成人污视频在线观看| 欧美综合色免费| 日韩免费在线观看| 国产精品成人免费| 日本欧美在线观看| 在线免费观看不卡av| 日韩一区二区三区免费看| 久久久久国产一区二区三区四区| 一区二区三区在线视频播放| 日本亚洲三级在线| heyzo一本久久综合| 欧美日韩二区三区| 国产欧美一区二区三区网站| 亚洲国产欧美在线人成| 国产精品一区久久久久| 在线亚洲一区观看| 久久久国产综合精品女国产盗摄| 亚洲影视在线观看| 国产一区二区三区高清播放| 色国产综合视频| 久久色在线观看| 亚洲国产一区二区视频| 成熟亚洲日本毛茸茸凸凹| 欧美精选午夜久久久乱码6080| 欧美激情一区不卡| 日本亚洲电影天堂| 欧美亚洲综合另类| 欧美国产精品v| 欧美bbbbb| 欧美视频一区二区三区在线观看| 国产性色一区二区| 裸体一区二区三区| 欧美日韩在线播放三区| 综合激情成人伊人| 国产91富婆露脸刺激对白| 日韩三区在线观看| 视频一区视频二区中文字幕| 91亚洲精品一区二区乱码| 26uuu另类欧美| 久久国内精品自在自线400部| 欧美三区在线观看| 亚洲综合区在线| 一本久久a久久精品亚洲| 欧美国产日韩一二三区| 精品在线免费视频| 欧美一区二区三区成人| 亚洲国产成人av网| 欧美性色黄大片| 亚洲精品国产精品乱码不99| 成人午夜免费视频| 欧美韩国日本不卡| 国产精品一二三| 久久久国产精品午夜一区ai换脸| 久久福利视频一区二区| 欧美成人精品二区三区99精品| 午夜视频一区二区三区| 欧美在线不卡视频| 亚洲sss视频在线视频| 欧美探花视频资源| 亚洲综合一二三区| 色噜噜狠狠一区二区三区果冻| 亚洲欧美日韩国产综合在线| 色婷婷久久久综合中文字幕| 亚洲男人的天堂av| 日本道在线观看一区二区| 亚洲精品一二三四区| 欧美亚洲自拍偷拍| 一区二区三区蜜桃网| 91福利国产精品| 婷婷国产v国产偷v亚洲高清| 欧美一级理论片| 国产一区二区三区在线观看免费 | 国产欧美一二三区| 成人激情午夜影院| 亚洲一区二区精品视频| 欧美疯狂性受xxxxx喷水图片| 日本不卡视频在线观看| 精品国产网站在线观看| 国产精品1024久久| 亚洲人成网站精品片在线观看| 欧美午夜在线观看| 日本成人在线一区| 久久久午夜电影| 9人人澡人人爽人人精品| 亚洲激情在线播放| 欧美一区二区三区四区视频| 国产综合色视频| 日韩理论片中文av| 欧美精选午夜久久久乱码6080| 国内精品在线播放| 亚洲欧美日韩系列| 日韩美女一区二区三区四区| 成人综合日日夜夜|