spiFlash, spiFlashdb: added global_lock flag and uses it instead of jedec_id (#566)
This commit is contained in:
parent
afb7bbeec2
commit
b2aa12b582
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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 <uint32_t, flash_t> flash_list = {
|
||||
|
|
@ -51,6 +52,7 @@ static std::map <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> 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 <uint32_t, flash_t> flash_list = {
|
|||
.bp_offset = {(1 << 2), (1 << 3), (1 << 4), (1 << 6)},
|
||||
.quad_register = NONER,
|
||||
.quad_mask = 0,
|
||||
.global_lock = false,
|
||||
}},
|
||||
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue