Lines Matching +full:0 +full:- +full:latest
4 * Copyright (c) 2016-2018, Armink, <[email protected]>
26 * Created on: 2016-04-23
33 #define DUMMY_DATA 0xFF
54 NORMAL_SPI_READ = 1 << 0, /**< mormal spi read mode */
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()
117 SFUD_DEBUG("You can get the latest version on https://github.com/armink/SFUD ."); in sfud_init()
119 for (i = 0; i < sizeof(flash_table) / sizeof(sfud_flash); i++) { in sfud_init()
168 /* if medium size greater than 16Mb, use 4-Byte address, instruction should be added one */ in qspi_set_read_cmd_format()
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()
187 * it will find the appropriate fast-read instruction to replace the read instruction(0x03)
188 * fast-read instruction @see SFUD_FLASH_EXT_INFO_TABLE
198 size_t i = 0; in sfud_qspi_fast_read_enable()
206 for (i = 0; i < sizeof(qspi_flash_ext_info_table) / sizeof(sfud_qspi_flash_ext_info); i++) { 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()
225 qspi_set_read_cmd_format(flash, SFUD_CMD_READ_DATA, 1, 1, 0, 1); 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()
261 flash->read_cmd_format.instruction = SFUD_CMD_READ_DATA; in hardware_init()
265 SFUD_ASSERT(flash->spi.wr); 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()
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()
301 for (i = 0; i < sizeof(flash_chip_table) / sizeof(sfud_flash_chip); i++) { 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()
328 for (i = 0; i < sizeof(mf_table) / sizeof(sfud_mf); i++) { in hardware_init()
329 if (mf_table[i].id == flash->chip.mf_id) { 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()
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()
364 flash->addr_in_4_byte = false; in hardware_init()
397 const sfud_spi *spi = &flash->spi; in sfud_read()
403 SFUD_ASSERT(flash->init_ok); in sfud_read()
405 if (addr + size > flash->chip.capacity) { in sfud_read()
410 if (spi->lock) { in sfud_read()
411 spi->lock(spi); 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()
423 cmd_data[0] = SFUD_CMD_READ_DATA; in sfud_read()
425 cmd_size = flash->addr_in_4_byte ? 5 : 4; in sfud_read()
426 result = spi->wr(spi, cmd_data, cmd_size, data, size); in sfud_read()
430 if (spi->unlock) { in sfud_read()
431 spi->unlock(spi); in sfud_read()
446 const sfud_spi *spi = &flash->spi; in sfud_chip_erase()
451 SFUD_ASSERT(flash->init_ok); in sfud_chip_erase()
453 if (spi->lock) { in sfud_chip_erase()
454 spi->lock(spi); in sfud_chip_erase()
463 cmd_data[0] = SFUD_CMD_ERASE_CHIP; 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()
466 cmd_data[1] = 0x94; in sfud_chip_erase()
467 cmd_data[2] = 0x80; in sfud_chip_erase()
468 cmd_data[3] = 0x9A; in sfud_chip_erase()
469 result = spi->wr(spi, cmd_data, 4, NULL, 0); in sfud_chip_erase()
471 result = spi->wr(spi, cmd_data, 1, NULL, 0); in sfud_chip_erase()
483 if (spi->unlock) { in sfud_chip_erase()
484 spi->unlock(spi); in sfud_chip_erase()
505 const sfud_spi *spi = &flash->spi;
511 SFUD_ASSERT(flash->init_ok);
513 if (addr + size > flash->chip.capacity) {
518 if (addr == 0 && size == flash->chip.capacity) {
523 if (spi->lock) {
524 spi->lock(spi);
532 if (flash->sfdp.available) {
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;
550 cmd_data[0] = cur_erase_cmd;
552 cmd_size = flash->addr_in_4_byte ? 5 : 4;
553 result = spi->wr(spi, cmd_data, cmd_size, NULL, 0);
563 if (addr % cur_erase_size != 0) {
564 if (size > cur_erase_size - (addr % cur_erase_size)) {
565 size -= cur_erase_size - (addr % cur_erase_size);
566 addr += cur_erase_size - (addr % cur_erase_size);
572 size -= cur_erase_size;
584 if (spi->unlock) {
585 spi->unlock(spi);
605 const sfud_spi *spi = &flash->spi;
614 SFUD_ASSERT(flash->init_ok);
616 if (addr + size > flash->chip.capacity) {
621 if (spi->lock) {
622 spi->lock(spi);
632 cmd_data[0] = SFUD_CMD_PAGE_PROGRAM;
634 cmd_size = flash->addr_in_4_byte ? 5 : 4;
637 if (addr % write_gran != 0) {
638 if (size > write_gran - (addr % write_gran)) {
639 data_size = write_gran - (addr % write_gran);
650 size -= data_size;
655 result = spi->wr(spi, cmd_data, cmd_size + data_size, NULL, 0);
671 if (spi->unlock) {
672 spi->unlock(spi);
681 …* If the address is odd number, it will place one 0xFF before the start of data for protect the ol…
682 …* If the latest remain size is 1, it will append one 0xFF at the end of data for protect the old d…
693 const sfud_spi *spi = &flash->spi;
698 SFUD_ASSERT(flash->init_ok);
700 if (addr + size > flash->chip.capacity) {
705 if (spi->lock) {
706 spi->lock(spi);
709 if (addr % 2 != 0) {
714 size--;
722 cmd_data[0] = SFUD_CMD_AAI_WORD_PROGRAM;
726 cmd_size = flash->addr_in_4_byte ? 5 : 4;
736 result = spi->wr(spi, cmd_data, cmd_size + 2, NULL, 0);
747 size -= 2;
763 if (spi->unlock) {
764 spi->unlock(spi);
783 if (flash->chip.write_mode & SFUD_WM_PAGE_256B) {
785 } else if (flash->chip.write_mode & SFUD_WM_AAI) {
787 } else if (flash->chip.write_mode & SFUD_WM_DUAL_BUFFER) {
788 //TODO dual-buffer write mode
818 const sfud_spi *spi = &flash->spi;
823 cmd_data[0] = SFUD_CMD_ENABLE_RESET;
824 result = spi->wr(spi, cmd_data, 1, NULL, 0);
833 result = spi->wr(spi, &cmd_data[1], 1, NULL, 0);
850 const sfud_spi *spi = &flash->spi;
855 cmd_data[0] = SFUD_CMD_JEDEC_ID;
856 result = spi->wr(spi, cmd_data, sizeof(cmd_data), recv_data, sizeof(recv_data));
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);
890 result = flash->spi.wr(&flash->spi, &cmd, 1, NULL, 0);
897 if (enabled && (register_status & SFUD_STATUS_REGISTER_WEL) == 0) {
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…
937 result = flash->spi.wr(&flash->spi, &cmd, 1, NULL, 0);
940 flash->addr_in_4_byte = enabled ? true : false;
941 SFUD_DEBUG("%s 4-Byte addressing mode success.", enabled ? "Enter" : "Exit");
943 SFUD_INFO("Error: %s 4-Byte addressing mode failed.", enabled ? "Enter" : "Exit");
963 return flash->spi.wr(&flash->spi, &cmd, 1, status, 1);
969 size_t retry_times = flash->retry.times;
975 if (result == SFUD_SUCCESS && ((status & SFUD_STATUS_REGISTER_BUSY)) == 0) {
979 SFUD_RETRY_PROCESS(flash->retry.delay, retry_times, result);
982 if (result != SFUD_SUCCESS || ((status & SFUD_STATUS_REGISTER_BUSY)) != 0) {
995 len = flash->addr_in_4_byte ? 4 : 3;
997 for (i = 0; i < len; i++) {
998 array[i] = (addr >> ((len - (i + 1)) * 8)) & 0xFF;
1006 * @param is_volatile true: volatile mode, false: non-volatile mode
1013 const sfud_spi *spi = &flash->spi;
1019 cmd_data[0] = SFUD_VOLATILE_SR_WRITE_ENABLE;
1020 result = spi->wr(spi, cmd_data, 1, NULL, 0);
1026 cmd_data[0] = SFUD_CMD_WRITE_STATUS_REGISTER;
1028 result = spi->wr(spi, cmd_data, 2, NULL, 0);