Lines Matching refs:flash
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_address_byte_array(const sfud_flash *flash, uint32_t addr, uint8_t *array);
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 initialized successfully.", flash->name); in sfud_device_init()
100 flash->init_ok = false; in sfud_device_init()
101 SFUD_INFO("Error: %s flash device initialization failed.", flash->name); in sfud_device_init()
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()
174 flash->read_cmd_format.instruction = ins + 0x10; in qspi_set_read_cmd_format()
177 flash->read_cmd_format.instruction = ins + 1; in qspi_set_read_cmd_format()
179 flash->read_cmd_format.address_size = 32; in qspi_set_read_cmd_format()
182 flash->read_cmd_format.instruction_lines = ins_lines; in qspi_set_read_cmd_format()
183 flash->read_cmd_format.address_lines = addr_lines; in qspi_set_read_cmd_format()
184 flash->read_cmd_format.alternate_bytes_lines = 0; in qspi_set_read_cmd_format()
185 flash->read_cmd_format.dummy_cycles = dummy_cycles; in qspi_set_read_cmd_format()
186 flash->read_cmd_format.data_lines = data_lines; in qspi_set_read_cmd_format()
202 sfud_err sfud_qspi_fast_read_enable(sfud_flash *flash, uint8_t data_line_width) { in sfud_qspi_fast_read_enable() argument
207 SFUD_ASSERT(flash); in sfud_qspi_fast_read_enable()
212 if ((qspi_flash_ext_info_table[i].mf_id == flash->chip.mf_id) in sfud_qspi_fast_read_enable()
213 && (qspi_flash_ext_info_table[i].type_id == flash->chip.type_id) in sfud_qspi_fast_read_enable()
214 && (qspi_flash_ext_info_table[i].capacity_id == flash->chip.capacity_id)) { in sfud_qspi_fast_read_enable()
222 qspi_set_read_cmd_format(flash, SFUD_CMD_READ_DATA, 1, 1, 0, 1); in sfud_qspi_fast_read_enable()
226 qspi_set_read_cmd_format(flash, SFUD_CMD_DUAL_IO_READ_DATA, 1, 2, 4, 2); in sfud_qspi_fast_read_enable()
228 qspi_set_read_cmd_format(flash, SFUD_CMD_DUAL_OUTPUT_READ_DATA, 1, 1, 8, 2); in sfud_qspi_fast_read_enable()
230 qspi_set_read_cmd_format(flash, SFUD_CMD_READ_DATA, 1, 1, 0, 1); in sfud_qspi_fast_read_enable()
235 qspi_set_read_cmd_format(flash, SFUD_CMD_QUAD_IO_READ_DATA, 1, 4, 6, 4); in sfud_qspi_fast_read_enable()
237 qspi_set_read_cmd_format(flash, SFUD_CMD_QUAD_OUTPUT_READ_DATA, 1, 1, 8, 4); in sfud_qspi_fast_read_enable()
239 qspi_set_read_cmd_format(flash, SFUD_CMD_READ_DATA, 1, 1, 0, 1); in sfud_qspi_fast_read_enable()
251 static sfud_err hardware_init(sfud_flash *flash) { in hardware_init() argument
252 extern sfud_err sfud_spi_port_init(sfud_flash * flash); in hardware_init()
257 SFUD_ASSERT(flash); in hardware_init()
259 result = sfud_spi_port_init(flash); in hardware_init()
266 flash->read_cmd_format.instruction = SFUD_CMD_READ_DATA; in hardware_init()
270 SFUD_ASSERT(flash->spi.wr); in hardware_init()
272 if (flash->chip.capacity == 0 || flash->chip.write_mode == 0 || flash->chip.erase_gran == 0 in hardware_init()
273 || flash->chip.erase_gran_cmd == 0) { in hardware_init()
275 result = read_jedec_id(flash); in hardware_init()
281 extern bool sfud_read_sfdp(sfud_flash *flash); in hardware_init()
283 if (sfud_read_sfdp(flash)) { in hardware_init()
284 flash->chip.name = NULL; in hardware_init()
285 flash->chip.capacity = flash->sfdp.capacity; in hardware_init()
287 if (flash->sfdp.write_gran == 1) { in hardware_init()
288 flash->chip.write_mode = SFUD_WM_BYTE; in hardware_init()
290 flash->chip.write_mode = SFUD_WM_PAGE_256B; in hardware_init()
293 flash->chip.erase_gran = flash->sfdp.eraser[0].size; in hardware_init()
294 flash->chip.erase_gran_cmd = flash->sfdp.eraser[0].cmd; in hardware_init()
296 … if (flash->sfdp.eraser[i].size != 0 && flash->chip.erase_gran > flash->sfdp.eraser[i].size) { in hardware_init()
297 flash->chip.erase_gran = flash->sfdp.eraser[i].size; in hardware_init()
298 flash->chip.erase_gran_cmd = flash->sfdp.eraser[i].cmd; in hardware_init()
307 if ((flash_chip_table[i].mf_id == flash->chip.mf_id) in hardware_init()
308 && (flash_chip_table[i].type_id == flash->chip.type_id) in hardware_init()
309 && (flash_chip_table[i].capacity_id == flash->chip.capacity_id)) { in hardware_init()
310 flash->chip.name = flash_chip_table[i].name; in hardware_init()
311 flash->chip.capacity = flash_chip_table[i].capacity; in hardware_init()
312 flash->chip.write_mode = flash_chip_table[i].write_mode; in hardware_init()
313 flash->chip.erase_gran = flash_chip_table[i].erase_gran; in hardware_init()
314 flash->chip.erase_gran_cmd = flash_chip_table[i].erase_gran_cmd; in hardware_init()
326 if (flash->chip.capacity == 0 || flash->chip.write_mode == 0 || flash->chip.erase_gran == 0 in hardware_init()
327 || flash->chip.erase_gran_cmd == 0) { in hardware_init()
334 if (mf_table[i].id == flash->chip.mf_id) { in hardware_init()
340 if (flash_mf_name && flash->chip.name) { in hardware_init()
341 … SFUD_INFO("Found a %s %s flash chip. Size is %ld bytes.", flash_mf_name, flash->chip.name, in hardware_init()
342 flash->chip.capacity); in hardware_init()
344 … SFUD_INFO("Found a %s flash chip. Size is %ld bytes.", flash_mf_name, flash->chip.capacity); in hardware_init()
346 SFUD_INFO("Found a flash chip. Size is %ld bytes.", flash->chip.capacity); in hardware_init()
351 result = reset(flash); in hardware_init()
357 if (flash->chip.write_mode & SFUD_WM_AAI) { in hardware_init()
358 result = sfud_write_status(flash, true, 0x00); in hardware_init()
361 …if ((0xC2 == flash->chip.mf_id) && (0x20 == flash->chip.type_id) && (0x16 == flash->chip.capacity_… in hardware_init()
362 result = sfud_write_status(flash, false, 0x00); in hardware_init()
370 if (flash->chip.capacity > (1L << 24)) { in hardware_init()
371 result = set_4_byte_address_mode(flash, true); in hardware_init()
373 flash->addr_in_4_byte = false; in hardware_init()
386 static sfud_err software_init(const sfud_flash *flash) { in software_init() argument
389 SFUD_ASSERT(flash); in software_init()
404 sfud_err sfud_read(const sfud_flash *flash, uint32_t addr, size_t size, uint8_t *data) { in sfud_read() argument
406 const sfud_spi *spi = &flash->spi; in sfud_read()
409 SFUD_ASSERT(flash); in sfud_read()
412 SFUD_ASSERT(flash->init_ok); in sfud_read()
414 if (addr + size > flash->chip.capacity) { in sfud_read()
423 result = wait_busy(flash); in sfud_read()
427 if (flash->read_cmd_format.instruction != SFUD_CMD_READ_DATA) { in sfud_read()
428 …result = spi->qspi_read(spi, addr, (sfud_qspi_read_cmd_format *)&flash->read_cmd_format, data, siz… in sfud_read()
433 make_address_byte_array(flash, addr, &cmd_data[1]); in sfud_read()
434 cmd_size = flash->addr_in_4_byte ? 5 : 4; in sfud_read()
453 sfud_err sfud_chip_erase(const sfud_flash *flash) { in sfud_chip_erase() argument
455 const sfud_spi *spi = &flash->spi; in sfud_chip_erase()
458 SFUD_ASSERT(flash); in sfud_chip_erase()
460 SFUD_ASSERT(flash->init_ok); in sfud_chip_erase()
467 result = set_write_enabled(flash, true); in sfud_chip_erase()
474 if (flash->chip.write_mode & SFUD_WM_DUAL_BUFFER) { in sfud_chip_erase()
486 result = wait_busy(flash); in sfud_chip_erase()
490 set_write_enabled(flash, false); in sfud_chip_erase()
510 sfud_err sfud_erase(const sfud_flash *flash, uint32_t addr, size_t size) { argument
511 …extern size_t sfud_sfdp_get_suitable_eraser(const sfud_flash *flash, uint32_t addr, size_t erase_s…
514 const sfud_spi *spi = &flash->spi;
518 SFUD_ASSERT(flash);
520 SFUD_ASSERT(flash->init_ok);
522 if (addr + size > flash->chip.capacity) {
527 if (addr == 0 && size == flash->chip.capacity) {
528 return sfud_chip_erase(flash);
541 if (flash->sfdp.available) {
543 eraser_index = sfud_sfdp_get_suitable_eraser(flash, addr, size);
544 cur_erase_cmd = flash->sfdp.eraser[eraser_index].cmd;
545 cur_erase_size = flash->sfdp.eraser[eraser_index].size;
550 cur_erase_cmd = flash->chip.erase_gran_cmd;
551 cur_erase_size = flash->chip.erase_gran;
554 result = set_write_enabled(flash, true);
560 make_address_byte_array(flash, addr, &cmd_data[1]);
561 cmd_size = flash->addr_in_4_byte ? 5 : 4;
567 result = wait_busy(flash);
591 set_write_enabled(flash, false);
611 static sfud_err page256_or_1_byte_write(const sfud_flash *flash, uint32_t addr, size_t size, uint16… argument
614 const sfud_spi *spi = &flash->spi;
619 SFUD_ASSERT(flash);
623 SFUD_ASSERT(flash->init_ok);
625 if (addr + size > flash->chip.capacity) {
637 result = set_write_enabled(flash, true);
642 make_address_byte_array(flash, addr, &cmd_data[1]);
643 cmd_size = flash->addr_in_4_byte ? 5 : 4;
669 result = wait_busy(flash);
678 set_write_enabled(flash, false);
700 static sfud_err aai_write(const sfud_flash *flash, uint32_t addr, size_t size, const uint8_t *data)… argument
702 const sfud_spi *spi = &flash->spi;
706 SFUD_ASSERT(flash);
707 SFUD_ASSERT(flash->init_ok);
709 if (addr + size > flash->chip.capacity) {
719 result = page256_or_1_byte_write(flash, addr++, 1, 1, data++);
726 result = set_write_enabled(flash, true);
734 make_address_byte_array(flash, addr, &cmd_data[1]);
735 cmd_size = flash->addr_in_4_byte ? 5 : 4;
751 result = wait_busy(flash);
761 result = set_write_enabled(flash, false);
764 result = page256_or_1_byte_write(flash, addr, 1, 1, data);
769 set_write_enabled(flash, false);
789 sfud_err sfud_write(const sfud_flash *flash, uint32_t addr, size_t size, const uint8_t *data) { argument
792 if (flash->chip.write_mode & SFUD_WM_PAGE_256B) {
793 result = page256_or_1_byte_write(flash, addr, size, 256, data);
794 } else if (flash->chip.write_mode & SFUD_WM_AAI) {
795 result = aai_write(flash, addr, size, data);
796 } else if (flash->chip.write_mode & SFUD_WM_DUAL_BUFFER) {
813 sfud_err sfud_erase_write(const sfud_flash *flash, uint32_t addr, size_t size, const uint8_t *data)… argument
816 result = sfud_erase(flash, addr, size);
819 result = sfud_write(flash, addr, size, data);
825 static sfud_err reset(const sfud_flash *flash) { argument
827 const sfud_spi *spi = &flash->spi;
830 SFUD_ASSERT(flash);
835 result = wait_busy(flash);
845 result = wait_busy(flash);
857 static sfud_err read_jedec_id(sfud_flash *flash) { argument
859 const sfud_spi *spi = &flash->spi;
862 SFUD_ASSERT(flash);
867 flash->chip.mf_id = recv_data[0];
868 flash->chip.type_id = recv_data[1];
869 flash->chip.capacity_id = recv_data[2];
871 flash->chip.mf_id, flash->chip.type_id, flash->chip.capacity_id);
887 static sfud_err set_write_enabled(const sfud_flash *flash, bool enabled) { argument
891 SFUD_ASSERT(flash);
899 result = flash->spi.wr(&flash->spi, &cmd, 1, NULL, 0);
902 result = sfud_read_status(flash, ®ister_status);
928 static sfud_err set_4_byte_address_mode(sfud_flash *flash, bool enabled) { argument
932 SFUD_ASSERT(flash);
935 result = set_write_enabled(flash, true);
946 result = flash->spi.wr(&flash->spi, &cmd, 1, NULL, 0);
949 flash->addr_in_4_byte = enabled ? true : false;
966 sfud_err sfud_read_status(const sfud_flash *flash, uint8_t *status) { argument
969 SFUD_ASSERT(flash);
972 return flash->spi.wr(&flash->spi, &cmd, 1, status, 1);
975 static sfud_err wait_busy(const sfud_flash *flash) { argument
978 size_t retry_times = flash->retry.times;
980 SFUD_ASSERT(flash);
983 result = sfud_read_status(flash, &status);
988 SFUD_RETRY_PROCESS(flash->retry.delay, retry_times, result);
998 static void make_address_byte_array(const sfud_flash *flash, uint32_t addr, uint8_t *array) { argument
1001 SFUD_ASSERT(flash);
1004 len = flash->addr_in_4_byte ? 4 : 3;
1020 sfud_err sfud_write_status(const sfud_flash *flash, bool is_volatile, uint8_t status) { argument
1022 const sfud_spi *spi = &flash->spi;
1025 SFUD_ASSERT(flash);
1031 result = set_write_enabled(flash, true);