SPI nor drivers refactor
authorGeorge Harris <george@luminairecoffee.com>
Fri, 17 Aug 2012 00:35:39 +0000 (17:35 -0700)
committerFreddie Chopin <freddie.chopin@gmail.com>
Wed, 26 Sep 2012 16:17:21 +0000 (16:17 +0000)
Moved common SPI flash driver code (device table,
common commands) into flash/nor/spi.c and spi.h.
Updated flash/nor/stmsmi.c to reflect this refactor.

Change-Id: I141644b0af71d3835f29f06dd15b505a00e5b6ec
Signed-off-by: George Harris <george@luminairecoffee.com>
Reviewed-on: http://openocd.zylin.com/782
Tested-by: jenkins
Reviewed-by: Aurelien Jacobs <aurel@gnuage.org>
Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
src/flash/nor/Makefile.am
src/flash/nor/spi.c [new file with mode: 0644]
src/flash/nor/spi.h [new file with mode: 0644]
src/flash/nor/stmsmi.c

index fc646022aec0098bf007081ca5883ee2d86203a0..d26aa2037d41ebf532521840fe6288c4a3a39d6a 100644 (file)
@@ -22,6 +22,7 @@ NOR_DRIVERS = \
        non_cfi.c \
        ocl.c \
        pic32mx.c \
+       spi.c \
        stmsmi.c \
        stellaris.c \
        stm32f1x.c \
@@ -42,6 +43,7 @@ noinst_HEADERS = \
        driver.h \
        imp.h \
        non_cfi.h \
-       ocl.h
+       ocl.h \
+       spi.h
 
 MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
diff --git a/src/flash/nor/spi.c b/src/flash/nor/spi.c
new file mode 100644 (file)
index 0000000..7046edd
--- /dev/null
@@ -0,0 +1,70 @@
+/***************************************************************************
+ *   Copyright (C) 2012 by George Harris                                   *
+ *   george@luminairecoffee.com                                            *
+ *                                                                         *
+ *   Copyright (C) 2010 by Antonio Borneo                                  *
+ *   borneo.antonio@gmail.com                                              *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "imp.h"
+#include "spi.h"
+#include <jtag/jtag.h>
+
+ /* Shared table of known SPI flash devices for SPI-based flash drivers. Taken
+  * from device datasheets and Linux SPI flash drivers. */
+struct flash_device flash_devices[] = {
+       /* name, erase_cmd, chip_erase_cmd, device_id, pagesize, sectorsize, size_in_bytes */
+       FLASH_ID("st m25p05",      0xd8, 0xC7, 0x00102020, 0x80,  0x8000,  0x10000),
+       FLASH_ID("st m25p10",      0xd8, 0xC7, 0x00112020, 0x80,  0x8000,  0x20000),
+       FLASH_ID("st m25p20",      0xd8, 0xC7, 0x00122020, 0x100, 0x10000, 0x40000),
+       FLASH_ID("st m25p40",      0xd8, 0xC7, 0x00132020, 0x100, 0x10000, 0x80000),
+       FLASH_ID("st m25p80",      0xd8, 0xC7, 0x00142020, 0x100, 0x10000, 0x100000),
+       FLASH_ID("st m25p16",      0xd8, 0xC7, 0x00152020, 0x100, 0x10000, 0x200000),
+       FLASH_ID("st m25p32",      0xd8, 0xC7, 0x00162020, 0x100, 0x10000, 0x400000),
+       FLASH_ID("st m25p64",      0xd8, 0xC7, 0x00172020, 0x100, 0x10000, 0x800000),
+       FLASH_ID("st m25p128",     0xd8, 0xC7, 0x00182020, 0x100, 0x40000, 0x1000000),
+       FLASH_ID("st m45pe10",     0xd8, 0xd8, 0x00114020, 0x100, 0x10000, 0x20000),
+       FLASH_ID("st m45pe20",     0xd8, 0xd8, 0x00124020, 0x100, 0x10000, 0x40000),
+       FLASH_ID("st m45pe40",     0xd8, 0xd8, 0x00134020, 0x100, 0x10000, 0x80000),
+       FLASH_ID("st m45pe80",     0xd8, 0xd8, 0x00144020, 0x100, 0x10000, 0x100000),
+       FLASH_ID("sp s25fl004",    0xd8, 0xC7, 0x00120201, 0x100, 0x10000, 0x80000),
+       FLASH_ID("sp s25fl008",    0xd8, 0xC7, 0x00130201, 0x100, 0x10000, 0x100000),
+       FLASH_ID("sp s25fl016",    0xd8, 0xC7, 0x00140201, 0x100, 0x10000, 0x200000),
+       FLASH_ID("sp s25fl032",    0xd8, 0xC7, 0x00150201, 0x100, 0x10000, 0x400000),
+       FLASH_ID("sp s25fl064",    0xd8, 0xC7, 0x00160201, 0x100, 0x10000, 0x800000),
+       FLASH_ID("atmel 25f512",   0x52, 0xC7, 0x0065001f, 0x80,  0x8000,  0x10000),
+       FLASH_ID("atmel 25f1024",  0x52, 0x62, 0x0060001f, 0x100, 0x8000,  0x20000),
+       FLASH_ID("atmel 25f2048",  0x52, 0x62, 0x0063001f, 0x100, 0x10000, 0x40000),
+       FLASH_ID("atmel 25f4096",  0x52, 0x62, 0x0064001f, 0x100, 0x10000, 0x80000),
+       FLASH_ID("atmel 25fs040",  0xd7, 0xC7, 0x0004661f, 0x100, 0x10000, 0x80000),
+       FLASH_ID("mac 25l512",     0xd8, 0xC7, 0x001020c2, 0x010, 0x10000, 0x10000),
+       FLASH_ID("mac 25l1005",    0xd8, 0xd8, 0x001120c2, 0x010, 0x10000, 0x20000),
+       FLASH_ID("mac 25l2005",    0xd8, 0xC7, 0x001220c2, 0x010, 0x10000, 0x40000),
+       FLASH_ID("mac 25l4005",    0xd8, 0xC7, 0x001320c2, 0x010, 0x10000, 0x80000),
+       FLASH_ID("mac 25l8005",    0xd8, 0xC7, 0x001420c2, 0x010, 0x10000, 0x100000),
+       FLASH_ID("mac 25l1605",    0xd8, 0xC7, 0x001520c2, 0x100, 0x10000, 0x200000),
+       FLASH_ID("mac 25l3205",    0xd8, 0xC7, 0x001620c2, 0x100, 0x10000, 0x400000),
+       FLASH_ID("mac 25l6405",    0xd8, 0xC7, 0x001720c2, 0x100, 0x10000, 0x800000),
+       FLASH_ID("win w25q32dw",   0xd8, 0xC7, 0x001660ef, 0x100, 0x10000, 0x400000),
+       FLASH_ID(NULL,             0,    0,        0,          0,     0,       0)
+};
diff --git a/src/flash/nor/spi.h b/src/flash/nor/spi.h
new file mode 100644 (file)
index 0000000..319b00b
--- /dev/null
@@ -0,0 +1,58 @@
+/***************************************************************************
+ *   Copyright (C) 2012 by George Harris                                   *
+ *   george@luminairecoffee.com                                            *
+ *                                                                         *
+ *   Copyright (C) 2010 by Antonio Borneo                                  *
+ *   borneo.antonio@gmail.com                                              *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+/* data structure to maintain flash ids from different vendors */
+struct flash_device {
+       char *name;
+       uint8_t erase_cmd;
+       uint8_t chip_erase_cmd;
+       uint32_t device_id;
+       uint32_t pagesize;
+       unsigned long sectorsize;
+       unsigned long size_in_bytes;
+};
+
+#define FLASH_ID(n, es, ces, id, psize, ssize, size) \
+{                              \
+       .name = n,              \
+       .erase_cmd = es,        \
+       .chip_erase_cmd = ces,  \
+       .device_id = id,        \
+       .pagesize = psize,      \
+       .sectorsize = ssize,    \
+       .size_in_bytes = size   \
+}
+
+extern struct flash_device flash_devices[];
+
+/* fields in SPI flash status register */
+#define SPIFLASH_BSY_BIT               0x00000001 /* WIP Bit of SPI SR on SMI SR */
+#define SPIFLASH_WE_BIT                        0x00000002 /* WEL Bit of SPI SR on SMI SR */
+
+/* SPI Flash Commands */
+#define SPIFLASH_READ_ID               0x9F /* Read Flash Identification */
+#define SPIFLASH_READ_STATUS   0x05 /* Read Status Register */
+#define SPIFLASH_WRITE_ENABLE  0x06 /* Write Enable */
+#define SPIFLASH_PAGE_PROGRAM  0x02 /* Page Program */
+#define SPIFLASH_FAST_READ             0x0B /* Fast Read */
+#define SPIFLASH_READ                  0x03 /* Normal Read */
index bf26a8eb53d1fb22356d20c4592f12a6593f3280..dffc9cd07a86b2de18919fe31ee0f722a0ddeb8e 100644 (file)
@@ -39,6 +39,7 @@
 #endif
 
 #include "imp.h"
+#include "spi.h"
 #include <jtag/jtag.h>
 #include <helper/time_support.h>
 
 #define SMI_SEL_BANK3     0x00003000 /* Select Bank3 */
 
 /* fields in SMI_SR */
-#define SMI_WIP_BIT       0x00000001 /* WIP Bit of SPI SR on SMI SR */
-#define SMI_WEL_BIT       0x00000002 /* WEL Bit of SPI SR on SMI SR */
 #define SMI_TFF           0x00000100 /* Transfer Finished Flag */
 
 /* Commands */
@@ -124,65 +123,6 @@ struct stmsmi_flash_bank {
        struct flash_device *dev;
 };
 
-/* data structure to maintain flash ids from different vendors */
-struct flash_device {
-       char *name;
-       uint8_t erase_cmd;
-       uint32_t device_id;
-       uint32_t pagesize;
-       unsigned long sectorsize;
-       unsigned long size_in_bytes;
-};
-
-#define FLASH_ID(n, es, id, psize, ssize, size) \
-{                              \
-       .name = n,              \
-       .erase_cmd = es,        \
-       .device_id = id,        \
-       .pagesize = psize,      \
-       .sectorsize = ssize,    \
-       .size_in_bytes = size   \
-}
-
-/* List below is taken from Linux driver. It is not exhaustive of all the
- * possible SPI memories, nor exclusive for SMI. Could be shared with
- * other SPI drivers. */
-static struct flash_device flash_devices[] = {
-       /* name, erase_cmd, device_id, pagesize, sectorsize, size_in_bytes */
-       FLASH_ID("st m25p05",      0xd8, 0x00102020, 0x80,  0x8000,  0x10000),
-       FLASH_ID("st m25p10",      0xd8, 0x00112020, 0x80,  0x8000,  0x20000),
-       FLASH_ID("st m25p20",      0xd8, 0x00122020, 0x100, 0x10000, 0x40000),
-       FLASH_ID("st m25p40",      0xd8, 0x00132020, 0x100, 0x10000, 0x80000),
-       FLASH_ID("st m25p80",      0xd8, 0x00142020, 0x100, 0x10000, 0x100000),
-       FLASH_ID("st m25p16",      0xd8, 0x00152020, 0x100, 0x10000, 0x200000),
-       FLASH_ID("st m25p32",      0xd8, 0x00162020, 0x100, 0x10000, 0x400000),
-       FLASH_ID("st m25p64",      0xd8, 0x00172020, 0x100, 0x10000, 0x800000),
-       FLASH_ID("st m25p128",     0xd8, 0x00182020, 0x100, 0x40000, 0x1000000),
-       FLASH_ID("st m45pe10",     0xd8, 0x00114020, 0x100, 0x10000, 0x20000),
-       FLASH_ID("st m45pe20",     0xd8, 0x00124020, 0x100, 0x10000, 0x40000),
-       FLASH_ID("st m45pe40",     0xd8, 0x00134020, 0x100, 0x10000, 0x80000),
-       FLASH_ID("st m45pe80",     0xd8, 0x00144020, 0x100, 0x10000, 0x100000),
-       FLASH_ID("sp s25fl004",    0xd8, 0x00120201, 0x100, 0x10000, 0x80000),
-       FLASH_ID("sp s25fl008",    0xd8, 0x00130201, 0x100, 0x10000, 0x100000),
-       FLASH_ID("sp s25fl016",    0xd8, 0x00140201, 0x100, 0x10000, 0x200000),
-       FLASH_ID("sp s25fl032",    0xd8, 0x00150201, 0x100, 0x10000, 0x400000),
-       FLASH_ID("sp s25fl064",    0xd8, 0x00160201, 0x100, 0x10000, 0x800000),
-       FLASH_ID("atmel 25f512",   0x52, 0x0065001f, 0x80,  0x8000,  0x10000),
-       FLASH_ID("atmel 25f1024",  0x52, 0x0060001f, 0x100, 0x8000,  0x20000),
-       FLASH_ID("atmel 25f2048",  0x52, 0x0063001f, 0x100, 0x10000, 0x40000),
-       FLASH_ID("atmel 25f4096",  0x52, 0x0064001f, 0x100, 0x10000, 0x80000),
-       FLASH_ID("atmel 25fs040",  0xd7, 0x0004661f, 0x100, 0x10000, 0x80000),
-       FLASH_ID("mac 25l512",     0xd8, 0x001020c2, 0x010, 0x10000, 0x10000),
-       FLASH_ID("mac 25l1005",    0xd8, 0x001120c2, 0x010, 0x10000, 0x20000),
-       FLASH_ID("mac 25l2005",    0xd8, 0x001220c2, 0x010, 0x10000, 0x40000),
-       FLASH_ID("mac 25l4005",    0xd8, 0x001320c2, 0x010, 0x10000, 0x80000),
-       FLASH_ID("mac 25l8005",    0xd8, 0x001420c2, 0x010, 0x10000, 0x100000),
-       FLASH_ID("mac 25l1605",    0xd8, 0x001520c2, 0x100, 0x10000, 0x200000),
-       FLASH_ID("mac 25l3205",    0xd8, 0x001620c2, 0x100, 0x10000, 0x400000),
-       FLASH_ID("mac 25l6405",    0xd8, 0x001720c2, 0x100, 0x10000, 0x800000),
-       FLASH_ID(NULL,             0,    0,          0,     0,       0)
-};
-
 struct stmsmi_target {
        char *name;
        uint32_t tap_idcode;
@@ -282,7 +222,7 @@ static int wait_till_ready(struct flash_bank *bank, int timeout)
                if (retval != ERROR_OK)
                        return retval;
 
-               if ((status & SMI_WIP_BIT) == 0)
+               if ((status & SPIFLASH_BSY_BIT) == 0)
                        return ERROR_OK;
                alive_sleep(1);
        } while (timeval_ms() < endtime);
@@ -320,7 +260,7 @@ static int smi_write_enable(struct flash_bank *bank)
                return retval;
 
        /* Check write enabled */
-       if ((status & SMI_WEL_BIT) == 0) {
+       if ((status & SPIFLASH_WE_BIT) == 0) {
                LOG_ERROR("Cannot enable write to flash. Status=0x%08" PRIx32, status);
                return ERROR_FAIL;
        }

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)