spi, sf: add mtdparts feature to spi and sf commands
v3 cover spi, sf: add mtdparts feature to spi and sf commands
This patchserie add the popssibility to define mtd partitions on spi nor flash, and use this settings with the sf commands.
steps:
- add MTD layer driver for spi, original patch from:
http://git.denx.de/?p=u-boot/u-boot-mips.git;a=commitdiff;h=bb246819cdc90493dd7089eaa51b9e639765cced
and addapted it to current mainline.
- move common functions to get offset and size from cmdline nand command to extract offset and size from a mtd partition to common place "drivers/mtd/mtd_uboot.c" maybe another place is better?
- add to the sf command the possibility to use offset and size from the settings in mtdparts
With this patchset, the sf command looks now:
=> 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
=>
There are the followings checkpatch warnings:
CHECK: Alignment should match open parenthesis
#153: FILE: common/cmd_nand.c:217:
+ if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize,
+ MTD_DEV_TYPE_NAND, nand_info[idx].size)) {
CHECK: Alignment should match open parenthesis
#179: FILE: common/cmd_nand.c:557:
+ if (arg_off(argv[3], &dev, &off, &size, &maxsize,
+ MTD_DEV_TYPE_NAND, nand_info[dev].size))
CHECK: Alignment should match open parenthesis
#193: FILE: common/cmd_nand.c:576:
+ if (arg_off_size(argc - 3, argv + 3, &dev, &off, &size,
+ &maxsize, MTD_DEV_TYPE_NAND,
total: 0 errors, 0 warnings, 3 checks, 361 lines checked
NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE NETWORKING_BLOCK_COMMENT_STYLE USLEEP_RANGE
20140714_ml_mtdparts/0002-mtd-nand-move-common-functions-from-cmd_nand.c-to-co.patch has style problems, please review.
I see not, why this warning pops up ...
- changes for v2:
- mtd-spi-add-MTD-layer-driver.patch
- add comment from Daniel Schwierzeck:
fix compile error from original patch with "static inline" rather than "static __maybe_unused"
- changes for v3:
- rebase with d6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
- add comments from scott wood:
- align MTD_DEV_TYPE_NAND correct
- remove unnecessary inline
- rework "jffs2 header" problem later
Daniel Schwierzeck (1):
mtd, spi: add MTD layer driver
Heiko Schocher (2):
mtd, nand: move common functions from cmd_nand.c to common place spi, sf: use offset and size in sf cmd from mtdpartition
README | 3 + common/cmd_nand.c | 140 ++++++++---------------------------------- common/cmd_onenand.c | 19 ++---- common/cmd_sf.c | 59 +++++++++--------- drivers/mtd/Makefile | 4 +- drivers/mtd/mtd_uboot.c | 114 ++++++++++++++++++++++++++++++++++ drivers/mtd/spi/Makefile | 1 + drivers/mtd/spi/sf_internal.h | 13 ++++ drivers/mtd/spi/sf_mtd.c | 104 +++++++++++++++++++++++++++++++ drivers/mtd/spi/sf_probe.c | 5 ++ include/linux/mtd/mtd.h | 7 +++ 11 files changed, 310 insertions(+), 159 deletions(-) create mode 100644 drivers/mtd/mtd_uboot.c create mode 100644 drivers/mtd/spi/sf_mtd.c
Signature · 1 line
1.8.3.1
PATCH v3 1/3 mtd, spi: add MTD layer driver
From: Daniel Schwierzeck <[email protected]>
add MTD layer driver for spi, original patch from:
http://git.denx.de/?p=u-boot/u-boot-mips.git;a=commitdiff;h=bb246819cdc90493dd7089eaa51b9e639765cced
changes from Heiko Schocher against this patch:
- remove compile error if not defining CONFIG_SPI_FLASH_MTD:
LD drivers/mtd/spi/built-in.odrivers/mtd/spi/sf_probe.o: In function `spi_flash_mtd_unregister':/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: multiple definition of spi_flash_mtd_unregister' drivers/mtd/spi/sf_params.o:/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: first defined here drivers/mtd/spi/sf_ops.o: In function spi_flash_mtd_unregister':/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: multiple definition of `spi_flash_mtd_unregister' drivers/mtd/spi/sf_params.o:/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: first defined here make[1]: *** [drivers/mtd/spi/built-in.o] Fehler 1
make: *** [drivers/mtd/spi] Fehler 2
- add a README entry.
- add correct writebufsize, to fit with Linux v3.14 MTD, UBI/UBIFS sync.
---
MAKEALL for ar, mips, powerc compiles clean
- changes for v2:
- add comment from Daniel Schwierzeck:
fix compile error from original patch with "static inline" rather than "static __maybe_unused"
- changes for v3:
rebase with d6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
--- README | 3 ++ common/cmd_sf.c | 9 ++-- drivers/mtd/spi/Makefile | 1 + drivers/mtd/spi/sf_internal.h | 13 ++++++ drivers/mtd/spi/sf_mtd.c | 104 ++++++++++++++++++++++++++++++++++++++++++ drivers/mtd/spi/sf_probe.c | 5 ++ 6 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 drivers/mtd/spi/sf_mtd.c
README +3 -0
@@ -2965,6 +2965,9 @@ CBFS (Coreboot Filesystem) support operation will not execute. The only way to exit this hardware-protected mode is to drive W#/VPP HIGH. + CONFIG_SPI_FLASH_MTD + add MTD translation layer driver. + - SystemACE Support: CONFIG_SYSTEMACE
common/cmd_sf.c +5 -4
@@ -121,16 +121,17 @@ static int do_spi_flash_probe(int argc, char * const argv[])return -1 ; } +if (flash) +spi_flash_free (flash); + new =spi_flash_probe (bus, cs, speed, mode); + flash = new; +if (!new) {printf ("Failed to initialize SPI flash at %u:%u\n" , bus, cs);return 1 ; } -if (flash) -spi_flash_free (flash); - flash = new; -return 0 ; }
drivers/mtd/spi/Makefile +1 -0
@@ -12,6 +12,7 @@ endif obj-$(CONFIG_CMD_SF) += sf.o obj-$(CONFIG_SPI_FLASH) += sf_params.o sf_probe.o sf_ops.o +obj-$(CONFIG_SPI_FLASH_MTD) += sf_mtd.o obj-$(CONFIG_SPI_FRAM_RAMTRON) += ramtron.o obj-$(CONFIG_SPI_FLASH_SANDBOX) += sandbox.o obj-$(CONFIG_SPI_M95XXX) += eeprom_m95xxx.o
drivers/mtd/spi/sf_internal.h +13 -0
@@ -160,4 +160,17 @@ int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,int spi_flash_cmd_read_ops (struct spi_flash *flash,u32 offset,size_t len,void *data); +#ifdef CONFIG_SPI_FLASH_MTD +int spi_flash_mtd_register (struct spi_flash *flash); +void spi_flash_mtd_unregister (void ); +#else +static inline int spi_flash_mtd_register (struct spi_flash *flash) +{ +return 0 ; +} +static inline void spi_flash_mtd_unregister (void ) +{ +} +#endif +#endif /* _SF_INTERNAL_H_ */
drivers/mtd/spi/sf_mtd.c new file +104 -0
104 lines not on this page · raw message
drivers/mtd/spi/sf_probe.c +5 -0
@@ -385,6 +385,10 @@ static struct spi_flash *spi_flash_probe_slave(struct spi_slave *spi)/* Release spi bus */ spi_release_bus (spi); + ret =spi_flash_mtd_register (flash); +if (ret) + goto err_claim_bus; +return flash; err_read_id:
@@ -416,6 +420,7 @@ struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node,void spi_flash_free (struct spi_flash *flash) { +spi_flash_mtd_unregister ();spi_free_slave (flash->spi);free (flash); }
Signature · 1 line
1.8.3.1
PATCH v3 1/3 mtd, spi: add MTD layer driver
Quoted 64 lines · Heiko Schocher
From: Daniel Schwierzeck <[email protected]>
add MTD layer driver for spi, original patch from:
http://git.denx.de/?p=u-boot/u-boot-mips.git;a=commitdiff;h=bb246819cdc90493dd7089eaa51b9e639765ccedchanges from Heiko Schocher against this patch:
- remove compile error if not definingCONFIG_SPI_FLASH_MTD:LD
drivers/mtd/spi/built-in.odrivers/mtd/spi/sf_probe.o: In function `spi_flash_mtd_unregister':/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: multiple definition ofspi_flash_mtd_unregister' drivers/mtd/spi/sf_params.o:/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: first defined here drivers/mtd/spi/sf_ops.o: In functionspi_flash_mtd_unregister':/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: multiple definition of `spi_flash_mtd_unregister' drivers/mtd/spi/sf_params.o:/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: first defined here make[1]: *** [drivers/mtd/spi/built-in.o] Fehler 1
make: *** [drivers/mtd/spi] Fehler 2- add a README entry.
- add correct writebufsize, to fit with Linux v3.14 MTD, UBI/UBIFS sync.Signed-off-by Daniel Schwierzeck <[email protected]>Signed-off-by Heiko Schocher <[email protected]>Cc Jagannadha Sutradharudu Teki <[email protected]>---
MAKEALL for ar, mips, powerc compiles clean- changes for v2:
- add comment from Daniel Schwierzeck:
fix compile error from original patch with "static inline" rather than "static__maybe_unused"
- changes for v3:
rebase withd6c1ffc7d23f4fe4ae8c91101861055b8e1501b6--- README | 3 ++ common/cmd_sf.c | 9 ++-- drivers/mtd/spi/Makefile | 1 + drivers/mtd/spi/sf_internal.h | 13 ++++++ drivers/mtd/spi/sf_mtd.c | 104 ++++++++++++++++++++++++++++++++++++++++++ drivers/mtd/spi/sf_probe.c | 5 ++ 6 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 drivers/mtd/spi/sf_mtd.cREADME +3
-0@@ -2965,6 +2965,9 @@ CBFS (Coreboot Filesystem) support operation will not execute. The only way to exit this hardware-protected mode is to drive W#/VPP HIGH. + CONFIG_SPI_FLASH_MTD + add MTD translation layer driver. + - SystemACE Support: CONFIG_SYSTEMACEcommon/cmd_sf.c +0
-0
common/cmd_sf.c static int do_spi_flash_probe(int argc, char * const argv[]) · line 129
Quoted 9 lines
common/cmd_sf.c +5
-0@@ -121,16 +121,17 @@ static int do_spi_flash_probe(int argc, char * const argv[])return -1 ; } +if (flash) +spi_flash_free (flash); + new =spi_flash_probe (bus, cs, speed, mode); + flash = new; +
Why is this change? I guess it's not related to mtd.
And it's better to add new with global flash only it's probed isn't it?
Quoted 120 lines
common/cmd_sf.c +0
-4if (!new) {printf ("Failed to initialize SPI flash at %u:%u\n" , bus, cs);return 1 ; } -if (flash) -spi_flash_free (flash); - flash = new; -return 0 ; }drivers/mtd/spi/Makefile +1
-0@@ -12,6 +12,7 @@ endif obj-$(CONFIG_CMD_SF) += sf.o obj-$(CONFIG_SPI_FLASH) += sf_params.o sf_probe.o sf_ops.o +obj-$(CONFIG_SPI_FLASH_MTD) += sf_mtd.o obj-$(CONFIG_SPI_FRAM_RAMTRON) += ramtron.o obj-$(CONFIG_SPI_FLASH_SANDBOX) += sandbox.o obj-$(CONFIG_SPI_M95XXX) += eeprom_m95xxx.odrivers/mtd/spi/sf_internal.h +13
-0@@ -160,4 +160,17 @@ int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,int spi_flash_cmd_read_ops (struct spi_flash *flash,u32 offset,size_t len,void *data); +#ifdef CONFIG_SPI_FLASH_MTD +int spi_flash_mtd_register (struct spi_flash *flash); +void spi_flash_mtd_unregister (void ); +#else +static inline int spi_flash_mtd_register (struct spi_flash *flash) +{ +return 0 ; +} +static inline void spi_flash_mtd_unregister (void ) +{ +} +#endif +#endif /* _SF_INTERNAL_H_ */ drivers/mtd/spi/sf_mtd.c new file +68
-0@@ -0,0 +1,104 @@ +/* +* Copyright (C) 2012-2014 Daniel Schwierzeck, daniel.schwierzeck at gmail.com +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#include <common.h> +#include <malloc.h> +#include <asm/errno.h> +#include <linux/mtd/mtd.h> +#include <spi_flash.h> + +static struct mtd_info sf_mtd_info; +static char sf_mtd_name[8 ]; + +static int spi_flash_mtd_erase (struct mtd_info *mtd,struct erase_info *instr) +{ +struct spi_flash *flash = mtd->priv; +int err; + + instr->state =MTD_ERASING ; + + err =spi_flash_erase (flash, instr->addr, instr->len); +if (err) { + instr->state =MTD_ERASE_FAILED ; + instr->fail_addr =MTD_FAIL_ADDR_UNKNOWN ; +return -EIO ; + } + + instr->state =MTD_ERASE_DONE ; +mtd_erase_callback (instr); + +return 0 ; +} + +static int spi_flash_mtd_read (struct mtd_info *mtd,loff_t from,size_t len, +size_t *retlen,u_char *buf) +{ +struct spi_flash *flash = mtd->priv; +int err; + + err =spi_flash_read (flash, from, len, buf); +if (!err) + *retlen = len; + +return err; +} + +static int spi_flash_mtd_write (struct mtd_info *mtd,loff_t to,size_t len, +size_t *retlen,const u_char *buf) +{ +struct spi_flash *flash = mtd->priv; +int err; + + err =spi_flash_write (flash, to, len, buf); +if (!err) + *retlen = len; + +return err; +} + +static void spi_flash_mtd_sync (struct mtd_info *mtd) +{ +} + +static int spi_flash_mtd_number (void ) +{ +#ifdef CONFIG_SYS_MAX_FLASH_BANKS
drivers/mtd/spi/sf_mtd.c line 78
Quoted 10 lines
drivers/mtd/spi/sf_mtd.c new file +10
-0+return CONFIG_SYS_MAX_FLASH_BANKS ; +#else +return 0 ; +#endif +} + +int spi_flash_mtd_register (struct spi_flash *flash) +{ +memset (&sf_mtd_info,0 ,sizeof (sf_mtd_info)); +sprintf (sf_mtd_name,"nor%d" ,spi_flash_mtd_number ());
This is quite not required for sf - like mtd_number is devnum that is maximum number of sf's on the particular board.
We're not dealing with this at this point of time, comments?
Quoted 31 lines
drivers/mtd/spi/sf_mtd.c new file +26
-0+ + sf_mtd_info.name = sf_mtd_name; + sf_mtd_info.type =MTD_NORFLASH ; + sf_mtd_info.flags =MTD_CAP_NORFLASH ; + sf_mtd_info.writesize =1 ; + sf_mtd_info.writebufsize = flash->page_size; + + sf_mtd_info._erase = spi_flash_mtd_erase; + sf_mtd_info._read = spi_flash_mtd_read; + sf_mtd_info._write = spi_flash_mtd_write; + sf_mtd_info._sync = spi_flash_mtd_sync; + + sf_mtd_info.size = flash->size; + sf_mtd_info.priv = flash; + +/* Only uniform flash devices for now */ + sf_mtd_info.numeraseregions =0 ; + sf_mtd_info.erasesize = flash->sector_size; + +return add_mtd_device (&sf_mtd_info); +} + +void spi_flash_mtd_unregister (void ) +{ +del_mtd_device (&sf_mtd_info); +}drivers/mtd/spi/sf_probe.c +0
-0
drivers/mtd/spi/sf_probe.c static struct spi_flash *spi_flash_probe_slave(struct spi_slave *spi) · line 391
Quoted 7 lines
drivers/mtd/spi/sf_probe.c +4
-0@@ -385,6 +385,10 @@ static struct spi_flash *spi_flash_probe_slave(struct spi_slave *spi)/* Release spi bus */ spi_release_bus (spi); + ret =spi_flash_mtd_register (flash); +if (ret) + goto err_claim_bus; +
Be define this code in macro's and place before spi_release_bus()
drivers/mtd/spi/sf_probe.c struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node, · line 423
Quoted 8 lines
drivers/mtd/spi/sf_probe.c +1
-0return flash; err_read_id:@@ -416,6 +420,7 @@ struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node,void spi_flash_free (struct spi_flash *flash) { +spi_flash_mtd_unregister ();
Same ..
Quoted 6 lines
drivers/mtd/spi/sf_probe.c +0
-1spi_free_slave (flash->spi);free (flash); } --1.8.3.1
Code looks straight forward and be define the necessary macro's on new code and please
update the test log on doc/SPI. Mean while I will look for more options.
thanks!
Signature · 1 line
Jagan.
PATCH v3 1/3 mtd, spi: add MTD layer driver
2014-11-04 21:32 GMT+01:00 Jagan Teki <[email protected]>:
Quoted 212 lines · Heiko Schocher
Quoted 64 lines
From: Daniel Schwierzeck <[email protected]>
add MTD layer driver for spi, original patch from:
http://git.denx.de/?p=u-boot/u-boot-mips.git;a=commitdiff;h=bb246819cdc90493dd7089eaa51b9e639765ccedchanges from Heiko Schocher against this patch:
- remove compile error if not definingCONFIG_SPI_FLASH_MTD:LD
drivers/mtd/spi/built-in.odrivers/mtd/spi/sf_probe.o: In function `spi_flash_mtd_unregister':/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: multiple definition ofspi_flash_mtd_unregister' drivers/mtd/spi/sf_params.o:/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: first defined here drivers/mtd/spi/sf_ops.o: In functionspi_flash_mtd_unregister':/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: multiple definition of `spi_flash_mtd_unregister' drivers/mtd/spi/sf_params.o:/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: first defined here make[1]: *** [drivers/mtd/spi/built-in.o] Fehler 1
make: *** [drivers/mtd/spi] Fehler 2- add a README entry.
- add correct writebufsize, to fit with Linux v3.14 MTD, UBI/UBIFS sync.Signed-off-by Daniel Schwierzeck <[email protected]>Signed-off-by Heiko Schocher <[email protected]>Cc Jagannadha Sutradharudu Teki <[email protected]>---
MAKEALL for ar, mips, powerc compiles clean- changes for v2:
- add comment from Daniel Schwierzeck:
fix compile error from original patch with "static inline" rather than "static__maybe_unused"
- changes for v3:
rebase withd6c1ffc7d23f4fe4ae8c91101861055b8e1501b6--- README | 3 ++ common/cmd_sf.c | 9 ++-- drivers/mtd/spi/Makefile | 1 + drivers/mtd/spi/sf_internal.h | 13 ++++++ drivers/mtd/spi/sf_mtd.c | 104 ++++++++++++++++++++++++++++++++++++++++++ drivers/mtd/spi/sf_probe.c | 5 ++ 6 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 drivers/mtd/spi/sf_mtd.cREADME +3
-0@@ -2965,6 +2965,9 @@ CBFS (Coreboot Filesystem) support operation will not execute. The only way to exit this hardware-protected mode is to drive W#/VPP HIGH. + CONFIG_SPI_FLASH_MTD + add MTD translation layer driver. + - SystemACE Support: CONFIG_SYSTEMACEcommon/cmd_sf.c +0
-0common/cmd_sf.c static int do_spi_flash_probe(int argc, char * const argv[]) · line 129
Quoted 9 lines
common/cmd_sf.c +5
-0@@ -121,16 +121,17 @@ static int do_spi_flash_probe(int argc, char * const argv[])return -1 ; } +if (flash) +spi_flash_free (flash); + new =spi_flash_probe (bus, cs, speed, mode); + flash = new; +Why is this change? I guess it's not related to mtd.
And it's better to add new with global flash only it's probed isn't it?Quoted 120 lines
common/cmd_sf.c +0
-4if (!new) {printf ("Failed to initialize SPI flash at %u:%u\n" , bus, cs);return 1 ; } -if (flash) -spi_flash_free (flash); - flash = new; -return 0 ; }drivers/mtd/spi/Makefile +1
-0@@ -12,6 +12,7 @@ endif obj-$(CONFIG_CMD_SF) += sf.o obj-$(CONFIG_SPI_FLASH) += sf_params.o sf_probe.o sf_ops.o +obj-$(CONFIG_SPI_FLASH_MTD) += sf_mtd.o obj-$(CONFIG_SPI_FRAM_RAMTRON) += ramtron.o obj-$(CONFIG_SPI_FLASH_SANDBOX) += sandbox.o obj-$(CONFIG_SPI_M95XXX) += eeprom_m95xxx.odrivers/mtd/spi/sf_internal.h +13
-0@@ -160,4 +160,17 @@ int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,int spi_flash_cmd_read_ops (struct spi_flash *flash,u32 offset,size_t len,void *data); +#ifdef CONFIG_SPI_FLASH_MTD +int spi_flash_mtd_register (struct spi_flash *flash); +void spi_flash_mtd_unregister (void ); +#else +static inline int spi_flash_mtd_register (struct spi_flash *flash) +{ +return 0 ; +} +static inline void spi_flash_mtd_unregister (void ) +{ +} +#endif +#endif /* _SF_INTERNAL_H_ */ drivers/mtd/spi/sf_mtd.c new file +68
-0@@ -0,0 +1,104 @@ +/* +* Copyright (C) 2012-2014 Daniel Schwierzeck, daniel.schwierzeck at gmail.com +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#include <common.h> +#include <malloc.h> +#include <asm/errno.h> +#include <linux/mtd/mtd.h> +#include <spi_flash.h> + +static struct mtd_info sf_mtd_info; +static char sf_mtd_name[8 ]; + +static int spi_flash_mtd_erase (struct mtd_info *mtd,struct erase_info *instr) +{ +struct spi_flash *flash = mtd->priv; +int err; + + instr->state =MTD_ERASING ; + + err =spi_flash_erase (flash, instr->addr, instr->len); +if (err) { + instr->state =MTD_ERASE_FAILED ; + instr->fail_addr =MTD_FAIL_ADDR_UNKNOWN ; +return -EIO ; + } + + instr->state =MTD_ERASE_DONE ; +mtd_erase_callback (instr); + +return 0 ; +} + +static int spi_flash_mtd_read (struct mtd_info *mtd,loff_t from,size_t len, +size_t *retlen,u_char *buf) +{ +struct spi_flash *flash = mtd->priv; +int err; + + err =spi_flash_read (flash, from, len, buf); +if (!err) + *retlen = len; + +return err; +} + +static int spi_flash_mtd_write (struct mtd_info *mtd,loff_t to,size_t len, +size_t *retlen,const u_char *buf) +{ +struct spi_flash *flash = mtd->priv; +int err; + + err =spi_flash_write (flash, to, len, buf); +if (!err) + *retlen = len; + +return err; +} + +static void spi_flash_mtd_sync (struct mtd_info *mtd) +{ +} + +static int spi_flash_mtd_number (void ) +{ +#ifdef CONFIG_SYS_MAX_FLASH_BANKS drivers/mtd/spi/sf_mtd.c line 78
Quoted 10 lines
drivers/mtd/spi/sf_mtd.c new file +10
-0+return CONFIG_SYS_MAX_FLASH_BANKS ; +#else +return 0 ; +#endif +} + +int spi_flash_mtd_register (struct spi_flash *flash) +{ +memset (&sf_mtd_info,0 ,sizeof (sf_mtd_info)); +sprintf (sf_mtd_name,"nor%d" ,spi_flash_mtd_number ());This is quite not required for sf - like
mtd_numberis devnum that is maximum number of sf's on the particular board.
Quoted 1 line
We're not dealing with this at this point of time, comments?
this is needed if you enable CFI-MTD and SF-MTD at the same time (common case on evaluation boards). Because CFI is always initialized in board_init_r() (before SF), it occupies MTD numbers 0 to CONFIG_SYS_MAX_FLASH_BANKS - 1.
Quoted 35 lines
Quoted 35 lines
drivers/mtd/spi/sf_mtd.c new file +26
-0+ + sf_mtd_info.name = sf_mtd_name; + sf_mtd_info.type =MTD_NORFLASH ; + sf_mtd_info.flags =MTD_CAP_NORFLASH ; + sf_mtd_info.writesize =1 ; + sf_mtd_info.writebufsize = flash->page_size; + + sf_mtd_info._erase = spi_flash_mtd_erase; + sf_mtd_info._read = spi_flash_mtd_read; + sf_mtd_info._write = spi_flash_mtd_write; + sf_mtd_info._sync = spi_flash_mtd_sync; + + sf_mtd_info.size = flash->size; + sf_mtd_info.priv = flash; + +/* Only uniform flash devices for now */ + sf_mtd_info.numeraseregions =0 ; + sf_mtd_info.erasesize = flash->sector_size; + +return add_mtd_device (&sf_mtd_info); +} + +void spi_flash_mtd_unregister (void ) +{ +del_mtd_device (&sf_mtd_info); +}drivers/mtd/spi/sf_probe.c +0
-0@@ -385,6 +385,10 @@ static struct spi_flash *spi_flash_probe_slave(struct spi_slave *spi)/* Release spi bus */ spi_release_bus (spi);
Quoted 6 lines
drivers/mtd/spi/sf_probe.c static struct spi_flash *spi_flash_probe_slave(struct spi_slave *spi) · line 391
Quoted 4 lines
drivers/mtd/spi/sf_probe.c +4
-0+ ret =spi_flash_mtd_register (flash); +if (ret) + goto err_claim_bus; +Be define this code in macro's and place before
spi_release_bus()
the defines are already in sf_internal.h. This technique is much more elegant and cleaner than polluting the code with #ifdef's
+#ifdef CONFIG_SPI_FLASH_MTD
+int spi_flash_mtd_register(struct spi_flash *flash); +void spi_flash_mtd_unregister(void);
+#else
+static inline int spi_flash_mtd_register(struct spi_flash *flash) +{
+ return 0;
+}
+static inline void spi_flash_mtd_unregister(void)
+{
+}
+#endif
Quoted 26 lines
drivers/mtd/spi/sf_probe.c struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node, · line 423
Quoted 9 lines
drivers/mtd/spi/sf_probe.c +1
-0return flash; err_read_id:@@ -416,6 +420,7 @@ struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node,void spi_flash_free (struct spi_flash *flash) { +spi_flash_mtd_unregister ();Same ..
Quoted 6 lines
drivers/mtd/spi/sf_probe.c +0
-1spi_free_slave (flash->spi);free (flash); } --1.8.3.1
Code looks straight forward and be define the necessary macro's on new code and please
update the test log on doc/SPI. Mean while I will look for more options.thanks!
--
Jagan.
Signature · 1 line
- Daniel
PATCH v3 1/3 mtd, spi: add MTD layer driver
Hello Jagan, Daniel,
Am 04.11.2014 22:24, schrieb Daniel Schwierzeck:
Quoted 78 lines
2014-11-04 21:32 GMT+01:00 Jagan Teki<[email protected]>:
Quoted 77 lines · Heiko Schocher
Quoted 64 lines
From: Daniel Schwierzeck<[email protected]>
add MTD layer driver for spi, original patch from:
http://git.denx.de/?p=u-boot/u-boot-mips.git;a=commitdiff;h=bb246819cdc90493dd7089eaa51b9e639765ccedchanges from Heiko Schocher against this patch:
- remove compile error if not definingCONFIG_SPI_FLASH_MTD:LD
drivers/mtd/spi/built-in.odrivers/mtd/spi/sf_probe.o: In function `spi_flash_mtd_unregister':/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: multiple definition ofspi_flash_mtd_unregister' drivers/mtd/spi/sf_params.o:/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: first defined here drivers/mtd/spi/sf_ops.o: In functionspi_flash_mtd_unregister':/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: multiple definition of `spi_flash_mtd_unregister' drivers/mtd/spi/sf_params.o:/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: first defined here make[1]: *** [drivers/mtd/spi/built-in.o] Fehler 1
make: *** [drivers/mtd/spi] Fehler 2- add a README entry.
- add correct writebufsize, to fit with Linux v3.14 MTD, UBI/UBIFS sync.Signed-off-by Daniel Schwierzeck<[email protected]>Signed-off-by Heiko Schocher<[email protected]>Cc Jagannadha Sutradharudu Teki<[email protected]>---
MAKEALL for ar, mips, powerc compiles clean- changes for v2:
- add comment from Daniel Schwierzeck:
fix compile error from original patch with "static inline" rather than "static__maybe_unused"
- changes for v3:rebase with d6c1ffc7d23f4fe4ae8c91101861055b8e1501b6 --- README | 3 ++ common/cmd_sf.c | 9 ++-- drivers/mtd/spi/Makefile | 1 + drivers/mtd/spi/sf_internal.h | 13 ++++++ drivers/mtd/spi/sf_mtd.c | 104 ++++++++++++++++++++++++++++++++++++++++++ drivers/mtd/spi/sf_probe.c | 5 ++ 6 files changed, 131 insertions(+), 4 deletions(-)create mode 100644
drivers/mtd/spi/sf_mtd.cREADME +3
-0@@ -2965,6 +2965,9 @@ CBFS (Coreboot Filesystem) support operation will not execute. The only way to exit this hardware-protected mode is to drive W#/VPP HIGH. + CONFIG_SPI_FLASH_MTD + add MTD translation layer driver. + - SystemACE Support: CONFIG_SYSTEMACEcommon/cmd_sf.c +0
-0common/cmd_sf.c static int do_spi_flash_probe(int argc, char * const argv[]) · line 129
Quoted 9 lines
common/cmd_sf.c +5
-0@@ -121,16 +121,17 @@ static int do_spi_flash_probe(int argc, char * const argv[])return -1 ; } +if (flash) +spi_flash_free (flash); + new =spi_flash_probe (bus, cs, speed, mode); + flash = new; +Why is this change? I guess it's not related to mtd.
And it's better to add new with global flash only it's probed isn't it?
If we have probed a flash, and we probe another flash on maybe another bus/cs, we should free the old ... or?
And if the new probe failed, we have to update the "flash" pointer in any case ...
Quoted 134 lines
Quoted 134 lines
Quoted 120 lines
common/cmd_sf.c +0
-4if (!new) {printf ("Failed to initialize SPI flash at %u:%u\n" , bus, cs);return 1 ; } -if (flash) -spi_flash_free (flash); - flash = new; -return 0 ; }drivers/mtd/spi/Makefile +1
-0@@ -12,6 +12,7 @@ endif obj-$(CONFIG_CMD_SF) += sf.o obj-$(CONFIG_SPI_FLASH) += sf_params.o sf_probe.o sf_ops.o +obj-$(CONFIG_SPI_FLASH_MTD) += sf_mtd.o obj-$(CONFIG_SPI_FRAM_RAMTRON) += ramtron.o obj-$(CONFIG_SPI_FLASH_SANDBOX) += sandbox.o obj-$(CONFIG_SPI_M95XXX) += eeprom_m95xxx.odrivers/mtd/spi/sf_internal.h +13
-0@@ -160,4 +160,17 @@ int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,int spi_flash_cmd_read_ops (struct spi_flash *flash,u32 offset,size_t len,void *data); +#ifdef CONFIG_SPI_FLASH_MTD +int spi_flash_mtd_register (struct spi_flash *flash); +void spi_flash_mtd_unregister (void ); +#else +static inline int spi_flash_mtd_register (struct spi_flash *flash) +{ +return 0 ; +} +static inline void spi_flash_mtd_unregister (void ) +{ +} +#endif +#endif /* _SF_INTERNAL_H_ */ drivers/mtd/spi/sf_mtd.c new file +68
-0@@ -0,0 +1,104 @@ +/* +* Copyright (C) 2012-2014 Daniel Schwierzeck, daniel.schwierzeck at gmail.com +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#include <common.h> +#include <malloc.h> +#include <asm/errno.h> +#include <linux/mtd/mtd.h> +#include <spi_flash.h> + +static struct mtd_info sf_mtd_info; +static char sf_mtd_name[8 ]; + +static int spi_flash_mtd_erase (struct mtd_info *mtd,struct erase_info *instr) +{ +struct spi_flash *flash = mtd->priv; +int err; + + instr->state =MTD_ERASING ; + + err =spi_flash_erase (flash, instr->addr, instr->len); +if (err) { + instr->state =MTD_ERASE_FAILED ; + instr->fail_addr =MTD_FAIL_ADDR_UNKNOWN ; +return -EIO ; + } + + instr->state =MTD_ERASE_DONE ; +mtd_erase_callback (instr); + +return 0 ; +} + +static int spi_flash_mtd_read (struct mtd_info *mtd,loff_t from,size_t len, +size_t *retlen,u_char *buf) +{ +struct spi_flash *flash = mtd->priv; +int err; + + err =spi_flash_read (flash, from, len, buf); +if (!err) + *retlen = len; + +return err; +} + +static int spi_flash_mtd_write (struct mtd_info *mtd,loff_t to,size_t len, +size_t *retlen,const u_char *buf) +{ +struct spi_flash *flash = mtd->priv; +int err; + + err =spi_flash_write (flash, to, len, buf); +if (!err) + *retlen = len; + +return err; +} + +static void spi_flash_mtd_sync (struct mtd_info *mtd) +{ +} + +static int spi_flash_mtd_number (void ) +{ +#ifdef CONFIG_SYS_MAX_FLASH_BANKS drivers/mtd/spi/sf_mtd.c line 78
Quoted 10 lines
drivers/mtd/spi/sf_mtd.c new file +10
-0+return CONFIG_SYS_MAX_FLASH_BANKS ; +#else +return 0 ; +#endif +} + +int spi_flash_mtd_register (struct spi_flash *flash) +{ +memset (&sf_mtd_info,0 ,sizeof (sf_mtd_info)); +sprintf (sf_mtd_name,"nor%d" ,spi_flash_mtd_number ());This is quite not required for sf - like
mtd_numberis devnum that is maximum number of sf's on the particular board.
Quoted 6 lines
Quoted 1 line
We're not dealing with this at this point of time, comments?
this is needed if you enable CFI-MTD and SF-MTD at the same time (common case on evaluation boards). Because CFI is always initialized in
board_init_r()(before SF), it occupies MTD numbers 0 toCONFIG_SYS_MAX_FLASH_BANKS- 1.
exactly! Thanks for clarifying.
Quoted 46 lines
Quoted 34 lines
Quoted 34 lines
drivers/mtd/spi/sf_mtd.c new file +26
-0+ + sf_mtd_info.name = sf_mtd_name; + sf_mtd_info.type =MTD_NORFLASH ; + sf_mtd_info.flags =MTD_CAP_NORFLASH ; + sf_mtd_info.writesize =1 ; + sf_mtd_info.writebufsize = flash->page_size; + + sf_mtd_info._erase = spi_flash_mtd_erase; + sf_mtd_info._read = spi_flash_mtd_read; + sf_mtd_info._write = spi_flash_mtd_write; + sf_mtd_info._sync = spi_flash_mtd_sync; + + sf_mtd_info.size = flash->size; + sf_mtd_info.priv = flash; + +/* Only uniform flash devices for now */ + sf_mtd_info.numeraseregions =0 ; + sf_mtd_info.erasesize = flash->sector_size; + +return add_mtd_device (&sf_mtd_info); +} + +void spi_flash_mtd_unregister (void ) +{ +del_mtd_device (&sf_mtd_info); +}drivers/mtd/spi/sf_probe.c +0
-0@@ -385,6 +385,10 @@ static struct spi_flash *spi_flash_probe_slave(struct spi_slave *spi)/* Release spi bus */ spi_release_bus (spi);Quoted 6 lines
drivers/mtd/spi/sf_probe.c static struct spi_flash *spi_flash_probe_slave(struct spi_slave *spi) · line 391
Quoted 4 lines
drivers/mtd/spi/sf_probe.c +4
-0+ ret =spi_flash_mtd_register (flash); +if (ret) + goto err_claim_bus; +Be define this code in macro's and place before
spi_release_bus()the defines are already in
sf_internal.h. This technique is much more elegant and cleaner than polluting the code with #ifdef'sdrivers/mtd/spi/sf_internal.h +2
-0+#ifdef CONFIG_SPI_FLASH_MTD +int spi_flash_mtd_register (struct spi_flash *flash);
drivers/mtd/spi/sf_internal.h int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd, · line 174
Quoted 10 lines
drivers/mtd/spi/sf_internal.h +10
-0+void spi_flash_mtd_unregister (void ); +#else +static inline int spi_flash_mtd_register (struct spi_flash *flash) +{ +return 0 ; +} +static inline void spi_flash_mtd_unregister (void ) +{ +} +#endif
Yep.
Quoted 19 lines
Quoted 19 lines
drivers/mtd/spi/sf_probe.c struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node, · line 423
Quoted 9 lines
drivers/mtd/spi/sf_probe.c +1
-0return flash; err_read_id:@@ -416,6 +420,7 @@ struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node,void spi_flash_free (struct spi_flash *flash) { +spi_flash_mtd_unregister ();Same ..
Quoted 6 lines
drivers/mtd/spi/sf_probe.c +0
-1spi_free_slave (flash->spi);free (flash); } --1.8.3.1
Quoted 2 lines
Quoted 2 lines
Code looks straight forward and be define the necessary macro's on new code and please
I am here on Daniels side ... do we really want to introduce here macros?
Quoted 1 line
Quoted 1 line
update the test log on doc/SPI. Mean while I will look for more options.
What do you mean exactly?
Thanks for the review!
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
PATCH v3 2/3 mtd, nand: move common functions from cmd_nand.c to common place
In reply to Heiko Schochermove common functions from cmd_nand.c (for calculating offset and size from cmdline paramter) to common place, so they could used from other commands which use mtd partitions.
For onenand the arg_off_size() is left in common/cmd_onenand.c. It should use now the common arg_off() function, but as I could not test onenand I let it there ...
---
- changes for v2:
none
- changes for v3:
- add comments from scott wood:
- align MTD_DEV_TYPE_NAND correct
- remove unnecessary inline
- rework "jffs2 header" problem later
- rebase with d6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
--- common/cmd_nand.c | 140 +++++++++--------------------------------------- common/cmd_onenand.c | 19 +++---- drivers/mtd/Makefile | 4 +- drivers/mtd/mtd_uboot.c | 114 +++++++++++++++++++++++++++++++++++++++ include/linux/mtd/mtd.h | 7 +++ 5 files changed, 154 insertions(+), 130 deletions(-) create mode 100644 drivers/mtd/mtd_uboot.c
common/cmd_nand.c +25 -115
@@ -133,115 +133,6 @@ static int set_dev(int dev)return 0 ; } -static inline int str2off (const char *p,loff_t *num) -{ -char *endptr; - - *num =simple_strtoull (p, &endptr,16 ); -return *p !='\0' && *endptr =='\0' ; -} - -static inline int str2long (const char *p,ulong *num) -{ -char *endptr; - - *num =simple_strtoul (p, &endptr,16 ); -return *p !='\0' && *endptr =='\0' ; -} - -static int get_part (const char *partname,int *idx,loff_t *off,loff_t *size, -loff_t *maxsize) -{ -#ifdef CONFIG_CMD_MTDPARTS -struct mtd_device *dev; -struct part_info *part; -u8 pnum; -int ret; - - ret =mtdparts_init (); -if (ret) -return ret; - - ret =find_dev_and_part (partname, &dev, &pnum, &part); -if (ret) -return ret; - -if (dev->id->type !=MTD_DEV_TYPE_NAND ) { -puts ("not a NAND device\n" ); -return -1 ; - } - - *off = part->offset; - *size = part->size; - *maxsize = part->size; - *idx = dev->id->num; - - ret =set_dev (*idx); -if (ret) -return ret; - -return 0 ; -#else -puts ("offset is not a number\n" ); -return -1 ; -#endif -} - -static int arg_off (const char *arg,int *idx,loff_t *off,loff_t *size, -loff_t *maxsize) -{ -if (!str2off (arg, off)) -return get_part (arg, idx, off, size, maxsize); - -if (*off >= nand_info[*idx].size) { -puts ("Offset exceeds device limit\n" ); -return -1 ; - } - - *maxsize = nand_info[*idx].size - *off; - *size = *maxsize; -return 0 ; -} - -static int arg_off_size (int argc,char *const argv[],int *idx, -loff_t *off,loff_t *size,loff_t *maxsize) -{ -int ret; - -if (argc ==0 ) { - *off =0 ; - *size = nand_info[*idx].size; - *maxsize = *size; - goto print; - } - - ret =arg_off (argv[0 ], idx, off, size, maxsize); -if (ret) -return ret; - -if (argc ==1 ) - goto print; - -if (!str2off (argv[1 ], size)) { -printf ("'%s' is not a number\n" , argv[1 ]); -return -1 ; - } - -if (*size > *maxsize) { -puts ("Size exceeds partition or device limit\n" ); -return -1 ; - } - -print: -printf ("device %d " , *idx); -if (*size == nand_info[*idx].size) -puts ("whole chip\n" ); -else -printf ("offset 0x%llx, size 0x%llx\n" , - (unsigned long long )*off, (unsigned long long )*size); -return 0 ; -} -#ifdef CONFIG_CMD_NAND_LOCK_UNLOCK static void print_status (ulong start,ulong end,ulong erasesize,int status) {
@@ -322,7 +213,12 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[]) goto usage;/* We don't care about size, or maxsize. */ -if (arg_off (argv[2 ], &idx, &addr, &maxsize, &maxsize)) { +if (arg_off (argv[2 ], &idx, &addr, &maxsize, &maxsize, +MTD_DEV_TYPE_NAND , nand_info[idx].size)) { +puts ("Offset or partition name expected\n" ); +return 1 ; + } +if (set_dev (idx)) {puts ("Offset or partition name expected\n" );return 1 ; }
@@ -592,7 +488,10 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])printf ("\nNAND %s: " , cmd);/* skip first two or three arguments, look for offset and size */ if (arg_off_size (argc - o, argv + o, &dev, &off, &size, - &maxsize) !=0 ) + &maxsize,MTD_DEV_TYPE_NAND , nand_info[dev].size) !=0 ) +return 1 ; + +if (set_dev (dev))return 1 ; nand = &nand_info[dev];
@@ -654,7 +553,11 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])if (s && !strcmp (s,".raw" )) { raw =1 ; -if (arg_off (argv[3 ], &dev, &off, &size, &maxsize)) +if (arg_off (argv[3 ], &dev, &off, &size, &maxsize, +MTD_DEV_TYPE_NAND , nand_info[dev].size)) +return 1 ; + +if (set_dev (dev))return 1 ;if (argc >4 && !str2long (argv[4 ], &pagecount)) {
@@ -669,8 +572,12 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) rwsize = pagecount * (nand->writesize + nand->oobsize); }else { -if (arg_off_size (argc -3 , argv +3 , &dev, - &off, &size, &maxsize) !=0 ) +if (arg_off_size (argc -3 , argv +3 , &dev, &off, &size, + &maxsize,MTD_DEV_TYPE_NAND , + nand_info[dev].size) !=0 ) +return 1 ; + +if (set_dev (dev))return 1 ;/* size is unspecified */
@@ -816,7 +723,10 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) allexcept =1 ;if (arg_off_size (argc -2 , argv +2 , &dev, &off, &size, - &maxsize) <0 ) + &maxsize,MTD_DEV_TYPE_NAND , nand_info[dev].size) <0 ) +return 1 ; + +if (set_dev (dev))return 1 ;if (!nand_unlock (&nand_info[dev], off, size, allexcept)) {
common/cmd_onenand.c +6 -13
@@ -24,15 +24,8 @@ static struct mtd_info *mtd;static loff_t next_ofs;static loff_t skip_ofs; -static inline int str2long (char *p,ulong *num) -{ -char *endptr; - - *num =simple_strtoul (p, &endptr,16 ); -return (*p !='\0' && *endptr =='\0' ) ?1 :0 ; -} - -static int arg_off_size (int argc,char *const argv[],ulong *off,size_t *size) +static int arg_off_size_onenand (int argc,char *const argv[],ulong *off, +size_t *size) {if (argc >=1 ) {if (!(str2long (argv[0 ], off))) {
@@ -399,7 +392,7 @@ static int do_onenand_read(cmd_tbl_t * cmdtp, int flag, int argc, char * const a addr = (ulong )simple_strtoul (argv[1 ],NULL ,16 );printf ("\nOneNAND read: " ); -if (arg_off_size (argc -2 , argv +2 , &ofs, &len) !=0 ) +if (arg_off_size_onenand (argc -2 , argv +2 , &ofs, &len) !=0 )return 1 ; ret =onenand_block_read (ofs, len, &retlen, (u8 *)addr, oob);
@@ -425,7 +418,7 @@ static int do_onenand_write(cmd_tbl_t * cmdtp, int flag, int argc, char * const addr = (ulong )simple_strtoul (argv[1 ],NULL ,16 );printf ("\nOneNAND write: " ); -if (arg_off_size (argc -2 , argv +2 , &ofs, &len) !=0 ) +if (arg_off_size_onenand (argc -2 , argv +2 , &ofs, &len) !=0 )return 1 ; ret =onenand_block_write (ofs, len, &retlen, (u8 *)addr, withoob);
@@ -461,7 +454,7 @@ static int do_onenand_erase(cmd_tbl_t * cmdtp, int flag, int argc, char * constprintf ("\nOneNAND erase: " );/* skip first two or three arguments, look for offset and size */ -if (arg_off_size (argc, argv, &ofs, &len) !=0 ) +if (arg_off_size_onenand (argc, argv, &ofs, &len) !=0 )return 1 ; ret =onenand_block_erase (ofs, len, force);
@@ -486,7 +479,7 @@ static int do_onenand_test(cmd_tbl_t * cmdtp, int flag, int argc, char * const aprintf ("\nOneNAND test: " );/* skip first two or three arguments, look for offset and size */ -if (arg_off_size (argc -1 , argv +1 , &ofs, &len) !=0 ) +if (arg_off_size_onenand (argc -1 , argv +1 , &ofs, &len) !=0 )return 1 ; ret =onenand_block_test (ofs, len);
drivers/mtd/Makefile +2 -2
@@ -5,8 +5,8 @@ # SPDX-License-Identifier: GPL-2.0+ # -ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND))) -obj-y += mtdcore.o +ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)$(CONFIG_CMD_SF))) +obj-y += mtdcore.o mtd_uboot.o endif obj-$(CONFIG_MTD_PARTITIONS) += mtdpart.o obj-$(CONFIG_MTD_CONCAT) += mtdconcat.o
drivers/mtd/mtd_uboot.c new file +114 -0
114 lines not on this page · raw message
include/linux/mtd/mtd.h +7 -0
@@ -483,5 +483,12 @@ int add_mtd_device(struct mtd_info *mtd);int del_mtd_device (struct mtd_info *mtd);int add_mtd_partitions (struct mtd_info *,const struct mtd_partition *,int );int del_mtd_partitions (struct mtd_info *); + +int str2off (const char *p,loff_t *num); +int str2long (const char *p,ulong *num); +int arg_off (const char *arg,int *idx,loff_t *off,loff_t *size, +loff_t *maxsize,int devtype,int chipsize); +int arg_off_size (int argc,char *const argv[],int *idx,loff_t *off, +loff_t *size,loff_t *maxsize,int devtype,int chipsize);#endif #endif /* __MTD_MTD_H__ */
Signature · 1 line
1.8.3.1
PATCH v3 2/3 mtd, nand: move common functions from cmd_nand.c to common place
Hi Heiko Schocher,
Nice pick -
Quoted 248 lines · Heiko Schocher
move common functions from
cmd_nand.c(for calculating offset and size from cmdline paramter) to common place, so they could used from other commands which use mtd partitions.For onenand the
arg_off_size()is left incommon/cmd_onenand.c. It should use now the commonarg_off()function, but as I could not test onenand I let it there ...Signed-off-by Heiko Schocher <[email protected]>Cc Scott Wood <[email protected]>Cc Tom Rini <[email protected]>---
- changes for v2:
none
- changes for v3:
- add comments from scott wood:
- alignMTD_DEV_TYPE_NANDcorrect
- remove unnecessary inline
- rework "jffs2 header" problem later
- rebase withd6c1ffc7d23f4fe4ae8c91101861055b8e1501b6--- common/cmd_nand.c | 140 +++++++++--------------------------------------- common/cmd_onenand.c | 19 +++---- drivers/mtd/Makefile | 4 +- drivers/mtd/mtd_uboot.c | 114 +++++++++++++++++++++++++++++++++++++++ include/linux/mtd/mtd.h | 7 +++ 5 files changed, 154 insertions(+), 130 deletions(-) create mode 100644 drivers/mtd/mtd_uboot.ccommon/cmd_nand.c +25
-115@@ -133,115 +133,6 @@ static int set_dev(int dev)return 0 ; } -static inline int str2off (const char *p,loff_t *num) -{ -char *endptr; - - *num =simple_strtoull (p, &endptr,16 ); -return *p !='\0' && *endptr =='\0' ; -} - -static inline int str2long (const char *p,ulong *num) -{ -char *endptr; - - *num =simple_strtoul (p, &endptr,16 ); -return *p !='\0' && *endptr =='\0' ; -} - -static int get_part (const char *partname,int *idx,loff_t *off,loff_t *size, -loff_t *maxsize) -{ -#ifdef CONFIG_CMD_MTDPARTS -struct mtd_device *dev; -struct part_info *part; -u8 pnum; -int ret; - - ret =mtdparts_init (); -if (ret) -return ret; - - ret =find_dev_and_part (partname, &dev, &pnum, &part); -if (ret) -return ret; - -if (dev->id->type !=MTD_DEV_TYPE_NAND ) { -puts ("not a NAND device\n" ); -return -1 ; - } - - *off = part->offset; - *size = part->size; - *maxsize = part->size; - *idx = dev->id->num; - - ret =set_dev (*idx); -if (ret) -return ret; - -return 0 ; -#else -puts ("offset is not a number\n" ); -return -1 ; -#endif -} - -static int arg_off (const char *arg,int *idx,loff_t *off,loff_t *size, -loff_t *maxsize) -{ -if (!str2off (arg, off)) -return get_part (arg, idx, off, size, maxsize); - -if (*off >= nand_info[*idx].size) { -puts ("Offset exceeds device limit\n" ); -return -1 ; - } - - *maxsize = nand_info[*idx].size - *off; - *size = *maxsize; -return 0 ; -} - -static int arg_off_size (int argc,char *const argv[],int *idx, -loff_t *off,loff_t *size,loff_t *maxsize) -{ -int ret; - -if (argc ==0 ) { - *off =0 ; - *size = nand_info[*idx].size; - *maxsize = *size; - goto print; - } - - ret =arg_off (argv[0 ], idx, off, size, maxsize); -if (ret) -return ret; - -if (argc ==1 ) - goto print; - -if (!str2off (argv[1 ], size)) { -printf ("'%s' is not a number\n" , argv[1 ]); -return -1 ; - } - -if (*size > *maxsize) { -puts ("Size exceeds partition or device limit\n" ); -return -1 ; - } - -print: -printf ("device %d " , *idx); -if (*size == nand_info[*idx].size) -puts ("whole chip\n" ); -else -printf ("offset 0x%llx, size 0x%llx\n" , - (unsigned long long )*off, (unsigned long long )*size); -return 0 ; -} -#ifdef CONFIG_CMD_NAND_LOCK_UNLOCK static void print_status (ulong start,ulong end,ulong erasesize,int status) {@@ -322,7 +213,12 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[]) goto usage;/* We don't care about size, or maxsize. */ -if (arg_off (argv[2 ], &idx, &addr, &maxsize, &maxsize)) { +if (arg_off (argv[2 ], &idx, &addr, &maxsize, &maxsize, +MTD_DEV_TYPE_NAND , nand_info[idx].size)) { +puts ("Offset or partition name expected\n" ); +return 1 ; + } +if (set_dev (idx)) {puts ("Offset or partition name expected\n" );return 1 ; }@@ -592,7 +488,10 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])printf ("\nNAND %s: " , cmd);/* skip first two or three arguments, look for offset and size */ if (arg_off_size (argc - o, argv + o, &dev, &off, &size, - &maxsize) !=0 ) + &maxsize,MTD_DEV_TYPE_NAND , nand_info[dev].size) !=0 ) +return 1 ; + +if (set_dev (dev))return 1 ; nand = &nand_info[dev];@@ -654,7 +553,11 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])if (s && !strcmp (s,".raw" )) { raw =1 ; -if (arg_off (argv[3 ], &dev, &off, &size, &maxsize)) +if (arg_off (argv[3 ], &dev, &off, &size, &maxsize, +MTD_DEV_TYPE_NAND , nand_info[dev].size)) +return 1 ; + +if (set_dev (dev))return 1 ;if (argc >4 && !str2long (argv[4 ], &pagecount)) {@@ -669,8 +572,12 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) rwsize = pagecount * (nand->writesize + nand->oobsize); }else { -if (arg_off_size (argc -3 , argv +3 , &dev, - &off, &size, &maxsize) !=0 ) +if (arg_off_size (argc -3 , argv +3 , &dev, &off, &size, + &maxsize,MTD_DEV_TYPE_NAND , + nand_info[dev].size) !=0 ) +return 1 ; + +if (set_dev (dev))return 1 ;/* size is unspecified */ @@ -816,7 +723,10 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) allexcept =1 ;if (arg_off_size (argc -2 , argv +2 , &dev, &off, &size, - &maxsize) <0 ) + &maxsize,MTD_DEV_TYPE_NAND , nand_info[dev].size) <0 ) +return 1 ; + +if (set_dev (dev))return 1 ;if (!nand_unlock (&nand_info[dev], off, size, allexcept)) {common/cmd_onenand.c +3
-10@@ -24,15 +24,8 @@ static struct mtd_info *mtd;static loff_t next_ofs;static loff_t skip_ofs; -static inline int str2long (char *p,ulong *num) -{ -char *endptr; - - *num =simple_strtoul (p, &endptr,16 ); -return (*p !='\0' && *endptr =='\0' ) ?1 :0 ; -} - -static int arg_off_size (int argc,char *const argv[],ulong *off,size_t *size) +static int arg_off_size_onenand (int argc,char *const argv[],ulong *off, +size_t *size) {if (argc >=1 ) {if (!(str2long (argv[0 ], off))) {@@ -399,7 +392,7 @@ static int do_onenand_read(cmd_tbl_t * cmdtp, int flag, int argc, char * const a addr = (ulong )simple_strtoul (argv[1 ],NULL ,16 );printf ("\nOneNAND read: " ); -if (arg_off_size (argc -2 , argv +2 , &ofs, &len) !=0 ) +if (arg_off_size_onenand (argc -2 , argv +2 , &ofs, &len) !=0 )return 1 ; ret =onenand_block_read (ofs, len, &retlen, (u8 *)addr, oob);
common/cmd_onenand.c static int do_onenand_write(cmd_tbl_t * cmdtp, int flag, int argc, char * const · line 421
Quoted 5 lines
common/cmd_onenand.c +1
-1@@ -425,7 +418,7 @@ static int do_onenand_write(cmd_tbl_t * cmdtp, int flag, int argc, char * const addr = (ulong )simple_strtoul (argv[1 ],NULL ,16 );printf ("\nOneNAND write: " ); -if (arg_off_size (argc -2 , argv +2 , &ofs, &len) !=0 ) +if (arg_off_size_onenand (argc -2 , argv +2 , &ofs, &len) !=0 )
Is this a new function call arg_off_size_onenand again, i guess it's common call arg_off_size()
Please check?
Quoted 26 lines
common/cmd_onenand.c +2
-2return 1 ; ret =onenand_block_write (ofs, len, &retlen, (u8 *)addr, withoob);@@ -461,7 +454,7 @@ static int do_onenand_erase(cmd_tbl_t * cmdtp, int flag, int argc, char * constprintf ("\nOneNAND erase: " );/* skip first two or three arguments, look for offset and size */ -if (arg_off_size (argc, argv, &ofs, &len) !=0 ) +if (arg_off_size_onenand (argc, argv, &ofs, &len) !=0 )return 1 ; ret =onenand_block_erase (ofs, len, force);@@ -486,7 +479,7 @@ static int do_onenand_test(cmd_tbl_t * cmdtp, int flag, int argc, char * const aprintf ("\nOneNAND test: " );/* skip first two or three arguments, look for offset and size */ -if (arg_off_size (argc -1 , argv +1 , &ofs, &len) !=0 ) +if (arg_off_size_onenand (argc -1 , argv +1 , &ofs, &len) !=0 )return 1 ; ret =onenand_block_test (ofs, len);drivers/mtd/Makefile +0
-0
drivers/mtd/Makefile line 9
Quoted 7 lines
drivers/mtd/Makefile +2
-2@@ -5,8 +5,8 @@ # SPDX-License-Identifier: GPL-2.0+ # -ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND))) -obj-y += mtdcore.o +ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)$(CONFIG_CMD_SF))) +obj-y += mtdcore.o mtd_uboot.o
I'm thinking its better to be this file in common instead of drivers/mtd because this more reusable code
for command stuff instead of mtd core.
And name something like mtd_common or make sense to appear command's usage instead of
main mtd stuff, IMHO.
Quoted 143 lines
drivers/mtd/Makefile +0
-0endif obj-$(CONFIG_MTD_PARTITIONS) += mtdpart.o obj-$(CONFIG_MTD_CONCAT) += mtdconcat.odrivers/mtd/mtd_uboot.c new file +114
-0@@ -0,0 +1,114 @@ +/* +* (C) Copyright 2014 +* Heiko Schocher, DENX Software Engineering, hs at denx.de. +* +* SPDX-License-Identifier: GPL-2.0+ +*/ +#include <common.h> +#include <linux/mtd/mtd.h> +#include <jffs2/jffs2.h> + +int str2off (const char *p,loff_t *num) +{ +char *endptr; + + *num =simple_strtoull (p, &endptr,16 ); +return *p !='\0' && *endptr =='\0' ; +} + +int str2long (const char *p,ulong *num) +{ +char *endptr; + + *num =simple_strtoul (p, &endptr,16 ); +return *p !='\0' && *endptr =='\0' ; +} + +static int get_part (const char *partname,int *idx,loff_t *off,loff_t *size, +loff_t *maxsize,int devtype) +{ +#ifdef CONFIG_CMD_MTDPARTS +struct mtd_device *dev; +struct part_info *part; +u8 pnum; +int ret; + + ret =mtdparts_init (); +if (ret) +return ret; + + ret =find_dev_and_part (partname, &dev, &pnum, &part); +if (ret) +return ret; + +if (dev->id->type != devtype) { +printf ("not same typ %d != %d\n" , dev->id->type, devtype); +return -1 ; + } + + *off = part->offset; + *size = part->size; + *maxsize = part->size; + *idx = dev->id->num; + +return 0 ; +#else +puts ("offset is not a number\n" ); +return -1 ; +#endif +} + +int arg_off (const char *arg,int *idx,loff_t *off,loff_t *size, +loff_t *maxsize,int devtype,int chipsize) +{ +if (!str2off (arg, off)) +return get_part (arg, idx, off, size, maxsize, devtype); + +if (*off >= chipsize) { +puts ("Offset exceeds device limit\n" ); +return -1 ; + } + + *maxsize = chipsize - *off; + *size = *maxsize; +return 0 ; +} + +int arg_off_size (int argc,char *const argv[],int *idx,loff_t *off, +loff_t *size,loff_t *maxsize,int devtype,int chipsize) +{ +int ret; + +if (argc ==0 ) { + *off =0 ; + *size = chipsize; + *maxsize = *size; + goto print; + } + + ret =arg_off (argv[0 ], idx, off, size, maxsize, devtype, chipsize); +if (ret) +return ret; + +if (argc ==1 ) + goto print; + +if (!str2off (argv[1 ], size)) { +printf ("'%s' is not a number\n" , argv[1 ]); +return -1 ; + } + +if (*size > *maxsize) { +puts ("Size exceeds partition or device limit\n" ); +return -1 ; + } + +print: +printf ("device %d " , *idx); +if (*size == chipsize) +puts ("whole chip\n" ); +else +printf ("offset 0x%llx, size 0x%llx\n" , + (unsigned long long )*off, (unsigned long long )*size); +return 0 ; +}include/linux/mtd/mtd.h +7
-1@@ -483,5 +483,12 @@ int add_mtd_device(struct mtd_info *mtd);int del_mtd_device (struct mtd_info *mtd);int add_mtd_partitions (struct mtd_info *,const struct mtd_partition *,int );int del_mtd_partitions (struct mtd_info *); + +int str2off (const char *p,loff_t *num); +int str2long (const char *p,ulong *num); +int arg_off (const char *arg,int *idx,loff_t *off,loff_t *size, +loff_t *maxsize,int devtype,int chipsize); +int arg_off_size (int argc,char *const argv[],int *idx,loff_t *off, +loff_t *size,loff_t *maxsize,int devtype,int chipsize);#endif #endif /* __MTD_MTD_H__ */ --1.8.3.1
Quoted 4 lines
_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot
thanks!
Signature · 1 line
Jagan.
PATCH v3 2/3 mtd, nand: move common functions from cmd_nand.c to common place
Hello Jagan,
Am 04.11.2014 21:55, schrieb Jagan Teki:
Quoted 255 lines
Hi Heiko Schocher,
Nice pick -
Quoted 250 lines · Heiko Schocher
move common functions from
cmd_nand.c(for calculating offset and size from cmdline paramter) to common place, so they could used from other commands which use mtd partitions.For onenand the
arg_off_size()is left incommon/cmd_onenand.c. It should use now the commonarg_off()function, but as I could not test onenand I let it there ...Signed-off-by Heiko Schocher<[email protected]>Cc Scott Wood<[email protected]>Cc Tom Rini<[email protected]>---
- changes for v2:
none
- changes for v3:
- add comments from scott wood:
- alignMTD_DEV_TYPE_NANDcorrect
- remove unnecessary inline
- rework "jffs2 header" problem later
- rebase withd6c1ffc7d23f4fe4ae8c91101861055b8e1501b6--- common/cmd_nand.c | 140 +++++++++--------------------------------------- common/cmd_onenand.c | 19 +++---- drivers/mtd/Makefile | 4 +- drivers/mtd/mtd_uboot.c | 114 +++++++++++++++++++++++++++++++++++++++ include/linux/mtd/mtd.h | 7 +++ 5 files changed, 154 insertions(+), 130 deletions(-)create mode 100644
drivers/mtd/mtd_uboot.ccommon/cmd_nand.c +25
-115@@ -133,115 +133,6 @@ static int set_dev(int dev)return 0 ; } -static inline int str2off (const char *p,loff_t *num) -{ -char *endptr; - - *num =simple_strtoull (p,&endptr,16 ); -return *p !='\0' && *endptr =='\0' ; -} - -static inline int str2long (const char *p,ulong *num) -{ -char *endptr; - - *num =simple_strtoul (p,&endptr,16 ); -return *p !='\0' && *endptr =='\0' ; -} - -static int get_part (const char *partname,int *idx,loff_t *off,loff_t *size, -loff_t *maxsize) -{ -#ifdef CONFIG_CMD_MTDPARTS -struct mtd_device *dev; -struct part_info *part; -u8 pnum; -int ret; - - ret =mtdparts_init (); -if (ret) -return ret; - - ret =find_dev_and_part (partname,&dev,&pnum,&part); -if (ret) -return ret; - -if (dev->id->type !=MTD_DEV_TYPE_NAND ) { -puts ("not a NAND device\n" ); -return -1 ; - } - - *off = part->offset; - *size = part->size; - *maxsize = part->size; - *idx = dev->id->num; - - ret =set_dev (*idx); -if (ret) -return ret; - -return 0 ; -#else -puts ("offset is not a number\n" ); -return -1 ; -#endif -} - -static int arg_off (const char *arg,int *idx,loff_t *off,loff_t *size, -loff_t *maxsize) -{ -if (!str2off (arg, off)) -return get_part (arg, idx, off, size, maxsize); - -if (*off>= nand_info[*idx].size) { -puts ("Offset exceeds device limit\n" ); -return -1 ; - } - - *maxsize = nand_info[*idx].size - *off; - *size = *maxsize; -return 0 ; -} - -static int arg_off_size (int argc,char *const argv[],int *idx, -loff_t *off,loff_t *size,loff_t *maxsize) -{ -int ret; - -if (argc ==0 ) { - *off =0 ; - *size = nand_info[*idx].size; - *maxsize = *size; - goto print; - } - - ret =arg_off (argv[0 ], idx, off, size, maxsize); -if (ret) -return ret; - -if (argc ==1 ) - goto print; - -if (!str2off (argv[1 ], size)) { -printf ("'%s' is not a number\n" , argv[1 ]); -return -1 ; - } - -if (*size> *maxsize) { -puts ("Size exceeds partition or device limit\n" ); -return -1 ; - } - -print: -printf ("device %d " , *idx); -if (*size == nand_info[*idx].size) -puts ("whole chip\n" ); -else -printf ("offset 0x%llx, size 0x%llx\n" , - (unsigned long long )*off, (unsigned long long )*size); -return 0 ; -} -#ifdef CONFIG_CMD_NAND_LOCK_UNLOCK static void print_status (ulong start,ulong end,ulong erasesize,int status) {@@ -322,7 +213,12 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[]) goto usage;/* We don't care about size, or maxsize. */ -if (arg_off (argv[2 ],&idx,&addr,&maxsize,&maxsize)) { +if (arg_off (argv[2 ],&idx,&addr,&maxsize,&maxsize, +MTD_DEV_TYPE_NAND , nand_info[idx].size)) { +puts ("Offset or partition name expected\n" ); +return 1 ; + } +if (set_dev (idx)) {puts ("Offset or partition name expected\n" );return 1 ; }@@ -592,7 +488,10 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])printf ("\nNAND %s: " , cmd);/* skip first two or three arguments, look for offset and size */ if (arg_off_size (argc - o, argv + o,&dev,&off,&size, -&maxsize) !=0 ) +&maxsize,MTD_DEV_TYPE_NAND , nand_info[dev].size) !=0 ) +return 1 ; + +if (set_dev (dev))return 1 ; nand =&nand_info[dev];@@ -654,7 +553,11 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])if (s&& !strcmp (s,".raw" )) { raw =1 ; -if (arg_off (argv[3 ],&dev,&off,&size,&maxsize)) +if (arg_off (argv[3 ],&dev,&off,&size,&maxsize, +MTD_DEV_TYPE_NAND , nand_info[dev].size)) +return 1 ; + +if (set_dev (dev))return 1 ;if (argc>4 && !str2long (argv[4 ],&pagecount)) {@@ -669,8 +572,12 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) rwsize = pagecount * (nand->writesize + nand->oobsize); }else { -if (arg_off_size (argc -3 , argv +3 ,&dev, -&off,&size,&maxsize) !=0 ) +if (arg_off_size (argc -3 , argv +3 ,&dev,&off,&size, +&maxsize,MTD_DEV_TYPE_NAND , + nand_info[dev].size) !=0 ) +return 1 ; + +if (set_dev (dev))return 1 ;/* size is unspecified */ @@ -816,7 +723,10 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) allexcept =1 ;if (arg_off_size (argc -2 , argv +2 ,&dev,&off,&size, -&maxsize)<0 ) +&maxsize,MTD_DEV_TYPE_NAND , nand_info[dev].size)<0 ) +return 1 ; + +if (set_dev (dev))return 1 ;if (!nand_unlock (&nand_info[dev], off, size, allexcept)) {common/cmd_onenand.c +3
-10@@ -24,15 +24,8 @@ static struct mtd_info *mtd;static loff_t next_ofs;static loff_t skip_ofs; -static inline int str2long (char *p,ulong *num) -{ -char *endptr; - - *num =simple_strtoul (p,&endptr,16 ); -return (*p !='\0' && *endptr =='\0' ) ?1 :0 ; -} - -static int arg_off_size (int argc,char *const argv[],ulong *off,size_t *size) +static int arg_off_size_onenand (int argc,char *const argv[],ulong *off, +size_t *size) {if (argc>=1 ) {if (!(str2long (argv[0 ], off))) {@@ -399,7 +392,7 @@ static int do_onenand_read(cmd_tbl_t * cmdtp, int flag, int argc, char * const a addr = (ulong )simple_strtoul (argv[1 ],NULL ,16 );printf ("\nOneNAND read: " ); -if (arg_off_size (argc -2 , argv +2 ,&ofs,&len) !=0 ) +if (arg_off_size_onenand (argc -2 , argv +2 ,&ofs,&len) !=0 )return 1 ; ret =onenand_block_read (ofs, len,&retlen, (u8 *)addr, oob);@@ -425,7 +418,7 @@ static int do_onenand_write(cmd_tbl_t * cmdtp, int flag, int argc, char * const addr = (ulong )simple_strtoul (argv[1 ],NULL ,16 );
Quoted 7 lines
common/cmd_onenand.c static int do_onenand_write(cmd_tbl_t * cmdtp, int flag, int argc, char * const · line 421
Quoted 3 lines
common/cmd_onenand.c +1
-1printf ("\nOneNAND write: " ); -if (arg_off_size (argc -2 , argv +2 ,&ofs,&len) !=0 ) +if (arg_off_size_onenand (argc -2 , argv +2 ,&ofs,&len) !=0 )Is this a new function call
arg_off_size_onenandagain, i guess it's common callarg_off_size()
Please check?
The arg_off_size() differs from the arg_off_size_onenand(), thats the reason why I let the "arg_off_size_onenand()" in ./common/cmd_onenand.c
I have no board with onenand availiable for testing, so it is to risky to me, to change the code in ./common/cmd_onenand.c
This should be done from someone, which can really test it!
Quoted 38 lines
Quoted 26 lines
common/cmd_onenand.c +2
-2return 1 ; ret =onenand_block_write (ofs, len,&retlen, (u8 *)addr, withoob);@@ -461,7 +454,7 @@ static int do_onenand_erase(cmd_tbl_t * cmdtp, int flag, int argc, char * constprintf ("\nOneNAND erase: " );/* skip first two or three arguments, look for offset and size */ -if (arg_off_size (argc, argv,&ofs,&len) !=0 ) +if (arg_off_size_onenand (argc, argv,&ofs,&len) !=0 )return 1 ; ret =onenand_block_erase (ofs, len, force);@@ -486,7 +479,7 @@ static int do_onenand_test(cmd_tbl_t * cmdtp, int flag, int argc, char * const aprintf ("\nOneNAND test: " );/* skip first two or three arguments, look for offset and size */ -if (arg_off_size (argc -1 , argv +1 ,&ofs,&len) !=0 ) +if (arg_off_size_onenand (argc -1 , argv +1 ,&ofs,&len) !=0 )return 1 ; ret =onenand_block_test (ofs, len);drivers/mtd/Makefile +0
-0drivers/mtd/Makefile line 9
Quoted 7 lines
drivers/mtd/Makefile +2
-2@@ -5,8 +5,8 @@ # SPDX-License-Identifier: GPL-2.0+ # -ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND))) -obj-y += mtdcore.o +ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)$(CONFIG_CMD_SF))) +obj-y += mtdcore.o mtd_uboot.oI'm thinking its better to be this file in common instead of
drivers/mtdbecause this more reusable code
for command stuff instead of mtd core.
Quoted 3 lines
And name something like
mtd_commonor make sense to appear command's usage instead of
main mtd stuff, IMHO.
Currently this is only possible on mtd partitions ... for example:
if ((*off + *size) > mtd->size) {
printf("total chip size (0x%llx) exceeded!\n", mtd->size);
return -1;
}
if (*size == mtd->size)
puts("whole chip\n");This works only for mtd devices ... so it should be in drivers/mtd ... the name of the file ... Hmm... I have no real preference ...
"mtd_uboot.c"
"mtd_common.c"
"mtd_uboot_common.c"
What do others think?
[...]
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
PATCH v3 3/3 spi, sf: use offset and size in sf cmd from mtdpartition
In reply to Heiko Schocherwith 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
=>
---
- changes for v2:
none
- changes for v3:
rebase with d6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
--- common/cmd_sf.c | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-)
common/cmd_sf.c +25 -25
@@ -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 );
Signature · 1 line
1.8.3.1
v3 cover spi, sf: add mtdparts feature to spi and sf commands
In reply to Heiko SchocherHello Jagannadha Sutradharudu Teki,
Am 05.09.2014 07:38, schrieb Heiko Schocher:
Quoted 81 lines
This patchserie add the popssibility to define mtd partitions on spi nor flash, and use this settings with the sf commands.
steps:
- add MTD layer driver for spi, original patch from:
http://git.denx.de/?p=u-boot/u-boot-mips.git;a=commitdiff;h=bb246819cdc90493dd7089eaa51b9e639765ccedand addapted it to current mainline.
- move common functions to get offset and size from cmdline nand command to extract offset and size from a mtd partition to common place "
drivers/mtd/mtd_uboot.c" maybe another place is better?- add to the sf command the possibility to use offset and size from the settings in mtdparts
With this patchset, the sf command looks now:
=> sf
sf - SPI flash sub-systemUsage:
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 ataddr'
sf write addr offset|partition len - write `len' bytes from memory
ataddr' to flash atoffset'
sf erase offset|partition [+]len - eraselen' bytes fromoffset'
+len' round uplen' to block size
sf update addr offset|partition len - erase and write `len' bytes from memory
ataddr' to flash atoffset'
=>
for example "env" is defined in mtdparts:=> sf read 13000000 env
device 0 offset0xd0000, size0x10000
SF: 65536 bytes @0xd0000Read: OK
=>There are the followings checkpatch warnings:
CHECK: Alignment should match open parenthesis
#153: FILE:common/cmd_nand.c:217:(quoted diff) +2
-0+ if (arg_off(argv[2],&idx,&addr,&maxsize,&maxsize, + MTD_DEV_TYPE_NAND, nand_info[idx].size)) {CHECK: Alignment should match open parenthesis
#179: FILE:common/cmd_nand.c:557:(quoted diff) +2
-0+ if (arg_off(argv[3],&dev,&off,&size,&maxsize, + MTD_DEV_TYPE_NAND, nand_info[dev].size))CHECK: Alignment should match open parenthesis
#193: FILE:common/cmd_nand.c:576:
+ if (arg_off_size(argc - 3, argv + 3,&dev,&off,&size,
+&maxsize,MTD_DEV_TYPE_NAND,total: 0 errors, 0 warnings, 3 checks, 361 lines checked
NOTE: Ignored message types:
COMPLEX_MACROCONSIDER_KSTRTOMINMAXMULTISTATEMENT_MACRO_USE_DO_WHILENETWORKING_BLOCK_COMMENT_STYLEUSLEEP_RANGE
20140714_ml_mtdparts/0002-mtd-nand-move-common-functions-from-cmd_nand.c-to-co.patchhas style problems, please review.I see not, why this warning pops up ...
- changes for v2:
- mtd-spi-add-MTD-layer-driver.patch
- add comment from Daniel Schwierzeck:
fix compile error from original patch with "static inline" rather than "static__maybe_unused"
- changes for v3:
- rebase withd6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
- add comments from scott wood:
- alignMTD_DEV_TYPE_NANDcorrect
- remove unnecessary inline
- rework "jffs2 header" problem later
Quoted 4 lines
Cc Scott Wood<[email protected]>Cc Tom Rini<[email protected]>Cc Daniel Schwierzeck<[email protected]>Cc Jagannadha Sutradharudu Teki<[email protected]>
ping? Do you have any objections against this patchseries, or do you think it is ok?
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
v3 cover spi, sf: add mtdparts feature to spi and sf commands
Quoted 94 lines · Heiko Schocher
Hello Jagannadha Sutradharudu Teki,
Am 05.09.2014 07:38, schrieb Heiko Schocher:
Quoted 90 lines
This patchserie add the popssibility to define mtd partitions on spi nor flash, and use this settings with the sf commands.
steps:
- add MTD layer driver for spi, original patch from:
http://git.denx.de/?p=u-boot/u-boot-mips.git;a=commitdiff;h=bb246819cdc90493dd7089eaa51b9e639765cced
and addapted it to current mainline.
- move common functions to get offset and size from cmdline nand command to extract offset and size from a mtd partition to common place "
drivers/mtd/mtd_uboot.c" maybe another place is better?- add to the sf command the possibility to use offset and size from the settings in mtdparts
With this patchset, the sf command looks now:
=> sf
sf - SPI flash sub-systemUsage:
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 ataddr'
sf write addr offset|partition len - write `len' bytes from memory
ataddr' to flash atoffset'
sf erase offset|partition [+]len - eraselen' bytes fromoffset'
+len' round uplen' to block
size
sf update addr offset|partition len - erase and write `len' bytes from
memory
ataddr' to flash atoffset'
=>
for example "env" is defined in mtdparts:=> sf read 13000000 env
device 0 offset0xd0000, size0x10000
SF: 65536 bytes @0xd0000Read: OK
=>There are the followings checkpatch warnings:
CHECK: Alignment should match open parenthesis
#153: FILE:common/cmd_nand.c:217:(quoted diff) +2
-0+ if (arg_off(argv[2],&idx,&addr,&maxsize,&maxsize, + MTD_DEV_TYPE_NAND, nand_info[idx].size)) {CHECK: Alignment should match open parenthesis
#179: FILE:common/cmd_nand.c:557:(quoted diff) +2
-0+ if (arg_off(argv[3],&dev,&off,&size,&maxsize, + MTD_DEV_TYPE_NAND, nand_info[dev].size))CHECK: Alignment should match open parenthesis
#193: FILE:common/cmd_nand.c:576:
+ if (arg_off_size(argc - 3, argv +
3,&dev,&off,&size,
+&maxsize,MTD_DEV_TYPE_NAND,total: 0 errors, 0 warnings, 3 checks, 361 lines checked
NOTE: Ignored message types:
COMPLEX_MACROCONSIDER_KSTRTOMINMAXMULTISTATEMENT_MACRO_USE_DO_WHILENETWORKING_BLOCK_COMMENT_STYLEUSLEEP_RANGE
20140714_ml_mtdparts/0002-mtd-nand-move-common-functions-from-cmd_nand.c-to-co.patchhas style problems, please review.I see not, why this warning pops up ...
- changes for v2:
- mtd-spi-add-MTD-layer-driver.patch
- add comment from Daniel Schwierzeck:
fix compile error from original patch with "static inline" rather than "static__maybe_unused"
- changes for v3:
- rebase withd6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
- add comments from scott wood:
- alignMTD_DEV_TYPE_NANDcorrect
- remove unnecessary inline
- rework "jffs2 header" problem later
Quoted 8 lines
Quoted 4 lines
Cc Scott Wood<[email protected]>Cc Tom Rini<[email protected]>Cc Daniel Schwierzeck<[email protected]>Cc Jagannadha Sutradharudu Teki<[email protected]>ping? Do you have any objections against this patchseries, or do you think it is ok?
Please wait for dm-spi to be happen first, so-that we sync again this mtd on top of that.
thanks!
Signature · 1 line
Jagan.
v3 cover spi, sf: add mtdparts feature to spi and sf commands
Hello Jagan,
Am 09.10.2014 12:38, schrieb Jagan Teki:
Quoted 101 lines · Heiko Schocher
Quoted 100 lines
Hello Jagannadha Sutradharudu Teki,
Am 05.09.2014 07:38, schrieb Heiko Schocher:
Quoted 94 lines
This patchserie add the popssibility to define mtd partitions on spi nor flash, and use this settings with the sf commands.
steps:
- add MTD layer driver for spi, original patch from:
http://git.denx.de/?p=u-boot/u-boot-mips.git;a=commitdiff;h=bb246819cdc90493dd7089eaa51b9e639765cced
and addapted it to current mainline.
- move common functions to get offset and size from cmdline nand command to extract offset and size from a mtd partition to common place "
drivers/mtd/mtd_uboot.c" maybe another place is better?- add to the sf command the possibility to use offset and size from the settings in mtdparts
With this patchset, the sf command looks now:
=> sf
sf - SPI flash sub-systemUsage:
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 ataddr'
sf write addr offset|partition len - write `len' bytes from memory
ataddr' to flash atoffset'
sf erase offset|partition [+]len - eraselen' bytes fromoffset'
+len' round uplen' to block
size
sf update addr offset|partition len - erase and write `len' bytes from
memory
ataddr' to flash atoffset'
=>
for example "env" is defined in mtdparts:=> sf read 13000000 env
device 0 offset0xd0000, size0x10000
SF: 65536 bytes @0xd0000Read: OK
=>There are the followings checkpatch warnings:
CHECK: Alignment should match open parenthesis
#153: FILE:common/cmd_nand.c:217:(quoted diff) +2
-0+ if (arg_off(argv[2],&idx,&addr,&maxsize,&maxsize, + MTD_DEV_TYPE_NAND, nand_info[idx].size)) {CHECK: Alignment should match open parenthesis
#179: FILE:common/cmd_nand.c:557:(quoted diff) +2
-0+ if (arg_off(argv[3],&dev,&off,&size,&maxsize, + MTD_DEV_TYPE_NAND, nand_info[dev].size))CHECK: Alignment should match open parenthesis
#193: FILE:common/cmd_nand.c:576:
+ if (arg_off_size(argc - 3, argv +
3,&dev,&off,&size,
+&maxsize,MTD_DEV_TYPE_NAND,total: 0 errors, 0 warnings, 3 checks, 361 lines checked
NOTE: Ignored message types:
COMPLEX_MACROCONSIDER_KSTRTOMINMAXMULTISTATEMENT_MACRO_USE_DO_WHILENETWORKING_BLOCK_COMMENT_STYLEUSLEEP_RANGE
20140714_ml_mtdparts/0002-mtd-nand-move-common-functions-from-cmd_nand.c-to-co.patchhas style problems, please review.I see not, why this warning pops up ...
- changes for v2:
- mtd-spi-add-MTD-layer-driver.patch
- add comment from Daniel Schwierzeck:
fix compile error from original patch with "static inline" rather than "static__maybe_unused"
- changes for v3:
- rebase withd6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
- add comments from scott wood:
- alignMTD_DEV_TYPE_NANDcorrect
- remove unnecessary inline
- rework "jffs2 header" problem laterCc Scott Wood<[email protected]>Cc Tom Rini<[email protected]>Cc Daniel Schwierzeck<[email protected]>Cc Jagannadha Sutradharudu Teki<[email protected]>
Quoted 5 lines
Quoted 2 lines
ping? Do you have any objections against this patchseries, or do you think it is ok?
Please wait for dm-spi to be happen first, so-that we sync again this mtd on top of that.
I did just a rebase for this patchset with current ML ... but I lost track of the patches, for which we are waiting ... Are this patches now in ML (so I can resend a next version)?
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany