Skip to content
Snippets Groups Projects
Commit 2ec1a405 authored by Heiko Schocher's avatar Heiko Schocher Committed by Jagan Teki
Browse files

spi, sf: Use offset and size in sf cmd from mtdpartition


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

zynq-uboot> mtdparts add nor0 0x10000@0x0 env
zynq-uboot> sf erase env 0x10000
SF: 65536 bytes @ 0x0 Erased: OK

zynq-uboot> sf write 0x100 env
device 0 offset 0x0, size 0x10000
SF: 65536 bytes @ 0x0 Written: OK

zynq-uboot> sf read 0x40000 env
device 0 offset 0x0, size 0x10000
SF: 65536 bytes @ 0x0 Read: OK

Signed-off-by: default avatarHeiko Schocher <hs@denx.de>
Tested-by: default avatarJagannadh Teki <jteki@openedev.com>
Reviewed-by: default avatarJagannadh Teki <jteki@openedev.com>
parent 09c32807
No related branches found
No related tags found
No related merge requests found
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#include <mapmem.h> #include <mapmem.h>
#include <spi.h> #include <spi.h>
#include <spi_flash.h> #include <spi_flash.h>
#include <jffs2/jffs2.h>
#include <linux/mtd/mtd.h>
#include <asm/io.h> #include <asm/io.h>
#include <dm/device-internal.h> #include <dm/device-internal.h>
...@@ -254,23 +256,21 @@ static int spi_flash_update(struct spi_flash *flash, u32 offset, ...@@ -254,23 +256,21 @@ static int spi_flash_update(struct spi_flash *flash, u32 offset,
static int do_spi_flash_read_write(int argc, char * const argv[]) static int do_spi_flash_read_write(int argc, char * const argv[])
{ {
unsigned long addr; unsigned long addr;
unsigned long offset;
unsigned long len;
void *buf; void *buf;
char *endp; char *endp;
int ret = 1; int ret = 1;
int dev = 0;
loff_t offset, len, maxsize;
if (argc < 4) if (argc < 3)
return -1; return -1;
addr = simple_strtoul(argv[1], &endp, 16); addr = simple_strtoul(argv[1], &endp, 16);
if (*argv[1] == 0 || *endp != 0) if (*argv[1] == 0 || *endp != 0)
return -1; return -1;
offset = simple_strtoul(argv[2], &endp, 16);
if (*argv[2] == 0 || *endp != 0) if (mtd_arg_off_size(argc - 2, &argv[2], &dev, &offset, &len,
return -1; &maxsize, MTD_DEV_TYPE_NOR, flash->size))
len = simple_strtoul(argv[3], &endp, 16);
if (*argv[3] == 0 || *endp != 0)
return -1; return -1;
/* Consistency checking */ /* Consistency checking */
...@@ -309,31 +309,31 @@ static int do_spi_flash_read_write(int argc, char * const argv[]) ...@@ -309,31 +309,31 @@ static int do_spi_flash_read_write(int argc, char * const argv[])
static int do_spi_flash_erase(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 ret;
int dev = 0;
loff_t offset, len, maxsize;
ulong size;
if (argc < 3) if (argc < 3)
return -1; return -1;
offset = simple_strtoul(argv[1], &endp, 16); if (mtd_arg_off(argv[1], &dev, &offset, &len, &maxsize,
if (*argv[1] == 0 || *endp != 0) MTD_DEV_TYPE_NOR, flash->size))
return -1; return -1;
ret = sf_parse_len_arg(argv[2], &len); ret = sf_parse_len_arg(argv[2], &size);
if (ret != 1) if (ret != 1)
return -1; return -1;
/* Consistency checking */ /* Consistency checking */
if (offset + len > flash->size) { if (offset + size > flash->size) {
printf("ERROR: attempting %s past flash size (%#x)\n", printf("ERROR: attempting %s past flash size (%#x)\n",
argv[0], flash->size); argv[0], flash->size);
return 1; return 1;
} }
ret = spi_flash_erase(flash, offset, len); ret = spi_flash_erase(flash, offset, size);
printf("SF: %zu bytes @ %#x Erased: %s\n", (size_t)len, (u32)offset, printf("SF: %zu bytes @ %#x Erased: %s\n", (size_t)size, (u32)offset,
ret ? "ERROR" : "OK"); ret ? "ERROR" : "OK");
return ret == 0 ? 0 : 1; return ret == 0 ? 0 : 1;
...@@ -558,13 +558,17 @@ U_BOOT_CMD( ...@@ -558,13 +558,17 @@ U_BOOT_CMD(
"SPI flash sub-system", "SPI flash sub-system",
"probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus\n" "probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus\n"
" and chip select\n" " and chip select\n"
"sf read addr offset len - read `len' bytes starting at\n" "sf read addr offset|partition len - read `len' bytes starting at\n"
" `offset' to memory at `addr'\n" " `offset' or from start of mtd\n"
"sf write addr offset len - write `len' bytes from memory\n" " `partition'to memory at `addr'\n"
" at `addr' to flash at `offset'\n" "sf write addr offset|partition len - write `len' bytes from memory\n"
"sf erase offset [+]len - erase `len' bytes from `offset'\n" " at `addr' to flash at `offset'\n"
" `+len' round up `len' to block size\n" " or to start of mtd `partition'\n"
"sf update addr offset len - erase and write `len' bytes from memory\n" "sf erase offset|partition [+]len - erase `len' bytes from `offset'\n"
" at `addr' to flash at `offset'" " or from start of mtd `partition'\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'\n"
" or to start of mtd `partition'\n"
SF_TEST_HELP SF_TEST_HELP
); );
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment