uboot 对SPI flash 的识别

flash信息在

const struct spi_flash_info spi_flash_ids[] = {
        {"w25p80",         INFO(0xef2014, 0x0,  64 * 1024,    16, 0) },
        {"w25p16",         INFO(0xef2015, 0x0,  64 * 1024,    32, 0) },
        {"w25p32",         INFO(0xef2016, 0x0,  64 * 1024,    64, 0) },
        {"w25x40",         INFO(0xef3013, 0x0,  64 * 1024,     8, SECT_4K) },
        {"w25x16",         INFO(0xef3015, 0x0,  64 * 1024,    32, SECT_4K) },
        {"w25x32",         INFO(0xef3016, 0x0,  64 * 1024,    64, SECT_4K) },
        {"w25x64",         INFO(0xef3017, 0x0,  64 * 1024,   128, SECT_4K) },
        {"w25q80bl",       INFO(0xef4014, 0x0,  64 * 1024,    16, RD_FULL | WR_QPP | SECT_4K) },
        {"w25q16cl",       INFO(0xef4015, 0x0,  64 * 1024,    32, RD_FULL | WR_QPP | SECT_4K) },
        {"w25q32bv",       INFO(0xef4016, 0x0,  64 * 1024,    64, RD_FULL | WR_QPP | SECT_4K) },
        {"w25q64cv",       INFO(0xef4017, 0x0,  64 * 1024,   128, RD_FULL | WR_QPP | SECT_4K) },
        {"w25q128bv",      INFO(0xef4018, 0x0,  64 * 1024,   256, RD_FULL | WR_QPP | SECT_4K) },
        {"w25q256",        INFO(0xef4019, 0x0,  64 * 1024,   512, RD_FULL | WR_QPP | SECT_4K) },
        {"w25q80bw",       INFO(0xef5014, 0x0,  64 * 1024,    16, RD_FULL | WR_QPP | SECT_4K) },
        {"w25q16dw",       INFO(0xef6015, 0x0,  64 * 1024,    32, RD_FULL | WR_QPP | SECT_4K) },
        {"w25q32dw",       INFO(0xef6016, 0x0,  64 * 1024,    64, RD_FULL | WR_QPP | SECT_4K) },
        {"w25q64dw",       INFO(0xef6017, 0x0,  64 * 1024,   128, RD_FULL | WR_QPP | SECT_4K) },
        {"w25q128fw",      INFO(0xef6018, 0x0,  64 * 1024,   256, RD_FULL | WR_QPP | SECT_4K) },


#define INFO(_jedec_id, _ext_id, _sector_size, _n_sectors, _flags)      \
                .id = {                                                 \
                        ((_jedec_id) >> 16) & 0xff,                     \
                        ((_jedec_id) >> 8) & 0xff,                      \
                        (_jedec_id) & 0xff,                             \
                        ((_ext_id) >> 8) & 0xff,                        \
                        (_ext_id) & 0xff,                               \
                        },                                              \
                .id_len = (!(_jedec_id) ? 0 : (3 + ((_ext_id) ? 2 : 0))),       \
                .sector_size = (_sector_size),                          \
                .n_sectors = (_n_sectors),                              \
                .page_size = 256,                                       \
                .flags = (_flags),


struct spi_flash_info {
        /* Device name ([MANUFLETTER][DEVTYPE][DENSITY][EXTRAINFO]) */
        const char      *name;

        /*
        * This array stores the ID bytes.
        * The first three bytes are the JEDIC ID.
        * JEDEC ID zero means "no ID" (mostly older chips).
        */
        u8              id[SPI_FLASH_MAX_ID_LEN];
        u8              id_len;

        /*
        * The size listed here is what works with SPINOR_OP_SE, which isn't
        * necessarily called a "sector" by the vendor.
        */
        u32             sector_size;
        u32             n_sectors;

        u16             page_size;

        u16             flags;


#define SECT_4K                 BIT(0)  /* CMD_ERASE_4K works uniformly */
#define E_FSR                   BIT(1)  /* use flag status register for */
#define SST_WR                  BIT(2)  /* use SST byte/word programming */
#define WR_QPP                  BIT(3)  /* use Quad Page Program */
#define RD_QUAD                 BIT(4)  /* use Quad Read */
#define RD_DUAL                 BIT(5)  /* use Dual Read */
#define RD_QUADIO               BIT(6)  /* use Quad IO Read */
#define RD_DUALIO               BIT(7)  /* use Dual IO Read */
#define RD_FULL                 (RD_QUAD | RD_DUAL | RD_QUADIO | RD_DUALIO)
};