[U-Boot] [PATCH v2 3/3] spi, sf: use offset and size in sf cmd from mtdpartition

Heiko Schocher hs at denx.de
Fri Jul 18 06:19:37 CEST 2014


with this patch, it is possible to get the offset and size information
from the mtdpartiton setting in "mtdparts", similiar to the
"nand" commandos.

=> sf
sf - SPI flash sub-system

Usage:
sf probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus
                                  and chip select
sf read addr offset|partition len       - read `len' bytes starting at
                                          `offset' to memory at `addr'
sf write addr offset|partition len      - write `len' bytes from memory
                                          at `addr' to flash at `offset'
sf erase offset|partition [+]len        - erase `len' bytes from `offset'
                                          `+len' round up `len' to block size
sf update addr offset|partition len     - erase and write `len' bytes from memory
                                          at `addr' to flash at `offset'
=>
for example "env" is defined in mtdparts:

=> sf read 13000000 env
device 0 offset 0xd0000, size 0x10000
SF: 65536 bytes @ 0xd0000 Read: OK
=>

Signed-off-by: Heiko Schocher <hs at denx.de>
Cc: Jagannadha Sutradharudu Teki <jagannadh.teki at gmail.com>

---
- changes for v2:
  none

 common/cmd_sf.c | 50 +++++++++++++++++++++++++-------------------------
 1 file changed, 25 insertions(+), 25 deletions(-)

diff --git a/common/cmd_sf.c b/common/cmd_sf.c
index 7653d7e..fc306ee 100644
--- a/common/cmd_sf.c
+++ b/common/cmd_sf.c
@@ -10,6 +10,8 @@
 #include <div64.h>
 #include <malloc.h>
 #include <spi_flash.h>
+#include <jffs2/jffs2.h>
+#include <linux/mtd/mtd.h>
 
 #include <asm/io.h>
 
@@ -244,23 +246,21 @@ static int spi_flash_update(struct spi_flash *flash, u32 offset,
 static int do_spi_flash_read_write(int argc, char * const argv[])
 {
 	unsigned long addr;
-	unsigned long offset;
-	unsigned long len;
 	void *buf;
 	char *endp;
 	int ret = 1;
+	int dev = 0;
+	loff_t offset, len, maxsize;
 
-	if (argc < 4)
+	if (argc < 3)
 		return -1;
 
 	addr = simple_strtoul(argv[1], &endp, 16);
 	if (*argv[1] == 0 || *endp != 0)
 		return -1;
-	offset = simple_strtoul(argv[2], &endp, 16);
-	if (*argv[2] == 0 || *endp != 0)
-		return -1;
-	len = simple_strtoul(argv[3], &endp, 16);
-	if (*argv[3] == 0 || *endp != 0)
+
+	if (arg_off_size(argc - 2, &argv[2], &dev, &offset, &len, &maxsize,
+	    MTD_DEV_TYPE_NOR, flash->size))
 		return -1;
 
 	/* Consistency checking */
@@ -299,31 +299,31 @@ static int do_spi_flash_read_write(int argc, char * const argv[])
 
 static int do_spi_flash_erase(int argc, char * const argv[])
 {
-	unsigned long offset;
-	unsigned long len;
-	char *endp;
 	int ret;
+	int dev = 0;
+	loff_t offset, len, maxsize;
+	ulong size;
 
 	if (argc < 3)
 		return -1;
 
-	offset = simple_strtoul(argv[1], &endp, 16);
-	if (*argv[1] == 0 || *endp != 0)
+	if (arg_off(argv[1], &dev, &offset, &len, &maxsize,
+	    MTD_DEV_TYPE_NOR, flash->size))
 		return -1;
 
-	ret = sf_parse_len_arg(argv[2], &len);
+	ret = sf_parse_len_arg(argv[2], &size);
 	if (ret != 1)
 		return -1;
 
 	/* Consistency checking */
-	if (offset + len > flash->size) {
+	if (offset + size > flash->size) {
 		printf("ERROR: attempting %s past flash size (%#x)\n",
 		       argv[0], flash->size);
 		return 1;
 	}
 
-	ret = spi_flash_erase(flash, offset, len);
-	printf("SF: %zu bytes @ %#x Erased: %s\n", (size_t)len, (u32)offset,
+	ret = spi_flash_erase(flash, offset, size);
+	printf("SF: %zu bytes @ %#x Erased: %s\n", (size_t)size, (u32)offset,
 	       ret ? "ERROR" : "OK");
 
 	return ret == 0 ? 0 : 1;
@@ -545,13 +545,13 @@ U_BOOT_CMD(
 	"SPI flash sub-system",
 	"probe [[bus:]cs] [hz] [mode]	- init flash device on given SPI bus\n"
 	"				  and chip select\n"
-	"sf read addr offset len	- read `len' bytes starting at\n"
-	"				  `offset' to memory at `addr'\n"
-	"sf write addr offset len	- write `len' bytes from memory\n"
-	"				  at `addr' to flash at `offset'\n"
-	"sf erase offset [+]len		- erase `len' bytes from `offset'\n"
-	"				  `+len' round up `len' to block size\n"
-	"sf update addr offset len	- erase and write `len' bytes from memory\n"
-	"				  at `addr' to flash at `offset'"
+	"sf read addr offset|partition len	- read `len' bytes starting at\n"
+	"				          `offset' to memory at `addr'\n"
+	"sf write addr offset|partition len	- write `len' bytes from memory\n"
+	"				          at `addr' to flash at `offset'\n"
+	"sf erase offset|partition [+]len	- erase `len' bytes from `offset'\n"
+	"			            	  `+len' round up `len' to block size\n"
+	"sf update addr offset|partition len	- erase and write `len' bytes from memory\n"
+	"				          at `addr' to flash at `offset'"
 	SF_TEST_HELP
 );
-- 
1.8.3.1



More information about the U-Boot mailing list