2 * Copyright (C) 2015 Piotr Dymacz <piotr@dymacz.pl>
3 * Copyright (C) 2005 Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
5 * SPDX-License-Identifier:GPL-2.0
13 /* Info for FLASH chips */
14 flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
16 /* List of supported and known SPI NOR FLASH chips */
17 static char VENDOR_ATMEL[] = "Atmel";
18 static char VENDOR_EON[] = "EON";
19 static char VENDOR_GIGADEVICE[] = "GigaDevice";
20 static char VENDOR_MACRONIX[] = "Macronix";
21 static char VENDOR_MICRON[] = "Micron";
22 static char VENDOR_SPANSION[] = "Spansion";
23 static char VENDOR_WINBOND[] = "Winbond";
25 const spi_nor_ids_info_t spi_nor_ids[] = {
27 { "AT25DF321", 0x1F4700, SIZE_4MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
28 { "EN25Q32", 0x1C3016, SIZE_4MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
29 { "EN25F32", 0x1C3116, SIZE_4MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
30 { "GD25Q32", 0xC84016, SIZE_4MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
31 { "MX25L320", 0xC22016, SIZE_4MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
32 { "M25P32", 0x202016, SIZE_4MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
33 { "S25FL032P", 0x010215, SIZE_4MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
34 { "W25Q32", 0xEF4016, SIZE_4MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
37 { "AT25DF641", 0x1F4800, SIZE_8MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
38 { "EN25Q64", 0x1C3017, SIZE_8MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
39 { "GD25Q64", 0xC84017, SIZE_8MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
40 { "MX25L64", 0xC22017, SIZE_8MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
41 { "MX25L64", 0xC22617, SIZE_8MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
42 { "M25P64", 0x202017, SIZE_8MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
43 { "S25FL064P", 0x010216, SIZE_8MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
44 { "W25Q64", 0xEF4017, SIZE_8MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
47 { "GD25Q128", 0xC84018, SIZE_16MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
48 { "MX25L128", 0xC22018, SIZE_16MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
49 { "MX25L128", 0xC22618, SIZE_16MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
50 { "N25Q128", 0x20BA18, SIZE_16MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
51 { "S25FL127S", 0x012018, SIZE_16MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
52 { "W25Q128", 0xEF4018, SIZE_16MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
53 { "W25Q128FW", 0xEF6018, SIZE_16MiB, SIZE_64KiB, 256, SPI_FLASH_CMD_ES_64KB },
56 const u32 spi_nor_ids_count = sizeof(spi_nor_ids) / sizeof(spi_nor_ids_info_t);
58 const char *flash_manuf_name(u32 jedec_id)
60 switch (jedec_id >> 16) {
61 case FLASH_VENDOR_JEDEC_ATMEL:
64 case FLASH_VENDOR_JEDEC_EON:
67 case FLASH_VENDOR_JEDEC_GIGADEVICE:
68 return VENDOR_GIGADEVICE;
70 case FLASH_VENDOR_JEDEC_MACRONIX:
71 return VENDOR_MACRONIX;
73 case FLASH_VENDOR_JEDEC_MICRON:
76 case FLASH_VENDOR_JEDEC_SPANSION:
77 return VENDOR_SPANSION;
79 case FLASH_VENDOR_JEDEC_WINBOND:
80 return VENDOR_WINBOND;
88 flash_info_t *addr2info(ulong addr)
93 for (i = 0, info = &flash_info[0]; i < CFG_MAX_FLASH_BANKS; ++i, ++info) {
95 * WARNING - The '- 1' is needed if the flash
96 * is at the end of the address space, since
97 * info->start[0] + info->size wraps back to 0.
98 * Please don't change this unless you understand this.
100 if (info->flash_id != FLASH_UNKNOWN
101 && addr >= info->start[0]
102 && addr <= info->start[0] + info->size - 1) {
111 * Copy memory to flash.
112 * Make sure all target addresses are within Flash bounds,
113 * and no protected sectors are hit.
116 * ERR_TIMOUT 1 - write timeout
117 * ERR_NOT_ERASED 2 - Flash not erased
118 * ERR_PROTECTED 4 - target range includes protected sectors
119 * ERR_INVAL 8 - target address not in Flash memory
120 * ERR_ALIGN 16 - target address not aligned on boundary
121 * (only some targets require alignment)
123 int flash_write(char *src, ulong addr, ulong cnt)
126 ulong end = addr + cnt - 1;
127 flash_info_t *info_first = addr2info(addr);
128 flash_info_t *info_last = addr2info(end);
134 if (!info_first || !info_last)
137 /* Finally write data to flash */
138 for (info = info_first; info <= info_last && cnt > 0; ++info) {
139 ulong len = info->start[0] + info->size - addr;
144 if ((i = write_buff(info, (uchar *)src, addr, len)) != 0)
155 void flash_perror(int err)
161 printf_err("timeout writing to FLASH\n");
164 printf_err("FLASH not erased\n");
167 printf_err("outside available FLASH\n");
170 printf_err("start and/or end address not on sector boundary\n");
172 case ERR_UNKNOWN_FLASH_VENDOR:
173 printf_err("unknown vendor of FLASH\n");
175 case ERR_UNKNOWN_FLASH_TYPE:
176 printf_err("unknown type of FLASH\n");
179 printf_err("general FLASH programming error\n");
182 printf_err("%s[%d] FIXME: rc=%d\n", __FILE__, __LINE__, err);
186 #endif /* !CFG_NO_FLASH */