Lines Matching full:flash

2  * This file is part of the Serial Flash Universal Driver Library.
25 * Function: serial flash operate functions by SFUD lib.
36 #error "Please configure the flash device information table in (in sfud_cfg.h)."
39 /* user configured flash device information table */
45 /* supported flash chip information table */
51 * flash read data mode
61 /* QSPI flash chip's extended information table */
65 static sfud_err software_init(const sfud_flash *flash);
66 static sfud_err hardware_init(sfud_flash *flash);
67 static sfud_err page256_or_1_byte_write(const sfud_flash *flash, uint32_t addr, size_t size, uint16…
69 static sfud_err aai_write(const sfud_flash *flash, uint32_t addr, size_t size, const uint8_t *data);
70 static sfud_err wait_busy(const sfud_flash *flash);
71 static sfud_err reset(const sfud_flash *flash);
72 static sfud_err read_jedec_id(sfud_flash *flash);
73 static sfud_err set_write_enabled(const sfud_flash *flash, bool enabled);
74 static sfud_err set_4_byte_address_mode(sfud_flash *flash, bool enabled);
75 static void make_adress_byte_array(const sfud_flash *flash, uint32_t addr, uint8_t *array);
82 * SFUD initialize by flash device
84 * @param flash flash device
88 sfud_err sfud_device_init(sfud_flash *flash) { in sfud_device_init() argument
92 result = hardware_init(flash); in sfud_device_init()
94 result = software_init(flash); in sfud_device_init()
97 flash->init_ok = true; in sfud_device_init()
98 SFUD_INFO("%s flash device is initialize success.", flash->name); in sfud_device_init()
100 flash->init_ok = false; in sfud_device_init()
101 SFUD_INFO("Error: %s flash device is initialize fail.", flash->name); in sfud_device_init()
116 SFUD_DEBUG("Start initialize Serial Flash Universal Driver(SFUD) V%s.", SFUD_SW_VERSION); in sfud_init()
118 /* initialize all flash device in flash device table */ in sfud_init()
120 /* initialize flash device index of flash device information table */ in sfud_init()
133 * get flash device by its index which in the flash information table
135 * @param index the index which in the flash information table @see flash_table
137 * @return flash device
148 * get flash device total number on flash device information table @see flash_table
150 * @return flash device total number
157 * get flash device information table @see flash_table
159 * @return flash device table pointer
166 static void qspi_set_read_cmd_format(sfud_flash *flash, uint8_t ins, uint8_t ins_lines, uint8_t add… in qspi_set_read_cmd_format() argument
169 if (flash->chip.capacity <= 0x1000000) { in qspi_set_read_cmd_format()
170 flash->read_cmd_format.instruction = ins; in qspi_set_read_cmd_format()
171 flash->read_cmd_format.address_size = 24; in qspi_set_read_cmd_format()
173 flash->read_cmd_format.instruction = ins + 1; in qspi_set_read_cmd_format()
174 flash->read_cmd_format.address_size = 32; in qspi_set_read_cmd_format()
177 flash->read_cmd_format.instruction_lines = ins_lines; in qspi_set_read_cmd_format()
178 flash->read_cmd_format.address_lines = addr_lines; in qspi_set_read_cmd_format()
179 flash->read_cmd_format.alternate_bytes_lines = 0; in qspi_set_read_cmd_format()
180 flash->read_cmd_format.dummy_cycles = dummy_cycles; in qspi_set_read_cmd_format()
181 flash->read_cmd_format.data_lines = data_lines; in qspi_set_read_cmd_format()
185 * Enbale the fast read mode in QSPI flash mode. Default read mode is normal SPI mode.
190 * @note When Flash is in QSPI mode, the method must be called after sfud_device_init().
192 * @param flash flash device
197 sfud_err sfud_qspi_fast_read_enable(sfud_flash *flash, uint8_t data_line_width) { in sfud_qspi_fast_read_enable() argument
202 SFUD_ASSERT(flash); in sfud_qspi_fast_read_enable()
207 if ((qspi_flash_ext_info_table[i].mf_id == flash->chip.mf_id) in sfud_qspi_fast_read_enable()
208 && (qspi_flash_ext_info_table[i].type_id == flash->chip.type_id) in sfud_qspi_fast_read_enable()
209 && (qspi_flash_ext_info_table[i].capacity_id == flash->chip.capacity_id)) { in sfud_qspi_fast_read_enable()
217 qspi_set_read_cmd_format(flash, SFUD_CMD_READ_DATA, 1, 1, 0, 1); in sfud_qspi_fast_read_enable()
221 qspi_set_read_cmd_format(flash, SFUD_CMD_DUAL_IO_READ_DATA, 1, 2, 8, 2); in sfud_qspi_fast_read_enable()
223 qspi_set_read_cmd_format(flash, SFUD_CMD_DUAL_OUTPUT_READ_DATA, 1, 1, 8, 2); in sfud_qspi_fast_read_enable()
225 qspi_set_read_cmd_format(flash, SFUD_CMD_READ_DATA, 1, 1, 0, 1); in sfud_qspi_fast_read_enable()
230 qspi_set_read_cmd_format(flash, SFUD_CMD_QUAD_IO_READ_DATA, 1, 4, 6, 4); in sfud_qspi_fast_read_enable()
232 qspi_set_read_cmd_format(flash, SFUD_CMD_QUAD_OUTPUT_READ_DATA, 1, 1, 8, 4); in sfud_qspi_fast_read_enable()
234 qspi_set_read_cmd_format(flash, SFUD_CMD_READ_DATA, 1, 1, 0, 1); in sfud_qspi_fast_read_enable()
246 static sfud_err hardware_init(sfud_flash *flash) { in hardware_init() argument
247 extern sfud_err sfud_spi_port_init(sfud_flash * flash); in hardware_init()
252 SFUD_ASSERT(flash); in hardware_init()
254 result = sfud_spi_port_init(flash); in hardware_init()
261 flash->read_cmd_format.instruction = SFUD_CMD_READ_DATA; in hardware_init()
265 SFUD_ASSERT(flash->spi.wr); in hardware_init()
266 …/* if the user don't configure flash chip information then using SFDP parameter or static flash pa… in hardware_init()
267 if (flash->chip.capacity == 0 || flash->chip.write_mode == 0 || flash->chip.erase_gran == 0 in hardware_init()
268 || flash->chip.erase_gran_cmd == 0) { in hardware_init()
269 /* read JEDEC ID include manufacturer ID, memory type ID and flash capacity ID */ in hardware_init()
270 result = read_jedec_id(flash); in hardware_init()
276 extern bool sfud_read_sfdp(sfud_flash *flash); in hardware_init()
278 if (sfud_read_sfdp(flash)) { in hardware_init()
279 flash->chip.name = NULL; in hardware_init()
280 flash->chip.capacity = flash->sfdp.capacity; in hardware_init()
282 if (flash->sfdp.write_gran == 1) { in hardware_init()
283 flash->chip.write_mode = SFUD_WM_BYTE; in hardware_init()
285 flash->chip.write_mode = SFUD_WM_PAGE_256B; in hardware_init()
288 flash->chip.erase_gran = flash->sfdp.eraser[0].size; in hardware_init()
289 flash->chip.erase_gran_cmd = flash->sfdp.eraser[0].cmd; in hardware_init()
291 … if (flash->sfdp.eraser[i].size != 0 && flash->chip.erase_gran > flash->sfdp.eraser[i].size) { in hardware_init()
292 flash->chip.erase_gran = flash->sfdp.eraser[i].size; in hardware_init()
293 flash->chip.erase_gran_cmd = flash->sfdp.eraser[i].cmd; in hardware_init()
302 if ((flash_chip_table[i].mf_id == flash->chip.mf_id) in hardware_init()
303 && (flash_chip_table[i].type_id == flash->chip.type_id) in hardware_init()
304 && (flash_chip_table[i].capacity_id == flash->chip.capacity_id)) { in hardware_init()
305 flash->chip.name = flash_chip_table[i].name; in hardware_init()
306 flash->chip.capacity = flash_chip_table[i].capacity; in hardware_init()
307 flash->chip.write_mode = flash_chip_table[i].write_mode; in hardware_init()
308 flash->chip.erase_gran = flash_chip_table[i].erase_gran; in hardware_init()
309 flash->chip.erase_gran_cmd = flash_chip_table[i].erase_gran_cmd; in hardware_init()
321 if (flash->chip.capacity == 0 || flash->chip.write_mode == 0 || flash->chip.erase_gran == 0 in hardware_init()
322 || flash->chip.erase_gran_cmd == 0) { in hardware_init()
323 SFUD_INFO("Warning: This flash device is not found or not support."); in hardware_init()
329 if (mf_table[i].id == flash->chip.mf_id) { in hardware_init()
334 /* print manufacturer and flash chip name */ in hardware_init()
335 if (flash_mf_name && flash->chip.name) { in hardware_init()
336 … SFUD_INFO("Find a %s %s flash chip. Size is %ld bytes.", flash_mf_name, flash->chip.name, in hardware_init()
337 flash->chip.capacity); in hardware_init()
339 … SFUD_INFO("Find a %s flash chip. Size is %ld bytes.", flash_mf_name, flash->chip.capacity); in hardware_init()
341 SFUD_INFO("Find a flash chip. Size is %ld bytes.", flash->chip.capacity); in hardware_init()
345 /* reset flash device */ in hardware_init()
346 result = reset(flash); in hardware_init()
351 /* I found when the flash write mode is supported AAI mode. The flash all blocks is protected, in hardware_init()
352 * so need change the flash status to unprotected before write and erase operate. */ in hardware_init()
353 if (flash->chip.write_mode & SFUD_WM_AAI) { in hardware_init()
354 result = sfud_write_status(flash, true, 0x00); in hardware_init()
360 /* if the flash is large than 16MB (256Mb) then enter in 4-Byte addressing mode */ in hardware_init()
361 if (flash->chip.capacity > (1L << 24)) { in hardware_init()
362 result = set_4_byte_address_mode(flash, true); in hardware_init()
364 flash->addr_in_4_byte = false; in hardware_init()
373 * @param flash flash device
377 static sfud_err software_init(const sfud_flash *flash) { in software_init() argument
380 SFUD_ASSERT(flash); in software_init()
386 * read flash data
388 * @param flash flash device
395 sfud_err sfud_read(const sfud_flash *flash, uint32_t addr, size_t size, uint8_t *data) { in sfud_read() argument
397 const sfud_spi *spi = &flash->spi; in sfud_read()
400 SFUD_ASSERT(flash); in sfud_read()
403 SFUD_ASSERT(flash->init_ok); in sfud_read()
404 /* check the flash address bound */ in sfud_read()
405 if (addr + size > flash->chip.capacity) { in sfud_read()
406 SFUD_INFO("Error: Flash address is out of bound."); in sfud_read()
414 result = wait_busy(flash); in sfud_read()
418 if (flash->read_cmd_format.instruction != SFUD_CMD_READ_DATA) { in sfud_read()
419 …result = spi->qspi_read(spi, addr, (sfud_qspi_read_cmd_format *)&flash->read_cmd_format, data, siz… in sfud_read()
424 make_adress_byte_array(flash, addr, &cmd_data[1]); in sfud_read()
425 cmd_size = flash->addr_in_4_byte ? 5 : 4; in sfud_read()
438 * erase all flash data
440 * @param flash flash device
444 sfud_err sfud_chip_erase(const sfud_flash *flash) { in sfud_chip_erase() argument
446 const sfud_spi *spi = &flash->spi; in sfud_chip_erase()
449 SFUD_ASSERT(flash); in sfud_chip_erase()
451 SFUD_ASSERT(flash->init_ok); in sfud_chip_erase()
457 /* set the flash write enable */ in sfud_chip_erase()
458 result = set_write_enabled(flash, true); in sfud_chip_erase()
464 … /* dual-buffer write, like AT45DB series flash chip erase operate is different for other flash */ in sfud_chip_erase()
465 if (flash->chip.write_mode & SFUD_WM_DUAL_BUFFER) { in sfud_chip_erase()
474 SFUD_INFO("Error: Flash chip erase SPI communicate error."); in sfud_chip_erase()
477 result = wait_busy(flash); in sfud_chip_erase()
480 /* set the flash write disable */ in sfud_chip_erase()
481 set_write_enabled(flash, false); in sfud_chip_erase()
491 * erase flash data
495 * @param flash flash device
501 sfud_err sfud_erase(const sfud_flash *flash, uint32_t addr, size_t size) { argument
502 …extern size_t sfud_sfdp_get_suitable_eraser(const sfud_flash *flash, uint32_t addr, size_t erase_s…
505 const sfud_spi *spi = &flash->spi;
509 SFUD_ASSERT(flash);
511 SFUD_ASSERT(flash->init_ok);
512 /* check the flash address bound */
513 if (addr + size > flash->chip.capacity) {
514 SFUD_INFO("Error: Flash address is out of bound.");
518 if (addr == 0 && size == flash->chip.capacity) {
519 return sfud_chip_erase(flash);
529 /* if this flash is support SFDP parameter, then used SFDP parameter supplies eraser */
532 if (flash->sfdp.available) {
534 eraser_index = sfud_sfdp_get_suitable_eraser(flash, addr, size);
535 cur_erase_cmd = flash->sfdp.eraser[eraser_index].cmd;
536 cur_erase_size = flash->sfdp.eraser[eraser_index].size;
541 cur_erase_cmd = flash->chip.erase_gran_cmd;
542 cur_erase_size = flash->chip.erase_gran;
544 /* set the flash write enable */
545 result = set_write_enabled(flash, true);
551 make_adress_byte_array(flash, addr, &cmd_data[1]);
552 cmd_size = flash->addr_in_4_byte ? 5 : 4;
555 SFUD_INFO("Error: Flash erase SPI communicate error.");
558 result = wait_busy(flash);
581 /* set the flash write disable */
582 set_write_enabled(flash, false);
592 * write flash data (no erase operate) for write 1 to 256 bytes per page mode or byte write mode
594 * @param flash flash device
602 static sfud_err page256_or_1_byte_write(const sfud_flash *flash, uint32_t addr, size_t size, uint16… argument
605 const sfud_spi *spi = &flash->spi;
610 SFUD_ASSERT(flash);
614 SFUD_ASSERT(flash->init_ok);
615 /* check the flash address bound */
616 if (addr + size > flash->chip.capacity) {
617 SFUD_INFO("Error: Flash address is out of bound.");
627 /* set the flash write enable */
628 result = set_write_enabled(flash, true);
633 make_adress_byte_array(flash, addr, &cmd_data[1]);
634 cmd_size = flash->addr_in_4_byte ? 5 : 4;
657 SFUD_INFO("Error: Flash write SPI communicate error.");
660 result = wait_busy(flash);
668 /* set the flash write disable */
669 set_write_enabled(flash, false);
679 * write flash data (no erase operate) for auto address increment mode
684 * @param flash flash device
691 static sfud_err aai_write(const sfud_flash *flash, uint32_t addr, size_t size, const uint8_t *data)… argument
693 const sfud_spi *spi = &flash->spi;
697 SFUD_ASSERT(flash);
698 SFUD_ASSERT(flash->init_ok);
699 /* check the flash address bound */
700 if (addr + size > flash->chip.capacity) {
701 SFUD_INFO("Error: Flash address is out of bound.");
710 result = page256_or_1_byte_write(flash, addr++, 1, 1, data++);
716 /* set the flash write enable */
717 result = set_write_enabled(flash, true);
725 make_adress_byte_array(flash, addr, &cmd_data[1]);
726 cmd_size = flash->addr_in_4_byte ? 5 : 4;
738 SFUD_INFO("Error: Flash write SPI communicate error.");
742 result = wait_busy(flash);
751 /* set the flash write disable for exit AAI mode */
752 result = set_write_enabled(flash, false);
755 result = page256_or_1_byte_write(flash, addr, 1, 1, data);
760 set_write_enabled(flash, false);
771 * write flash data (no erase operate)
773 * @param flash flash device
780 sfud_err sfud_write(const sfud_flash *flash, uint32_t addr, size_t size, const uint8_t *data) { argument
783 if (flash->chip.write_mode & SFUD_WM_PAGE_256B) {
784 result = page256_or_1_byte_write(flash, addr, size, 256, data);
785 } else if (flash->chip.write_mode & SFUD_WM_AAI) {
786 result = aai_write(flash, addr, size, data);
787 } else if (flash->chip.write_mode & SFUD_WM_DUAL_BUFFER) {
795 * erase and write flash data
797 * @param flash flash device
804 sfud_err sfud_erase_write(const sfud_flash *flash, uint32_t addr, size_t size, const uint8_t *data)… argument
807 result = sfud_erase(flash, addr, size);
810 result = sfud_write(flash, addr, size, data);
816 static sfud_err reset(const sfud_flash *flash) { argument
818 const sfud_spi *spi = &flash->spi;
821 SFUD_ASSERT(flash);
826 result = wait_busy(flash);
828 SFUD_INFO("Error: Flash device reset failed.");
836 result = wait_busy(flash);
840 SFUD_DEBUG("Flash device reset success.");
842 SFUD_INFO("Error: Flash device reset failed.");
848 static sfud_err read_jedec_id(sfud_flash *flash) { argument
850 const sfud_spi *spi = &flash->spi;
853 SFUD_ASSERT(flash);
858 flash->chip.mf_id = recv_data[0];
859 flash->chip.type_id = recv_data[1];
860 flash->chip.capacity_id = recv_data[2];
861 …SFUD_DEBUG("The flash device manufacturer ID is 0x%02X, memory type ID is 0x%02X, capacity ID is 0…
862 flash->chip.mf_id, flash->chip.type_id, flash->chip.capacity_id);
864 SFUD_INFO("Error: Read flash device JEDEC ID error.");
871 * set the flash write enable or write disable
873 * @param flash flash device
878 static sfud_err set_write_enabled(const sfud_flash *flash, bool enabled) { argument
882 SFUD_ASSERT(flash);
890 result = flash->spi.wr(&flash->spi, &cmd, 1, NULL, 0);
893 result = sfud_read_status(flash, &register_status);
910 * enable or disable 4-Byte addressing for flash
912 …* @note The 4-Byte addressing just supported for the flash capacity which is large then 16MB (256M…
914 * @param flash flash device
919 static sfud_err set_4_byte_address_mode(sfud_flash *flash, bool enabled) { argument
923 SFUD_ASSERT(flash);
925 /* set the flash write enable */
926 result = set_write_enabled(flash, true);
937 result = flash->spi.wr(&flash->spi, &cmd, 1, NULL, 0);
940 flash->addr_in_4_byte = enabled ? true : false;
950 * read flash register status
952 * @param flash flash device
957 sfud_err sfud_read_status(const sfud_flash *flash, uint8_t *status) { argument
960 SFUD_ASSERT(flash);
963 return flash->spi.wr(&flash->spi, &cmd, 1, status, 1);
966 static sfud_err wait_busy(const sfud_flash *flash) { argument
969 size_t retry_times = flash->retry.times;
971 SFUD_ASSERT(flash);
974 result = sfud_read_status(flash, &status);
979 SFUD_RETRY_PROCESS(flash->retry.delay, retry_times, result);
983 SFUD_INFO("Error: Flash wait busy has an error.");
989 static void make_adress_byte_array(const sfud_flash *flash, uint32_t addr, uint8_t *array) { argument
992 SFUD_ASSERT(flash);
995 len = flash->addr_in_4_byte ? 4 : 3;
1005 * @param flash flash device
1011 sfud_err sfud_write_status(const sfud_flash *flash, bool is_volatile, uint8_t status) { argument
1013 const sfud_spi *spi = &flash->spi;
1016 SFUD_ASSERT(flash);
1022 result = set_write_enabled(flash, true);