===================================================================
@@ -175,6 +175,13 @@
CHIP_BUSTYPE_UNKNOWN = CHIP_BUSTYPE_PARALLEL | CHIP_BUSTYPE_LPC | CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_SPI,
};
+enum lockaction {
+ lock_check_unlocked, /* Check if the chip is completely unlocked or doesn't support locks. */
+ lock_print, /* Print verbose current locking status. */
+ lock_disable, /* Disable all locks. */
+ lock_enable, /* Enable all locks (no permanent lockdown). */
+};
+
/*
* How many different contiguous runs of erase blocks with one size each do
* we have for a given erase function?
@@ -229,6 +236,7 @@
int (*write) (struct flashchip *flash, uint8_t *buf);
int (*read) (struct flashchip *flash, uint8_t *buf, int start, int len);
+ int (*lock) (struct flashchip *flash, enum lockaction action);
/* Some flash devices have an additional register space. */
chipaddr virtual_memory;
@@ -558,6 +566,7 @@
int spi_send_multicommand(struct spi_command *cmds);
int spi_write_enable(void);
int spi_write_disable(void);
+int spi_chip_lock(struct flashchip *flash, enum lockaction action);
int spi_chip_erase_60(struct flashchip *flash);
int spi_chip_erase_c7(struct flashchip *flash);
int spi_chip_erase_60_c7(struct flashchip *flash);
@@ -668,6 +677,7 @@
int probe_49fl00x(struct flashchip *flash);
int erase_49fl00x(struct flashchip *flash);
int write_49fl00x(struct flashchip *flash, uint8_t *buf);
+int lock_49fl00x(struct flashchip *flash, enum lockaction action);
/* sharplhf00l04.c */
int probe_lhf00l04(struct flashchip *flash);
===================================================================
@@ -4,6 +4,7 @@
* Copyright (C) 2004 Tyan Corporation
* Copyright (C) 2007 Nikolay Petukhov <nikolay.petukhov@gmail.com>
* Copyright (C) 2007 Reinder E.N. de Haan <lb_reha@mveas.com>
+ * Copyright (C) 2009 Carl-Daniel Hailfinger
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -36,6 +37,33 @@
}
}
+/*
+ * Return 0 if successful, 1 if failed, 2 if unsupported.
+ */
+int lock_49fl00x(struct flashchip *flash, enum lockaction action)
+{
+ switch (action) {
+ case lock_check_unlocked:
+ fprintf(stderr, "Checking lock status not supported.\n");
+ return 2;
+ case lock_print:
+ fprintf(stderr, "Printing lock status not supported.\n");
+ return 2;
+ case lock_disable:
+ write_lockbits_49fl00x(flash->virtual_registers,
+ flash->total_size * 1024, 0,
+ flash->page_size);
+ return 0;
+ case lock_enable:
+ write_lockbits_49fl00x(flash->virtual_registers,
+ flash->total_size * 1024, 1,
+ flash->page_size);
+ return 0;
+ default:
+ return 2;
+ }
+}
+
int probe_49fl00x(struct flashchip *flash)
{
int ret = probe_jedec(flash);
@@ -53,8 +81,7 @@
int page_size = flash->page_size;
/* unprotected */
- write_lockbits_49fl00x(flash->virtual_registers,
- total_size, 0, page_size);
+ lock_49fl00x(flash, lock_disable);
/*
* erase_chip_jedec() will not work... Datasheet says
@@ -74,8 +101,7 @@
printf("\n");
/* protected */
- write_lockbits_49fl00x(flash->virtual_registers,
- total_size, 1, page_size);
+ lock_49fl00x(flash, lock_enable);
return 0;
}
@@ -88,8 +114,7 @@
chipaddr bios = flash->virtual_memory;
/* unprotected */
- write_lockbits_49fl00x(flash->virtual_registers, total_size, 0,
- page_size);
+ lock_49fl00x(flash, lock_disable);
printf("Programming page: ");
for (i = 0; i < total_size / page_size; i++) {
@@ -109,8 +134,7 @@
printf("\n");
/* protected */
- write_lockbits_49fl00x(flash->virtual_registers, total_size, 1,
- page_size);
+ lock_49fl00x(flash, lock_enable);
return 0;
}
===================================================================
@@ -51,6 +51,7 @@
* }
* .write = Chip write function
* .read = Chip read function
+ * .lock = Chip locking print/enable/disable function
*/
{
@@ -211,6 +212,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -227,6 +229,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -243,6 +246,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -259,6 +263,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -275,6 +280,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -291,6 +297,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -307,6 +314,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -323,6 +331,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -339,6 +348,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -355,6 +365,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -387,6 +398,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -403,6 +415,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -419,6 +432,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
/*The AT26DF321 has the same ID as the AT25DF321. */
@@ -436,6 +450,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},*/
{
@@ -468,7 +483,6 @@
.erase = erase_chip_jedec,
.write = write_jedec,
.read = read_memmapped,
-
},
{
@@ -725,6 +739,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -789,6 +804,7 @@
.erase = erase_49fl00x,
.write = write_49fl00x,
.read = read_memmapped,
+ .lock = lock_49fl00x,
},
{
@@ -821,6 +837,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -837,6 +854,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -853,6 +871,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -869,6 +888,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -885,6 +905,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -901,6 +922,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -917,6 +939,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -933,6 +956,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -949,6 +973,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -965,6 +990,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -981,6 +1007,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -997,6 +1024,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1013,6 +1041,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1029,6 +1058,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1045,6 +1075,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1061,6 +1092,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1256,6 +1288,7 @@
},
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1288,6 +1321,7 @@
},
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1323,6 +1357,7 @@
},
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1358,6 +1393,7 @@
},
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1393,6 +1429,7 @@
},
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1428,6 +1465,7 @@
},
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1444,6 +1482,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1460,6 +1499,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1476,6 +1516,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1492,6 +1533,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1508,6 +1550,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1604,6 +1647,7 @@
.erase = spi_chip_erase_d8,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1620,6 +1664,7 @@
.erase = spi_chip_erase_d8,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1636,6 +1681,7 @@
.erase = spi_chip_erase_d8,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1652,6 +1698,7 @@
.erase = spi_chip_erase_d8,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1668,6 +1715,7 @@
.erase = spi_chip_erase_d8,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1684,6 +1732,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1700,6 +1749,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1716,6 +1766,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1732,6 +1783,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1748,6 +1800,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1764,6 +1817,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1828,6 +1882,7 @@
.erase = erase_49fl00x,
.write = write_49fl00x,
.read = read_memmapped,
+ .lock = lock_49fl00x,
},
{
@@ -1844,6 +1899,7 @@
.erase = erase_49fl00x,
.write = write_49fl00x,
.read = read_memmapped,
+ .lock = lock_49fl00x,
},
{
@@ -1876,6 +1932,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1892,6 +1949,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_1,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1908,6 +1966,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_1,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1924,6 +1983,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_1,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1940,6 +2000,7 @@
.erase = spi_chip_erase_60,
.write = spi_chip_write_1,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1956,6 +2017,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_1,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -1972,6 +2034,7 @@
.erase = spi_chip_erase_60_c7,
.write = spi_chip_write_1,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -2420,6 +2483,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
/* The ST M25P05 is a bit of a problem. It has the same ID as the
@@ -2441,6 +2505,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_1, /* 128 */
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -2457,6 +2522,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
/* The ST M25P10 has the same problem as the M25P05. */
@@ -2474,6 +2540,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_1, /* 128 */
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -2490,6 +2557,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -2506,6 +2574,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -2522,6 +2591,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -2538,6 +2608,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -2554,6 +2625,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -2570,6 +2642,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -2586,6 +2659,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -2602,6 +2676,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -2954,6 +3029,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -2970,6 +3046,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -2986,6 +3063,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -3002,6 +3080,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -3018,6 +3097,7 @@
.erase = spi_chip_erase_c7,
.write = spi_chip_write_256,
.read = spi_chip_read,
+ .lock = spi_chip_lock,
},
{
@@ -3258,6 +3338,7 @@
.erase = NULL,
.write = NULL,
.read = NULL,
+ .lock = NULL,
},
{
@@ -3274,6 +3355,7 @@
.erase = NULL,
.write = NULL,
.read = NULL,
+ .lock = NULL,
},
{
@@ -3290,6 +3372,7 @@
.erase = NULL,
.write = NULL,
.read = NULL,
+ .lock = NULL,
},
{
@@ -3306,6 +3389,7 @@
.erase = NULL,
.write = NULL,
.read = NULL,
+ .lock = NULL,
},
{
@@ -3322,6 +3406,7 @@
.erase = NULL,
.write = NULL,
.read = NULL,
+ .lock = NULL,
},
{
@@ -3338,6 +3423,7 @@
.erase = NULL,
.write = NULL,
.read = NULL,
+ .lock = NULL,
},
{
===================================================================
@@ -30,8 +30,6 @@
enum spi_controller spi_controller = SPI_CONTROLLER_NONE;
void *spibar = NULL;
-void spi_prettyprint_status_register(struct flashchip *flash);
-
const struct spi_programmer spi_programmer[] = {
{ /* SPI_CONTROLLER_NONE */
.command = NULL,
@@ -268,11 +266,6 @@
printf_debug("%s: id1 0x%02x, id2 0x%02x\n", __func__, id1, id2);
if (id1 == flash->manufacture_id && id2 == flash->model_id) {
- /* Print the status register to tell the
- * user about possible write protection.
- */
- spi_prettyprint_status_register(flash);
-
return 1;
}
@@ -332,11 +325,6 @@
printf_debug("%s: id1 0x%x, id2 0x%x\n", __func__, id1, id2);
if (id1 == flash->manufacture_id && id2 == flash->model_id) {
- /* Print the status register to tell the
- * user about possible write protection.
- */
- spi_prettyprint_status_register(flash);
-
return 1;
}
@@ -373,10 +361,6 @@
if (id2 != flash->model_id)
return 0;
- /* Print the status register to tell the
- * user about possible write protection.
- */
- spi_prettyprint_status_register(flash);
return 1;
}
@@ -467,39 +451,76 @@
bpt[(status & 0x1c) >> 2]);
}
-void spi_prettyprint_status_register(struct flashchip *flash)
+/*
+ * Return 0 if successful, 1 if failed, 2 if unsupported.
+ */
+int spi_prettyprint_status_register(struct flashchip *flash)
{
uint8_t status;
+ int result = 2;
status = spi_read_status_register();
printf_debug("Chip status register is %02x\n", status);
switch (flash->manufacture_id) {
case ST_ID:
if (((flash->model_id & 0xff00) == 0x2000) ||
- ((flash->model_id & 0xff00) == 0x2500))
+ ((flash->model_id & 0xff00) == 0x2500)) {
spi_prettyprint_status_register_st_m25p(status);
+ result = 0;
+ }
break;
case MX_ID:
- if ((flash->model_id & 0xff00) == 0x2000)
+ if ((flash->model_id & 0xff00) == 0x2000) {
spi_prettyprint_status_register_st_m25p(status);
+ result = 0;
+ }
break;
case SST_ID:
switch (flash->model_id) {
case 0x2541:
spi_prettyprint_status_register_sst25vf016(status);
+ result = 0;
break;
case 0x8d:
case 0x258d:
spi_prettyprint_status_register_sst25vf040b(status);
+ result = 0;
break;
default:
spi_prettyprint_status_register_sst25(status);
+ result = 0;
break;
}
break;
}
+
+ if (result == 2)
+ fprintf(stderr, "Printing lock status not supported.\n");
+ return result;
}
+/*
+ * Return 0 if successful, 1 if failed, 2 if unsupported.
+ */
+int spi_chip_lock(struct flashchip *flash, enum lockaction action)
+{
+ switch (action) {
+ case lock_check_unlocked:
+ fprintf(stderr, "Checking lock status not supported.\n");
+ return 2;
+ case lock_print:
+ spi_prettyprint_status_register(flash);
+ return 0;
+ case lock_disable:
+ return spi_disable_blockprotect();
+ case lock_enable:
+ fprintf(stderr, "Lock enable not supported.\n");
+ return 2;
+ default:
+ return 2;
+ }
+}
+
int spi_chip_erase_60(struct flashchip *flash)
{
int result;
@@ -521,9 +542,9 @@
.readarr = NULL,
}};
- result = spi_disable_blockprotect();
+ result = spi_chip_lock(flash, lock_disable);
if (result) {
- fprintf(stderr, "spi_disable_blockprotect failed\n");
+ fprintf(stderr, "unprotect failed\n");
return result;
}
@@ -567,9 +588,9 @@
.readarr = NULL,
}};
- result = spi_disable_blockprotect();
+ result = spi_chip_lock(flash, lock_disable);
if (result) {
- fprintf(stderr, "spi_disable_blockprotect failed\n");
+ fprintf(stderr, "unprotect failed\n");
return result;
}
@@ -687,17 +708,21 @@
int spi_chip_erase_d8(struct flashchip *flash)
{
- int i, rc = 0;
+ int i, result = 0;
int total_size = flash->total_size * 1024;
int erase_size = 64 * 1024;
- spi_disable_blockprotect();
+ result = spi_chip_lock(flash, lock_disable);
+ if (result) {
+ fprintf(stderr, "unprotect failed\n");
+ return result;
+ }
printf("Erasing chip: \n");
for (i = 0; i < total_size / erase_size; i++) {
- rc = spi_block_erase_d8(flash, i * erase_size, erase_size);
- if (rc) {
+ result = spi_block_erase_d8(flash, i * erase_size, erase_size);
+ if (result) {
fprintf(stderr, "Error erasing block at 0x%x\n", i);
break;
}
@@ -705,7 +730,7 @@
printf("\n");
- return rc;
+ return result;
}
/* Sector size is usually 4k, though Macronix eliteflash has 64k */
@@ -983,7 +1008,11 @@
int total_size = 1024 * flash->total_size;
int i, result = 0;
- spi_disable_blockprotect();
+ result = spi_chip_lock(flash, lock_disable);
+ if (result) {
+ fprintf(stderr, "unprotect failed\n");
+ return result;
+ }
/* Erase first */
printf("Erasing flash before programming... ");
if (erase_flash(flash)) {
===================================================================
@@ -509,6 +509,26 @@
printf("Found chip \"%s %s\" (%d KB, %s) at physical address 0x%lx.\n",
flash->vendor, flash->name, flash->total_size,
flashbuses_to_text(flash->bustype), base);
+ /* Print the locking status. */
+ if (flash->lock) {
+ flash->lock(flash, lock_print);
+ switch (flash->lock(flash, lock_check_unlocked)) {
+ case 0:
+ printf_debug("Chip is completely unlocked or does not "
+ "support locking.");
+ break;
+ case 1:
+ printf_debug("Chip is partially/completely locked.\n");
+ break;
+ case 2:
+ printf_debug("Chip locking status could not be "
+ "determined.\n");
+ break;
+ }
+ } else {
+ printf_debug("This chip has not been converted to the new chip "
+ "locking infrastructure yet.\n");
+ }
return flash;
}