[U-Boot] [PATCH] sf: Add SPI_FLASH_4BYTE_MODE_ONLY option to support 4-byte mode

Simon Goldschmidt simon.k.r.goldschmidt at gmail.com
Mon Aug 6 15:15:51 UTC 2018


Stefan Roese <sr at denx.de> schrieb am Mo., 6. Aug. 2018, 16:34:

> Some SPI NOR chips only support 4-byte mode addressing. Here the default
> 3-byte mode does not work and leads to incorrect accesses. Setting this
> option enables the use of such SPI NOR chips, that only support this
> 4-byte mode.
>

I think it would make more sense to enable 4-byte mode or 4-byte opcodes on
all chips with more than 16 mbyte rather than having to select at compile
time.

Simon


> This was noticed on the LinkIt Smart 7688 modul, which is equipped with
> an Macronix MX25L25635F device. But this device does *NOT* support
> switching to 3-byte mode via the EX4B command.
>
> Signed-off-by: Stefan Roese <sr at denx.de>
> Cc: Jagan Teki <jagan at openedev.com>
> ---
>  drivers/mtd/spi/Kconfig       | 9 +++++++++
>  drivers/mtd/spi/sf_internal.h | 5 +++++
>  drivers/mtd/spi/spi_flash.c   | 7 +++++++
>  3 files changed, 21 insertions(+)
>
> diff --git a/drivers/mtd/spi/Kconfig b/drivers/mtd/spi/Kconfig
> index 4484cf8195..5738cd66e8 100644
> --- a/drivers/mtd/spi/Kconfig
> +++ b/drivers/mtd/spi/Kconfig
> @@ -49,6 +49,15 @@ config SF_DUAL_FLASH
>           Enable this option to support two flash memories connected to a
> single
>           controller. Currently Xilinx Zynq qspi supports this.
>
> +config SPI_FLASH_4BYTE_MODE_ONLY
> +       bool "SPI 4-byte mode only supported"
> +       depends on SPI_FLASH
> +       help
> +         Some SPI NOR chips only support 4-byte mode addressing. Here
> +         the default 3-byte mode does not work and leads to incorrect
> +         accesses. Setting this option enables the use of such SPI
> +         NOR chips, that only support this 4-byte mode.
> +
>  if SPI_FLASH
>
>  config SPI_FLASH_ATMEL
> diff --git a/drivers/mtd/spi/sf_internal.h b/drivers/mtd/spi/sf_internal.h
> index 4f63cacc64..78be6e442f 100644
> --- a/drivers/mtd/spi/sf_internal.h
> +++ b/drivers/mtd/spi/sf_internal.h
> @@ -26,7 +26,12 @@ enum spi_nor_option_flags {
>  };
>
>  #define SPI_FLASH_3B_ADDR_LEN          3
> +#define SPI_FLASH_4B_ADDR_LEN          4
> +#ifdef CONFIG_SPI_FLASH_4BYTE_MODE_ONLY
> +#define SPI_FLASH_CMD_LEN              (1 + SPI_FLASH_4B_ADDR_LEN)
> +#else
>  #define SPI_FLASH_CMD_LEN              (1 + SPI_FLASH_3B_ADDR_LEN)
> +#endif
>  #define SPI_FLASH_16MB_BOUN            0x1000000
>
>  /* CFI Manufacture ID's */
> diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
> index c159124259..3b26d8ca88 100644
> --- a/drivers/mtd/spi/spi_flash.c
> +++ b/drivers/mtd/spi/spi_flash.c
> @@ -23,9 +23,16 @@
>  static void spi_flash_addr(u32 addr, u8 *cmd)
>  {
>         /* cmd[0] is actual command */
> +#ifdef CONFIG_SPI_FLASH_4BYTE_MODE_ONLY
> +       cmd[1] = addr >> 24;
> +       cmd[2] = addr >> 16;
> +       cmd[3] = addr >> 8;
> +       cmd[4] = addr >> 0;
> +#else
>         cmd[1] = addr >> 16;
>         cmd[2] = addr >> 8;
>         cmd[3] = addr >> 0;
> +#endif
>  }
>
>  static int read_sr(struct spi_flash *flash, u8 *rs)
> --
> 2.18.0
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot
>


More information about the U-Boot mailing list