OpenWrt Forum Archive

Topic: It's possible to add Support for SPI-Flash SST25VF064C?

The content of this topic has been archived on 17 Apr 2018. There are no obvious gaps in this topic, but there may still be some posts missing at the end.

After iv'e had unbricked my Router by desoldering Flash-Chip and external reprogramming and successful building an Image with unlocked Partitions mtd0 & mtd5 by myself the idea suggests itself.
What i have to do to add Support for 8MByte Flash-Chip SST25VF064C?
In the Sources i discovered a c-file called "m25p80.c" within witch i've found following:

/* NOTE: double check command sets and memory organization when you add
 * more flash chips.  This current list focusses on newer chips, which
 * have been converging on command sets which including JEDEC ID.
 */
static const struct spi_device_id m25p_ids[] = {
    /* Atmel -- some are (confusingly) marketed as "DataFlash" */
    { "at25fs010",  INFO(0x1f6601, 0, 32 * 1024,   4, SECT_4K) },
    { "at25fs040",  INFO(0x1f6604, 0, 64 * 1024,   8, SECT_4K) },

    { "at25df041a", INFO(0x1f4401, 0, 64 * 1024,   8, SECT_4K) },
    { "at25df321a", INFO(0x1f4701, 0, 64 * 1024,  64, SECT_4K) },
    { "at25df641",  INFO(0x1f4800, 0, 64 * 1024, 128, SECT_4K) },

    { "at26f004",   INFO(0x1f0400, 0, 64 * 1024,  8, SECT_4K) },
    { "at26df081a", INFO(0x1f4501, 0, 64 * 1024, 16, SECT_4K) },
    { "at26df161a", INFO(0x1f4601, 0, 64 * 1024, 32, SECT_4K) },
    { "at26df321",  INFO(0x1f4700, 0, 64 * 1024, 64, SECT_4K) },

    /* EON -- en25xxx */
    { "en25f32", INFO(0x1c3116, 0, 64 * 1024,  64, SECT_4K) },
    { "en25p32", INFO(0x1c2016, 0, 64 * 1024,  64, 0) },
    { "en25q32b", INFO(0x1c3016, 0, 64 * 1024,  64, 0) },
    { "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) },

    /* Intel/Numonyx -- xxxs33b */
    { "160s33b",  INFO(0x898911, 0, 64 * 1024,  32, 0) },
    { "320s33b",  INFO(0x898912, 0, 64 * 1024,  64, 0) },
    { "640s33b",  INFO(0x898913, 0, 64 * 1024, 128, 0) },

    /* Macronix */
    { "mx25l4005a",  INFO(0xc22013, 0, 64 * 1024,   8, SECT_4K) },
    { "mx25l8005",   INFO(0xc22014, 0, 64 * 1024,  16, 0) },
    { "mx25l1606e",  INFO(0xc22015, 0, 64 * 1024,  32, SECT_4K) },
    { "mx25l3205d",  INFO(0xc22016, 0, 64 * 1024,  64, 0) },
    { "mx25l6405d",  INFO(0xc22017, 0, 64 * 1024, 128, 0) },
    { "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) },
    { "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
    { "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512, 0) },
    { "mx25l25655e", INFO(0xc22619, 0, 64 * 1024, 512, 0) },

    /* PMC -- pm25x "blocks" are 32K, sectors are 4K */
    { "pm25lv512", INFO(0, 0, 32 * 1024, 2, SECT_4K_PMC) },
    { "pm25lv010", INFO(0, 0, 32 * 1024, 4, SECT_4K_PMC) },

    /* Spansion -- single (large) sector size only, at least
     * for the chips listed here (without boot sectors).
     */
    { "s25sl004a",  INFO(0x010212,      0,  64 * 1024,   8, 0) },
    { "s25sl008a",  INFO(0x010213,      0,  64 * 1024,  16, 0) },
    { "s25sl016a",  INFO(0x010214,      0,  64 * 1024,  32, 0) },
    { "s25sl032a",  INFO(0x010215,      0,  64 * 1024,  64, 0) },
    { "s25sl032p",  INFO(0x010215, 0x4d00,  64 * 1024,  64, SECT_4K) },
    { "s25sl064a",  INFO(0x010216,      0,  64 * 1024, 128, 0) },
    { "s25fl256s0", INFO(0x010219, 0x4d00, 256 * 1024, 128, 0) },
    { "s25fl256s1", INFO(0x010219, 0x4d01,  64 * 1024, 512, 0) },
    { "s25fl512s",  INFO(0x010220, 0x4d00, 256 * 1024, 256, 0) },
    { "s70fl01gs",  INFO(0x010221, 0x4d00, 256 * 1024, 256, 0) },
    { "s25sl12800", INFO(0x012018, 0x0300, 256 * 1024,  64, 0) },
    { "s25sl12801", INFO(0x012018, 0x0301,  64 * 1024, 256, 0) },
    { "s25fl129p0", INFO(0x012018, 0x4d00, 256 * 1024,  64, 0) },
    { "s25fl129p1", INFO(0x012018, 0x4d01,  64 * 1024, 256, 0) },
    { "s25fl016k",  INFO(0xef4015,      0,  64 * 1024,  32, SECT_4K) },
    { "s25fl064k",  INFO(0xef4017,      0,  64 * 1024, 128, SECT_4K) },

    /* SST -- large erase sizes are "overlays", "sectors" are 4K */
    { "sst25vf040b", INFO(0xbf258d, 0, 64 * 1024,  8, SECT_4K) },
    { "sst25vf080b", INFO(0xbf258e, 0, 64 * 1024, 16, SECT_4K) },
    { "sst25vf016b", INFO(0xbf2541, 0, 64 * 1024, 32, SECT_4K) },
    { "sst25vf032b", INFO(0xbf254a, 0, 64 * 1024, 64, SECT_4K) },
    { "sst25wf512",  INFO(0xbf2501, 0, 64 * 1024,  1, SECT_4K) },
    { "sst25wf010",  INFO(0xbf2502, 0, 64 * 1024,  2, SECT_4K) },
    { "sst25wf020",  INFO(0xbf2503, 0, 64 * 1024,  4, SECT_4K) },
    { "sst25wf040",  INFO(0xbf2504, 0, 64 * 1024,  8, SECT_4K) },

    /* ST Microelectronics -- newer production may have feature updates */
    { "m25p05",  INFO(0x202010,  0,  32 * 1024,   2, 0) },
    { "m25p10",  INFO(0x202011,  0,  32 * 1024,   4, 0) },
    { "m25p20",  INFO(0x202012,  0,  64 * 1024,   4, 0) },
    { "m25p40",  INFO(0x202013,  0,  64 * 1024,   8, 0) },
    { "m25p80",  INFO(0x202014,  0,  64 * 1024,  16, 0) },
    { "m25p16",  INFO(0x202015,  0,  64 * 1024,  32, 0) },
    { "m25p32",  INFO(0x202016,  0,  64 * 1024,  64, 0) },
    { "m25p64",  INFO(0x202017,  0,  64 * 1024, 128, 0) },
    { "m25p128", INFO(0x202018,  0, 256 * 1024,  64, 0) },

    { "m25p05-nonjedec",  INFO(0, 0,  32 * 1024,   2, 0) },
    { "m25p10-nonjedec",  INFO(0, 0,  32 * 1024,   4, 0) },
    { "m25p20-nonjedec",  INFO(0, 0,  64 * 1024,   4, 0) },
    { "m25p40-nonjedec",  INFO(0, 0,  64 * 1024,   8, 0) },
    { "m25p80-nonjedec",  INFO(0, 0,  64 * 1024,  16, 0) },
    { "m25p16-nonjedec",  INFO(0, 0,  64 * 1024,  32, 0) },
    { "m25p32-nonjedec",  INFO(0, 0,  64 * 1024,  64, 0) },
    { "m25p64-nonjedec",  INFO(0, 0,  64 * 1024, 128, 0) },
    { "m25p128-nonjedec", INFO(0, 0, 256 * 1024,  64, 0) },

    { "m45pe10", INFO(0x204011,  0, 64 * 1024,    2, 0) },
    { "m45pe80", INFO(0x204014,  0, 64 * 1024,   16, 0) },
    { "m45pe16", INFO(0x204015,  0, 64 * 1024,   32, 0) },

    { "m25pe80", INFO(0x208014,  0, 64 * 1024, 16,       0) },
    { "m25pe16", INFO(0x208015,  0, 64 * 1024, 32, SECT_4K) },

    { "m25px32",    INFO(0x207116,  0, 64 * 1024, 64, SECT_4K) },
    { "m25px32-s0", INFO(0x207316,  0, 64 * 1024, 64, SECT_4K) },
    { "m25px32-s1", INFO(0x206316,  0, 64 * 1024, 64, SECT_4K) },
    { "m25px64",    INFO(0x207117,  0, 64 * 1024, 128, 0) },

    /* Winbond -- w25x "blocks" are 64K, "sectors" are 4KiB */
    { "w25x10", INFO(0xef3011, 0, 64 * 1024,  2,  SECT_4K) },
    { "w25x20", INFO(0xef3012, 0, 64 * 1024,  4,  SECT_4K) },
    { "w25x40", INFO(0xef3013, 0, 64 * 1024,  8,  SECT_4K) },
    { "w25x80", INFO(0xef3014, 0, 64 * 1024,  16, SECT_4K) },
    { "w25x16", INFO(0xef3015, 0, 64 * 1024,  32, SECT_4K) },
    { "w25x32", INFO(0xef3016, 0, 64 * 1024,  64, SECT_4K) },
    { "w25q32", INFO(0xef4016, 0, 64 * 1024,  64, SECT_4K) },
    { "w25x64", INFO(0xef3017, 0, 64 * 1024, 128, SECT_4K) },
    { "w25q64", INFO(0xef4017, 0, 64 * 1024, 128, SECT_4K) },
    { "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) },

    /* Catalyst / On Semiconductor -- non-JEDEC */
    { "cat25c11", CAT25_INFO(  16, 8, 16, 1) },
    { "cat25c03", CAT25_INFO(  32, 8, 16, 2) },
    { "cat25c09", CAT25_INFO( 128, 8, 32, 2) },
    { "cat25c17", CAT25_INFO( 256, 8, 32, 2) },
    { "cat25128", CAT25_INFO(2048, 8, 64, 2) },
    { },
};

It's enough to add an Entry like this? Or is it too simple?

    { "sst25vf032b", INFO(0xbf254a, 0, 64 * 1024, 64, SECT_4K) },
    { "sst25vf064c", INFO(0xbf254b, 0, 64 * 1024,128, SECT_4K) },  // new Entry for SST25VF064C, JEDEC-ID (0xbf254b) extracted from Datasheet
    { "sst25wf512",  INFO(0xbf2501, 0, 64 * 1024,  1, SECT_4K) },

My Router Model is an TP-Link WR741ND v4

pappnase

(Last edited by pappnase on 25 Jul 2012, 11:06)

yes, looks ok... if it works please send a patch to the openwrt-devel list

The discussion might have continued from here.