1 /***************************************************************************
2 * Copyright (C) 2005, 2007 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * Copyright (C) 2009 Michael Schwingen *
5 * michael@schwingen.org *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 2 of the License, or *
10 * (at your option) any later version. *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program; if not, write to the *
19 * Free Software Foundation, Inc., *
20 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21 ***************************************************************************/
29 #include "binarybuffer.h"
32 static int cfi_register_commands(struct command_context_s
*cmd_ctx
);
33 static int cfi_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
, struct flash_bank_s
*bank
);
34 static int cfi_erase(struct flash_bank_s
*bank
, int first
, int last
);
35 static int cfi_protect(struct flash_bank_s
*bank
, int set
, int first
, int last
);
36 static int cfi_write(struct flash_bank_s
*bank
, u8
*buffer
, u32 offset
, u32 count
);
37 static int cfi_probe(struct flash_bank_s
*bank
);
38 static int cfi_auto_probe(struct flash_bank_s
*bank
);
39 static int cfi_protect_check(struct flash_bank_s
*bank
);
40 static int cfi_info(struct flash_bank_s
*bank
, char *buf
, int buf_size
);
42 //static int cfi_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
44 #define CFI_MAX_BUS_WIDTH 4
45 #define CFI_MAX_CHIP_WIDTH 4
47 /* defines internal maximum size for code fragment in cfi_intel_write_block() */
48 #define CFI_MAX_INTEL_CODESIZE 256
50 flash_driver_t cfi_flash
=
53 .register_commands
= cfi_register_commands
,
54 .flash_bank_command
= cfi_flash_bank_command
,
56 .protect
= cfi_protect
,
59 .auto_probe
= cfi_auto_probe
,
60 .erase_check
= default_flash_blank_check
,
61 .protect_check
= cfi_protect_check
,
65 static cfi_unlock_addresses_t cfi_unlock_addresses
[] =
67 [CFI_UNLOCK_555_2AA
] = { .unlock1
= 0x555, .unlock2
= 0x2aa },
68 [CFI_UNLOCK_5555_2AAA
] = { .unlock1
= 0x5555, .unlock2
= 0x2aaa },
71 /* CFI fixups foward declarations */
72 static void cfi_fixup_0002_erase_regions(flash_bank_t
*flash
, void *param
);
73 static void cfi_fixup_0002_unlock_addresses(flash_bank_t
*flash
, void *param
);
74 static void cfi_fixup_atmel_reversed_erase_regions(flash_bank_t
*flash
, void *param
);
76 /* fixup after reading cmdset 0002 primary query table */
77 static cfi_fixup_t cfi_0002_fixups
[] = {
78 {CFI_MFR_SST
, 0x00D4, cfi_fixup_0002_unlock_addresses
, &cfi_unlock_addresses
[CFI_UNLOCK_5555_2AAA
]},
79 {CFI_MFR_SST
, 0x00D5, cfi_fixup_0002_unlock_addresses
, &cfi_unlock_addresses
[CFI_UNLOCK_5555_2AAA
]},
80 {CFI_MFR_SST
, 0x00D6, cfi_fixup_0002_unlock_addresses
, &cfi_unlock_addresses
[CFI_UNLOCK_5555_2AAA
]},
81 {CFI_MFR_SST
, 0x00D7, cfi_fixup_0002_unlock_addresses
, &cfi_unlock_addresses
[CFI_UNLOCK_5555_2AAA
]},
82 {CFI_MFR_SST
, 0x2780, cfi_fixup_0002_unlock_addresses
, &cfi_unlock_addresses
[CFI_UNLOCK_5555_2AAA
]},
83 {CFI_MFR_ATMEL
, 0x00C8, cfi_fixup_atmel_reversed_erase_regions
, NULL
},
84 {CFI_MFR_FUJITSU
, 0x226b, cfi_fixup_0002_unlock_addresses
, &cfi_unlock_addresses
[CFI_UNLOCK_5555_2AAA
]},
85 {CFI_MFR_AMIC
, 0xb31a, cfi_fixup_0002_unlock_addresses
, &cfi_unlock_addresses
[CFI_UNLOCK_555_2AA
]},
86 {CFI_MFR_MX
, 0x225b, cfi_fixup_0002_unlock_addresses
, &cfi_unlock_addresses
[CFI_UNLOCK_555_2AA
]},
87 {CFI_MFR_AMD
, 0x225b, cfi_fixup_0002_unlock_addresses
, &cfi_unlock_addresses
[CFI_UNLOCK_555_2AA
]},
88 {CFI_MFR_ANY
, CFI_ID_ANY
, cfi_fixup_0002_erase_regions
, NULL
},
92 /* fixup after reading cmdset 0001 primary query table */
93 static cfi_fixup_t cfi_0001_fixups
[] = {
97 static void cfi_fixup(flash_bank_t
*bank
, cfi_fixup_t
*fixups
)
99 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
102 for (f
= fixups
; f
->fixup
; f
++)
104 if (((f
->mfr
== CFI_MFR_ANY
) || (f
->mfr
== cfi_info
->manufacturer
)) &&
105 ((f
->id
== CFI_ID_ANY
) || (f
->id
== cfi_info
->device_id
)))
107 f
->fixup(bank
, f
->param
);
112 /* inline u32 flash_address(flash_bank_t *bank, int sector, u32 offset) */
113 static __inline__ u32
flash_address(flash_bank_t
*bank
, int sector
, u32 offset
)
115 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
117 /* while the sector list isn't built, only accesses to sector 0 work */
119 return bank
->base
+ (offset
* bank
->bus_width
<< cfi_info
->x16_as_x8
);
124 LOG_ERROR("BUG: sector list not yet built");
127 return bank
->base
+ bank
->sectors
[sector
].offset
+ (offset
* bank
->bus_width
<< cfi_info
->x16_as_x8
);
132 static void cfi_command(flash_bank_t
*bank
, u8 cmd
, u8
*cmd_buf
)
136 /* clear whole buffer, to ensure bits that exceed the bus_width
139 for (i
= 0; i
< CFI_MAX_BUS_WIDTH
; i
++)
142 if (bank
->target
->endianness
== TARGET_LITTLE_ENDIAN
)
144 for (i
= bank
->bus_width
; i
> 0; i
--)
146 *cmd_buf
++ = (i
& (bank
->chip_width
- 1)) ? 0x0 : cmd
;
151 for (i
= 1; i
<= bank
->bus_width
; i
++)
153 *cmd_buf
++ = (i
& (bank
->chip_width
- 1)) ? 0x0 : cmd
;
158 /* read unsigned 8-bit value from the bank
159 * flash banks are expected to be made of similar chips
160 * the query result should be the same for all
162 static u8
cfi_query_u8(flash_bank_t
*bank
, int sector
, u32 offset
)
164 target_t
*target
= bank
->target
;
165 u8 data
[CFI_MAX_BUS_WIDTH
];
167 target
->type
->read_memory(target
, flash_address(bank
, sector
, offset
), bank
->bus_width
, 1, data
);
169 if (bank
->target
->endianness
== TARGET_LITTLE_ENDIAN
)
172 return data
[bank
->bus_width
- 1];
175 /* read unsigned 8-bit value from the bank
176 * in case of a bank made of multiple chips,
177 * the individual values are ORed
179 static u8
cfi_get_u8(flash_bank_t
*bank
, int sector
, u32 offset
)
181 target_t
*target
= bank
->target
;
182 u8 data
[CFI_MAX_BUS_WIDTH
];
185 target
->type
->read_memory(target
, flash_address(bank
, sector
, offset
), bank
->bus_width
, 1, data
);
187 if (bank
->target
->endianness
== TARGET_LITTLE_ENDIAN
)
189 for (i
= 0; i
< bank
->bus_width
/ bank
->chip_width
; i
++)
197 for (i
= 0; i
< bank
->bus_width
/ bank
->chip_width
; i
++)
198 value
|= data
[bank
->bus_width
- 1 - i
];
204 static u16
cfi_query_u16(flash_bank_t
*bank
, int sector
, u32 offset
)
206 target_t
*target
= bank
->target
;
207 u8 data
[CFI_MAX_BUS_WIDTH
* 2];
209 target
->type
->read_memory(target
, flash_address(bank
, sector
, offset
), bank
->bus_width
, 2, data
);
211 if (bank
->target
->endianness
== TARGET_LITTLE_ENDIAN
)
212 return data
[0] | data
[bank
->bus_width
] << 8;
214 return data
[bank
->bus_width
- 1] | data
[(2 * bank
->bus_width
) - 1] << 8;
217 static u32
cfi_query_u32(flash_bank_t
*bank
, int sector
, u32 offset
)
219 target_t
*target
= bank
->target
;
220 u8 data
[CFI_MAX_BUS_WIDTH
* 4];
222 target
->type
->read_memory(target
, flash_address(bank
, sector
, offset
), bank
->bus_width
, 4, data
);
224 if (bank
->target
->endianness
== TARGET_LITTLE_ENDIAN
)
225 return data
[0] | data
[bank
->bus_width
] << 8 | data
[bank
->bus_width
* 2] << 16 | data
[bank
->bus_width
* 3] << 24;
227 return data
[bank
->bus_width
- 1] | data
[(2* bank
->bus_width
) - 1] << 8 |
228 data
[(3 * bank
->bus_width
) - 1] << 16 | data
[(4 * bank
->bus_width
) - 1] << 24;
231 static void cfi_intel_clear_status_register(flash_bank_t
*bank
)
233 target_t
*target
= bank
->target
;
236 if (target
->state
!= TARGET_HALTED
)
238 LOG_ERROR("BUG: attempted to clear status register while target wasn't halted");
242 cfi_command(bank
, 0x50, command
);
243 target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
);
246 u8
cfi_intel_wait_status_busy(flash_bank_t
*bank
, int timeout
)
250 while ((!((status
= cfi_get_u8(bank
, 0, 0x0)) & 0x80)) && (timeout
-- > 0))
252 LOG_DEBUG("status: 0x%x", status
);
256 /* mask out bit 0 (reserved) */
257 status
= status
& 0xfe;
259 LOG_DEBUG("status: 0x%x", status
);
261 if ((status
& 0x80) != 0x80)
263 LOG_ERROR("timeout while waiting for WSM to become ready");
265 else if (status
!= 0x80)
267 LOG_ERROR("status register: 0x%x", status
);
269 LOG_ERROR("Block Lock-Bit Detected, Operation Abort");
271 LOG_ERROR("Program suspended");
273 LOG_ERROR("Low Programming Voltage Detected, Operation Aborted");
275 LOG_ERROR("Program Error / Error in Setting Lock-Bit");
277 LOG_ERROR("Error in Block Erasure or Clear Lock-Bits");
279 LOG_ERROR("Block Erase Suspended");
281 cfi_intel_clear_status_register(bank
);
287 int cfi_spansion_wait_status_busy(flash_bank_t
*bank
, int timeout
)
289 u8 status
, oldstatus
;
290 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
292 oldstatus
= cfi_get_u8(bank
, 0, 0x0);
295 status
= cfi_get_u8(bank
, 0, 0x0);
296 if ((status
^ oldstatus
) & 0x40) {
297 if (status
& cfi_info
->status_poll_mask
& 0x20) {
298 oldstatus
= cfi_get_u8(bank
, 0, 0x0);
299 status
= cfi_get_u8(bank
, 0, 0x0);
300 if ((status
^ oldstatus
) & 0x40) {
301 LOG_ERROR("dq5 timeout, status: 0x%x", status
);
302 return(ERROR_FLASH_OPERATION_FAILED
);
304 LOG_DEBUG("status: 0x%x", status
);
308 } else { /* no toggle: finished, OK */
309 LOG_DEBUG("status: 0x%x", status
);
315 } while (timeout
-- > 0);
317 LOG_ERROR("timeout, status: 0x%x", status
);
319 return(ERROR_FLASH_BUSY
);
322 static int cfi_read_intel_pri_ext(flash_bank_t
*bank
)
325 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
326 cfi_intel_pri_ext_t
*pri_ext
= malloc(sizeof(cfi_intel_pri_ext_t
));
327 target_t
*target
= bank
->target
;
330 cfi_info
->pri_ext
= pri_ext
;
332 pri_ext
->pri
[0] = cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 0);
333 pri_ext
->pri
[1] = cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 1);
334 pri_ext
->pri
[2] = cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 2);
336 if ((pri_ext
->pri
[0] != 'P') || (pri_ext
->pri
[1] != 'R') || (pri_ext
->pri
[2] != 'I'))
338 cfi_command(bank
, 0xf0, command
);
339 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
343 cfi_command(bank
, 0xff, command
);
344 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
348 LOG_ERROR("Could not read bank flash bank information");
349 return ERROR_FLASH_BANK_INVALID
;
352 pri_ext
->major_version
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 3);
353 pri_ext
->minor_version
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 4);
355 LOG_DEBUG("pri: '%c%c%c', version: %c.%c", pri_ext
->pri
[0], pri_ext
->pri
[1], pri_ext
->pri
[2], pri_ext
->major_version
, pri_ext
->minor_version
);
357 pri_ext
->feature_support
= cfi_query_u32(bank
, 0, cfi_info
->pri_addr
+ 5);
358 pri_ext
->suspend_cmd_support
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 9);
359 pri_ext
->blk_status_reg_mask
= cfi_query_u16(bank
, 0, cfi_info
->pri_addr
+ 0xa);
361 LOG_DEBUG("feature_support: 0x%x, suspend_cmd_support: 0x%x, blk_status_reg_mask: 0x%x", pri_ext
->feature_support
, pri_ext
->suspend_cmd_support
, pri_ext
->blk_status_reg_mask
);
363 pri_ext
->vcc_optimal
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 0xc);
364 pri_ext
->vpp_optimal
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 0xd);
366 LOG_DEBUG("Vcc opt: %1.1x.%1.1x, Vpp opt: %1.1x.%1.1x",
367 (pri_ext
->vcc_optimal
& 0xf0) >> 4, pri_ext
->vcc_optimal
& 0x0f,
368 (pri_ext
->vpp_optimal
& 0xf0) >> 4, pri_ext
->vpp_optimal
& 0x0f);
370 pri_ext
->num_protection_fields
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 0xe);
371 if (pri_ext
->num_protection_fields
!= 1)
373 LOG_WARNING("expected one protection register field, but found %i", pri_ext
->num_protection_fields
);
376 pri_ext
->prot_reg_addr
= cfi_query_u16(bank
, 0, cfi_info
->pri_addr
+ 0xf);
377 pri_ext
->fact_prot_reg_size
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 0x11);
378 pri_ext
->user_prot_reg_size
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 0x12);
380 LOG_DEBUG("protection_fields: %i, prot_reg_addr: 0x%x, factory pre-programmed: %i, user programmable: %i", pri_ext
->num_protection_fields
, pri_ext
->prot_reg_addr
, 1 << pri_ext
->fact_prot_reg_size
, 1 << pri_ext
->user_prot_reg_size
);
385 static int cfi_read_spansion_pri_ext(flash_bank_t
*bank
)
388 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
389 cfi_spansion_pri_ext_t
*pri_ext
= malloc(sizeof(cfi_spansion_pri_ext_t
));
390 target_t
*target
= bank
->target
;
393 cfi_info
->pri_ext
= pri_ext
;
395 pri_ext
->pri
[0] = cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 0);
396 pri_ext
->pri
[1] = cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 1);
397 pri_ext
->pri
[2] = cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 2);
399 if ((pri_ext
->pri
[0] != 'P') || (pri_ext
->pri
[1] != 'R') || (pri_ext
->pri
[2] != 'I'))
401 cfi_command(bank
, 0xf0, command
);
402 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
406 LOG_ERROR("Could not read spansion bank information");
407 return ERROR_FLASH_BANK_INVALID
;
410 pri_ext
->major_version
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 3);
411 pri_ext
->minor_version
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 4);
413 LOG_DEBUG("pri: '%c%c%c', version: %c.%c", pri_ext
->pri
[0], pri_ext
->pri
[1], pri_ext
->pri
[2], pri_ext
->major_version
, pri_ext
->minor_version
);
415 pri_ext
->SiliconRevision
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 5);
416 pri_ext
->EraseSuspend
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 6);
417 pri_ext
->BlkProt
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 7);
418 pri_ext
->TmpBlkUnprotect
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 8);
419 pri_ext
->BlkProtUnprot
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 9);
420 pri_ext
->SimultaneousOps
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 10);
421 pri_ext
->BurstMode
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 11);
422 pri_ext
->PageMode
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 12);
423 pri_ext
->VppMin
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 13);
424 pri_ext
->VppMax
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 14);
425 pri_ext
->TopBottom
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 15);
427 LOG_DEBUG("Silicon Revision: 0x%x, Erase Suspend: 0x%x, Block protect: 0x%x", pri_ext
->SiliconRevision
,
428 pri_ext
->EraseSuspend
, pri_ext
->BlkProt
);
430 LOG_DEBUG("Temporary Unprotect: 0x%x, Block Protect Scheme: 0x%x, Simultaneous Ops: 0x%x", pri_ext
->TmpBlkUnprotect
,
431 pri_ext
->BlkProtUnprot
, pri_ext
->SimultaneousOps
);
433 LOG_DEBUG("Burst Mode: 0x%x, Page Mode: 0x%x, ", pri_ext
->BurstMode
, pri_ext
->PageMode
);
436 LOG_DEBUG("Vpp min: %2.2d.%1.1d, Vpp max: %2.2d.%1.1x",
437 (pri_ext
->VppMin
& 0xf0) >> 4, pri_ext
->VppMin
& 0x0f,
438 (pri_ext
->VppMax
& 0xf0) >> 4, pri_ext
->VppMax
& 0x0f);
440 LOG_DEBUG("WP# protection 0x%x", pri_ext
->TopBottom
);
442 /* default values for implementation specific workarounds */
443 pri_ext
->_unlock1
= cfi_unlock_addresses
[CFI_UNLOCK_555_2AA
].unlock1
;
444 pri_ext
->_unlock2
= cfi_unlock_addresses
[CFI_UNLOCK_555_2AA
].unlock2
;
445 pri_ext
->_reversed_geometry
= 0;
450 static int cfi_read_atmel_pri_ext(flash_bank_t
*bank
)
453 cfi_atmel_pri_ext_t atmel_pri_ext
;
454 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
455 cfi_spansion_pri_ext_t
*pri_ext
= malloc(sizeof(cfi_spansion_pri_ext_t
));
456 target_t
*target
= bank
->target
;
459 /* ATMEL devices use the same CFI primary command set (0x2) as AMD/Spansion,
460 * but a different primary extended query table.
461 * We read the atmel table, and prepare a valid AMD/Spansion query table.
464 memset(pri_ext
, 0, sizeof(cfi_spansion_pri_ext_t
));
466 cfi_info
->pri_ext
= pri_ext
;
468 atmel_pri_ext
.pri
[0] = cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 0);
469 atmel_pri_ext
.pri
[1] = cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 1);
470 atmel_pri_ext
.pri
[2] = cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 2);
472 if ((atmel_pri_ext
.pri
[0] != 'P') || (atmel_pri_ext
.pri
[1] != 'R') || (atmel_pri_ext
.pri
[2] != 'I'))
474 cfi_command(bank
, 0xf0, command
);
475 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
479 LOG_ERROR("Could not read atmel bank information");
480 return ERROR_FLASH_BANK_INVALID
;
483 pri_ext
->pri
[0] = atmel_pri_ext
.pri
[0];
484 pri_ext
->pri
[1] = atmel_pri_ext
.pri
[1];
485 pri_ext
->pri
[2] = atmel_pri_ext
.pri
[2];
487 atmel_pri_ext
.major_version
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 3);
488 atmel_pri_ext
.minor_version
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 4);
490 LOG_DEBUG("pri: '%c%c%c', version: %c.%c", atmel_pri_ext
.pri
[0], atmel_pri_ext
.pri
[1], atmel_pri_ext
.pri
[2], atmel_pri_ext
.major_version
, atmel_pri_ext
.minor_version
);
492 pri_ext
->major_version
= atmel_pri_ext
.major_version
;
493 pri_ext
->minor_version
= atmel_pri_ext
.minor_version
;
495 atmel_pri_ext
.features
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 5);
496 atmel_pri_ext
.bottom_boot
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 6);
497 atmel_pri_ext
.burst_mode
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 7);
498 atmel_pri_ext
.page_mode
= cfi_query_u8(bank
, 0, cfi_info
->pri_addr
+ 8);
500 LOG_DEBUG("features: 0x%2.2x, bottom_boot: 0x%2.2x, burst_mode: 0x%2.2x, page_mode: 0x%2.2x",
501 atmel_pri_ext
.features
, atmel_pri_ext
.bottom_boot
, atmel_pri_ext
.burst_mode
, atmel_pri_ext
.page_mode
);
503 if (atmel_pri_ext
.features
& 0x02)
504 pri_ext
->EraseSuspend
= 2;
506 if (atmel_pri_ext
.bottom_boot
)
507 pri_ext
->TopBottom
= 2;
509 pri_ext
->TopBottom
= 3;
511 pri_ext
->_unlock1
= cfi_unlock_addresses
[CFI_UNLOCK_555_2AA
].unlock1
;
512 pri_ext
->_unlock2
= cfi_unlock_addresses
[CFI_UNLOCK_555_2AA
].unlock2
;
517 static int cfi_read_0002_pri_ext(flash_bank_t
*bank
)
519 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
521 if (cfi_info
->manufacturer
== CFI_MFR_ATMEL
)
523 return cfi_read_atmel_pri_ext(bank
);
527 return cfi_read_spansion_pri_ext(bank
);
531 static int cfi_spansion_info(struct flash_bank_s
*bank
, char *buf
, int buf_size
)
534 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
535 cfi_spansion_pri_ext_t
*pri_ext
= cfi_info
->pri_ext
;
537 printed
= snprintf(buf
, buf_size
, "\nSpansion primary algorithm extend information:\n");
541 printed
= snprintf(buf
, buf_size
, "pri: '%c%c%c', version: %c.%c\n", pri_ext
->pri
[0],
542 pri_ext
->pri
[1], pri_ext
->pri
[2],
543 pri_ext
->major_version
, pri_ext
->minor_version
);
547 printed
= snprintf(buf
, buf_size
, "Silicon Rev.: 0x%x, Address Sensitive unlock: 0x%x\n",
548 (pri_ext
->SiliconRevision
) >> 2,
549 (pri_ext
->SiliconRevision
) & 0x03);
553 printed
= snprintf(buf
, buf_size
, "Erase Suspend: 0x%x, Sector Protect: 0x%x\n",
554 pri_ext
->EraseSuspend
,
559 printed
= snprintf(buf
, buf_size
, "VppMin: %2.2d.%1.1x, VppMax: %2.2d.%1.1x\n",
560 (pri_ext
->VppMin
& 0xf0) >> 4, pri_ext
->VppMin
& 0x0f,
561 (pri_ext
->VppMax
& 0xf0) >> 4, pri_ext
->VppMax
& 0x0f);
566 static int cfi_intel_info(struct flash_bank_s
*bank
, char *buf
, int buf_size
)
569 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
570 cfi_intel_pri_ext_t
*pri_ext
= cfi_info
->pri_ext
;
572 printed
= snprintf(buf
, buf_size
, "\nintel primary algorithm extend information:\n");
576 printed
= snprintf(buf
, buf_size
, "pri: '%c%c%c', version: %c.%c\n", pri_ext
->pri
[0], pri_ext
->pri
[1], pri_ext
->pri
[2], pri_ext
->major_version
, pri_ext
->minor_version
);
580 printed
= snprintf(buf
, buf_size
, "feature_support: 0x%x, suspend_cmd_support: 0x%x, blk_status_reg_mask: 0x%x\n", pri_ext
->feature_support
, pri_ext
->suspend_cmd_support
, pri_ext
->blk_status_reg_mask
);
584 printed
= snprintf(buf
, buf_size
, "Vcc opt: %1.1x.%1.1x, Vpp opt: %1.1x.%1.1x\n",
585 (pri_ext
->vcc_optimal
& 0xf0) >> 4, pri_ext
->vcc_optimal
& 0x0f,
586 (pri_ext
->vpp_optimal
& 0xf0) >> 4, pri_ext
->vpp_optimal
& 0x0f);
590 printed
= snprintf(buf
, buf_size
, "protection_fields: %i, prot_reg_addr: 0x%x, factory pre-programmed: %i, user programmable: %i\n", pri_ext
->num_protection_fields
, pri_ext
->prot_reg_addr
, 1 << pri_ext
->fact_prot_reg_size
, 1 << pri_ext
->user_prot_reg_size
);
595 static int cfi_register_commands(struct command_context_s
*cmd_ctx
)
597 /*command_t *cfi_cmd = */
598 register_command(cmd_ctx
, NULL
, "cfi", NULL
, COMMAND_ANY
, "flash bank cfi <base> <size> <chip_width> <bus_width> <targetNum> [jedec_probe/x16_as_x8]");
600 register_command(cmd_ctx, cfi_cmd, "part_id", cfi_handle_part_id_command, COMMAND_EXEC,
601 "print part id of cfi flash bank <num>");
606 /* flash_bank cfi <base> <size> <chip_width> <bus_width> <target#> [options]
608 static int cfi_flash_bank_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
, struct flash_bank_s
*bank
)
610 cfi_flash_bank_t
*cfi_info
;
617 LOG_WARNING("incomplete flash_bank cfi configuration");
618 return ERROR_FLASH_BANK_INVALID
;
621 if ((strtoul(args
[4], NULL
, 0) > CFI_MAX_CHIP_WIDTH
)
622 || (strtoul(args
[3], NULL
, 0) > CFI_MAX_BUS_WIDTH
))
624 LOG_ERROR("chip and bus width have to specified in bytes");
625 return ERROR_FLASH_BANK_INVALID
;
628 cfi_info
= malloc(sizeof(cfi_flash_bank_t
));
629 cfi_info
->probed
= 0;
630 bank
->driver_priv
= cfi_info
;
632 cfi_info
->write_algorithm
= NULL
;
634 cfi_info
->x16_as_x8
= 0;
635 cfi_info
->jedec_probe
= 0;
636 cfi_info
->not_cfi
= 0;
638 for (i
= 6; i
< argc
; i
++)
640 if (strcmp(args
[i
], "x16_as_x8") == 0)
642 cfi_info
->x16_as_x8
= 1;
644 else if (strcmp(args
[i
], "jedec_probe") == 0)
646 cfi_info
->jedec_probe
= 1;
650 cfi_info
->write_algorithm
= NULL
;
652 /* bank wasn't probed yet */
653 cfi_info
->qry
[0] = -1;
658 static int cfi_intel_erase(struct flash_bank_s
*bank
, int first
, int last
)
661 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
662 target_t
*target
= bank
->target
;
666 cfi_intel_clear_status_register(bank
);
668 for (i
= first
; i
<= last
; i
++)
670 cfi_command(bank
, 0x20, command
);
671 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, i
, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
676 cfi_command(bank
, 0xd0, command
);
677 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, i
, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
682 if (cfi_intel_wait_status_busy(bank
, 1000 * (1 << cfi_info
->block_erase_timeout_typ
)) == 0x80)
683 bank
->sectors
[i
].is_erased
= 1;
686 cfi_command(bank
, 0xff, command
);
687 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
692 LOG_ERROR("couldn't erase block %i of flash bank at base 0x%x", i
, bank
->base
);
693 return ERROR_FLASH_OPERATION_FAILED
;
697 cfi_command(bank
, 0xff, command
);
698 return target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
);
702 static int cfi_spansion_erase(struct flash_bank_s
*bank
, int first
, int last
)
705 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
706 cfi_spansion_pri_ext_t
*pri_ext
= cfi_info
->pri_ext
;
707 target_t
*target
= bank
->target
;
711 for (i
= first
; i
<= last
; i
++)
713 cfi_command(bank
, 0xaa, command
);
714 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, pri_ext
->_unlock1
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
719 cfi_command(bank
, 0x55, command
);
720 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, pri_ext
->_unlock2
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
725 cfi_command(bank
, 0x80, command
);
726 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, pri_ext
->_unlock1
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
731 cfi_command(bank
, 0xaa, command
);
732 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, pri_ext
->_unlock1
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
737 cfi_command(bank
, 0x55, command
);
738 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, pri_ext
->_unlock2
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
743 cfi_command(bank
, 0x30, command
);
744 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, i
, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
749 if (cfi_spansion_wait_status_busy(bank
, 1000 * (1 << cfi_info
->block_erase_timeout_typ
)) == ERROR_OK
)
750 bank
->sectors
[i
].is_erased
= 1;
753 cfi_command(bank
, 0xf0, command
);
754 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
759 LOG_ERROR("couldn't erase block %i of flash bank at base 0x%x", i
, bank
->base
);
760 return ERROR_FLASH_OPERATION_FAILED
;
764 cfi_command(bank
, 0xf0, command
);
765 return target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
);
768 static int cfi_erase(struct flash_bank_s
*bank
, int first
, int last
)
770 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
772 if (bank
->target
->state
!= TARGET_HALTED
)
774 LOG_ERROR("Target not halted");
775 return ERROR_TARGET_NOT_HALTED
;
778 if ((first
< 0) || (last
< first
) || (last
>= bank
->num_sectors
))
780 return ERROR_FLASH_SECTOR_INVALID
;
783 if (cfi_info
->qry
[0] != 'Q')
784 return ERROR_FLASH_BANK_NOT_PROBED
;
786 switch(cfi_info
->pri_id
)
790 return cfi_intel_erase(bank
, first
, last
);
793 return cfi_spansion_erase(bank
, first
, last
);
796 LOG_ERROR("cfi primary command set %i unsupported", cfi_info
->pri_id
);
803 static int cfi_intel_protect(struct flash_bank_s
*bank
, int set
, int first
, int last
)
806 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
807 cfi_intel_pri_ext_t
*pri_ext
= cfi_info
->pri_ext
;
808 target_t
*target
= bank
->target
;
813 /* if the device supports neither legacy lock/unlock (bit 3) nor
814 * instant individual block locking (bit 5).
816 if (!(pri_ext
->feature_support
& 0x28))
817 return ERROR_FLASH_OPERATION_FAILED
;
819 cfi_intel_clear_status_register(bank
);
821 for (i
= first
; i
<= last
; i
++)
823 cfi_command(bank
, 0x60, command
);
824 LOG_DEBUG("address: 0x%4.4x, command: 0x%4.4x", flash_address(bank
, i
, 0x0), target_buffer_get_u32(target
, command
));
825 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, i
, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
831 cfi_command(bank
, 0x01, command
);
832 LOG_DEBUG("address: 0x%4.4x, command: 0x%4.4x", flash_address(bank
, i
, 0x0), target_buffer_get_u32(target
, command
));
833 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, i
, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
837 bank
->sectors
[i
].is_protected
= 1;
841 cfi_command(bank
, 0xd0, command
);
842 LOG_DEBUG("address: 0x%4.4x, command: 0x%4.4x", flash_address(bank
, i
, 0x0), target_buffer_get_u32(target
, command
));
843 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, i
, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
847 bank
->sectors
[i
].is_protected
= 0;
850 /* instant individual block locking doesn't require reading of the status register */
851 if (!(pri_ext
->feature_support
& 0x20))
853 /* Clear lock bits operation may take up to 1.4s */
854 cfi_intel_wait_status_busy(bank
, 1400);
859 /* read block lock bit, to verify status */
860 cfi_command(bank
, 0x90, command
);
861 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x55), bank
->bus_width
, 1, command
)) != ERROR_OK
)
865 block_status
= cfi_get_u8(bank
, i
, 0x2);
867 if ((block_status
& 0x1) != set
)
869 LOG_ERROR("couldn't change block lock status (set = %i, block_status = 0x%2.2x)", set
, block_status
);
870 cfi_command(bank
, 0x70, command
);
871 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x55), bank
->bus_width
, 1, command
)) != ERROR_OK
)
875 cfi_intel_wait_status_busy(bank
, 10);
878 return ERROR_FLASH_OPERATION_FAILED
;
888 /* if the device doesn't support individual block lock bits set/clear,
889 * all blocks have been unlocked in parallel, so we set those that should be protected
891 if ((!set
) && (!(pri_ext
->feature_support
& 0x20)))
893 for (i
= 0; i
< bank
->num_sectors
; i
++)
895 if (bank
->sectors
[i
].is_protected
== 1)
897 cfi_intel_clear_status_register(bank
);
899 cfi_command(bank
, 0x60, command
);
900 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, i
, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
905 cfi_command(bank
, 0x01, command
);
906 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, i
, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
911 cfi_intel_wait_status_busy(bank
, 100);
916 cfi_command(bank
, 0xff, command
);
917 return target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
);
920 static int cfi_protect(struct flash_bank_s
*bank
, int set
, int first
, int last
)
922 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
924 if (bank
->target
->state
!= TARGET_HALTED
)
926 LOG_ERROR("Target not halted");
927 return ERROR_TARGET_NOT_HALTED
;
930 if ((first
< 0) || (last
< first
) || (last
>= bank
->num_sectors
))
932 return ERROR_FLASH_SECTOR_INVALID
;
935 if (cfi_info
->qry
[0] != 'Q')
936 return ERROR_FLASH_BANK_NOT_PROBED
;
938 switch(cfi_info
->pri_id
)
942 cfi_intel_protect(bank
, set
, first
, last
);
945 LOG_ERROR("protect: cfi primary command set %i unsupported", cfi_info
->pri_id
);
952 /* FIXME Replace this by a simple memcpy() - still unsure about sideeffects */
953 static void cfi_add_byte(struct flash_bank_s
*bank
, u8
*word
, u8 byte
)
955 /* target_t *target = bank->target; */
960 * The data to flash must not be changed in endian! We write a bytestrem in
961 * target byte order already. Only the control and status byte lane of the flash
962 * WSM is interpreted by the CPU in different ways, when read a u16 or u32
963 * word (data seems to be in the upper or lower byte lane for u16 accesses).
967 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
971 for (i
= 0; i
< bank
->bus_width
- 1; i
++)
972 word
[i
] = word
[i
+ 1];
973 word
[bank
->bus_width
- 1] = byte
;
979 for (i
= bank
->bus_width
- 1; i
> 0; i
--)
980 word
[i
] = word
[i
- 1];
986 /* Convert code image to target endian */
987 /* FIXME create general block conversion fcts in target.c?) */
988 static void cfi_fix_code_endian(target_t
*target
, u8
*dest
, const u32
*src
, u32 count
)
991 for (i
=0; i
< count
; i
++)
993 target_buffer_set_u32(target
, dest
, *src
);
999 static u32
cfi_command_val(flash_bank_t
*bank
, u8 cmd
)
1001 target_t
*target
= bank
->target
;
1003 u8 buf
[CFI_MAX_BUS_WIDTH
];
1004 cfi_command(bank
, cmd
, buf
);
1005 switch (bank
->bus_width
)
1011 return target_buffer_get_u16(target
, buf
);
1014 return target_buffer_get_u32(target
, buf
);
1017 LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes", bank
->bus_width
);
1022 static int cfi_intel_write_block(struct flash_bank_s
*bank
, u8
*buffer
, u32 address
, u32 count
)
1024 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
1025 target_t
*target
= bank
->target
;
1026 reg_param_t reg_params
[7];
1027 armv4_5_algorithm_t armv4_5_info
;
1028 working_area_t
*source
;
1029 u32 buffer_size
= 32768;
1030 u32 write_command_val
, busy_pattern_val
, error_pattern_val
;
1032 /* algorithm register usage:
1033 * r0: source address (in RAM)
1034 * r1: target address (in Flash)
1036 * r3: flash write command
1037 * r4: status byte (returned to host)
1038 * r5: busy test pattern
1039 * r6: error test pattern
1042 static const u32 word_32_code
[] = {
1043 0xe4904004, /* loop: ldr r4, [r0], #4 */
1044 0xe5813000, /* str r3, [r1] */
1045 0xe5814000, /* str r4, [r1] */
1046 0xe5914000, /* busy: ldr r4, [r1] */
1047 0xe0047005, /* and r7, r4, r5 */
1048 0xe1570005, /* cmp r7, r5 */
1049 0x1afffffb, /* bne busy */
1050 0xe1140006, /* tst r4, r6 */
1051 0x1a000003, /* bne done */
1052 0xe2522001, /* subs r2, r2, #1 */
1053 0x0a000001, /* beq done */
1054 0xe2811004, /* add r1, r1 #4 */
1055 0xeafffff2, /* b loop */
1056 0xeafffffe /* done: b -2 */
1059 static const u32 word_16_code
[] = {
1060 0xe0d040b2, /* loop: ldrh r4, [r0], #2 */
1061 0xe1c130b0, /* strh r3, [r1] */
1062 0xe1c140b0, /* strh r4, [r1] */
1063 0xe1d140b0, /* busy ldrh r4, [r1] */
1064 0xe0047005, /* and r7, r4, r5 */
1065 0xe1570005, /* cmp r7, r5 */
1066 0x1afffffb, /* bne busy */
1067 0xe1140006, /* tst r4, r6 */
1068 0x1a000003, /* bne done */
1069 0xe2522001, /* subs r2, r2, #1 */
1070 0x0a000001, /* beq done */
1071 0xe2811002, /* add r1, r1 #2 */
1072 0xeafffff2, /* b loop */
1073 0xeafffffe /* done: b -2 */
1076 static const u32 word_8_code
[] = {
1077 0xe4d04001, /* loop: ldrb r4, [r0], #1 */
1078 0xe5c13000, /* strb r3, [r1] */
1079 0xe5c14000, /* strb r4, [r1] */
1080 0xe5d14000, /* busy ldrb r4, [r1] */
1081 0xe0047005, /* and r7, r4, r5 */
1082 0xe1570005, /* cmp r7, r5 */
1083 0x1afffffb, /* bne busy */
1084 0xe1140006, /* tst r4, r6 */
1085 0x1a000003, /* bne done */
1086 0xe2522001, /* subs r2, r2, #1 */
1087 0x0a000001, /* beq done */
1088 0xe2811001, /* add r1, r1 #1 */
1089 0xeafffff2, /* b loop */
1090 0xeafffffe /* done: b -2 */
1092 u8 target_code
[4*CFI_MAX_INTEL_CODESIZE
];
1093 const u32
*target_code_src
;
1094 u32 target_code_size
;
1095 int retval
= ERROR_OK
;
1098 cfi_intel_clear_status_register(bank
);
1100 armv4_5_info
.common_magic
= ARMV4_5_COMMON_MAGIC
;
1101 armv4_5_info
.core_mode
= ARMV4_5_MODE_SVC
;
1102 armv4_5_info
.core_state
= ARMV4_5_STATE_ARM
;
1104 /* If we are setting up the write_algorith, we need target_code_src */
1105 /* if not we only need target_code_size. */
1107 /* However, we don't want to create multiple code paths, so we */
1108 /* do the unecessary evaluation of target_code_src, which the */
1109 /* compiler will probably nicely optimize away if not needed */
1111 /* prepare algorithm code for target endian */
1112 switch (bank
->bus_width
)
1115 target_code_src
= word_8_code
;
1116 target_code_size
= sizeof(word_8_code
);
1119 target_code_src
= word_16_code
;
1120 target_code_size
= sizeof(word_16_code
);
1123 target_code_src
= word_32_code
;
1124 target_code_size
= sizeof(word_32_code
);
1127 LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes", bank
->bus_width
);
1128 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1131 /* flash write code */
1132 if (!cfi_info
->write_algorithm
)
1134 if ( target_code_size
> sizeof(target_code
) )
1136 LOG_WARNING("Internal error - target code buffer to small. Increase CFI_MAX_INTEL_CODESIZE and recompile.");
1137 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1139 cfi_fix_code_endian(target
, target_code
, target_code_src
, target_code_size
/ 4);
1141 /* Get memory for block write handler */
1142 retval
= target_alloc_working_area(target
, target_code_size
, &cfi_info
->write_algorithm
);
1143 if (retval
!= ERROR_OK
)
1145 LOG_WARNING("No working area available, can't do block memory writes");
1146 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1149 /* write algorithm code to working area */
1150 retval
= target_write_buffer(target
, cfi_info
->write_algorithm
->address
, target_code_size
, target_code
);
1151 if (retval
!= ERROR_OK
)
1153 LOG_ERROR("Unable to write block write code to target");
1158 /* Get a workspace buffer for the data to flash starting with 32k size.
1159 Half size until buffer would be smaller 256 Bytem then fail back */
1160 /* FIXME Why 256 bytes, why not 32 bytes (smallest flash write page */
1161 while (target_alloc_working_area(target
, buffer_size
, &source
) != ERROR_OK
)
1164 if (buffer_size
<= 256)
1166 LOG_WARNING("no large enough working area available, can't do block memory writes");
1167 retval
= ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1172 /* setup algo registers */
1173 init_reg_param(®_params
[0], "r0", 32, PARAM_OUT
);
1174 init_reg_param(®_params
[1], "r1", 32, PARAM_OUT
);
1175 init_reg_param(®_params
[2], "r2", 32, PARAM_OUT
);
1176 init_reg_param(®_params
[3], "r3", 32, PARAM_OUT
);
1177 init_reg_param(®_params
[4], "r4", 32, PARAM_IN
);
1178 init_reg_param(®_params
[5], "r5", 32, PARAM_OUT
);
1179 init_reg_param(®_params
[6], "r6", 32, PARAM_OUT
);
1181 /* prepare command and status register patterns */
1182 write_command_val
= cfi_command_val(bank
, 0x40);
1183 busy_pattern_val
= cfi_command_val(bank
, 0x80);
1184 error_pattern_val
= cfi_command_val(bank
, 0x7e);
1186 LOG_INFO("Using target buffer at 0x%08x and of size 0x%04x", source
->address
, buffer_size
);
1188 /* Programming main loop */
1191 u32 thisrun_count
= (count
> buffer_size
) ? buffer_size
: count
;
1194 if((retval
= target_write_buffer(target
, source
->address
, thisrun_count
, buffer
)) != ERROR_OK
)
1199 buf_set_u32(reg_params
[0].value
, 0, 32, source
->address
);
1200 buf_set_u32(reg_params
[1].value
, 0, 32, address
);
1201 buf_set_u32(reg_params
[2].value
, 0, 32, thisrun_count
/ bank
->bus_width
);
1203 buf_set_u32(reg_params
[3].value
, 0, 32, write_command_val
);
1204 buf_set_u32(reg_params
[5].value
, 0, 32, busy_pattern_val
);
1205 buf_set_u32(reg_params
[6].value
, 0, 32, error_pattern_val
);
1207 LOG_INFO("Write 0x%04x bytes to flash at 0x%08x", thisrun_count
, address
);
1209 /* Execute algorithm, assume breakpoint for last instruction */
1210 retval
= target
->type
->run_algorithm(target
, 0, NULL
, 7, reg_params
,
1211 cfi_info
->write_algorithm
->address
,
1212 cfi_info
->write_algorithm
->address
+ target_code_size
- sizeof(u32
),
1213 10000, /* 10s should be enough for max. 32k of data */
1216 /* On failure try a fall back to direct word writes */
1217 if (retval
!= ERROR_OK
)
1219 cfi_intel_clear_status_register(bank
);
1220 LOG_ERROR("Execution of flash algorythm failed. Can't fall back. Please report.");
1221 retval
= ERROR_FLASH_OPERATION_FAILED
;
1222 /* retval = ERROR_TARGET_RESOURCE_NOT_AVAILABLE; */
1223 /* FIXME To allow fall back or recovery, we must save the actual status
1224 somewhere, so that a higher level code can start recovery. */
1228 /* Check return value from algo code */
1229 wsm_error
= buf_get_u32(reg_params
[4].value
, 0, 32) & error_pattern_val
;
1232 /* read status register (outputs debug inforation) */
1233 cfi_intel_wait_status_busy(bank
, 100);
1234 cfi_intel_clear_status_register(bank
);
1235 retval
= ERROR_FLASH_OPERATION_FAILED
;
1239 buffer
+= thisrun_count
;
1240 address
+= thisrun_count
;
1241 count
-= thisrun_count
;
1244 /* free up resources */
1247 target_free_working_area(target
, source
);
1249 if (cfi_info
->write_algorithm
)
1251 target_free_working_area(target
, cfi_info
->write_algorithm
);
1252 cfi_info
->write_algorithm
= NULL
;
1255 destroy_reg_param(®_params
[0]);
1256 destroy_reg_param(®_params
[1]);
1257 destroy_reg_param(®_params
[2]);
1258 destroy_reg_param(®_params
[3]);
1259 destroy_reg_param(®_params
[4]);
1260 destroy_reg_param(®_params
[5]);
1261 destroy_reg_param(®_params
[6]);
1266 static int cfi_spansion_write_block(struct flash_bank_s
*bank
, u8
*buffer
, u32 address
, u32 count
)
1268 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
1269 cfi_spansion_pri_ext_t
*pri_ext
= cfi_info
->pri_ext
;
1270 target_t
*target
= bank
->target
;
1271 reg_param_t reg_params
[10];
1272 armv4_5_algorithm_t armv4_5_info
;
1273 working_area_t
*source
;
1274 u32 buffer_size
= 32768;
1276 int retval
, retvaltemp
;
1277 int exit_code
= ERROR_OK
;
1279 /* input parameters - */
1280 /* R0 = source address */
1281 /* R1 = destination address */
1282 /* R2 = number of writes */
1283 /* R3 = flash write command */
1284 /* R4 = constant to mask DQ7 bits (also used for Dq5 with shift) */
1285 /* output parameters - */
1286 /* R5 = 0x80 ok 0x00 bad */
1287 /* temp registers - */
1288 /* R6 = value read from flash to test status */
1289 /* R7 = holding register */
1290 /* unlock registers - */
1291 /* R8 = unlock1_addr */
1292 /* R9 = unlock1_cmd */
1293 /* R10 = unlock2_addr */
1294 /* R11 = unlock2_cmd */
1296 static const u32 word_32_code
[] = {
1297 /* 00008100 <sp_32_code>: */
1298 0xe4905004, /* ldr r5, [r0], #4 */
1299 0xe5889000, /* str r9, [r8] */
1300 0xe58ab000, /* str r11, [r10] */
1301 0xe5883000, /* str r3, [r8] */
1302 0xe5815000, /* str r5, [r1] */
1303 0xe1a00000, /* nop */
1305 /* 00008110 <sp_32_busy>: */
1306 0xe5916000, /* ldr r6, [r1] */
1307 0xe0257006, /* eor r7, r5, r6 */
1308 0xe0147007, /* ands r7, r4, r7 */
1309 0x0a000007, /* beq 8140 <sp_32_cont> ; b if DQ7 == Data7 */
1310 0xe0166124, /* ands r6, r6, r4, lsr #2 */
1311 0x0afffff9, /* beq 8110 <sp_32_busy> ; b if DQ5 low */
1312 0xe5916000, /* ldr r6, [r1] */
1313 0xe0257006, /* eor r7, r5, r6 */
1314 0xe0147007, /* ands r7, r4, r7 */
1315 0x0a000001, /* beq 8140 <sp_32_cont> ; b if DQ7 == Data7 */
1316 0xe3a05000, /* mov r5, #0 ; 0x0 - return 0x00, error */
1317 0x1a000004, /* bne 8154 <sp_32_done> */
1319 /* 00008140 <sp_32_cont>: */
1320 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
1321 0x03a05080, /* moveq r5, #128 ; 0x80 */
1322 0x0a000001, /* beq 8154 <sp_32_done> */
1323 0xe2811004, /* add r1, r1, #4 ; 0x4 */
1324 0xeaffffe8, /* b 8100 <sp_32_code> */
1326 /* 00008154 <sp_32_done>: */
1327 0xeafffffe /* b 8154 <sp_32_done> */
1330 static const u32 word_16_code
[] = {
1331 /* 00008158 <sp_16_code>: */
1332 0xe0d050b2, /* ldrh r5, [r0], #2 */
1333 0xe1c890b0, /* strh r9, [r8] */
1334 0xe1cab0b0, /* strh r11, [r10] */
1335 0xe1c830b0, /* strh r3, [r8] */
1336 0xe1c150b0, /* strh r5, [r1] */
1337 0xe1a00000, /* nop (mov r0,r0) */
1339 /* 00008168 <sp_16_busy>: */
1340 0xe1d160b0, /* ldrh r6, [r1] */
1341 0xe0257006, /* eor r7, r5, r6 */
1342 0xe0147007, /* ands r7, r4, r7 */
1343 0x0a000007, /* beq 8198 <sp_16_cont> */
1344 0xe0166124, /* ands r6, r6, r4, lsr #2 */
1345 0x0afffff9, /* beq 8168 <sp_16_busy> */
1346 0xe1d160b0, /* ldrh r6, [r1] */
1347 0xe0257006, /* eor r7, r5, r6 */
1348 0xe0147007, /* ands r7, r4, r7 */
1349 0x0a000001, /* beq 8198 <sp_16_cont> */
1350 0xe3a05000, /* mov r5, #0 ; 0x0 */
1351 0x1a000004, /* bne 81ac <sp_16_done> */
1353 /* 00008198 <sp_16_cont>: */
1354 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
1355 0x03a05080, /* moveq r5, #128 ; 0x80 */
1356 0x0a000001, /* beq 81ac <sp_16_done> */
1357 0xe2811002, /* add r1, r1, #2 ; 0x2 */
1358 0xeaffffe8, /* b 8158 <sp_16_code> */
1360 /* 000081ac <sp_16_done>: */
1361 0xeafffffe /* b 81ac <sp_16_done> */
1364 static const u32 word_8_code
[] = {
1365 /* 000081b0 <sp_16_code_end>: */
1366 0xe4d05001, /* ldrb r5, [r0], #1 */
1367 0xe5c89000, /* strb r9, [r8] */
1368 0xe5cab000, /* strb r11, [r10] */
1369 0xe5c83000, /* strb r3, [r8] */
1370 0xe5c15000, /* strb r5, [r1] */
1371 0xe1a00000, /* nop (mov r0,r0) */
1373 /* 000081c0 <sp_8_busy>: */
1374 0xe5d16000, /* ldrb r6, [r1] */
1375 0xe0257006, /* eor r7, r5, r6 */
1376 0xe0147007, /* ands r7, r4, r7 */
1377 0x0a000007, /* beq 81f0 <sp_8_cont> */
1378 0xe0166124, /* ands r6, r6, r4, lsr #2 */
1379 0x0afffff9, /* beq 81c0 <sp_8_busy> */
1380 0xe5d16000, /* ldrb r6, [r1] */
1381 0xe0257006, /* eor r7, r5, r6 */
1382 0xe0147007, /* ands r7, r4, r7 */
1383 0x0a000001, /* beq 81f0 <sp_8_cont> */
1384 0xe3a05000, /* mov r5, #0 ; 0x0 */
1385 0x1a000004, /* bne 8204 <sp_8_done> */
1387 /* 000081f0 <sp_8_cont>: */
1388 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
1389 0x03a05080, /* moveq r5, #128 ; 0x80 */
1390 0x0a000001, /* beq 8204 <sp_8_done> */
1391 0xe2811001, /* add r1, r1, #1 ; 0x1 */
1392 0xeaffffe8, /* b 81b0 <sp_16_code_end> */
1394 /* 00008204 <sp_8_done>: */
1395 0xeafffffe /* b 8204 <sp_8_done> */
1398 armv4_5_info
.common_magic
= ARMV4_5_COMMON_MAGIC
;
1399 armv4_5_info
.core_mode
= ARMV4_5_MODE_SVC
;
1400 armv4_5_info
.core_state
= ARMV4_5_STATE_ARM
;
1402 /* flash write code */
1403 if (!cfi_info
->write_algorithm
)
1406 int target_code_size
;
1409 /* convert bus-width dependent algorithm code to correct endiannes */
1410 switch (bank
->bus_width
)
1414 target_code_size
= sizeof(word_8_code
);
1418 target_code_size
= sizeof(word_16_code
);
1422 target_code_size
= sizeof(word_32_code
);
1425 LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes", bank
->bus_width
);
1426 return ERROR_FLASH_OPERATION_FAILED
;
1428 target_code
= malloc(target_code_size
);
1429 cfi_fix_code_endian(target
, target_code
, src
, target_code_size
/ 4);
1431 /* allocate working area */
1432 retval
=target_alloc_working_area(target
, target_code_size
,
1433 &cfi_info
->write_algorithm
);
1434 if (retval
!= ERROR_OK
)
1440 /* write algorithm code to working area */
1441 if((retval
= target_write_buffer(target
, cfi_info
->write_algorithm
->address
,
1442 target_code_size
, target_code
)) != ERROR_OK
)
1450 /* the following code still assumes target code is fixed 24*4 bytes */
1452 while (target_alloc_working_area(target
, buffer_size
, &source
) != ERROR_OK
)
1455 if (buffer_size
<= 256)
1457 /* if we already allocated the writing code, but failed to get a buffer, free the algorithm */
1458 if (cfi_info
->write_algorithm
)
1459 target_free_working_area(target
, cfi_info
->write_algorithm
);
1461 LOG_WARNING("not enough working area available, can't do block memory writes");
1462 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1466 init_reg_param(®_params
[0], "r0", 32, PARAM_OUT
);
1467 init_reg_param(®_params
[1], "r1", 32, PARAM_OUT
);
1468 init_reg_param(®_params
[2], "r2", 32, PARAM_OUT
);
1469 init_reg_param(®_params
[3], "r3", 32, PARAM_OUT
);
1470 init_reg_param(®_params
[4], "r4", 32, PARAM_OUT
);
1471 init_reg_param(®_params
[5], "r5", 32, PARAM_IN
);
1472 init_reg_param(®_params
[6], "r8", 32, PARAM_OUT
);
1473 init_reg_param(®_params
[7], "r9", 32, PARAM_OUT
);
1474 init_reg_param(®_params
[8], "r10", 32, PARAM_OUT
);
1475 init_reg_param(®_params
[9], "r11", 32, PARAM_OUT
);
1479 u32 thisrun_count
= (count
> buffer_size
) ? buffer_size
: count
;
1481 retvaltemp
= target_write_buffer(target
, source
->address
, thisrun_count
, buffer
);
1483 buf_set_u32(reg_params
[0].value
, 0, 32, source
->address
);
1484 buf_set_u32(reg_params
[1].value
, 0, 32, address
);
1485 buf_set_u32(reg_params
[2].value
, 0, 32, thisrun_count
/ bank
->bus_width
);
1486 buf_set_u32(reg_params
[3].value
, 0, 32, cfi_command_val(bank
, 0xA0));
1487 buf_set_u32(reg_params
[4].value
, 0, 32, cfi_command_val(bank
, 0x80));
1488 buf_set_u32(reg_params
[6].value
, 0, 32, flash_address(bank
, 0, pri_ext
->_unlock1
));
1489 buf_set_u32(reg_params
[7].value
, 0, 32, 0xaaaaaaaa);
1490 buf_set_u32(reg_params
[8].value
, 0, 32, flash_address(bank
, 0, pri_ext
->_unlock2
));
1491 buf_set_u32(reg_params
[9].value
, 0, 32, 0x55555555);
1493 retval
= target
->type
->run_algorithm(target
, 0, NULL
, 10, reg_params
,
1494 cfi_info
->write_algorithm
->address
,
1495 cfi_info
->write_algorithm
->address
+ ((24 * 4) - 4),
1496 10000, &armv4_5_info
);
1498 status
= buf_get_u32(reg_params
[5].value
, 0, 32);
1500 if ((retval
!= ERROR_OK
) || (retvaltemp
!= ERROR_OK
) || status
!= 0x80)
1502 LOG_DEBUG("status: 0x%x", status
);
1503 exit_code
= ERROR_FLASH_OPERATION_FAILED
;
1507 buffer
+= thisrun_count
;
1508 address
+= thisrun_count
;
1509 count
-= thisrun_count
;
1512 target_free_working_area(target
, source
);
1514 destroy_reg_param(®_params
[0]);
1515 destroy_reg_param(®_params
[1]);
1516 destroy_reg_param(®_params
[2]);
1517 destroy_reg_param(®_params
[3]);
1518 destroy_reg_param(®_params
[4]);
1519 destroy_reg_param(®_params
[5]);
1520 destroy_reg_param(®_params
[6]);
1521 destroy_reg_param(®_params
[7]);
1522 destroy_reg_param(®_params
[8]);
1523 destroy_reg_param(®_params
[9]);
1528 static int cfi_intel_write_word(struct flash_bank_s
*bank
, u8
*word
, u32 address
)
1531 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
1532 target_t
*target
= bank
->target
;
1535 cfi_intel_clear_status_register(bank
);
1536 cfi_command(bank
, 0x40, command
);
1537 if((retval
= target
->type
->write_memory(target
, address
, bank
->bus_width
, 1, command
)) != ERROR_OK
)
1542 if((retval
= target
->type
->write_memory(target
, address
, bank
->bus_width
, 1, word
)) != ERROR_OK
)
1547 if (cfi_intel_wait_status_busy(bank
, 1000 * (1 << cfi_info
->word_write_timeout_max
)) != 0x80)
1549 cfi_command(bank
, 0xff, command
);
1550 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
1555 LOG_ERROR("couldn't write word at base 0x%x, address %x", bank
->base
, address
);
1556 return ERROR_FLASH_OPERATION_FAILED
;
1562 static int cfi_intel_write_words(struct flash_bank_s
*bank
, u8
*word
, u32 wordcount
, u32 address
)
1565 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
1566 target_t
*target
= bank
->target
;
1569 /* Calculate buffer size and boundary mask */
1570 u32 buffersize
= (1UL << cfi_info
->max_buf_write_size
) * (bank
->bus_width
/ bank
->chip_width
);
1571 u32 buffermask
= buffersize
-1;
1574 /* Check for valid range */
1575 if (address
& buffermask
)
1577 LOG_ERROR("Write address at base 0x%x, address %x not aligned to 2^%d boundary", bank
->base
, address
, cfi_info
->max_buf_write_size
);
1578 return ERROR_FLASH_OPERATION_FAILED
;
1580 switch(bank
->chip_width
)
1582 case 4 : bufferwsize
= buffersize
/ 4; break;
1583 case 2 : bufferwsize
= buffersize
/ 2; break;
1584 case 1 : bufferwsize
= buffersize
; break;
1586 LOG_ERROR("Unsupported chip width %d", bank
->chip_width
);
1587 return ERROR_FLASH_OPERATION_FAILED
;
1590 bufferwsize
/=(bank
->bus_width
/ bank
->chip_width
);
1593 /* Check for valid size */
1594 if (wordcount
> bufferwsize
)
1596 LOG_ERROR("Number of data words %d exceeds available buffersize %d", wordcount
, buffersize
);
1597 return ERROR_FLASH_OPERATION_FAILED
;
1600 /* Write to flash buffer */
1601 cfi_intel_clear_status_register(bank
);
1603 /* Initiate buffer operation _*/
1604 cfi_command(bank
, 0xE8, command
);
1605 if((retval
= target
->type
->write_memory(target
, address
, bank
->bus_width
, 1, command
)) != ERROR_OK
)
1609 if (cfi_intel_wait_status_busy(bank
, 1000 * (1 << cfi_info
->buf_write_timeout_max
)) != 0x80)
1611 cfi_command(bank
, 0xff, command
);
1612 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
1617 LOG_ERROR("couldn't start buffer write operation at base 0x%x, address %x", bank
->base
, address
);
1618 return ERROR_FLASH_OPERATION_FAILED
;
1621 /* Write buffer wordcount-1 and data words */
1622 cfi_command(bank
, bufferwsize
-1, command
);
1623 if((retval
= target
->type
->write_memory(target
, address
, bank
->bus_width
, 1, command
)) != ERROR_OK
)
1628 if((retval
= target
->type
->write_memory(target
, address
, bank
->bus_width
, bufferwsize
, word
)) != ERROR_OK
)
1633 /* Commit write operation */
1634 cfi_command(bank
, 0xd0, command
);
1635 if((retval
= target
->type
->write_memory(target
, address
, bank
->bus_width
, 1, command
)) != ERROR_OK
)
1639 if (cfi_intel_wait_status_busy(bank
, 1000 * (1 << cfi_info
->buf_write_timeout_max
)) != 0x80)
1641 cfi_command(bank
, 0xff, command
);
1642 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
1647 LOG_ERROR("Buffer write at base 0x%x, address %x failed.", bank
->base
, address
);
1648 return ERROR_FLASH_OPERATION_FAILED
;
1654 static int cfi_spansion_write_word(struct flash_bank_s
*bank
, u8
*word
, u32 address
)
1657 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
1658 cfi_spansion_pri_ext_t
*pri_ext
= cfi_info
->pri_ext
;
1659 target_t
*target
= bank
->target
;
1662 cfi_command(bank
, 0xaa, command
);
1663 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, pri_ext
->_unlock1
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
1668 cfi_command(bank
, 0x55, command
);
1669 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, pri_ext
->_unlock2
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
1674 cfi_command(bank
, 0xa0, command
);
1675 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, pri_ext
->_unlock1
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
1680 if((retval
= target
->type
->write_memory(target
, address
, bank
->bus_width
, 1, word
)) != ERROR_OK
)
1685 if (cfi_spansion_wait_status_busy(bank
, 1000 * (1 << cfi_info
->word_write_timeout_max
)) != ERROR_OK
)
1687 cfi_command(bank
, 0xf0, command
);
1688 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
1693 LOG_ERROR("couldn't write word at base 0x%x, address %x", bank
->base
, address
);
1694 return ERROR_FLASH_OPERATION_FAILED
;
1700 static int cfi_spansion_write_words(struct flash_bank_s
*bank
, u8
*word
, u32 wordcount
, u32 address
)
1703 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
1704 target_t
*target
= bank
->target
;
1706 cfi_spansion_pri_ext_t
*pri_ext
= cfi_info
->pri_ext
;
1708 /* Calculate buffer size and boundary mask */
1709 u32 buffersize
= (1UL << cfi_info
->max_buf_write_size
) * (bank
->bus_width
/ bank
->chip_width
);
1710 u32 buffermask
= buffersize
-1;
1713 /* Check for valid range */
1714 if (address
& buffermask
)
1716 LOG_ERROR("Write address at base 0x%x, address %x not aligned to 2^%d boundary", bank
->base
, address
, cfi_info
->max_buf_write_size
);
1717 return ERROR_FLASH_OPERATION_FAILED
;
1719 switch(bank
->chip_width
)
1721 case 4 : bufferwsize
= buffersize
/ 4; break;
1722 case 2 : bufferwsize
= buffersize
/ 2; break;
1723 case 1 : bufferwsize
= buffersize
; break;
1725 LOG_ERROR("Unsupported chip width %d", bank
->chip_width
);
1726 return ERROR_FLASH_OPERATION_FAILED
;
1729 bufferwsize
/=(bank
->bus_width
/ bank
->chip_width
);
1731 /* Check for valid size */
1732 if (wordcount
> bufferwsize
)
1734 LOG_ERROR("Number of data words %d exceeds available buffersize %d", wordcount
, buffersize
);
1735 return ERROR_FLASH_OPERATION_FAILED
;
1739 cfi_command(bank
, 0xaa, command
);
1740 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, pri_ext
->_unlock1
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
1745 cfi_command(bank
, 0x55, command
);
1746 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, pri_ext
->_unlock2
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
1751 // Buffer load command
1752 cfi_command(bank
, 0x25, command
);
1753 if((retval
= target
->type
->write_memory(target
, address
, bank
->bus_width
, 1, command
)) != ERROR_OK
)
1758 /* Write buffer wordcount-1 and data words */
1759 cfi_command(bank
, bufferwsize
-1, command
);
1760 if((retval
= target
->type
->write_memory(target
, address
, bank
->bus_width
, 1, command
)) != ERROR_OK
)
1765 if((retval
= target
->type
->write_memory(target
, address
, bank
->bus_width
, bufferwsize
, word
)) != ERROR_OK
)
1770 /* Commit write operation */
1771 cfi_command(bank
, 0x29, command
);
1772 if((retval
= target
->type
->write_memory(target
, address
, bank
->bus_width
, 1, command
)) != ERROR_OK
)
1777 if (cfi_spansion_wait_status_busy(bank
, 1000 * (1 << cfi_info
->word_write_timeout_max
)) != ERROR_OK
)
1779 cfi_command(bank
, 0xf0, command
);
1780 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
1785 LOG_ERROR("couldn't write block at base 0x%x, address %x, size %x", bank
->base
, address
, bufferwsize
);
1786 return ERROR_FLASH_OPERATION_FAILED
;
1792 static int cfi_write_word(struct flash_bank_s
*bank
, u8
*word
, u32 address
)
1794 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
1796 switch(cfi_info
->pri_id
)
1800 return cfi_intel_write_word(bank
, word
, address
);
1803 return cfi_spansion_write_word(bank
, word
, address
);
1806 LOG_ERROR("cfi primary command set %i unsupported", cfi_info
->pri_id
);
1810 return ERROR_FLASH_OPERATION_FAILED
;
1813 static int cfi_write_words(struct flash_bank_s
*bank
, u8
*word
, u32 wordcount
, u32 address
)
1815 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
1817 switch(cfi_info
->pri_id
)
1821 return cfi_intel_write_words(bank
, word
, wordcount
, address
);
1824 return cfi_spansion_write_words(bank
, word
, wordcount
, address
);
1827 LOG_ERROR("cfi primary command set %i unsupported", cfi_info
->pri_id
);
1831 return ERROR_FLASH_OPERATION_FAILED
;
1834 int cfi_write(struct flash_bank_s
*bank
, u8
*buffer
, u32 offset
, u32 count
)
1836 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
1837 target_t
*target
= bank
->target
;
1838 u32 address
= bank
->base
+ offset
; /* address of first byte to be programmed */
1839 u32 write_p
, copy_p
;
1840 int align
; /* number of unaligned bytes */
1841 int blk_count
; /* number of bus_width bytes for block copy */
1842 u8 current_word
[CFI_MAX_BUS_WIDTH
* 4]; /* word (bus_width size) currently being programmed */
1846 if (bank
->target
->state
!= TARGET_HALTED
)
1848 LOG_ERROR("Target not halted");
1849 return ERROR_TARGET_NOT_HALTED
;
1852 if (offset
+ count
> bank
->size
)
1853 return ERROR_FLASH_DST_OUT_OF_BANK
;
1855 if (cfi_info
->qry
[0] != 'Q')
1856 return ERROR_FLASH_BANK_NOT_PROBED
;
1858 /* start at the first byte of the first word (bus_width size) */
1859 write_p
= address
& ~(bank
->bus_width
- 1);
1860 if ((align
= address
- write_p
) != 0)
1862 LOG_INFO("Fixup %d unaligned head bytes", align
);
1864 for (i
= 0; i
< bank
->bus_width
; i
++)
1865 current_word
[i
] = 0;
1868 /* copy bytes before the first write address */
1869 for (i
= 0; i
< align
; ++i
, ++copy_p
)
1872 if((retval
= target
->type
->read_memory(target
, copy_p
, 1, 1, &byte
)) != ERROR_OK
)
1876 cfi_add_byte(bank
, current_word
, byte
);
1879 /* add bytes from the buffer */
1880 for (; (i
< bank
->bus_width
) && (count
> 0); i
++)
1882 cfi_add_byte(bank
, current_word
, *buffer
++);
1887 /* if the buffer is already finished, copy bytes after the last write address */
1888 for (; (count
== 0) && (i
< bank
->bus_width
); ++i
, ++copy_p
)
1891 if((retval
= target
->type
->read_memory(target
, copy_p
, 1, 1, &byte
)) != ERROR_OK
)
1895 cfi_add_byte(bank
, current_word
, byte
);
1898 retval
= cfi_write_word(bank
, current_word
, write_p
);
1899 if (retval
!= ERROR_OK
)
1904 /* handle blocks of bus_size aligned bytes */
1905 blk_count
= count
& ~(bank
->bus_width
- 1); /* round down, leave tail bytes */
1906 switch(cfi_info
->pri_id
)
1908 /* try block writes (fails without working area) */
1911 retval
= cfi_intel_write_block(bank
, buffer
, write_p
, blk_count
);
1914 retval
= cfi_spansion_write_block(bank
, buffer
, write_p
, blk_count
);
1917 LOG_ERROR("cfi primary command set %i unsupported", cfi_info
->pri_id
);
1918 retval
= ERROR_FLASH_OPERATION_FAILED
;
1921 if (retval
== ERROR_OK
)
1923 /* Increment pointers and decrease count on succesful block write */
1924 buffer
+= blk_count
;
1925 write_p
+= blk_count
;
1930 if (retval
== ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
1932 //adjust buffersize for chip width
1933 u32 buffersize
= (1UL << cfi_info
->max_buf_write_size
) * (bank
->bus_width
/ bank
->chip_width
);
1934 u32 buffermask
= buffersize
-1;
1937 switch(bank
->chip_width
)
1939 case 4 : bufferwsize
= buffersize
/ 4; break;
1940 case 2 : bufferwsize
= buffersize
/ 2; break;
1941 case 1 : bufferwsize
= buffersize
; break;
1943 LOG_ERROR("Unsupported chip width %d", bank
->chip_width
);
1944 return ERROR_FLASH_OPERATION_FAILED
;
1947 bufferwsize
/=(bank
->bus_width
/ bank
->chip_width
);
1949 /* fall back to memory writes */
1950 while (count
>= (u32
)bank
->bus_width
)
1953 if ((write_p
& 0xff) == 0)
1955 LOG_INFO("Programming at %08x, count %08x bytes remaining", write_p
, count
);
1958 if ((bufferwsize
> 0) && (count
>= buffersize
) && !(write_p
& buffermask
))
1960 retval
= cfi_write_words(bank
, buffer
, bufferwsize
, write_p
);
1961 if (retval
== ERROR_OK
)
1963 buffer
+= buffersize
;
1964 write_p
+= buffersize
;
1965 count
-= buffersize
;
1969 /* try the slow way? */
1972 for (i
= 0; i
< bank
->bus_width
; i
++)
1973 current_word
[i
] = 0;
1975 for (i
= 0; i
< bank
->bus_width
; i
++)
1977 cfi_add_byte(bank
, current_word
, *buffer
++);
1980 retval
= cfi_write_word(bank
, current_word
, write_p
);
1981 if (retval
!= ERROR_OK
)
1984 write_p
+= bank
->bus_width
;
1985 count
-= bank
->bus_width
;
1993 /* return to read array mode, so we can read from flash again for padding */
1994 cfi_command(bank
, 0xf0, current_word
);
1995 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, current_word
)) != ERROR_OK
)
1999 cfi_command(bank
, 0xff, current_word
);
2000 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, current_word
)) != ERROR_OK
)
2005 /* handle unaligned tail bytes */
2008 LOG_INFO("Fixup %d unaligned tail bytes", count
);
2011 for (i
= 0; i
< bank
->bus_width
; i
++)
2012 current_word
[i
] = 0;
2014 for (i
= 0; (i
< bank
->bus_width
) && (count
> 0); ++i
, ++copy_p
)
2016 cfi_add_byte(bank
, current_word
, *buffer
++);
2019 for (; i
< bank
->bus_width
; ++i
, ++copy_p
)
2022 if((retval
= target
->type
->read_memory(target
, copy_p
, 1, 1, &byte
)) != ERROR_OK
)
2026 cfi_add_byte(bank
, current_word
, byte
);
2028 retval
= cfi_write_word(bank
, current_word
, write_p
);
2029 if (retval
!= ERROR_OK
)
2033 /* return to read array mode */
2034 cfi_command(bank
, 0xf0, current_word
);
2035 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, current_word
)) != ERROR_OK
)
2039 cfi_command(bank
, 0xff, current_word
);
2040 return target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, current_word
);
2043 static void cfi_fixup_atmel_reversed_erase_regions(flash_bank_t
*bank
, void *param
)
2046 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
2047 cfi_spansion_pri_ext_t
*pri_ext
= cfi_info
->pri_ext
;
2049 pri_ext
->_reversed_geometry
= 1;
2052 static void cfi_fixup_0002_erase_regions(flash_bank_t
*bank
, void *param
)
2055 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
2056 cfi_spansion_pri_ext_t
*pri_ext
= cfi_info
->pri_ext
;
2059 if ((pri_ext
->_reversed_geometry
) || (pri_ext
->TopBottom
== 3))
2061 LOG_DEBUG("swapping reversed erase region information on cmdset 0002 device");
2063 for (i
= 0; i
< cfi_info
->num_erase_regions
/ 2; i
++)
2065 int j
= (cfi_info
->num_erase_regions
- 1) - i
;
2068 swap
= cfi_info
->erase_region_info
[i
];
2069 cfi_info
->erase_region_info
[i
] = cfi_info
->erase_region_info
[j
];
2070 cfi_info
->erase_region_info
[j
] = swap
;
2075 static void cfi_fixup_0002_unlock_addresses(flash_bank_t
*bank
, void *param
)
2077 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
2078 cfi_spansion_pri_ext_t
*pri_ext
= cfi_info
->pri_ext
;
2079 cfi_unlock_addresses_t
*unlock_addresses
= param
;
2081 pri_ext
->_unlock1
= unlock_addresses
->unlock1
;
2082 pri_ext
->_unlock2
= unlock_addresses
->unlock2
;
2085 static int cfi_probe(struct flash_bank_s
*bank
)
2087 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
2088 target_t
*target
= bank
->target
;
2090 int num_sectors
= 0;
2093 u32 unlock1
= 0x555;
2094 u32 unlock2
= 0x2aa;
2097 if (bank
->target
->state
!= TARGET_HALTED
)
2099 LOG_ERROR("Target not halted");
2100 return ERROR_TARGET_NOT_HALTED
;
2103 cfi_info
->probed
= 0;
2105 /* JEDEC standard JESD21C uses 0x5555 and 0x2aaa as unlock addresses,
2106 * while CFI compatible AMD/Spansion flashes use 0x555 and 0x2aa
2108 if (cfi_info
->jedec_probe
)
2114 /* switch to read identifier codes mode ("AUTOSELECT") */
2115 cfi_command(bank
, 0xaa, command
);
2116 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, unlock1
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2120 cfi_command(bank
, 0x55, command
);
2121 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, unlock2
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2125 cfi_command(bank
, 0x90, command
);
2126 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, unlock1
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2131 if (bank
->chip_width
== 1)
2133 u8 manufacturer
, device_id
;
2134 if((retval
= target_read_u8(target
, flash_address(bank
, 0, 0x00), &manufacturer
)) != ERROR_OK
)
2138 if((retval
= target_read_u8(target
, flash_address(bank
, 0, 0x01), &device_id
)) != ERROR_OK
)
2142 cfi_info
->manufacturer
= manufacturer
;
2143 cfi_info
->device_id
= device_id
;
2145 else if (bank
->chip_width
== 2)
2147 if((retval
= target_read_u16(target
, flash_address(bank
, 0, 0x00), &cfi_info
->manufacturer
)) != ERROR_OK
)
2151 if((retval
= target_read_u16(target
, flash_address(bank
, 0, 0x02), &cfi_info
->device_id
)) != ERROR_OK
)
2157 LOG_INFO("Flash Manufacturer/Device: 0x%04x 0x%04x", cfi_info
->manufacturer
, cfi_info
->device_id
);
2158 /* switch back to read array mode */
2159 cfi_command(bank
, 0xf0, command
);
2160 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x00), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2164 cfi_command(bank
, 0xff, command
);
2165 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x00), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2170 /* check device/manufacturer ID for known non-CFI flashes. */
2171 cfi_fixup_non_cfi(bank
);
2173 /* query only if this is a CFI compatible flash,
2174 * otherwise the relevant info has already been filled in
2176 if (cfi_info
->not_cfi
== 0)
2178 /* enter CFI query mode
2179 * according to JEDEC Standard No. 68.01,
2180 * a single bus sequence with address = 0x55, data = 0x98 should put
2181 * the device into CFI query mode.
2183 * SST flashes clearly violate this, and we will consider them incompatbile for now
2185 cfi_command(bank
, 0x98, command
);
2186 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x55), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2191 cfi_info
->qry
[0] = cfi_query_u8(bank
, 0, 0x10);
2192 cfi_info
->qry
[1] = cfi_query_u8(bank
, 0, 0x11);
2193 cfi_info
->qry
[2] = cfi_query_u8(bank
, 0, 0x12);
2195 LOG_DEBUG("CFI qry returned: 0x%2.2x 0x%2.2x 0x%2.2x", cfi_info
->qry
[0], cfi_info
->qry
[1], cfi_info
->qry
[2]);
2197 if ((cfi_info
->qry
[0] != 'Q') || (cfi_info
->qry
[1] != 'R') || (cfi_info
->qry
[2] != 'Y'))
2199 cfi_command(bank
, 0xf0, command
);
2200 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2204 cfi_command(bank
, 0xff, command
);
2205 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2209 LOG_ERROR("Could not probe bank: no QRY");
2210 return ERROR_FLASH_BANK_INVALID
;
2213 cfi_info
->pri_id
= cfi_query_u16(bank
, 0, 0x13);
2214 cfi_info
->pri_addr
= cfi_query_u16(bank
, 0, 0x15);
2215 cfi_info
->alt_id
= cfi_query_u16(bank
, 0, 0x17);
2216 cfi_info
->alt_addr
= cfi_query_u16(bank
, 0, 0x19);
2218 LOG_DEBUG("qry: '%c%c%c', pri_id: 0x%4.4x, pri_addr: 0x%4.4x, alt_id: 0x%4.4x, alt_addr: 0x%4.4x", cfi_info
->qry
[0], cfi_info
->qry
[1], cfi_info
->qry
[2], cfi_info
->pri_id
, cfi_info
->pri_addr
, cfi_info
->alt_id
, cfi_info
->alt_addr
);
2220 cfi_info
->vcc_min
= cfi_query_u8(bank
, 0, 0x1b);
2221 cfi_info
->vcc_max
= cfi_query_u8(bank
, 0, 0x1c);
2222 cfi_info
->vpp_min
= cfi_query_u8(bank
, 0, 0x1d);
2223 cfi_info
->vpp_max
= cfi_query_u8(bank
, 0, 0x1e);
2224 cfi_info
->word_write_timeout_typ
= cfi_query_u8(bank
, 0, 0x1f);
2225 cfi_info
->buf_write_timeout_typ
= cfi_query_u8(bank
, 0, 0x20);
2226 cfi_info
->block_erase_timeout_typ
= cfi_query_u8(bank
, 0, 0x21);
2227 cfi_info
->chip_erase_timeout_typ
= cfi_query_u8(bank
, 0, 0x22);
2228 cfi_info
->word_write_timeout_max
= cfi_query_u8(bank
, 0, 0x23);
2229 cfi_info
->buf_write_timeout_max
= cfi_query_u8(bank
, 0, 0x24);
2230 cfi_info
->block_erase_timeout_max
= cfi_query_u8(bank
, 0, 0x25);
2231 cfi_info
->chip_erase_timeout_max
= cfi_query_u8(bank
, 0, 0x26);
2233 LOG_DEBUG("Vcc min: %1.1x.%1.1x, Vcc max: %1.1x.%1.1x, Vpp min: %1.1x.%1.1x, Vpp max: %1.1x.%1.1x",
2234 (cfi_info
->vcc_min
& 0xf0) >> 4, cfi_info
->vcc_min
& 0x0f,
2235 (cfi_info
->vcc_max
& 0xf0) >> 4, cfi_info
->vcc_max
& 0x0f,
2236 (cfi_info
->vpp_min
& 0xf0) >> 4, cfi_info
->vpp_min
& 0x0f,
2237 (cfi_info
->vpp_max
& 0xf0) >> 4, cfi_info
->vpp_max
& 0x0f);
2238 LOG_DEBUG("typ. word write timeout: %u, typ. buf write timeout: %u, typ. block erase timeout: %u, typ. chip erase timeout: %u", 1 << cfi_info
->word_write_timeout_typ
, 1 << cfi_info
->buf_write_timeout_typ
,
2239 1 << cfi_info
->block_erase_timeout_typ
, 1 << cfi_info
->chip_erase_timeout_typ
);
2240 LOG_DEBUG("max. word write timeout: %u, max. buf write timeout: %u, max. block erase timeout: %u, max. chip erase timeout: %u", (1 << cfi_info
->word_write_timeout_max
) * (1 << cfi_info
->word_write_timeout_typ
),
2241 (1 << cfi_info
->buf_write_timeout_max
) * (1 << cfi_info
->buf_write_timeout_typ
),
2242 (1 << cfi_info
->block_erase_timeout_max
) * (1 << cfi_info
->block_erase_timeout_typ
),
2243 (1 << cfi_info
->chip_erase_timeout_max
) * (1 << cfi_info
->chip_erase_timeout_typ
));
2245 cfi_info
->dev_size
= 1<<cfi_query_u8(bank
, 0, 0x27);
2246 cfi_info
->interface_desc
= cfi_query_u16(bank
, 0, 0x28);
2247 cfi_info
->max_buf_write_size
= cfi_query_u16(bank
, 0, 0x2a);
2248 cfi_info
->num_erase_regions
= cfi_query_u8(bank
, 0, 0x2c);
2250 LOG_DEBUG("size: 0x%x, interface desc: %i, max buffer write size: %x", cfi_info
->dev_size
, cfi_info
->interface_desc
, (1 << cfi_info
->max_buf_write_size
));
2252 if (cfi_info
->num_erase_regions
)
2254 cfi_info
->erase_region_info
= malloc(4 * cfi_info
->num_erase_regions
);
2255 for (i
= 0; i
< cfi_info
->num_erase_regions
; i
++)
2257 cfi_info
->erase_region_info
[i
] = cfi_query_u32(bank
, 0, 0x2d + (4 * i
));
2258 LOG_DEBUG("erase region[%i]: %i blocks of size 0x%x", i
, (cfi_info
->erase_region_info
[i
] & 0xffff) + 1, (cfi_info
->erase_region_info
[i
] >> 16) * 256);
2263 cfi_info
->erase_region_info
= NULL
;
2266 /* We need to read the primary algorithm extended query table before calculating
2267 * the sector layout to be able to apply fixups
2269 switch(cfi_info
->pri_id
)
2271 /* Intel command set (standard and extended) */
2274 cfi_read_intel_pri_ext(bank
);
2276 /* AMD/Spansion, Atmel, ... command set */
2278 cfi_info
->status_poll_mask
= CFI_STATUS_POLL_MASK_DQ5_DQ6_DQ7
; /* default for all CFI flashs */
2279 cfi_read_0002_pri_ext(bank
);
2282 LOG_ERROR("cfi primary command set %i unsupported", cfi_info
->pri_id
);
2286 /* return to read array mode
2287 * we use both reset commands, as some Intel flashes fail to recognize the 0xF0 command
2289 cfi_command(bank
, 0xf0, command
);
2290 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2294 cfi_command(bank
, 0xff, command
);
2295 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2299 } /* end CFI case */
2301 /* apply fixups depending on the primary command set */
2302 switch(cfi_info
->pri_id
)
2304 /* Intel command set (standard and extended) */
2307 cfi_fixup(bank
, cfi_0001_fixups
);
2309 /* AMD/Spansion, Atmel, ... command set */
2311 cfi_fixup(bank
, cfi_0002_fixups
);
2314 LOG_ERROR("cfi primary command set %i unsupported", cfi_info
->pri_id
);
2318 if ((cfi_info
->dev_size
* bank
->bus_width
/ bank
->chip_width
) != bank
->size
)
2320 LOG_WARNING("configuration specifies 0x%x size, but a 0x%x size flash was found", bank
->size
, cfi_info
->dev_size
);
2323 if (cfi_info
->num_erase_regions
== 0)
2325 /* a device might have only one erase block, spanning the whole device */
2326 bank
->num_sectors
= 1;
2327 bank
->sectors
= malloc(sizeof(flash_sector_t
));
2329 bank
->sectors
[sector
].offset
= 0x0;
2330 bank
->sectors
[sector
].size
= bank
->size
;
2331 bank
->sectors
[sector
].is_erased
= -1;
2332 bank
->sectors
[sector
].is_protected
= -1;
2338 for (i
= 0; i
< cfi_info
->num_erase_regions
; i
++)
2340 num_sectors
+= (cfi_info
->erase_region_info
[i
] & 0xffff) + 1;
2343 bank
->num_sectors
= num_sectors
;
2344 bank
->sectors
= malloc(sizeof(flash_sector_t
) * num_sectors
);
2346 for (i
= 0; i
< cfi_info
->num_erase_regions
; i
++)
2349 for (j
= 0; j
< (cfi_info
->erase_region_info
[i
] & 0xffff) + 1; j
++)
2351 bank
->sectors
[sector
].offset
= offset
;
2352 bank
->sectors
[sector
].size
= ((cfi_info
->erase_region_info
[i
] >> 16) * 256) * bank
->bus_width
/ bank
->chip_width
;
2353 offset
+= bank
->sectors
[sector
].size
;
2354 bank
->sectors
[sector
].is_erased
= -1;
2355 bank
->sectors
[sector
].is_protected
= -1;
2359 if (offset
!= cfi_info
->dev_size
)
2361 LOG_WARNING("CFI size is 0x%x, but total sector size is 0x%x", cfi_info
->dev_size
, offset
);
2365 cfi_info
->probed
= 1;
2370 static int cfi_auto_probe(struct flash_bank_s
*bank
)
2372 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
2373 if (cfi_info
->probed
)
2375 return cfi_probe(bank
);
2379 static int cfi_intel_protect_check(struct flash_bank_s
*bank
)
2382 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
2383 cfi_intel_pri_ext_t
*pri_ext
= cfi_info
->pri_ext
;
2384 target_t
*target
= bank
->target
;
2385 u8 command
[CFI_MAX_BUS_WIDTH
];
2388 /* check if block lock bits are supported on this device */
2389 if (!(pri_ext
->blk_status_reg_mask
& 0x1))
2390 return ERROR_FLASH_OPERATION_FAILED
;
2392 cfi_command(bank
, 0x90, command
);
2393 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, 0x55), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2398 for (i
= 0; i
< bank
->num_sectors
; i
++)
2400 u8 block_status
= cfi_get_u8(bank
, i
, 0x2);
2402 if (block_status
& 1)
2403 bank
->sectors
[i
].is_protected
= 1;
2405 bank
->sectors
[i
].is_protected
= 0;
2408 cfi_command(bank
, 0xff, command
);
2409 return target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
);
2412 static int cfi_spansion_protect_check(struct flash_bank_s
*bank
)
2415 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
2416 cfi_spansion_pri_ext_t
*pri_ext
= cfi_info
->pri_ext
;
2417 target_t
*target
= bank
->target
;
2421 cfi_command(bank
, 0xaa, command
);
2422 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, pri_ext
->_unlock1
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2427 cfi_command(bank
, 0x55, command
);
2428 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, pri_ext
->_unlock2
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2433 cfi_command(bank
, 0x90, command
);
2434 if((retval
= target
->type
->write_memory(target
, flash_address(bank
, 0, pri_ext
->_unlock1
), bank
->bus_width
, 1, command
)) != ERROR_OK
)
2439 for (i
= 0; i
< bank
->num_sectors
; i
++)
2441 u8 block_status
= cfi_get_u8(bank
, i
, 0x2);
2443 if (block_status
& 1)
2444 bank
->sectors
[i
].is_protected
= 1;
2446 bank
->sectors
[i
].is_protected
= 0;
2449 cfi_command(bank
, 0xf0, command
);
2450 return target
->type
->write_memory(target
, flash_address(bank
, 0, 0x0), bank
->bus_width
, 1, command
);
2453 static int cfi_protect_check(struct flash_bank_s
*bank
)
2455 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
2457 if (bank
->target
->state
!= TARGET_HALTED
)
2459 LOG_ERROR("Target not halted");
2460 return ERROR_TARGET_NOT_HALTED
;
2463 if (cfi_info
->qry
[0] != 'Q')
2464 return ERROR_FLASH_BANK_NOT_PROBED
;
2466 switch(cfi_info
->pri_id
)
2470 return cfi_intel_protect_check(bank
);
2473 return cfi_spansion_protect_check(bank
);
2476 LOG_ERROR("cfi primary command set %i unsupported", cfi_info
->pri_id
);
2483 static int cfi_info(struct flash_bank_s
*bank
, char *buf
, int buf_size
)
2486 cfi_flash_bank_t
*cfi_info
= bank
->driver_priv
;
2488 if (cfi_info
->qry
[0] == (char)-1)
2490 printed
= snprintf(buf
, buf_size
, "\ncfi flash bank not probed yet\n");
2494 if (cfi_info
->not_cfi
== 0)
2495 printed
= snprintf(buf
, buf_size
, "\ncfi information:\n");
2497 printed
= snprintf(buf
, buf_size
, "\nnon-cfi flash:\n");
2499 buf_size
-= printed
;
2501 printed
= snprintf(buf
, buf_size
, "\nmfr: 0x%4.4x, id:0x%4.4x\n",
2502 cfi_info
->manufacturer
, cfi_info
->device_id
);
2504 buf_size
-= printed
;
2506 if (cfi_info
->not_cfi
== 0)
2508 printed
= snprintf(buf
, buf_size
, "qry: '%c%c%c', pri_id: 0x%4.4x, pri_addr: 0x%4.4x, alt_id: 0x%4.4x, alt_addr: 0x%4.4x\n", cfi_info
->qry
[0], cfi_info
->qry
[1], cfi_info
->qry
[2], cfi_info
->pri_id
, cfi_info
->pri_addr
, cfi_info
->alt_id
, cfi_info
->alt_addr
);
2510 buf_size
-= printed
;
2512 printed
= snprintf(buf
, buf_size
, "Vcc min: %1.1x.%1.1x, Vcc max: %1.1x.%1.1x, Vpp min: %1.1x.%1.1x, Vpp max: %1.1x.%1.1x\n",
2513 (cfi_info
->vcc_min
& 0xf0) >> 4, cfi_info
->vcc_min
& 0x0f,
2514 (cfi_info
->vcc_max
& 0xf0) >> 4, cfi_info
->vcc_max
& 0x0f,
2515 (cfi_info
->vpp_min
& 0xf0) >> 4, cfi_info
->vpp_min
& 0x0f,
2516 (cfi_info
->vpp_max
& 0xf0) >> 4, cfi_info
->vpp_max
& 0x0f);
2518 buf_size
-= printed
;
2520 printed
= snprintf(buf
, buf_size
, "typ. word write timeout: %u, typ. buf write timeout: %u, typ. block erase timeout: %u, typ. chip erase timeout: %u\n",
2521 1 << cfi_info
->word_write_timeout_typ
,
2522 1 << cfi_info
->buf_write_timeout_typ
,
2523 1 << cfi_info
->block_erase_timeout_typ
,
2524 1 << cfi_info
->chip_erase_timeout_typ
);
2526 buf_size
-= printed
;
2528 printed
= snprintf(buf
, buf_size
, "max. word write timeout: %u, max. buf write timeout: %u, max. block erase timeout: %u, max. chip erase timeout: %u\n",
2529 (1 << cfi_info
->word_write_timeout_max
) * (1 << cfi_info
->word_write_timeout_typ
),
2530 (1 << cfi_info
->buf_write_timeout_max
) * (1 << cfi_info
->buf_write_timeout_typ
),
2531 (1 << cfi_info
->block_erase_timeout_max
) * (1 << cfi_info
->block_erase_timeout_typ
),
2532 (1 << cfi_info
->chip_erase_timeout_max
) * (1 << cfi_info
->chip_erase_timeout_typ
));
2534 buf_size
-= printed
;
2536 printed
= snprintf(buf
, buf_size
, "size: 0x%x, interface desc: %i, max buffer write size: %x\n",
2538 cfi_info
->interface_desc
,
2539 1 << cfi_info
->max_buf_write_size
);
2541 buf_size
-= printed
;
2543 switch(cfi_info
->pri_id
)
2547 cfi_intel_info(bank
, buf
, buf_size
);
2550 cfi_spansion_info(bank
, buf
, buf_size
);
2553 LOG_ERROR("cfi primary command set %i unsupported", cfi_info
->pri_id
);
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)