From b2aa12b58259445de57849d24a5c00ca1b23c5a2 Mon Sep 17 00:00:00 2001 From: Gwenhael Goavec-Merou Date: Mon, 30 Jun 2025 18:25:54 +0200 Subject: [PATCH] spiFlash, spiFlashdb: added global_lock flag and uses it instead of jedec_id (#566) --- src/spiFlash.cpp | 17 +++++++++-------- src/spiFlashdb.hpp | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/spiFlash.cpp b/src/spiFlash.cpp index f4cd8b2..e79be9b 100644 --- a/src/spiFlash.cpp +++ b/src/spiFlash.cpp @@ -353,20 +353,21 @@ int SPIFlash::erase_and_prog(int base_addr, const uint8_t *data, int len) bool must_relock = false; // used to relock after write; - /* microchip SST26VF032B have global lock set - * at powerup. global unlock must be send unconditionally - * with or without block protection - */ - if (_jedec_id == 0xbf2642bf) { // microchip SST26VF032B - if (!global_unlock()) - return -1; - } /* check Block Protect Bits (hide WIP/WEN bits) */ uint8_t status = read_status_reg() & ~0x03; if (_verbose > 0) display_status_reg(status); /* if known chip */ if (_flash_model) { + /* microchip SST26VF032B/64B have global lock set + * at powerup. global unlock must be send unconditionally + * with or without block protection + */ + if (_flash_model->global_lock) { + if (!global_unlock()) + return -1; + } + /* check if offset + len fit in flash */ if ((unsigned int)(base_addr + len) > (_flash_model->nr_sector * 0x10000)) { printError("flash overflow"); diff --git a/src/spiFlashdb.hpp b/src/spiFlashdb.hpp index 8185b35..802f345 100644 --- a/src/spiFlashdb.hpp +++ b/src/spiFlashdb.hpp @@ -34,6 +34,7 @@ typedef struct { uint8_t bp_offset[4]; /**< BP[0:3] bit offset */ tb_loc_t quad_register; /**< TOP/BOTTOM bit offset */ uint16_t quad_mask; /** Quad Enable bit offset */ + bool global_lock; /** Global lock/unlock bit */ } flash_t; static std::map flash_list = { @@ -51,6 +52,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), 0}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x010219, { /* https://www.mouser.fr/datasheet/2/196/Infineon_S25FL128SS25FL256S_128_Mb__16_MB_256_Mb__-3363490.pdf */ @@ -67,6 +69,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), 0}, .quad_register = CONFR, .quad_mask = (1 << 1), + .global_lock = false, }}, {0x010220, { .manufacturer = "spansion", @@ -82,6 +85,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), 0}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x012018, { .manufacturer = "spansion", @@ -97,6 +101,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), 0}, .quad_register = CONFR, .quad_mask = (1 << 1), + .global_lock = false, }}, {0x016018, { /* https://www.infineon.com/dgdl/Infineon-S25FL128L_S25FL256L_128_Mb_16_MB_256_Mb_32_MB_FL-L_flash_SPI_multi-I_O_3-DataSheet-v13_00-EN.pdf?fileId=8ac78c8c7d0d8da4017d0ed40e335224 */ @@ -113,6 +118,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 5)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x016019, { .manufacturer = "spansion", @@ -128,6 +134,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 5)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x202014, { /* https://pdf1.alldatasheet.com/datasheet-pdf/download/22807/STMICROELECTRONICS/M25P80.html */ @@ -144,6 +151,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), 0}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x202015, { /* https://datasheet.octopart.com/M25P16-VME6G-STMicroelectronics-datasheet-7623188.pdf */ @@ -160,6 +168,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), 0}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x202016, { /* https://pdf1.alldatasheet.com/datasheet-pdf/download/104949/STMICROELECTRONICS/M25P32.html */ @@ -176,6 +185,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), 0}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x20ba16, { /* https://www.digikey.co.uk/htmldatasheets/production/1283198/0/0/1/N25Q032A-32Mb-1-8V.pdf */ @@ -196,6 +206,7 @@ static std::map flash_list = { .quad_mask = 0, //.quad_register = NVCONFR, //.quad_mask = (1 << 3), + .global_lock = false, }}, {0x20ba17, { .manufacturer = "micron", @@ -215,6 +226,7 @@ static std::map flash_list = { .quad_mask = 0, //.quad_register = NVCONFR, //.quad_mask = (1 << 3), + .global_lock = false, }}, {0x20ba18, { /* https://media-www.micron.com/-/media/client/global/documents/products/data-sheet/nor-flash/serial-nor/n25q/n25q_128mb_3v_65nm.pdf */ @@ -235,6 +247,7 @@ static std::map flash_list = { .quad_mask = 0, //.quad_register = NVCONFR, //.quad_mask = (1 << 3), + .global_lock = false, }}, {0x20ba19, { /* https://datasheet.octopart.com/N25Q256A13E1241F-Micron-datasheet-11552757.pdf */ @@ -255,6 +268,7 @@ static std::map flash_list = { .quad_mask = 0, //.quad_register = NVCONFR, //.quad_mask = (1 << 3), + .global_lock = false, }}, {0x20bb18, { /* https://www.micron.com/-/media/client/global/documents/products/data-sheet/nor-flash/serial-nor/n25q/n25q_128mb_1_8v_65nm.pdf */ @@ -273,6 +287,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 6)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x20bb19, { .manufacturer = "micron", @@ -288,6 +303,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 6)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x20bb21, { .manufacturer = "micron", @@ -303,6 +319,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 6)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x20bb22, { .manufacturer = "micron", @@ -318,6 +335,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 6)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x9d6016, { .manufacturer = "ISSI", @@ -333,6 +351,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 5)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x9d6017, { .manufacturer = "ISSI", @@ -348,6 +367,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 5)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x9d6018, { .manufacturer = "ISSI", @@ -363,6 +383,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 5)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x9d6019, { /* https://www.issi.com/WW/pdf/IS25LP(WP)256D.pdf */ @@ -379,6 +400,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 5)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0xba6015, { .manufacturer = "Zetta", @@ -394,6 +416,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), 0}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0xbf258d, { .manufacturer = "microchip", @@ -409,6 +432,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 5)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0xbf2642, { .manufacturer = "microchip", @@ -424,6 +448,7 @@ static std::map flash_list = { .bp_offset = {0, 0, 0, 0}, .quad_register = NONER, .quad_mask = 0, + .global_lock = true, }}, {0xbf2643, { .manufacturer = "microchip", @@ -439,6 +464,7 @@ static std::map flash_list = { .bp_offset = {0, 0, 0, 0}, .quad_register = NONER, .quad_mask = 0, + .global_lock = true, }}, {0xc22016, { /* https://www.macronix.com/Lists/Datasheet/Attachments/8933/MX25L3233F,%203V,%2032Mb,%20v1.7.pdf */ @@ -455,6 +481,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 5)}, .quad_register = STATR, .quad_mask = (1 << 6), + .global_lock = false, }}, {0xc22018, { /* https://www.macronix.com/Lists/Datasheet/Attachments/8934/MX25L12833F,%203V,%20128Mb,%20v1.0.pdf */ @@ -471,6 +498,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 5)}, .quad_register = STATR, .quad_mask = (1 << 6), + .global_lock = false, }}, {0xc22019, { /* https://www.mxic.com.tw/Lists/Datasheet/Attachments/8906/MX25L25645G,%203V,%20256Mb,%20v2.0.pdf */ @@ -487,6 +515,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 5)}, .quad_register = STATR, .quad_mask = (1 << 6), + .global_lock = false, }}, {0xc2201a, { /* https://www.macronix.com/Lists/Datasheet/Attachments/8745/MX25L51245G,%203V,%20512Mb,%20v1.7.pdf */ @@ -503,6 +532,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 5)}, .quad_register = STATR, .quad_mask = (1 << 6), + .global_lock = false, }}, {0xc22537, { /* https://www.macronix.com/Lists/Datasheet/Attachments/8904/MX25U6432F,%201.8V,%2064Mb,%20v1.1.pdf */ @@ -519,6 +549,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 5)}, .quad_register = STATR, .quad_mask = (1 << 6), + .global_lock = false, }}, {0xc22817, { /* https://www.macronix.com/Lists/Datasheet/Attachments/8868/MX25R6435F,%20Wide%20Range,%2064Mb,%20v1.6.pdf */ @@ -535,6 +566,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 5)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0xef4014, { /* https://cdn-shop.adafruit.com/datasheets/W25Q80BV.pdf */ @@ -551,6 +583,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), 0}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0xef4015, { .manufacturer = "Winbond", @@ -566,6 +599,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), 0}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0xef4016, { .manufacturer = "Winbond", @@ -581,6 +615,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), 0}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0xef4017, { .manufacturer = "Winbond", @@ -596,6 +631,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), 0}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0xef4018, { .manufacturer = "Winbond", @@ -611,6 +647,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), 0}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x6bbb14, { .manufacturer = "Everspin", @@ -626,6 +663,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 6)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x6bbb15, { .manufacturer = "Everspin", @@ -641,6 +679,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 6)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x6bbb16, { .manufacturer = "Everspin", @@ -656,6 +695,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 6)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, {0x6bbb17, { .manufacturer = "Everspin", @@ -671,6 +711,7 @@ static std::map flash_list = { .bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 6)}, .quad_register = NONER, .quad_mask = 0, + .global_lock = false, }}, };