mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	cmd_sf: add handler for +len arg for erase command
This patch adds [+]len handler for the erase command that will automatically round up the requested erase length to the flash's sector_size. Signed-off-by: Richard Retanubun <RichardRetanubun@RuggedCom.com> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
		
				
					committed by
					
						 Mike Frysinger
						Mike Frysinger
					
				
			
			
				
	
			
			
			
						parent
						
							f8f0757dcb
						
					
				
				
					commit
					334eb4b02f
				
			| @@ -19,6 +19,47 @@ | |||||||
|  |  | ||||||
| static struct spi_flash *flash; | static struct spi_flash *flash; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * This function computes the length argument for the erase command. | ||||||
|  |  * The length on which the command is to operate can be given in two forms: | ||||||
|  |  * 1. <cmd> offset len  - operate on <'offset',  'len') | ||||||
|  |  * 2. <cmd> offset +len - operate on <'offset',  'round_up(len)') | ||||||
|  |  * If the second form is used and the length doesn't fall on the | ||||||
|  |  * sector boundary, than it will be adjusted to the next sector boundary. | ||||||
|  |  * If it isn't in the flash, the function will fail (return -1). | ||||||
|  |  * Input: | ||||||
|  |  *    arg: length specification (i.e. both command arguments) | ||||||
|  |  * Output: | ||||||
|  |  *    len: computed length for operation | ||||||
|  |  * Return: | ||||||
|  |  *    1: success | ||||||
|  |  *   -1: failure (bad format, bad address). | ||||||
|  |  */ | ||||||
|  | static int sf_parse_len_arg(char *arg, ulong *len) | ||||||
|  | { | ||||||
|  | 	char *ep; | ||||||
|  | 	char round_up_len; /* indicates if the "+length" form used */ | ||||||
|  | 	ulong len_arg; | ||||||
|  |  | ||||||
|  | 	round_up_len = 0; | ||||||
|  | 	if (*arg == '+') { | ||||||
|  | 		round_up_len = 1; | ||||||
|  | 		++arg; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	len_arg = simple_strtoul(arg, &ep, 16); | ||||||
|  | 	if (ep == arg || *ep != '\0') | ||||||
|  | 		return -1; | ||||||
|  |  | ||||||
|  | 	if (round_up_len && flash->sector_size > 0) | ||||||
|  | 		*len = ROUND(len_arg - 1, flash->sector_size); | ||||||
|  | 	else | ||||||
|  | 		*len = len_arg; | ||||||
|  |  | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
| static int do_spi_flash_probe(int argc, char * const argv[]) | static int do_spi_flash_probe(int argc, char * const argv[]) | ||||||
| { | { | ||||||
| 	unsigned int bus = 0; | 	unsigned int bus = 0; | ||||||
| @@ -135,8 +176,9 @@ static int do_spi_flash_erase(int argc, char * const argv[]) | |||||||
| 	offset = simple_strtoul(argv[1], &endp, 16); | 	offset = simple_strtoul(argv[1], &endp, 16); | ||||||
| 	if (*argv[1] == 0 || *endp != 0) | 	if (*argv[1] == 0 || *endp != 0) | ||||||
| 		goto usage; | 		goto usage; | ||||||
| 	len = simple_strtoul(argv[2], &endp, 16); |  | ||||||
| 	if (*argv[2] == 0 || *endp != 0) | 	ret = sf_parse_len_arg(argv[2], &len); | ||||||
|  | 	if (ret != 1) | ||||||
| 		goto usage; | 		goto usage; | ||||||
|  |  | ||||||
| 	ret = spi_flash_erase(flash, offset, len); | 	ret = spi_flash_erase(flash, offset, len); | ||||||
| @@ -148,7 +190,7 @@ static int do_spi_flash_erase(int argc, char * const argv[]) | |||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
| usage: | usage: | ||||||
| 	puts("Usage: sf erase offset len\n"); | 	puts("Usage: sf erase offset [+]len\n"); | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -189,5 +231,6 @@ U_BOOT_CMD( | |||||||
| 	"				  `offset' to memory at `addr'\n" | 	"				  `offset' to memory at `addr'\n" | ||||||
| 	"sf write addr offset len	- write `len' bytes from memory\n" | 	"sf write addr offset len	- write `len' bytes from memory\n" | ||||||
| 	"				  at `addr' to flash at `offset'\n" | 	"				  at `addr' to flash at `offset'\n" | ||||||
| 	"sf erase offset len		- erase `len' bytes from `offset'" | 	"sf erase offset [+]len		- erase `len' bytes from `offset'\n" | ||||||
|  | 	"				  `+len' round up `len' to block size" | ||||||
| ); | ); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user