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)
    };