Lines Matching +full:4 +full:- +full:byte
4 * Copyright (c) 2016-2018, Armink, <[email protected]>
26 * Created on: 2016-04-23
58 QUAD_IO = 1 << 4, /**< qspi fast read quad input/output */
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()
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
193 * @param data_line_width the data lines max width which QSPI bus supported, such as 1, 2, 4
203 SFUD_ASSERT(data_line_width == 1 || data_line_width == 2 || data_line_width == 4); 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()
228 case 4: 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()
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()
281 /* only 1 byte or 256 bytes write mode for SFDP */ 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()
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()
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()
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()
447 uint8_t cmd_data[4]; 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()
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()
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;
552 cmd_size = flash->addr_in_4_byte ? 5 : 4;
553 result = spi->wr(spi, cmd_data, cmd_size, NULL, 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);
592 * write flash data (no erase operate) for write 1 to 256 bytes per page mode or byte write mode
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);
634 cmd_size = flash->addr_in_4_byte ? 5 : 4;
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);
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);
708 …/* The address must be even for AAI write mode. So it must write one byte first when address is od…
714 size--;
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;
753 /* write last one byte data when origin write size is odd */
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;
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;
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];
862 flash->chip.mf_id, flash->chip.type_id, flash->chip.capacity_id);
890 result = flash->spi.wr(&flash->spi, &cmd, 1, NULL, 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;
979 SFUD_RETRY_PROCESS(flash->retry.delay, retry_times, result);
995 len = flash->addr_in_4_byte ? 4 : 3;
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;
1020 result = spi->wr(spi, cmd_data, 1, NULL, 0);
1028 result = spi->wr(spi, cmd_data, 2, NULL, 0);