diff options
Diffstat (limited to 'common/cmd_flash.c')
| -rw-r--r-- | common/cmd_flash.c | 177 | 
1 files changed, 93 insertions, 84 deletions
| diff --git a/common/cmd_flash.c b/common/cmd_flash.c index 18d2250f3..93eefa964 100644 --- a/common/cmd_flash.c +++ b/common/cmd_flash.c @@ -41,7 +41,7 @@ int find_dev_and_part(const char *id, struct mtd_device **dev,  		u8 *part_num, struct part_info **part);  #endif -#ifndef CFG_NO_FLASH +#ifndef CONFIG_SYS_NO_FLASH  extern flash_info_t flash_info[];	/* info for FLASH chips */  /* @@ -76,7 +76,7 @@ abbrev_spec (char *str, flash_info_t ** pinfo, int *psf, int *psl)  	bank = simple_strtoul (str, &ep, 10);  	if (ep == str || *ep != '\0' || -		bank < 1 || bank > CFG_MAX_FLASH_BANKS || +		bank < 1 || bank > CONFIG_SYS_MAX_FLASH_BANKS ||  		(fp = &flash_info[bank - 1])->flash_id == FLASH_UNKNOWN)  		return -1; @@ -105,6 +105,47 @@ abbrev_spec (char *str, flash_info_t ** pinfo, int *psf, int *psl)  }  /* + * Take *addr in Flash and adjust it to fall on the end of its sector + */ +int flash_sect_roundb (ulong *addr) +{ +	flash_info_t *info; +	ulong bank, sector_end_addr; +	char found; +	int i; + +	/* find the end addr of the sector where the *addr is */ +	found = 0; +	for (bank = 0; bank < CONFIG_SYS_MAX_FLASH_BANKS && !found; ++bank) { +		info = &flash_info[bank]; +		for (i = 0; i < info->sector_count && !found; ++i) { +			/* get the end address of the sector */ +			if (i == info->sector_count - 1) { +				sector_end_addr = info->start[0] + +								info->size - 1; +			} else { +				sector_end_addr = info->start[i+1] - 1; +			} + +			if (*addr <= sector_end_addr && +						*addr >= info->start[i]) { +				found = 1; +				/* adjust *addr if necessary */ +				if (*addr < sector_end_addr) +					*addr = sector_end_addr; +			} /* sector */ +		} /* bank */ +	} +	if (!found) { +		/* error, addres not in flash */ +		printf("Error: end address (0x%08lx) not in flash!\n", *addr); +		return 1; +	} + +	return 0; +} + +/*   * This function computes the start and end addresses for both   * erase and protect commands. The range of the addresses on which   * either of the commands is to operate can be given in two forms: @@ -126,8 +167,6 @@ addr_spec(char *arg1, char *arg2, ulong *addr_first, ulong *addr_last)  {  	char *ep;  	char len_used; /* indicates if the "start +length" form used */ -	char found; -	ulong bank;  	*addr_first = simple_strtoul(arg1, &ep, 16);  	if (ep == arg1 || *ep != '\0') @@ -157,38 +196,8 @@ addr_spec(char *arg1, char *arg2, ulong *addr_first, ulong *addr_last)  		 * sector boundary, so that the commands don't fail later on.  		 */ -		/* find the end addr of the sector where the *addr_last is */ -		found = 0; -		for (bank = 0; bank < CFG_MAX_FLASH_BANKS && !found; ++bank){ -			int i; -			flash_info_t *info = &flash_info[bank]; -			for (i = 0; i < info->sector_count && !found; ++i){ -				/* get the end address of the sector */ -				ulong sector_end_addr; -				if (i == info->sector_count - 1){ -					sector_end_addr = -						info->start[0] + info->size - 1; -				} else { -					sector_end_addr = -						info->start[i+1] - 1; -				} -				if (*addr_last <= sector_end_addr && -						*addr_last >= info->start[i]){ -					/* sector found */ -					found = 1; -					/* adjust *addr_last if necessary */ -					if (*addr_last < sector_end_addr){ -						*addr_last = sector_end_addr; -					} -				} -			} /* sector */ -		} /* bank */ -		if (!found){ -			/* error, addres not in flash */ -			printf("Error: end address (0x%08lx) not in flash!\n", -								*addr_last); +		if (flash_sect_roundb(addr_last) > 0)  			return -1; -		}  	} /* "start +length" from used */  	return 1; @@ -205,13 +214,13 @@ flash_fill_sect_ranges (ulong addr_first, ulong addr_last,  	*s_count = 0; -	for (bank=0; bank < CFG_MAX_FLASH_BANKS; ++bank) { +	for (bank=0; bank < CONFIG_SYS_MAX_FLASH_BANKS; ++bank) {  		s_first[bank] = -1;	/* first sector to erase	*/  		s_last [bank] = -1;	/* last  sector to erase	*/  	}  	for (bank=0,info = &flash_info[0]; -	     (bank < CFG_MAX_FLASH_BANKS) && (addr_first <= addr_last); +	     (bank < CONFIG_SYS_MAX_FLASH_BANKS) && (addr_first <= addr_last);  	     ++bank, ++info) {  		ulong b_end;  		int sect; @@ -276,11 +285,11 @@ flash_fill_sect_ranges (ulong addr_first, ulong addr_last,  	return rcode;  } -#endif /* CFG_NO_FLASH */ +#endif /* CONFIG_SYS_NO_FLASH */  int do_flinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  { -#ifndef CFG_NO_FLASH +#ifndef CONFIG_SYS_NO_FLASH  	ulong bank;  #endif @@ -288,9 +297,9 @@ int do_flinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	dataflash_print_info();  #endif -#ifndef CFG_NO_FLASH +#ifndef CONFIG_SYS_NO_FLASH  	if (argc == 1) {	/* print info for all FLASH banks */ -		for (bank=0; bank <CFG_MAX_FLASH_BANKS; ++bank) { +		for (bank=0; bank <CONFIG_SYS_MAX_FLASH_BANKS; ++bank) {  			printf ("\nBank # %ld: ", bank+1);  			flash_print_info (&flash_info[bank]); @@ -299,20 +308,20 @@ int do_flinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	}  	bank = simple_strtoul(argv[1], NULL, 16); -	if ((bank < 1) || (bank > CFG_MAX_FLASH_BANKS)) { +	if ((bank < 1) || (bank > CONFIG_SYS_MAX_FLASH_BANKS)) {  		printf ("Only FLASH Banks # 1 ... # %d supported\n", -			CFG_MAX_FLASH_BANKS); +			CONFIG_SYS_MAX_FLASH_BANKS);  		return 1;  	}  	printf ("\nBank # %ld: ", bank);  	flash_print_info (&flash_info[bank-1]); -#endif /* CFG_NO_FLASH */ +#endif /* CONFIG_SYS_NO_FLASH */  	return 0;  }  int do_flerase (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  { -#ifndef CFG_NO_FLASH +#ifndef CONFIG_SYS_NO_FLASH  	flash_info_t *info;  	ulong bank, addr_first, addr_last;  	int n, sect_first, sect_last; @@ -329,7 +338,7 @@ int do_flerase (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	}  	if (strcmp(argv[1], "all") == 0) { -		for (bank=1; bank<=CFG_MAX_FLASH_BANKS; ++bank) { +		for (bank=1; bank<=CONFIG_SYS_MAX_FLASH_BANKS; ++bank) {  			printf ("Erase Flash Bank # %ld ", bank);  			info = &flash_info[bank-1];  			rcode = flash_erase (info, 0, info->sector_count-1); @@ -381,9 +390,9 @@ int do_flerase (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	if (strcmp(argv[1], "bank") == 0) {  		bank = simple_strtoul(argv[2], NULL, 16); -		if ((bank < 1) || (bank > CFG_MAX_FLASH_BANKS)) { +		if ((bank < 1) || (bank > CONFIG_SYS_MAX_FLASH_BANKS)) {  			printf ("Only FLASH Banks # 1 ... # %d supported\n", -				CFG_MAX_FLASH_BANKS); +				CONFIG_SYS_MAX_FLASH_BANKS);  			return 1;  		}  		printf ("Erase Flash Bank # %ld ", bank); @@ -406,18 +415,18 @@ int do_flerase (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	return rcode;  #else  	return 0; -#endif /* CFG_NO_FLASH */ +#endif /* CONFIG_SYS_NO_FLASH */  } -#ifndef CFG_NO_FLASH +#ifndef CONFIG_SYS_NO_FLASH  int flash_sect_erase (ulong addr_first, ulong addr_last)  {  	flash_info_t *info;  	ulong bank; -#ifdef CFG_MAX_FLASH_BANKS_DETECT -	int s_first[CFG_MAX_FLASH_BANKS_DETECT], s_last[CFG_MAX_FLASH_BANKS_DETECT]; +#ifdef CONFIG_SYS_MAX_FLASH_BANKS_DETECT +	int s_first[CONFIG_SYS_MAX_FLASH_BANKS_DETECT], s_last[CONFIG_SYS_MAX_FLASH_BANKS_DETECT];  #else -	int s_first[CFG_MAX_FLASH_BANKS], s_last[CFG_MAX_FLASH_BANKS]; +	int s_first[CONFIG_SYS_MAX_FLASH_BANKS], s_last[CONFIG_SYS_MAX_FLASH_BANKS];  #endif  	int erased = 0;  	int planned; @@ -428,7 +437,7 @@ int flash_sect_erase (ulong addr_first, ulong addr_last)  	if (planned && (rcode == 0)) {  		for (bank=0,info = &flash_info[0]; -		     (bank < CFG_MAX_FLASH_BANKS) && (rcode == 0); +		     (bank < CONFIG_SYS_MAX_FLASH_BANKS) && (rcode == 0);  		     ++bank, ++info) {  			if (s_first[bank]>=0) {  				erased += s_last[bank] - s_first[bank] + 1; @@ -450,15 +459,15 @@ int flash_sect_erase (ulong addr_first, ulong addr_last)  	}  	return rcode;  } -#endif /* CFG_NO_FLASH */ +#endif /* CONFIG_SYS_NO_FLASH */  int do_protect (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  { -#ifndef CFG_NO_FLASH +#ifndef CONFIG_SYS_NO_FLASH  	flash_info_t *info;  	ulong bank;  	int i, n, sect_first, sect_last; -#endif /* CFG_NO_FLASH */ +#endif /* CONFIG_SYS_NO_FLASH */  	ulong addr_first, addr_last;  	int p;  #if defined(CONFIG_CMD_JFFS2) && defined(CONFIG_JFFS2_CMDLINE) @@ -503,9 +512,9 @@ int do_protect (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	}  #endif -#ifndef CFG_NO_FLASH +#ifndef CONFIG_SYS_NO_FLASH  	if (strcmp(argv[2], "all") == 0) { -		for (bank=1; bank<=CFG_MAX_FLASH_BANKS; ++bank) { +		for (bank=1; bank<=CONFIG_SYS_MAX_FLASH_BANKS; ++bank) {  			info = &flash_info[bank-1];  			if (info->flash_id == FLASH_UNKNOWN) {  				continue; @@ -514,17 +523,17 @@ int do_protect (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  				p ? "" : "Un-", bank);  			for (i=0; i<info->sector_count; ++i) { -#if defined(CFG_FLASH_PROTECTION) +#if defined(CONFIG_SYS_FLASH_PROTECTION)  				if (flash_real_protect(info, i, p))  					rcode = 1;  				putc ('.');  #else  				info->protect[i] = p; -#endif	/* CFG_FLASH_PROTECTION */ +#endif	/* CONFIG_SYS_FLASH_PROTECTION */  			} -#if defined(CFG_FLASH_PROTECTION) +#if defined(CONFIG_SYS_FLASH_PROTECTION)  			if (!rcode) puts (" done\n"); -#endif	/* CFG_FLASH_PROTECTION */ +#endif	/* CONFIG_SYS_FLASH_PROTECTION */  		}  		return rcode;  	} @@ -538,18 +547,18 @@ int do_protect (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  			p ? "" : "Un-", sect_first, sect_last,  			(info-flash_info)+1);  		for (i = sect_first; i <= sect_last; i++) { -#if defined(CFG_FLASH_PROTECTION) +#if defined(CONFIG_SYS_FLASH_PROTECTION)  			if (flash_real_protect(info, i, p))  				rcode =  1;  			putc ('.');  #else  			info->protect[i] = p; -#endif	/* CFG_FLASH_PROTECTION */ +#endif	/* CONFIG_SYS_FLASH_PROTECTION */  		} -#if defined(CFG_FLASH_PROTECTION) +#if defined(CONFIG_SYS_FLASH_PROTECTION)  		if (!rcode) puts (" done\n"); -#endif	/* CFG_FLASH_PROTECTION */ +#endif	/* CONFIG_SYS_FLASH_PROTECTION */  		return rcode;  	} @@ -588,9 +597,9 @@ int do_protect (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	if (strcmp(argv[2], "bank") == 0) {  		bank = simple_strtoul(argv[3], NULL, 16); -		if ((bank < 1) || (bank > CFG_MAX_FLASH_BANKS)) { +		if ((bank < 1) || (bank > CONFIG_SYS_MAX_FLASH_BANKS)) {  			printf ("Only FLASH Banks # 1 ... # %d supported\n", -				CFG_MAX_FLASH_BANKS); +				CONFIG_SYS_MAX_FLASH_BANKS);  			return 1;  		}  		printf ("%sProtect Flash Bank # %ld\n", @@ -602,18 +611,18 @@ int do_protect (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  			return 1;  		}  		for (i=0; i<info->sector_count; ++i) { -#if defined(CFG_FLASH_PROTECTION) +#if defined(CONFIG_SYS_FLASH_PROTECTION)  			if (flash_real_protect(info, i, p))  				rcode =  1;  			putc ('.');  #else  			info->protect[i] = p; -#endif	/* CFG_FLASH_PROTECTION */ +#endif	/* CONFIG_SYS_FLASH_PROTECTION */  		} -#if defined(CFG_FLASH_PROTECTION) +#if defined(CONFIG_SYS_FLASH_PROTECTION)  		if (!rcode) puts (" done\n"); -#endif	/* CFG_FLASH_PROTECTION */ +#endif	/* CONFIG_SYS_FLASH_PROTECTION */  		return rcode;  	} @@ -628,19 +637,19 @@ int do_protect (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  		return 1;  	}  	rcode = flash_sect_protect (p, addr_first, addr_last); -#endif /* CFG_NO_FLASH */ +#endif /* CONFIG_SYS_NO_FLASH */  	return rcode;  } -#ifndef CFG_NO_FLASH +#ifndef CONFIG_SYS_NO_FLASH  int flash_sect_protect (int p, ulong addr_first, ulong addr_last)  {  	flash_info_t *info;  	ulong bank; -#ifdef CFG_MAX_FLASH_BANKS_DETECT -	int s_first[CFG_MAX_FLASH_BANKS_DETECT], s_last[CFG_MAX_FLASH_BANKS_DETECT]; +#ifdef CONFIG_SYS_MAX_FLASH_BANKS_DETECT +	int s_first[CONFIG_SYS_MAX_FLASH_BANKS_DETECT], s_last[CONFIG_SYS_MAX_FLASH_BANKS_DETECT];  #else -	int s_first[CFG_MAX_FLASH_BANKS], s_last[CFG_MAX_FLASH_BANKS]; +	int s_first[CONFIG_SYS_MAX_FLASH_BANKS], s_last[CONFIG_SYS_MAX_FLASH_BANKS];  #endif  	int protected, i;  	int planned; @@ -651,7 +660,7 @@ int flash_sect_protect (int p, ulong addr_first, ulong addr_last)  	protected = 0;  	if (planned && (rcode == 0)) { -		for (bank=0,info = &flash_info[0]; bank < CFG_MAX_FLASH_BANKS; ++bank, ++info) { +		for (bank=0,info = &flash_info[0]; bank < CONFIG_SYS_MAX_FLASH_BANKS; ++bank, ++info) {  			if (info->flash_id == FLASH_UNKNOWN) {  				continue;  			} @@ -662,19 +671,19 @@ int flash_sect_protect (int p, ulong addr_first, ulong addr_last)  					s_first[bank], s_last[bank], bank+1);  				protected += s_last[bank] - s_first[bank] + 1;  				for (i=s_first[bank]; i<=s_last[bank]; ++i) { -#if defined(CFG_FLASH_PROTECTION) +#if defined(CONFIG_SYS_FLASH_PROTECTION)  					if (flash_real_protect(info, i, p))  						rcode = 1;  					putc ('.');  #else  					info->protect[i] = p; -#endif	/* CFG_FLASH_PROTECTION */ +#endif	/* CONFIG_SYS_FLASH_PROTECTION */  				}  			}  		} -#if defined(CFG_FLASH_PROTECTION) +#if defined(CONFIG_SYS_FLASH_PROTECTION)  		puts (" done\n"); -#endif	/* CFG_FLASH_PROTECTION */ +#endif	/* CONFIG_SYS_FLASH_PROTECTION */  		printf ("%sProtected %d sectors\n",  			p ? "" : "Un-", protected); @@ -685,7 +694,7 @@ int flash_sect_protect (int p, ulong addr_first, ulong addr_last)  	}  	return rcode;  } -#endif /* CFG_NO_FLASH */ +#endif /* CONFIG_SYS_NO_FLASH */  /**************************************************/ |