You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2285 lines
74 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2005, 2007 by Dominic Rath *
  3. * Dominic.Rath@gmx.de *
  4. * *
  5. * This program is free software; you can redistribute it and/or modify *
  6. * it under the terms of the GNU General Public License as published by *
  7. * the Free Software Foundation; either version 2 of the License, or *
  8. * (at your option) any later version. *
  9. * *
  10. * This program is distributed in the hope that it will be useful, *
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  13. * GNU General Public License for more details. *
  14. * *
  15. * You should have received a copy of the GNU General Public License *
  16. * along with this program; if not, write to the *
  17. * Free Software Foundation, Inc., *
  18. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  19. ***************************************************************************/
  20. #ifdef HAVE_CONFIG_H
  21. #include "config.h"
  22. #endif
  23. #include "replacements.h"
  24. #include "cfi.h"
  25. #include "non_cfi.h"
  26. #include "flash.h"
  27. #include "target.h"
  28. #include "log.h"
  29. #include "armv4_5.h"
  30. #include "algorithm.h"
  31. #include "binarybuffer.h"
  32. #include "types.h"
  33. #include <stdlib.h>
  34. #include <string.h>
  35. #include <unistd.h>
  36. int cfi_register_commands(struct command_context_s *cmd_ctx);
  37. int cfi_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank);
  38. int cfi_erase(struct flash_bank_s *bank, int first, int last);
  39. int cfi_protect(struct flash_bank_s *bank, int set, int first, int last);
  40. int cfi_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count);
  41. int cfi_probe(struct flash_bank_s *bank);
  42. int cfi_auto_probe(struct flash_bank_s *bank);
  43. int cfi_protect_check(struct flash_bank_s *bank);
  44. int cfi_info(struct flash_bank_s *bank, char *buf, int buf_size);
  45. int cfi_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  46. #define CFI_MAX_BUS_WIDTH 4
  47. #define CFI_MAX_CHIP_WIDTH 4
  48. /* defines internal maximum size for code fragment in cfi_intel_write_block() */
  49. #define CFI_MAX_INTEL_CODESIZE 256
  50. flash_driver_t cfi_flash =
  51. {
  52. .name = "cfi",
  53. .register_commands = cfi_register_commands,
  54. .flash_bank_command = cfi_flash_bank_command,
  55. .erase = cfi_erase,
  56. .protect = cfi_protect,
  57. .write = cfi_write,
  58. .probe = cfi_probe,
  59. .auto_probe = cfi_auto_probe,
  60. .erase_check = default_flash_blank_check,
  61. .protect_check = cfi_protect_check,
  62. .info = cfi_info
  63. };
  64. cfi_unlock_addresses_t cfi_unlock_addresses[] =
  65. {
  66. [CFI_UNLOCK_555_2AA] = { .unlock1 = 0x555, .unlock2 = 0x2aa },
  67. [CFI_UNLOCK_5555_2AAA] = { .unlock1 = 0x5555, .unlock2 = 0x2aaa },
  68. };
  69. /* CFI fixups foward declarations */
  70. void cfi_fixup_0002_erase_regions(flash_bank_t *flash, void *param);
  71. void cfi_fixup_0002_unlock_addresses(flash_bank_t *flash, void *param);
  72. void cfi_fixup_atmel_reversed_erase_regions(flash_bank_t *flash, void *param);
  73. /* fixup after identifying JEDEC manufactuer and ID */
  74. cfi_fixup_t cfi_jedec_fixups[] = {
  75. {CFI_MFR_SST, 0x00D4, cfi_fixup_non_cfi, NULL},
  76. {CFI_MFR_SST, 0x00D5, cfi_fixup_non_cfi, NULL},
  77. {CFI_MFR_SST, 0x00D6, cfi_fixup_non_cfi, NULL},
  78. {CFI_MFR_SST, 0x00D7, cfi_fixup_non_cfi, NULL},
  79. {CFI_MFR_SST, 0x2780, cfi_fixup_non_cfi, NULL},
  80. {CFI_MFR_ST, 0x00D5, cfi_fixup_non_cfi, NULL},
  81. {CFI_MFR_ST, 0x00D6, cfi_fixup_non_cfi, NULL},
  82. {CFI_MFR_AMD, 0x2223, cfi_fixup_non_cfi, NULL},
  83. {CFI_MFR_AMD, 0x22ab, cfi_fixup_non_cfi, NULL},
  84. {CFI_MFR_FUJITSU, 0x226b, cfi_fixup_non_cfi, NULL},
  85. {CFI_MFR_AMIC, 0xb31a, cfi_fixup_non_cfi, NULL},
  86. {CFI_MFR_MX, 0x225b, cfi_fixup_non_cfi, NULL},
  87. {0, 0, NULL, NULL}
  88. };
  89. /* fixup after reading cmdset 0002 primary query table */
  90. cfi_fixup_t cfi_0002_fixups[] = {
  91. {CFI_MFR_SST, 0x00D4, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_5555_2AAA]},
  92. {CFI_MFR_SST, 0x00D5, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_5555_2AAA]},
  93. {CFI_MFR_SST, 0x00D6, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_5555_2AAA]},
  94. {CFI_MFR_SST, 0x00D7, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_5555_2AAA]},
  95. {CFI_MFR_SST, 0x2780, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_5555_2AAA]},
  96. {CFI_MFR_ATMEL, 0x00C8, cfi_fixup_atmel_reversed_erase_regions, NULL},
  97. {CFI_MFR_FUJITSU, 0x226b, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_5555_2AAA]},
  98. {CFI_MFR_AMIC, 0xb31a, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_555_2AA]},
  99. {CFI_MFR_MX, 0x225b, cfi_fixup_0002_unlock_addresses, &cfi_unlock_addresses[CFI_UNLOCK_555_2AA]},
  100. {CFI_MFR_ANY, CFI_ID_ANY, cfi_fixup_0002_erase_regions, NULL},
  101. {0, 0, NULL, NULL}
  102. };
  103. /* fixup after reading cmdset 0001 primary query table */
  104. cfi_fixup_t cfi_0001_fixups[] = {
  105. {0, 0, NULL, NULL}
  106. };
  107. void cfi_fixup(flash_bank_t *bank, cfi_fixup_t *fixups)
  108. {
  109. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  110. cfi_fixup_t *f;
  111. for (f = fixups; f->fixup; f++)
  112. {
  113. if (((f->mfr == CFI_MFR_ANY) || (f->mfr == cfi_info->manufacturer)) &&
  114. ((f->id == CFI_ID_ANY) || (f->id == cfi_info->device_id)))
  115. {
  116. f->fixup(bank, f->param);
  117. }
  118. }
  119. }
  120. /* inline u32 flash_address(flash_bank_t *bank, int sector, u32 offset) */
  121. __inline__ u32 flash_address(flash_bank_t *bank, int sector, u32 offset)
  122. {
  123. /* while the sector list isn't built, only accesses to sector 0 work */
  124. if (sector == 0)
  125. return bank->base + offset * bank->bus_width;
  126. else
  127. {
  128. if (!bank->sectors)
  129. {
  130. LOG_ERROR("BUG: sector list not yet built");
  131. exit(-1);
  132. }
  133. return bank->base + bank->sectors[sector].offset + offset * bank->bus_width;
  134. }
  135. }
  136. void cfi_command(flash_bank_t *bank, u8 cmd, u8 *cmd_buf)
  137. {
  138. int i;
  139. /* clear whole buffer, to ensure bits that exceed the bus_width
  140. * are set to zero
  141. */
  142. for (i = 0; i < CFI_MAX_BUS_WIDTH; i++)
  143. cmd_buf[i] = 0;
  144. if (bank->target->endianness == TARGET_LITTLE_ENDIAN)
  145. {
  146. for (i = bank->bus_width; i > 0; i--)
  147. {
  148. *cmd_buf++ = (i & (bank->chip_width - 1)) ? 0x0 : cmd;
  149. }
  150. }
  151. else
  152. {
  153. for (i = 1; i <= bank->bus_width; i++)
  154. {
  155. *cmd_buf++ = (i & (bank->chip_width - 1)) ? 0x0 : cmd;
  156. }
  157. }
  158. }
  159. /* read unsigned 8-bit value from the bank
  160. * flash banks are expected to be made of similar chips
  161. * the query result should be the same for all
  162. */
  163. u8 cfi_query_u8(flash_bank_t *bank, int sector, u32 offset)
  164. {
  165. target_t *target = bank->target;
  166. u8 data[CFI_MAX_BUS_WIDTH];
  167. target->type->read_memory(target, flash_address(bank, sector, offset), bank->bus_width, 1, data);
  168. if (bank->target->endianness == TARGET_LITTLE_ENDIAN)
  169. return data[0];
  170. else
  171. return data[bank->bus_width - 1];
  172. }
  173. /* read unsigned 8-bit value from the bank
  174. * in case of a bank made of multiple chips,
  175. * the individual values are ORed
  176. */
  177. u8 cfi_get_u8(flash_bank_t *bank, int sector, u32 offset)
  178. {
  179. target_t *target = bank->target;
  180. u8 data[CFI_MAX_BUS_WIDTH];
  181. int i;
  182. target->type->read_memory(target, flash_address(bank, sector, offset), bank->bus_width, 1, data);
  183. if (bank->target->endianness == TARGET_LITTLE_ENDIAN)
  184. {
  185. for (i = 0; i < bank->bus_width / bank->chip_width; i++)
  186. data[0] |= data[i];
  187. return data[0];
  188. }
  189. else
  190. {
  191. u8 value = 0;
  192. for (i = 0; i < bank->bus_width / bank->chip_width; i++)
  193. value |= data[bank->bus_width - 1 - i];
  194. return value;
  195. }
  196. }
  197. u16 cfi_query_u16(flash_bank_t *bank, int sector, u32 offset)
  198. {
  199. target_t *target = bank->target;
  200. u8 data[CFI_MAX_BUS_WIDTH * 2];
  201. target->type->read_memory(target, flash_address(bank, sector, offset), bank->bus_width, 2, data);
  202. if (bank->target->endianness == TARGET_LITTLE_ENDIAN)
  203. return data[0] | data[bank->bus_width] << 8;
  204. else
  205. return data[bank->bus_width - 1] | data[(2 * bank->bus_width) - 1] << 8;
  206. }
  207. u32 cfi_query_u32(flash_bank_t *bank, int sector, u32 offset)
  208. {
  209. target_t *target = bank->target;
  210. u8 data[CFI_MAX_BUS_WIDTH * 4];
  211. target->type->read_memory(target, flash_address(bank, sector, offset), bank->bus_width, 4, data);
  212. if (bank->target->endianness == TARGET_LITTLE_ENDIAN)
  213. return data[0] | data[bank->bus_width] << 8 | data[bank->bus_width * 2] << 16 | data[bank->bus_width * 3] << 24;
  214. else
  215. return data[bank->bus_width - 1] | data[(2* bank->bus_width) - 1] << 8 |
  216. data[(3 * bank->bus_width) - 1] << 16 | data[(4 * bank->bus_width) - 1] << 24;
  217. }
  218. void cfi_intel_clear_status_register(flash_bank_t *bank)
  219. {
  220. target_t *target = bank->target;
  221. u8 command[8];
  222. if (target->state != TARGET_HALTED)
  223. {
  224. LOG_ERROR("BUG: attempted to clear status register while target wasn't halted");
  225. exit(-1);
  226. }
  227. cfi_command(bank, 0x50, command);
  228. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  229. }
  230. u8 cfi_intel_wait_status_busy(flash_bank_t *bank, int timeout)
  231. {
  232. u8 status;
  233. while ((!((status = cfi_get_u8(bank, 0, 0x0)) & 0x80)) && (timeout-- > 0))
  234. {
  235. LOG_DEBUG("status: 0x%x", status);
  236. usleep(1000);
  237. }
  238. /* mask out bit 0 (reserved) */
  239. status = status & 0xfe;
  240. LOG_DEBUG("status: 0x%x", status);
  241. if ((status & 0x80) != 0x80)
  242. {
  243. LOG_ERROR("timeout while waiting for WSM to become ready");
  244. }
  245. else if (status != 0x80)
  246. {
  247. LOG_ERROR("status register: 0x%x", status);
  248. if (status & 0x2)
  249. LOG_ERROR("Block Lock-Bit Detected, Operation Abort");
  250. if (status & 0x4)
  251. LOG_ERROR("Program suspended");
  252. if (status & 0x8)
  253. LOG_ERROR("Low Programming Voltage Detected, Operation Aborted");
  254. if (status & 0x10)
  255. LOG_ERROR("Program Error / Error in Setting Lock-Bit");
  256. if (status & 0x20)
  257. LOG_ERROR("Error in Block Erasure or Clear Lock-Bits");
  258. if (status & 0x40)
  259. LOG_ERROR("Block Erase Suspended");
  260. cfi_intel_clear_status_register(bank);
  261. }
  262. return status;
  263. }
  264. int cfi_spansion_wait_status_busy(flash_bank_t *bank, int timeout)
  265. {
  266. u8 status, oldstatus;
  267. oldstatus = cfi_get_u8(bank, 0, 0x0);
  268. do {
  269. status = cfi_get_u8(bank, 0, 0x0);
  270. if ((status ^ oldstatus) & 0x40) {
  271. if (status & 0x20) {
  272. oldstatus = cfi_get_u8(bank, 0, 0x0);
  273. status = cfi_get_u8(bank, 0, 0x0);
  274. if ((status ^ oldstatus) & 0x40) {
  275. LOG_ERROR("dq5 timeout, status: 0x%x", status);
  276. return(ERROR_FLASH_OPERATION_FAILED);
  277. } else {
  278. LOG_DEBUG("status: 0x%x", status);
  279. return(ERROR_OK);
  280. }
  281. }
  282. } else {
  283. LOG_DEBUG("status: 0x%x", status);
  284. return(ERROR_OK);
  285. }
  286. oldstatus = status;
  287. usleep(1000);
  288. } while (timeout-- > 0);
  289. LOG_ERROR("timeout, status: 0x%x", status);
  290. return(ERROR_FLASH_BUSY);
  291. }
  292. int cfi_read_intel_pri_ext(flash_bank_t *bank)
  293. {
  294. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  295. cfi_intel_pri_ext_t *pri_ext = malloc(sizeof(cfi_intel_pri_ext_t));
  296. target_t *target = bank->target;
  297. u8 command[8];
  298. cfi_info->pri_ext = pri_ext;
  299. pri_ext->pri[0] = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0);
  300. pri_ext->pri[1] = cfi_query_u8(bank, 0, cfi_info->pri_addr + 1);
  301. pri_ext->pri[2] = cfi_query_u8(bank, 0, cfi_info->pri_addr + 2);
  302. if ((pri_ext->pri[0] != 'P') || (pri_ext->pri[1] != 'R') || (pri_ext->pri[2] != 'I'))
  303. {
  304. cfi_command(bank, 0xf0, command);
  305. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  306. cfi_command(bank, 0xff, command);
  307. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  308. LOG_ERROR("Could not read bank flash bank information");
  309. return ERROR_FLASH_BANK_INVALID;
  310. }
  311. pri_ext->major_version = cfi_query_u8(bank, 0, cfi_info->pri_addr + 3);
  312. pri_ext->minor_version = cfi_query_u8(bank, 0, cfi_info->pri_addr + 4);
  313. 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);
  314. pri_ext->feature_support = cfi_query_u32(bank, 0, cfi_info->pri_addr + 5);
  315. pri_ext->suspend_cmd_support = cfi_query_u8(bank, 0, cfi_info->pri_addr + 9);
  316. pri_ext->blk_status_reg_mask = cfi_query_u16(bank, 0, cfi_info->pri_addr + 0xa);
  317. 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);
  318. pri_ext->vcc_optimal = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0xc);
  319. pri_ext->vpp_optimal = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0xd);
  320. LOG_DEBUG("Vcc opt: %1.1x.%1.1x, Vpp opt: %1.1x.%1.1x",
  321. (pri_ext->vcc_optimal & 0xf0) >> 4, pri_ext->vcc_optimal & 0x0f,
  322. (pri_ext->vpp_optimal & 0xf0) >> 4, pri_ext->vpp_optimal & 0x0f);
  323. pri_ext->num_protection_fields = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0xe);
  324. if (pri_ext->num_protection_fields != 1)
  325. {
  326. LOG_WARNING("expected one protection register field, but found %i", pri_ext->num_protection_fields);
  327. }
  328. pri_ext->prot_reg_addr = cfi_query_u16(bank, 0, cfi_info->pri_addr + 0xf);
  329. pri_ext->fact_prot_reg_size = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0x11);
  330. pri_ext->user_prot_reg_size = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0x12);
  331. 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);
  332. return ERROR_OK;
  333. }
  334. int cfi_read_spansion_pri_ext(flash_bank_t *bank)
  335. {
  336. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  337. cfi_spansion_pri_ext_t *pri_ext = malloc(sizeof(cfi_spansion_pri_ext_t));
  338. target_t *target = bank->target;
  339. u8 command[8];
  340. cfi_info->pri_ext = pri_ext;
  341. pri_ext->pri[0] = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0);
  342. pri_ext->pri[1] = cfi_query_u8(bank, 0, cfi_info->pri_addr + 1);
  343. pri_ext->pri[2] = cfi_query_u8(bank, 0, cfi_info->pri_addr + 2);
  344. if ((pri_ext->pri[0] != 'P') || (pri_ext->pri[1] != 'R') || (pri_ext->pri[2] != 'I'))
  345. {
  346. cfi_command(bank, 0xf0, command);
  347. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  348. LOG_ERROR("Could not read spansion bank information");
  349. return ERROR_FLASH_BANK_INVALID;
  350. }
  351. pri_ext->major_version = cfi_query_u8(bank, 0, cfi_info->pri_addr + 3);
  352. pri_ext->minor_version = cfi_query_u8(bank, 0, cfi_info->pri_addr + 4);
  353. 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);
  354. pri_ext->SiliconRevision = cfi_query_u8(bank, 0, cfi_info->pri_addr + 5);
  355. pri_ext->EraseSuspend = cfi_query_u8(bank, 0, cfi_info->pri_addr + 6);
  356. pri_ext->BlkProt = cfi_query_u8(bank, 0, cfi_info->pri_addr + 7);
  357. pri_ext->TmpBlkUnprotect = cfi_query_u8(bank, 0, cfi_info->pri_addr + 8);
  358. pri_ext->BlkProtUnprot = cfi_query_u8(bank, 0, cfi_info->pri_addr + 9);
  359. pri_ext->SimultaneousOps = cfi_query_u8(bank, 0, cfi_info->pri_addr + 10);
  360. pri_ext->BurstMode = cfi_query_u8(bank, 0, cfi_info->pri_addr + 11);
  361. pri_ext->PageMode = cfi_query_u8(bank, 0, cfi_info->pri_addr + 12);
  362. pri_ext->VppMin = cfi_query_u8(bank, 0, cfi_info->pri_addr + 13);
  363. pri_ext->VppMax = cfi_query_u8(bank, 0, cfi_info->pri_addr + 14);
  364. pri_ext->TopBottom = cfi_query_u8(bank, 0, cfi_info->pri_addr + 15);
  365. LOG_DEBUG("Silicon Revision: 0x%x, Erase Suspend: 0x%x, Block protect: 0x%x", pri_ext->SiliconRevision,
  366. pri_ext->EraseSuspend, pri_ext->BlkProt);
  367. LOG_DEBUG("Temporary Unprotect: 0x%x, Block Protect Scheme: 0x%x, Simultaneous Ops: 0x%x", pri_ext->TmpBlkUnprotect,
  368. pri_ext->BlkProtUnprot, pri_ext->SimultaneousOps);
  369. LOG_DEBUG("Burst Mode: 0x%x, Page Mode: 0x%x, ", pri_ext->BurstMode, pri_ext->PageMode);
  370. LOG_DEBUG("Vpp min: %2.2d.%1.1d, Vpp max: %2.2d.%1.1x",
  371. (pri_ext->VppMin & 0xf0) >> 4, pri_ext->VppMin & 0x0f,
  372. (pri_ext->VppMax & 0xf0) >> 4, pri_ext->VppMax & 0x0f);
  373. LOG_DEBUG("WP# protection 0x%x", pri_ext->TopBottom);
  374. /* default values for implementation specific workarounds */
  375. pri_ext->_unlock1 = cfi_unlock_addresses[CFI_UNLOCK_555_2AA].unlock1;
  376. pri_ext->_unlock2 = cfi_unlock_addresses[CFI_UNLOCK_555_2AA].unlock2;
  377. pri_ext->_reversed_geometry = 0;
  378. return ERROR_OK;
  379. }
  380. int cfi_read_atmel_pri_ext(flash_bank_t *bank)
  381. {
  382. cfi_atmel_pri_ext_t atmel_pri_ext;
  383. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  384. cfi_spansion_pri_ext_t *pri_ext = malloc(sizeof(cfi_spansion_pri_ext_t));
  385. target_t *target = bank->target;
  386. u8 command[8];
  387. /* ATMEL devices use the same CFI primary command set (0x2) as AMD/Spansion,
  388. * but a different primary extended query table.
  389. * We read the atmel table, and prepare a valid AMD/Spansion query table.
  390. */
  391. memset(pri_ext, 0, sizeof(cfi_spansion_pri_ext_t));
  392. cfi_info->pri_ext = pri_ext;
  393. atmel_pri_ext.pri[0] = cfi_query_u8(bank, 0, cfi_info->pri_addr + 0);
  394. atmel_pri_ext.pri[1] = cfi_query_u8(bank, 0, cfi_info->pri_addr + 1);
  395. atmel_pri_ext.pri[2] = cfi_query_u8(bank, 0, cfi_info->pri_addr + 2);
  396. if ((atmel_pri_ext.pri[0] != 'P') || (atmel_pri_ext.pri[1] != 'R') || (atmel_pri_ext.pri[2] != 'I'))
  397. {
  398. cfi_command(bank, 0xf0, command);
  399. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  400. LOG_ERROR("Could not read atmel bank information");
  401. return ERROR_FLASH_BANK_INVALID;
  402. }
  403. pri_ext->pri[0] = atmel_pri_ext.pri[0];
  404. pri_ext->pri[1] = atmel_pri_ext.pri[1];
  405. pri_ext->pri[2] = atmel_pri_ext.pri[2];
  406. atmel_pri_ext.major_version = cfi_query_u8(bank, 0, cfi_info->pri_addr + 3);
  407. atmel_pri_ext.minor_version = cfi_query_u8(bank, 0, cfi_info->pri_addr + 4);
  408. 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);
  409. pri_ext->major_version = atmel_pri_ext.major_version;
  410. pri_ext->minor_version = atmel_pri_ext.minor_version;
  411. atmel_pri_ext.features = cfi_query_u8(bank, 0, cfi_info->pri_addr + 5);
  412. atmel_pri_ext.bottom_boot = cfi_query_u8(bank, 0, cfi_info->pri_addr + 6);
  413. atmel_pri_ext.burst_mode = cfi_query_u8(bank, 0, cfi_info->pri_addr + 7);
  414. atmel_pri_ext.page_mode = cfi_query_u8(bank, 0, cfi_info->pri_addr + 8);
  415. LOG_DEBUG("features: 0x%2.2x, bottom_boot: 0x%2.2x, burst_mode: 0x%2.2x, page_mode: 0x%2.2x",
  416. atmel_pri_ext.features, atmel_pri_ext.bottom_boot, atmel_pri_ext.burst_mode, atmel_pri_ext.page_mode);
  417. if (atmel_pri_ext.features & 0x02)
  418. pri_ext->EraseSuspend = 2;
  419. if (atmel_pri_ext.bottom_boot)
  420. pri_ext->TopBottom = 2;
  421. else
  422. pri_ext->TopBottom = 3;
  423. pri_ext->_unlock1 = cfi_unlock_addresses[CFI_UNLOCK_555_2AA].unlock1;
  424. pri_ext->_unlock2 = cfi_unlock_addresses[CFI_UNLOCK_555_2AA].unlock2;
  425. return ERROR_OK;
  426. }
  427. int cfi_read_0002_pri_ext(flash_bank_t *bank)
  428. {
  429. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  430. if (cfi_info->manufacturer == CFI_MFR_ATMEL)
  431. {
  432. return cfi_read_atmel_pri_ext(bank);
  433. }
  434. else
  435. {
  436. return cfi_read_spansion_pri_ext(bank);
  437. }
  438. }
  439. int cfi_spansion_info(struct flash_bank_s *bank, char *buf, int buf_size)
  440. {
  441. int printed;
  442. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  443. cfi_spansion_pri_ext_t *pri_ext = cfi_info->pri_ext;
  444. printed = snprintf(buf, buf_size, "\nSpansion primary algorithm extend information:\n");
  445. buf += printed;
  446. buf_size -= printed;
  447. printed = snprintf(buf, buf_size, "pri: '%c%c%c', version: %c.%c\n", pri_ext->pri[0],
  448. pri_ext->pri[1], pri_ext->pri[2],
  449. pri_ext->major_version, pri_ext->minor_version);
  450. buf += printed;
  451. buf_size -= printed;
  452. printed = snprintf(buf, buf_size, "Silicon Rev.: 0x%x, Address Sensitive unlock: 0x%x\n",
  453. (pri_ext->SiliconRevision) >> 2,
  454. (pri_ext->SiliconRevision) & 0x03);
  455. buf += printed;
  456. buf_size -= printed;
  457. printed = snprintf(buf, buf_size, "Erase Suspend: 0x%x, Sector Protect: 0x%x\n",
  458. pri_ext->EraseSuspend,
  459. pri_ext->BlkProt);
  460. buf += printed;
  461. buf_size -= printed;
  462. printed = snprintf(buf, buf_size, "VppMin: %2.2d.%1.1x, VppMax: %2.2d.%1.1x\n",
  463. (pri_ext->VppMin & 0xf0) >> 4, pri_ext->VppMin & 0x0f,
  464. (pri_ext->VppMax & 0xf0) >> 4, pri_ext->VppMax & 0x0f);
  465. return ERROR_OK;
  466. }
  467. int cfi_intel_info(struct flash_bank_s *bank, char *buf, int buf_size)
  468. {
  469. int printed;
  470. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  471. cfi_intel_pri_ext_t *pri_ext = cfi_info->pri_ext;
  472. printed = snprintf(buf, buf_size, "\nintel primary algorithm extend information:\n");
  473. buf += printed;
  474. buf_size -= printed;
  475. 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);
  476. buf += printed;
  477. buf_size -= printed;
  478. 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);
  479. buf += printed;
  480. buf_size -= printed;
  481. printed = snprintf(buf, buf_size, "Vcc opt: %1.1x.%1.1x, Vpp opt: %1.1x.%1.1x\n",
  482. (pri_ext->vcc_optimal & 0xf0) >> 4, pri_ext->vcc_optimal & 0x0f,
  483. (pri_ext->vpp_optimal & 0xf0) >> 4, pri_ext->vpp_optimal & 0x0f);
  484. buf += printed;
  485. buf_size -= printed;
  486. 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);
  487. return ERROR_OK;
  488. }
  489. int cfi_register_commands(struct command_context_s *cmd_ctx)
  490. {
  491. /*command_t *cfi_cmd = */
  492. register_command(cmd_ctx, NULL, "cfi", NULL, COMMAND_ANY, "flash bank cfi <base> <size> <chip_width> <bus_width> <targetNum> [jedec_probe/x16_as_x8]");
  493. /*
  494. register_command(cmd_ctx, cfi_cmd, "part_id", cfi_handle_part_id_command, COMMAND_EXEC,
  495. "print part id of cfi flash bank <num>");
  496. */
  497. return ERROR_OK;
  498. }
  499. /* flash_bank cfi <base> <size> <chip_width> <bus_width> <target#> [options]
  500. */
  501. int cfi_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank)
  502. {
  503. cfi_flash_bank_t *cfi_info;
  504. int i;
  505. if (argc < 6)
  506. {
  507. LOG_WARNING("incomplete flash_bank cfi configuration");
  508. return ERROR_FLASH_BANK_INVALID;
  509. }
  510. if ((strtoul(args[4], NULL, 0) > CFI_MAX_CHIP_WIDTH)
  511. || (strtoul(args[3], NULL, 0) > CFI_MAX_BUS_WIDTH))
  512. {
  513. LOG_ERROR("chip and bus width have to specified in bytes");
  514. return ERROR_FLASH_BANK_INVALID;
  515. }
  516. cfi_info = malloc(sizeof(cfi_flash_bank_t));
  517. cfi_info->probed = 0;
  518. bank->driver_priv = cfi_info;
  519. cfi_info->write_algorithm = NULL;
  520. cfi_info->x16_as_x8 = 0;
  521. cfi_info->jedec_probe = 0;
  522. cfi_info->not_cfi = 0;
  523. for (i = 6; i < argc; i++)
  524. {
  525. if (strcmp(args[i], "x16_as_x8") == 0)
  526. {
  527. cfi_info->x16_as_x8 = 1;
  528. }
  529. else if (strcmp(args[i], "jedec_probe") == 0)
  530. {
  531. cfi_info->jedec_probe = 1;
  532. }
  533. }
  534. cfi_info->write_algorithm = NULL;
  535. /* bank wasn't probed yet */
  536. cfi_info->qry[0] = -1;
  537. return ERROR_OK;
  538. }
  539. int cfi_intel_erase(struct flash_bank_s *bank, int first, int last)
  540. {
  541. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  542. target_t *target = bank->target;
  543. u8 command[8];
  544. int i;
  545. cfi_intel_clear_status_register(bank);
  546. for (i = first; i <= last; i++)
  547. {
  548. cfi_command(bank, 0x20, command);
  549. target->type->write_memory(target, flash_address(bank, i, 0x0), bank->bus_width, 1, command);
  550. cfi_command(bank, 0xd0, command);
  551. target->type->write_memory(target, flash_address(bank, i, 0x0), bank->bus_width, 1, command);
  552. if (cfi_intel_wait_status_busy(bank, 1000 * (1 << cfi_info->block_erase_timeout_typ)) == 0x80)
  553. bank->sectors[i].is_erased = 1;
  554. else
  555. {
  556. cfi_command(bank, 0xff, command);
  557. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  558. LOG_ERROR("couldn't erase block %i of flash bank at base 0x%x", i, bank->base);
  559. return ERROR_FLASH_OPERATION_FAILED;
  560. }
  561. }
  562. cfi_command(bank, 0xff, command);
  563. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  564. return ERROR_OK;
  565. }
  566. int cfi_spansion_erase(struct flash_bank_s *bank, int first, int last)
  567. {
  568. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  569. cfi_spansion_pri_ext_t *pri_ext = cfi_info->pri_ext;
  570. target_t *target = bank->target;
  571. u8 command[8];
  572. int i;
  573. for (i = first; i <= last; i++)
  574. {
  575. cfi_command(bank, 0xaa, command);
  576. target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command);
  577. cfi_command(bank, 0x55, command);
  578. target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command);
  579. cfi_command(bank, 0x80, command);
  580. target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command);
  581. cfi_command(bank, 0xaa, command);
  582. target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command);
  583. cfi_command(bank, 0x55, command);
  584. target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command);
  585. cfi_command(bank, 0x30, command);
  586. target->type->write_memory(target, flash_address(bank, i, 0x0), bank->bus_width, 1, command);
  587. if (cfi_spansion_wait_status_busy(bank, 1000 * (1 << cfi_info->block_erase_timeout_typ)) == ERROR_OK)
  588. bank->sectors[i].is_erased = 1;
  589. else
  590. {
  591. cfi_command(bank, 0xf0, command);
  592. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  593. LOG_ERROR("couldn't erase block %i of flash bank at base 0x%x", i, bank->base);
  594. return ERROR_FLASH_OPERATION_FAILED;
  595. }
  596. }
  597. cfi_command(bank, 0xf0, command);
  598. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  599. return ERROR_OK;
  600. }
  601. int cfi_erase(struct flash_bank_s *bank, int first, int last)
  602. {
  603. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  604. if (bank->target->state != TARGET_HALTED)
  605. {
  606. LOG_ERROR("Target not halted");
  607. return ERROR_TARGET_NOT_HALTED;
  608. }
  609. if ((first < 0) || (last < first) || (last >= bank->num_sectors))
  610. {
  611. return ERROR_FLASH_SECTOR_INVALID;
  612. }
  613. if (cfi_info->qry[0] != 'Q')
  614. return ERROR_FLASH_BANK_NOT_PROBED;
  615. switch(cfi_info->pri_id)
  616. {
  617. case 1:
  618. case 3:
  619. return cfi_intel_erase(bank, first, last);
  620. break;
  621. case 2:
  622. return cfi_spansion_erase(bank, first, last);
  623. break;
  624. default:
  625. LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
  626. break;
  627. }
  628. return ERROR_OK;
  629. }
  630. int cfi_intel_protect(struct flash_bank_s *bank, int set, int first, int last)
  631. {
  632. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  633. cfi_intel_pri_ext_t *pri_ext = cfi_info->pri_ext;
  634. target_t *target = bank->target;
  635. u8 command[8];
  636. int retry = 0;
  637. int i;
  638. /* if the device supports neither legacy lock/unlock (bit 3) nor
  639. * instant individual block locking (bit 5).
  640. */
  641. if (!(pri_ext->feature_support & 0x28))
  642. return ERROR_FLASH_OPERATION_FAILED;
  643. cfi_intel_clear_status_register(bank);
  644. for (i = first; i <= last; i++)
  645. {
  646. cfi_command(bank, 0x60, command);
  647. LOG_DEBUG("address: 0x%4.4x, command: 0x%4.4x", flash_address(bank, i, 0x0), target_buffer_get_u32(target, command));
  648. target->type->write_memory(target, flash_address(bank, i, 0x0), bank->bus_width, 1, command);
  649. if (set)
  650. {
  651. cfi_command(bank, 0x01, command);
  652. LOG_DEBUG("address: 0x%4.4x, command: 0x%4.4x", flash_address(bank, i, 0x0), target_buffer_get_u32(target, command));
  653. target->type->write_memory(target, flash_address(bank, i, 0x0), bank->bus_width, 1, command);
  654. bank->sectors[i].is_protected = 1;
  655. }
  656. else
  657. {
  658. cfi_command(bank, 0xd0, command);
  659. LOG_DEBUG("address: 0x%4.4x, command: 0x%4.4x", flash_address(bank, i, 0x0), target_buffer_get_u32(target, command));
  660. target->type->write_memory(target, flash_address(bank, i, 0x0), bank->bus_width, 1, command);
  661. bank->sectors[i].is_protected = 0;
  662. }
  663. /* instant individual block locking doesn't require reading of the status register */
  664. if (!(pri_ext->feature_support & 0x20))
  665. {
  666. /* Clear lock bits operation may take up to 1.4s */
  667. cfi_intel_wait_status_busy(bank, 1400);
  668. }
  669. else
  670. {
  671. u8 block_status;
  672. /* read block lock bit, to verify status */
  673. cfi_command(bank, 0x90, command);
  674. target->type->write_memory(target, flash_address(bank, 0, 0x55), bank->bus_width, 1, command);
  675. block_status = cfi_get_u8(bank, i, 0x2);
  676. if ((block_status & 0x1) != set)
  677. {
  678. LOG_ERROR("couldn't change block lock status (set = %i, block_status = 0x%2.2x)", set, block_status);
  679. cfi_command(bank, 0x70, command);
  680. target->type->write_memory(target, flash_address(bank, 0, 0x55), bank->bus_width, 1, command);
  681. cfi_intel_wait_status_busy(bank, 10);
  682. if (retry > 10)
  683. return ERROR_FLASH_OPERATION_FAILED;
  684. else
  685. {
  686. i--;
  687. retry++;
  688. }
  689. }
  690. }
  691. }
  692. /* if the device doesn't support individual block lock bits set/clear,
  693. * all blocks have been unlocked in parallel, so we set those that should be protected
  694. */
  695. if ((!set) && (!(pri_ext->feature_support & 0x20)))
  696. {
  697. for (i = 0; i < bank->num_sectors; i++)
  698. {
  699. if (bank->sectors[i].is_protected == 1)
  700. {
  701. cfi_intel_clear_status_register(bank);
  702. cfi_command(bank, 0x60, command);
  703. target->type->write_memory(target, flash_address(bank, i, 0x0), bank->bus_width, 1, command);
  704. cfi_command(bank, 0x01, command);
  705. target->type->write_memory(target, flash_address(bank, i, 0x0), bank->bus_width, 1, command);
  706. cfi_intel_wait_status_busy(bank, 100);
  707. }
  708. }
  709. }
  710. cfi_command(bank, 0xff, command);
  711. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  712. return ERROR_OK;
  713. }
  714. int cfi_protect(struct flash_bank_s *bank, int set, int first, int last)
  715. {
  716. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  717. if (bank->target->state != TARGET_HALTED)
  718. {
  719. LOG_ERROR("Target not halted");
  720. return ERROR_TARGET_NOT_HALTED;
  721. }
  722. if ((first < 0) || (last < first) || (last >= bank->num_sectors))
  723. {
  724. return ERROR_FLASH_SECTOR_INVALID;
  725. }
  726. if (cfi_info->qry[0] != 'Q')
  727. return ERROR_FLASH_BANK_NOT_PROBED;
  728. switch(cfi_info->pri_id)
  729. {
  730. case 1:
  731. case 3:
  732. cfi_intel_protect(bank, set, first, last);
  733. break;
  734. default:
  735. LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
  736. break;
  737. }
  738. return ERROR_OK;
  739. }
  740. /* FIXME Replace this by a simple memcpy() - still unsure about sideeffects */
  741. static void cfi_add_byte(struct flash_bank_s *bank, u8 *word, u8 byte)
  742. {
  743. /* target_t *target = bank->target; */
  744. int i;
  745. /* NOTE:
  746. * The data to flash must not be changed in endian! We write a bytestrem in
  747. * target byte order already. Only the control and status byte lane of the flash
  748. * WSM is interpreted by the CPU in different ways, when read a u16 or u32
  749. * word (data seems to be in the upper or lower byte lane for u16 accesses).
  750. */
  751. #if 0
  752. if (target->endianness == TARGET_LITTLE_ENDIAN)
  753. {
  754. #endif
  755. /* shift bytes */
  756. for (i = 0; i < bank->bus_width - 1; i++)
  757. word[i] = word[i + 1];
  758. word[bank->bus_width - 1] = byte;
  759. #if 0
  760. }
  761. else
  762. {
  763. /* shift bytes */
  764. for (i = bank->bus_width - 1; i > 0; i--)
  765. word[i] = word[i - 1];
  766. word[0] = byte;
  767. }
  768. #endif
  769. }
  770. /* Convert code image to target endian */
  771. /* FIXME create general block conversion fcts in target.c?) */
  772. static void cfi_fix_code_endian(target_t *target, u8 *dest, const u32 *src, u32 count)
  773. {
  774. u32 i;
  775. for (i=0; i< count; i++)
  776. {
  777. target_buffer_set_u32(target, dest, *src);
  778. dest+=4;
  779. src++;
  780. }
  781. }
  782. u32 cfi_command_val(flash_bank_t *bank, u8 cmd)
  783. {
  784. target_t *target = bank->target;
  785. u8 buf[CFI_MAX_BUS_WIDTH];
  786. cfi_command(bank, cmd, buf);
  787. switch (bank->bus_width)
  788. {
  789. case 1 :
  790. return buf[0];
  791. break;
  792. case 2 :
  793. return target_buffer_get_u16(target, buf);
  794. break;
  795. case 4 :
  796. return target_buffer_get_u32(target, buf);
  797. break;
  798. default :
  799. LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes", bank->bus_width);
  800. return 0;
  801. }
  802. }
  803. int cfi_intel_write_block(struct flash_bank_s *bank, u8 *buffer, u32 address, u32 count)
  804. {
  805. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  806. target_t *target = bank->target;
  807. reg_param_t reg_params[7];
  808. armv4_5_algorithm_t armv4_5_info;
  809. working_area_t *source;
  810. u32 buffer_size = 32768;
  811. u32 write_command_val, busy_pattern_val, error_pattern_val;
  812. /* algorithm register usage:
  813. * r0: source address (in RAM)
  814. * r1: target address (in Flash)
  815. * r2: count
  816. * r3: flash write command
  817. * r4: status byte (returned to host)
  818. * r5: busy test pattern
  819. * r6: error test pattern
  820. */
  821. static const u32 word_32_code[] = {
  822. 0xe4904004, /* loop: ldr r4, [r0], #4 */
  823. 0xe5813000, /* str r3, [r1] */
  824. 0xe5814000, /* str r4, [r1] */
  825. 0xe5914000, /* busy: ldr r4, [r1] */
  826. 0xe0047005, /* and r7, r4, r5 */
  827. 0xe1570005, /* cmp r7, r5 */
  828. 0x1afffffb, /* bne busy */
  829. 0xe1140006, /* tst r4, r6 */
  830. 0x1a000003, /* bne done */
  831. 0xe2522001, /* subs r2, r2, #1 */
  832. 0x0a000001, /* beq done */
  833. 0xe2811004, /* add r1, r1 #4 */
  834. 0xeafffff2, /* b loop */
  835. 0xeafffffe /* done: b -2 */
  836. };
  837. static const u32 word_16_code[] = {
  838. 0xe0d040b2, /* loop: ldrh r4, [r0], #2 */
  839. 0xe1c130b0, /* strh r3, [r1] */
  840. 0xe1c140b0, /* strh r4, [r1] */
  841. 0xe1d140b0, /* busy ldrh r4, [r1] */
  842. 0xe0047005, /* and r7, r4, r5 */
  843. 0xe1570005, /* cmp r7, r5 */
  844. 0x1afffffb, /* bne busy */
  845. 0xe1140006, /* tst r4, r6 */
  846. 0x1a000003, /* bne done */
  847. 0xe2522001, /* subs r2, r2, #1 */
  848. 0x0a000001, /* beq done */
  849. 0xe2811002, /* add r1, r1 #2 */
  850. 0xeafffff2, /* b loop */
  851. 0xeafffffe /* done: b -2 */
  852. };
  853. static const u32 word_8_code[] = {
  854. 0xe4d04001, /* loop: ldrb r4, [r0], #1 */
  855. 0xe5c13000, /* strb r3, [r1] */
  856. 0xe5c14000, /* strb r4, [r1] */
  857. 0xe5d14000, /* busy ldrb r4, [r1] */
  858. 0xe0047005, /* and r7, r4, r5 */
  859. 0xe1570005, /* cmp r7, r5 */
  860. 0x1afffffb, /* bne busy */
  861. 0xe1140006, /* tst r4, r6 */
  862. 0x1a000003, /* bne done */
  863. 0xe2522001, /* subs r2, r2, #1 */
  864. 0x0a000001, /* beq done */
  865. 0xe2811001, /* add r1, r1 #1 */
  866. 0xeafffff2, /* b loop */
  867. 0xeafffffe /* done: b -2 */
  868. };
  869. u8 target_code[4*CFI_MAX_INTEL_CODESIZE];
  870. const u32 *target_code_src;
  871. int target_code_size;
  872. int retval = ERROR_OK;
  873. cfi_intel_clear_status_register(bank);
  874. armv4_5_info.common_magic = ARMV4_5_COMMON_MAGIC;
  875. armv4_5_info.core_mode = ARMV4_5_MODE_SVC;
  876. armv4_5_info.core_state = ARMV4_5_STATE_ARM;
  877. /* If we are setting up the write_algorith, we need target_code_src */
  878. /* if not we only need target_code_size. */
  879. /* */
  880. /* However, we don't want to create multiple code paths, so we */
  881. /* do the unecessary evaluation of target_code_src, which the */
  882. /* compiler will probably nicely optimize away if not needed */
  883. /* prepare algorithm code for target endian */
  884. switch (bank->bus_width)
  885. {
  886. case 1 :
  887. target_code_src = word_8_code;
  888. target_code_size = sizeof(word_8_code);
  889. break;
  890. case 2 :
  891. target_code_src = word_16_code;
  892. target_code_size = sizeof(word_16_code);
  893. break;
  894. case 4 :
  895. target_code_src = word_32_code;
  896. target_code_size = sizeof(word_32_code);
  897. break;
  898. default:
  899. LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes", bank->bus_width);
  900. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  901. }
  902. /* flash write code */
  903. if (!cfi_info->write_algorithm)
  904. {
  905. if ( target_code_size > sizeof(target_code) )
  906. {
  907. LOG_WARNING("Internal error - target code buffer to small. Increase CFI_MAX_INTEL_CODESIZE and recompile.");
  908. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  909. }
  910. cfi_fix_code_endian(target, target_code, target_code_src, target_code_size / 4);
  911. /* Get memory for block write handler */
  912. retval = target_alloc_working_area(target, target_code_size, &cfi_info->write_algorithm);
  913. if (retval != ERROR_OK)
  914. {
  915. LOG_WARNING("No working area available, can't do block memory writes");
  916. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  917. };
  918. /* write algorithm code to working area */
  919. retval = target_write_buffer(target, cfi_info->write_algorithm->address, target_code_size, target_code);
  920. if (retval != ERROR_OK)
  921. {
  922. LOG_ERROR("Unable to write block write code to target");
  923. goto cleanup;
  924. }
  925. }
  926. /* Get a workspace buffer for the data to flash starting with 32k size.
  927. Half size until buffer would be smaller 256 Bytem then fail back */
  928. /* FIXME Why 256 bytes, why not 32 bytes (smallest flash write page */
  929. while (target_alloc_working_area(target, buffer_size, &source) != ERROR_OK)
  930. {
  931. buffer_size /= 2;
  932. if (buffer_size <= 256)
  933. {
  934. LOG_WARNING("no large enough working area available, can't do block memory writes");
  935. retval = ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  936. goto cleanup;
  937. }
  938. };
  939. /* setup algo registers */
  940. init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);
  941. init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);
  942. init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);
  943. init_reg_param(&reg_params[3], "r3", 32, PARAM_OUT);
  944. init_reg_param(&reg_params[4], "r4", 32, PARAM_IN);
  945. init_reg_param(&reg_params[5], "r5", 32, PARAM_OUT);
  946. init_reg_param(&reg_params[6], "r6", 32, PARAM_OUT);
  947. /* prepare command and status register patterns */
  948. write_command_val = cfi_command_val(bank, 0x40);
  949. busy_pattern_val = cfi_command_val(bank, 0x80);
  950. error_pattern_val = cfi_command_val(bank, 0x7e);
  951. LOG_INFO("Using target buffer at 0x%08x and of size 0x%04x", source->address, buffer_size );
  952. /* Programming main loop */
  953. while (count > 0)
  954. {
  955. u32 thisrun_count = (count > buffer_size) ? buffer_size : count;
  956. u32 wsm_error;
  957. target_write_buffer(target, source->address, thisrun_count, buffer);
  958. buf_set_u32(reg_params[0].value, 0, 32, source->address);
  959. buf_set_u32(reg_params[1].value, 0, 32, address);
  960. buf_set_u32(reg_params[2].value, 0, 32, thisrun_count / bank->bus_width);
  961. buf_set_u32(reg_params[3].value, 0, 32, write_command_val);
  962. buf_set_u32(reg_params[5].value, 0, 32, busy_pattern_val);
  963. buf_set_u32(reg_params[6].value, 0, 32, error_pattern_val);
  964. LOG_INFO("Write 0x%04x bytes to flash at 0x%08x", thisrun_count, address );
  965. /* Execute algorithm, assume breakpoint for last instruction */
  966. retval = target->type->run_algorithm(target, 0, NULL, 7, reg_params,
  967. cfi_info->write_algorithm->address,
  968. cfi_info->write_algorithm->address + target_code_size - sizeof(u32),
  969. 10000, /* 10s should be enough for max. 32k of data */
  970. &armv4_5_info);
  971. /* On failure try a fall back to direct word writes */
  972. if (retval != ERROR_OK)
  973. {
  974. cfi_intel_clear_status_register(bank);
  975. LOG_ERROR("Execution of flash algorythm failed. Can't fall back. Please report.");
  976. retval = ERROR_FLASH_OPERATION_FAILED;
  977. /* retval = ERROR_TARGET_RESOURCE_NOT_AVAILABLE; */
  978. /* FIXME To allow fall back or recovery, we must save the actual status
  979. somewhere, so that a higher level code can start recovery. */
  980. goto cleanup;
  981. }
  982. /* Check return value from algo code */
  983. wsm_error = buf_get_u32(reg_params[4].value, 0, 32) & error_pattern_val;
  984. if (wsm_error)
  985. {
  986. /* read status register (outputs debug inforation) */
  987. cfi_intel_wait_status_busy(bank, 100);
  988. cfi_intel_clear_status_register(bank);
  989. retval = ERROR_FLASH_OPERATION_FAILED;
  990. goto cleanup;
  991. }
  992. buffer += thisrun_count;
  993. address += thisrun_count;
  994. count -= thisrun_count;
  995. }
  996. /* free up resources */
  997. cleanup:
  998. if (source)
  999. target_free_working_area(target, source);
  1000. if (cfi_info->write_algorithm)
  1001. {
  1002. target_free_working_area(target, cfi_info->write_algorithm);
  1003. cfi_info->write_algorithm = NULL;
  1004. }
  1005. destroy_reg_param(&reg_params[0]);
  1006. destroy_reg_param(&reg_params[1]);
  1007. destroy_reg_param(&reg_params[2]);
  1008. destroy_reg_param(&reg_params[3]);
  1009. destroy_reg_param(&reg_params[4]);
  1010. destroy_reg_param(&reg_params[5]);
  1011. destroy_reg_param(&reg_params[6]);
  1012. return retval;
  1013. }
  1014. int cfi_spansion_write_block(struct flash_bank_s *bank, u8 *buffer, u32 address, u32 count)
  1015. {
  1016. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1017. cfi_spansion_pri_ext_t *pri_ext = cfi_info->pri_ext;
  1018. target_t *target = bank->target;
  1019. reg_param_t reg_params[10];
  1020. armv4_5_algorithm_t armv4_5_info;
  1021. working_area_t *source;
  1022. u32 buffer_size = 32768;
  1023. u32 status;
  1024. int retval;
  1025. int exit_code = ERROR_OK;
  1026. /* input parameters - */
  1027. /* R0 = source address */
  1028. /* R1 = destination address */
  1029. /* R2 = number of writes */
  1030. /* R3 = flash write command */
  1031. /* R4 = constant to mask DQ7 bits (also used for Dq5 with shift) */
  1032. /* output parameters - */
  1033. /* R5 = 0x80 ok 0x00 bad */
  1034. /* temp registers - */
  1035. /* R6 = value read from flash to test status */
  1036. /* R7 = holding register */
  1037. /* unlock registers - */
  1038. /* R8 = unlock1_addr */
  1039. /* R9 = unlock1_cmd */
  1040. /* R10 = unlock2_addr */
  1041. /* R11 = unlock2_cmd */
  1042. static const u32 word_32_code[] = {
  1043. /* 00008100 <sp_32_code>: */
  1044. 0xe4905004, /* ldr r5, [r0], #4 */
  1045. 0xe5889000, /* str r9, [r8] */
  1046. 0xe58ab000, /* str r11, [r10] */
  1047. 0xe5883000, /* str r3, [r8] */
  1048. 0xe5815000, /* str r5, [r1] */
  1049. 0xe1a00000, /* nop */
  1050. /* */
  1051. /* 00008110 <sp_32_busy>: */
  1052. 0xe5916000, /* ldr r6, [r1] */
  1053. 0xe0257006, /* eor r7, r5, r6 */
  1054. 0xe0147007, /* ands r7, r4, r7 */
  1055. 0x0a000007, /* beq 8140 <sp_32_cont> ; b if DQ7 == Data7 */
  1056. 0xe0166124, /* ands r6, r6, r4, lsr #2 */
  1057. 0x0afffff9, /* beq 8110 <sp_32_busy> ; b if DQ5 low */
  1058. 0xe5916000, /* ldr r6, [r1] */
  1059. 0xe0257006, /* eor r7, r5, r6 */
  1060. 0xe0147007, /* ands r7, r4, r7 */
  1061. 0x0a000001, /* beq 8140 <sp_32_cont> ; b if DQ7 == Data7 */
  1062. 0xe3a05000, /* mov r5, #0 ; 0x0 - return 0x00, error */
  1063. 0x1a000004, /* bne 8154 <sp_32_done> */
  1064. /* */
  1065. /* 00008140 <sp_32_cont>: */
  1066. 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
  1067. 0x03a05080, /* moveq r5, #128 ; 0x80 */
  1068. 0x0a000001, /* beq 8154 <sp_32_done> */
  1069. 0xe2811004, /* add r1, r1, #4 ; 0x4 */
  1070. 0xeaffffe8, /* b 8100 <sp_32_code> */
  1071. /* */
  1072. /* 00008154 <sp_32_done>: */
  1073. 0xeafffffe /* b 8154 <sp_32_done> */
  1074. };
  1075. static const u32 word_16_code[] = {
  1076. /* 00008158 <sp_16_code>: */
  1077. 0xe0d050b2, /* ldrh r5, [r0], #2 */
  1078. 0xe1c890b0, /* strh r9, [r8] */
  1079. 0xe1cab0b0, /* strh r11, [r10] */
  1080. 0xe1c830b0, /* strh r3, [r8] */
  1081. 0xe1c150b0, /* strh r5, [r1] */
  1082. 0xe1a00000, /* nop (mov r0,r0) */
  1083. /* */
  1084. /* 00008168 <sp_16_busy>: */
  1085. 0xe1d160b0, /* ldrh r6, [r1] */
  1086. 0xe0257006, /* eor r7, r5, r6 */
  1087. 0xe0147007, /* ands r7, r4, r7 */
  1088. 0x0a000007, /* beq 8198 <sp_16_cont> */
  1089. 0xe0166124, /* ands r6, r6, r4, lsr #2 */
  1090. 0x0afffff9, /* beq 8168 <sp_16_busy> */
  1091. 0xe1d160b0, /* ldrh r6, [r1] */
  1092. 0xe0257006, /* eor r7, r5, r6 */
  1093. 0xe0147007, /* ands r7, r4, r7 */
  1094. 0x0a000001, /* beq 8198 <sp_16_cont> */
  1095. 0xe3a05000, /* mov r5, #0 ; 0x0 */
  1096. 0x1a000004, /* bne 81ac <sp_16_done> */
  1097. /* */
  1098. /* 00008198 <sp_16_cont>: */
  1099. 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
  1100. 0x03a05080, /* moveq r5, #128 ; 0x80 */
  1101. 0x0a000001, /* beq 81ac <sp_16_done> */
  1102. 0xe2811002, /* add r1, r1, #2 ; 0x2 */
  1103. 0xeaffffe8, /* b 8158 <sp_16_code> */
  1104. /* */
  1105. /* 000081ac <sp_16_done>: */
  1106. 0xeafffffe /* b 81ac <sp_16_done> */
  1107. };
  1108. static const u32 word_8_code[] = {
  1109. /* 000081b0 <sp_16_code_end>: */
  1110. 0xe4d05001, /* ldrb r5, [r0], #1 */
  1111. 0xe5c89000, /* strb r9, [r8] */
  1112. 0xe5cab000, /* strb r11, [r10] */
  1113. 0xe5c83000, /* strb r3, [r8] */
  1114. 0xe5c15000, /* strb r5, [r1] */
  1115. 0xe1a00000, /* nop (mov r0,r0) */
  1116. /* */
  1117. /* 000081c0 <sp_8_busy>: */
  1118. 0xe5d16000, /* ldrb r6, [r1] */
  1119. 0xe0257006, /* eor r7, r5, r6 */
  1120. 0xe0147007, /* ands r7, r4, r7 */
  1121. 0x0a000007, /* beq 81f0 <sp_8_cont> */
  1122. 0xe0166124, /* ands r6, r6, r4, lsr #2 */
  1123. 0x0afffff9, /* beq 81c0 <sp_8_busy> */
  1124. 0xe5d16000, /* ldrb r6, [r1] */
  1125. 0xe0257006, /* eor r7, r5, r6 */
  1126. 0xe0147007, /* ands r7, r4, r7 */
  1127. 0x0a000001, /* beq 81f0 <sp_8_cont> */
  1128. 0xe3a05000, /* mov r5, #0 ; 0x0 */
  1129. 0x1a000004, /* bne 8204 <sp_8_done> */
  1130. /* */
  1131. /* 000081f0 <sp_8_cont>: */
  1132. 0xe2522001, /* subs r2, r2, #1 ; 0x1 */
  1133. 0x03a05080, /* moveq r5, #128 ; 0x80 */
  1134. 0x0a000001, /* beq 8204 <sp_8_done> */
  1135. 0xe2811001, /* add r1, r1, #1 ; 0x1 */
  1136. 0xeaffffe8, /* b 81b0 <sp_16_code_end> */
  1137. /* */
  1138. /* 00008204 <sp_8_done>: */
  1139. 0xeafffffe /* b 8204 <sp_8_done> */
  1140. };
  1141. armv4_5_info.common_magic = ARMV4_5_COMMON_MAGIC;
  1142. armv4_5_info.core_mode = ARMV4_5_MODE_SVC;
  1143. armv4_5_info.core_state = ARMV4_5_STATE_ARM;
  1144. /* flash write code */
  1145. if (!cfi_info->write_algorithm)
  1146. {
  1147. u8 *target_code;
  1148. int target_code_size;
  1149. const u32 *src;
  1150. /* convert bus-width dependent algorithm code to correct endiannes */
  1151. switch (bank->bus_width)
  1152. {
  1153. case 1:
  1154. src = word_8_code;
  1155. target_code_size = sizeof(word_8_code);
  1156. break;
  1157. case 2:
  1158. src = word_16_code;
  1159. target_code_size = sizeof(word_16_code);
  1160. break;
  1161. case 4:
  1162. src = word_32_code;
  1163. target_code_size = sizeof(word_32_code);
  1164. break;
  1165. default:
  1166. LOG_ERROR("Unsupported bank buswidth %d, can't do block memory writes", bank->bus_width);
  1167. return ERROR_FLASH_OPERATION_FAILED;
  1168. }
  1169. target_code = malloc(target_code_size);
  1170. cfi_fix_code_endian(target, target_code, src, target_code_size / 4);
  1171. /* allocate working area */
  1172. retval=target_alloc_working_area(target, target_code_size,
  1173. &cfi_info->write_algorithm);
  1174. if (retval != ERROR_OK)
  1175. return retval;
  1176. /* write algorithm code to working area */
  1177. target_write_buffer(target, cfi_info->write_algorithm->address,
  1178. target_code_size, target_code);
  1179. free(target_code);
  1180. }
  1181. /* the following code still assumes target code is fixed 24*4 bytes */
  1182. while (target_alloc_working_area(target, buffer_size, &source) != ERROR_OK)
  1183. {
  1184. buffer_size /= 2;
  1185. if (buffer_size <= 256)
  1186. {
  1187. /* if we already allocated the writing code, but failed to get a buffer, free the algorithm */
  1188. if (cfi_info->write_algorithm)
  1189. target_free_working_area(target, cfi_info->write_algorithm);
  1190. LOG_WARNING("not enough working area available, can't do block memory writes");
  1191. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  1192. }
  1193. };
  1194. init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);
  1195. init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);
  1196. init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);
  1197. init_reg_param(&reg_params[3], "r3", 32, PARAM_OUT);
  1198. init_reg_param(&reg_params[4], "r4", 32, PARAM_OUT);
  1199. init_reg_param(&reg_params[5], "r5", 32, PARAM_IN);
  1200. init_reg_param(&reg_params[6], "r8", 32, PARAM_OUT);
  1201. init_reg_param(&reg_params[7], "r9", 32, PARAM_OUT);
  1202. init_reg_param(&reg_params[8], "r10", 32, PARAM_OUT);
  1203. init_reg_param(&reg_params[9], "r11", 32, PARAM_OUT);
  1204. while (count > 0)
  1205. {
  1206. u32 thisrun_count = (count > buffer_size) ? buffer_size : count;
  1207. target_write_buffer(target, source->address, thisrun_count, buffer);
  1208. buf_set_u32(reg_params[0].value, 0, 32, source->address);
  1209. buf_set_u32(reg_params[1].value, 0, 32, address);
  1210. buf_set_u32(reg_params[2].value, 0, 32, thisrun_count / bank->bus_width);
  1211. buf_set_u32(reg_params[3].value, 0, 32, cfi_command_val(bank, 0xA0));
  1212. buf_set_u32(reg_params[4].value, 0, 32, cfi_command_val(bank, 0x80));
  1213. buf_set_u32(reg_params[6].value, 0, 32, flash_address(bank, 0, pri_ext->_unlock1));
  1214. buf_set_u32(reg_params[7].value, 0, 32, 0xaaaaaaaa);
  1215. buf_set_u32(reg_params[8].value, 0, 32, flash_address(bank, 0, pri_ext->_unlock2));
  1216. buf_set_u32(reg_params[9].value, 0, 32, 0x55555555);
  1217. retval = target->type->run_algorithm(target, 0, NULL, 10, reg_params,
  1218. cfi_info->write_algorithm->address,
  1219. cfi_info->write_algorithm->address + ((24 * 4) - 4),
  1220. 10000, &armv4_5_info);
  1221. status = buf_get_u32(reg_params[5].value, 0, 32);
  1222. if ((retval != ERROR_OK) || status != 0x80)
  1223. {
  1224. LOG_DEBUG("status: 0x%x", status);
  1225. exit_code = ERROR_FLASH_OPERATION_FAILED;
  1226. break;
  1227. }
  1228. buffer += thisrun_count;
  1229. address += thisrun_count;
  1230. count -= thisrun_count;
  1231. }
  1232. target_free_working_area(target, source);
  1233. destroy_reg_param(&reg_params[0]);
  1234. destroy_reg_param(&reg_params[1]);
  1235. destroy_reg_param(&reg_params[2]);
  1236. destroy_reg_param(&reg_params[3]);
  1237. destroy_reg_param(&reg_params[4]);
  1238. destroy_reg_param(&reg_params[5]);
  1239. destroy_reg_param(&reg_params[6]);
  1240. destroy_reg_param(&reg_params[7]);
  1241. destroy_reg_param(&reg_params[8]);
  1242. destroy_reg_param(&reg_params[9]);
  1243. return exit_code;
  1244. }
  1245. int cfi_intel_write_word(struct flash_bank_s *bank, u8 *word, u32 address)
  1246. {
  1247. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1248. target_t *target = bank->target;
  1249. u8 command[8];
  1250. cfi_intel_clear_status_register(bank);
  1251. cfi_command(bank, 0x40, command);
  1252. target->type->write_memory(target, address, bank->bus_width, 1, command);
  1253. target->type->write_memory(target, address, bank->bus_width, 1, word);
  1254. if (cfi_intel_wait_status_busy(bank, 1000 * (1 << cfi_info->word_write_timeout_max)) != 0x80)
  1255. {
  1256. cfi_command(bank, 0xff, command);
  1257. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  1258. LOG_ERROR("couldn't write word at base 0x%x, address %x", bank->base, address);
  1259. return ERROR_FLASH_OPERATION_FAILED;
  1260. }
  1261. return ERROR_OK;
  1262. }
  1263. int cfi_intel_write_words(struct flash_bank_s *bank, u8 *word, u32 wordcount, u32 address)
  1264. {
  1265. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1266. target_t *target = bank->target;
  1267. u8 command[8];
  1268. /* Calculate buffer size and boundary mask */
  1269. u32 buffersize = 1UL << cfi_info->max_buf_write_size;
  1270. u32 buffermask = buffersize-1;
  1271. u32 bufferwsize;
  1272. /* Check for valid range */
  1273. if (address & buffermask)
  1274. {
  1275. 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);
  1276. return ERROR_FLASH_OPERATION_FAILED;
  1277. }
  1278. switch(bank->chip_width)
  1279. {
  1280. case 4 : bufferwsize = buffersize / 4; break;
  1281. case 2 : bufferwsize = buffersize / 2; break;
  1282. case 1 : bufferwsize = buffersize; break;
  1283. default:
  1284. LOG_ERROR("Unsupported chip width %d", bank->chip_width);
  1285. return ERROR_FLASH_OPERATION_FAILED;
  1286. }
  1287. /* Check for valid size */
  1288. if (wordcount > bufferwsize)
  1289. {
  1290. LOG_ERROR("Number of data words %d exceeds available buffersize %d", wordcount, buffersize);
  1291. return ERROR_FLASH_OPERATION_FAILED;
  1292. }
  1293. /* Write to flash buffer */
  1294. cfi_intel_clear_status_register(bank);
  1295. /* Initiate buffer operation _*/
  1296. cfi_command(bank, 0xE8, command);
  1297. target->type->write_memory(target, address, bank->bus_width, 1, command);
  1298. if (cfi_intel_wait_status_busy(bank, 1000 * (1 << cfi_info->buf_write_timeout_max)) != 0x80)
  1299. {
  1300. cfi_command(bank, 0xff, command);
  1301. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  1302. LOG_ERROR("couldn't start buffer write operation at base 0x%x, address %x", bank->base, address);
  1303. return ERROR_FLASH_OPERATION_FAILED;
  1304. }
  1305. /* Write buffer wordcount-1 and data words */
  1306. cfi_command(bank, bufferwsize-1, command);
  1307. target->type->write_memory(target, address, bank->bus_width, 1, command);
  1308. target->type->write_memory(target, address, bank->bus_width, bufferwsize, word);
  1309. /* Commit write operation */
  1310. cfi_command(bank, 0xd0, command);
  1311. target->type->write_memory(target, address, bank->bus_width, 1, command);
  1312. if (cfi_intel_wait_status_busy(bank, 1000 * (1 << cfi_info->buf_write_timeout_max)) != 0x80)
  1313. {
  1314. cfi_command(bank, 0xff, command);
  1315. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  1316. LOG_ERROR("Buffer write at base 0x%x, address %x failed.", bank->base, address);
  1317. return ERROR_FLASH_OPERATION_FAILED;
  1318. }
  1319. return ERROR_OK;
  1320. }
  1321. int cfi_spansion_write_word(struct flash_bank_s *bank, u8 *word, u32 address)
  1322. {
  1323. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1324. cfi_spansion_pri_ext_t *pri_ext = cfi_info->pri_ext;
  1325. target_t *target = bank->target;
  1326. u8 command[8];
  1327. cfi_command(bank, 0xaa, command);
  1328. target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command);
  1329. cfi_command(bank, 0x55, command);
  1330. target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command);
  1331. cfi_command(bank, 0xa0, command);
  1332. target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command);
  1333. target->type->write_memory(target, address, bank->bus_width, 1, word);
  1334. if (cfi_spansion_wait_status_busy(bank, 1000 * (1 << cfi_info->word_write_timeout_max)) != ERROR_OK)
  1335. {
  1336. cfi_command(bank, 0xf0, command);
  1337. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  1338. LOG_ERROR("couldn't write word at base 0x%x, address %x", bank->base, address);
  1339. return ERROR_FLASH_OPERATION_FAILED;
  1340. }
  1341. return ERROR_OK;
  1342. }
  1343. int cfi_write_word(struct flash_bank_s *bank, u8 *word, u32 address)
  1344. {
  1345. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1346. switch(cfi_info->pri_id)
  1347. {
  1348. case 1:
  1349. case 3:
  1350. return cfi_intel_write_word(bank, word, address);
  1351. break;
  1352. case 2:
  1353. return cfi_spansion_write_word(bank, word, address);
  1354. break;
  1355. default:
  1356. LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
  1357. break;
  1358. }
  1359. return ERROR_FLASH_OPERATION_FAILED;
  1360. }
  1361. int cfi_write_words(struct flash_bank_s *bank, u8 *word, u32 wordcount, u32 address)
  1362. {
  1363. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1364. switch(cfi_info->pri_id)
  1365. {
  1366. case 1:
  1367. case 3:
  1368. return cfi_intel_write_words(bank, word, wordcount, address);
  1369. break;
  1370. case 2:
  1371. /* return cfi_spansion_write_words(bank, word, address); */
  1372. LOG_ERROR("cfi primary command set %i unimplemented - FIXME", cfi_info->pri_id);
  1373. break;
  1374. default:
  1375. LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
  1376. break;
  1377. }
  1378. return ERROR_FLASH_OPERATION_FAILED;
  1379. }
  1380. int cfi_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count)
  1381. {
  1382. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1383. target_t *target = bank->target;
  1384. u32 address = bank->base + offset; /* address of first byte to be programmed */
  1385. u32 write_p, copy_p;
  1386. int align; /* number of unaligned bytes */
  1387. int blk_count; /* number of bus_width bytes for block copy */
  1388. u8 current_word[CFI_MAX_BUS_WIDTH * 4]; /* word (bus_width size) currently being programmed */
  1389. int i;
  1390. int retval;
  1391. if (bank->target->state != TARGET_HALTED)
  1392. {
  1393. LOG_ERROR("Target not halted");
  1394. return ERROR_TARGET_NOT_HALTED;
  1395. }
  1396. if (offset + count > bank->size)
  1397. return ERROR_FLASH_DST_OUT_OF_BANK;
  1398. if (cfi_info->qry[0] != 'Q')
  1399. return ERROR_FLASH_BANK_NOT_PROBED;
  1400. /* start at the first byte of the first word (bus_width size) */
  1401. write_p = address & ~(bank->bus_width - 1);
  1402. if ((align = address - write_p) != 0)
  1403. {
  1404. LOG_INFO("Fixup %d unaligned head bytes", align );
  1405. for (i = 0; i < bank->bus_width; i++)
  1406. current_word[i] = 0;
  1407. copy_p = write_p;
  1408. /* copy bytes before the first write address */
  1409. for (i = 0; i < align; ++i, ++copy_p)
  1410. {
  1411. u8 byte;
  1412. target->type->read_memory(target, copy_p, 1, 1, &byte);
  1413. cfi_add_byte(bank, current_word, byte);
  1414. }
  1415. /* add bytes from the buffer */
  1416. for (; (i < bank->bus_width) && (count > 0); i++)
  1417. {
  1418. cfi_add_byte(bank, current_word, *buffer++);
  1419. count--;
  1420. copy_p++;
  1421. }
  1422. /* if the buffer is already finished, copy bytes after the last write address */
  1423. for (; (count == 0) && (i < bank->bus_width); ++i, ++copy_p)
  1424. {
  1425. u8 byte;
  1426. target->type->read_memory(target, copy_p, 1, 1, &byte);
  1427. cfi_add_byte(bank, current_word, byte);
  1428. }
  1429. retval = cfi_write_word(bank, current_word, write_p);
  1430. if (retval != ERROR_OK)
  1431. return retval;
  1432. write_p = copy_p;
  1433. }
  1434. /* handle blocks of bus_size aligned bytes */
  1435. blk_count = count & ~(bank->bus_width - 1); /* round down, leave tail bytes */
  1436. switch(cfi_info->pri_id)
  1437. {
  1438. /* try block writes (fails without working area) */
  1439. case 1:
  1440. case 3:
  1441. retval = cfi_intel_write_block(bank, buffer, write_p, blk_count);
  1442. break;
  1443. case 2:
  1444. retval = cfi_spansion_write_block(bank, buffer, write_p, blk_count);
  1445. break;
  1446. default:
  1447. LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
  1448. retval = ERROR_FLASH_OPERATION_FAILED;
  1449. break;
  1450. }
  1451. if (retval == ERROR_OK)
  1452. {
  1453. /* Increment pointers and decrease count on succesful block write */
  1454. buffer += blk_count;
  1455. write_p += blk_count;
  1456. count -= blk_count;
  1457. }
  1458. else
  1459. {
  1460. if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE)
  1461. {
  1462. u32 buffersize = 1UL << cfi_info->max_buf_write_size;
  1463. u32 buffermask = buffersize-1;
  1464. u32 bufferwsize;
  1465. switch(bank->chip_width)
  1466. {
  1467. case 4 : bufferwsize = buffersize / 4; break;
  1468. case 2 : bufferwsize = buffersize / 2; break;
  1469. case 1 : bufferwsize = buffersize; break;
  1470. default:
  1471. LOG_ERROR("Unsupported chip width %d", bank->chip_width);
  1472. return ERROR_FLASH_OPERATION_FAILED;
  1473. }
  1474. /* fall back to memory writes */
  1475. while (count >= bank->bus_width)
  1476. {
  1477. int fallback;
  1478. if ((write_p & 0xff) == 0)
  1479. {
  1480. LOG_INFO("Programming at %08x, count %08x bytes remaining", write_p, count);
  1481. }
  1482. fallback = 1;
  1483. if ((bufferwsize > 0) && (count >= buffersize) && !(write_p & buffermask))
  1484. {
  1485. retval = cfi_write_words(bank, buffer, bufferwsize, write_p);
  1486. if (retval == ERROR_OK)
  1487. {
  1488. buffer += buffersize;
  1489. write_p += buffersize;
  1490. count -= buffersize;
  1491. fallback=0;
  1492. }
  1493. }
  1494. /* try the slow way? */
  1495. if (fallback)
  1496. {
  1497. for (i = 0; i < bank->bus_width; i++)
  1498. current_word[i] = 0;
  1499. for (i = 0; i < bank->bus_width; i++)
  1500. {
  1501. cfi_add_byte(bank, current_word, *buffer++);
  1502. }
  1503. retval = cfi_write_word(bank, current_word, write_p);
  1504. if (retval != ERROR_OK)
  1505. return retval;
  1506. write_p += bank->bus_width;
  1507. count -= bank->bus_width;
  1508. }
  1509. }
  1510. }
  1511. else
  1512. return retval;
  1513. }
  1514. /* return to read array mode, so we can read from flash again for padding */
  1515. cfi_command(bank, 0xf0, current_word);
  1516. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, current_word);
  1517. cfi_command(bank, 0xff, current_word);
  1518. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, current_word);
  1519. /* handle unaligned tail bytes */
  1520. if (count > 0)
  1521. {
  1522. LOG_INFO("Fixup %d unaligned tail bytes", count );
  1523. copy_p = write_p;
  1524. for (i = 0; i < bank->bus_width; i++)
  1525. current_word[i] = 0;
  1526. for (i = 0; (i < bank->bus_width) && (count > 0); ++i, ++copy_p)
  1527. {
  1528. cfi_add_byte(bank, current_word, *buffer++);
  1529. count--;
  1530. }
  1531. for (; i < bank->bus_width; ++i, ++copy_p)
  1532. {
  1533. u8 byte;
  1534. target->type->read_memory(target, copy_p, 1, 1, &byte);
  1535. cfi_add_byte(bank, current_word, byte);
  1536. }
  1537. retval = cfi_write_word(bank, current_word, write_p);
  1538. if (retval != ERROR_OK)
  1539. return retval;
  1540. }
  1541. /* return to read array mode */
  1542. cfi_command(bank, 0xf0, current_word);
  1543. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, current_word);
  1544. cfi_command(bank, 0xff, current_word);
  1545. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, current_word);
  1546. return ERROR_OK;
  1547. }
  1548. void cfi_fixup_atmel_reversed_erase_regions(flash_bank_t *bank, void *param)
  1549. {
  1550. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1551. cfi_spansion_pri_ext_t *pri_ext = cfi_info->pri_ext;
  1552. pri_ext->_reversed_geometry = 1;
  1553. }
  1554. void cfi_fixup_0002_erase_regions(flash_bank_t *bank, void *param)
  1555. {
  1556. int i;
  1557. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1558. cfi_spansion_pri_ext_t *pri_ext = cfi_info->pri_ext;
  1559. if ((pri_ext->_reversed_geometry) || (pri_ext->TopBottom == 3))
  1560. {
  1561. LOG_DEBUG("swapping reversed erase region information on cmdset 0002 device");
  1562. for (i = 0; i < cfi_info->num_erase_regions / 2; i++)
  1563. {
  1564. int j = (cfi_info->num_erase_regions - 1) - i;
  1565. u32 swap;
  1566. swap = cfi_info->erase_region_info[i];
  1567. cfi_info->erase_region_info[i] = cfi_info->erase_region_info[j];
  1568. cfi_info->erase_region_info[j] = swap;
  1569. }
  1570. }
  1571. }
  1572. void cfi_fixup_0002_unlock_addresses(flash_bank_t *bank, void *param)
  1573. {
  1574. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1575. cfi_spansion_pri_ext_t *pri_ext = cfi_info->pri_ext;
  1576. cfi_unlock_addresses_t *unlock_addresses = param;
  1577. pri_ext->_unlock1 = unlock_addresses->unlock1;
  1578. pri_ext->_unlock2 = unlock_addresses->unlock2;
  1579. }
  1580. int cfi_probe(struct flash_bank_s *bank)
  1581. {
  1582. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1583. target_t *target = bank->target;
  1584. u8 command[8];
  1585. int num_sectors = 0;
  1586. int i;
  1587. int sector = 0;
  1588. u32 offset = 0;
  1589. u32 unlock1 = 0x555;
  1590. u32 unlock2 = 0x2aa;
  1591. if (bank->target->state != TARGET_HALTED)
  1592. {
  1593. LOG_ERROR("Target not halted");
  1594. return ERROR_TARGET_NOT_HALTED;
  1595. }
  1596. cfi_info->probed = 0;
  1597. /* JEDEC standard JESD21C uses 0x5555 and 0x2aaa as unlock addresses,
  1598. * while CFI compatible AMD/Spansion flashes use 0x555 and 0x2aa
  1599. */
  1600. if (cfi_info->jedec_probe)
  1601. {
  1602. unlock1 = 0x5555;
  1603. unlock2 = 0x2aaa;
  1604. }
  1605. /* switch to read identifier codes mode ("AUTOSELECT") */
  1606. cfi_command(bank, 0xaa, command);
  1607. target->type->write_memory(target, flash_address(bank, 0, unlock1), bank->bus_width, 1, command);
  1608. cfi_command(bank, 0x55, command);
  1609. target->type->write_memory(target, flash_address(bank, 0, unlock2), bank->bus_width, 1, command);
  1610. cfi_command(bank, 0x90, command);
  1611. target->type->write_memory(target, flash_address(bank, 0, unlock1), bank->bus_width, 1, command);
  1612. if (bank->chip_width == 1)
  1613. {
  1614. u8 manufacturer, device_id;
  1615. target_read_u8(target, bank->base + 0x0, &manufacturer);
  1616. target_read_u8(target, bank->base + 0x1, &device_id);
  1617. cfi_info->manufacturer = manufacturer;
  1618. cfi_info->device_id = device_id;
  1619. }
  1620. else if (bank->chip_width == 2)
  1621. {
  1622. target_read_u16(target, bank->base + 0x0, &cfi_info->manufacturer);
  1623. target_read_u16(target, bank->base + 0x2, &cfi_info->device_id);
  1624. }
  1625. /* switch back to read array mode */
  1626. cfi_command(bank, 0xf0, command);
  1627. target->type->write_memory(target, flash_address(bank, 0, 0x00), bank->bus_width, 1, command);
  1628. cfi_command(bank, 0xff, command);
  1629. target->type->write_memory(target, flash_address(bank, 0, 0x00), bank->bus_width, 1, command);
  1630. cfi_fixup(bank, cfi_jedec_fixups);
  1631. /* query only if this is a CFI compatible flash,
  1632. * otherwise the relevant info has already been filled in
  1633. */
  1634. if (cfi_info->not_cfi == 0)
  1635. {
  1636. /* enter CFI query mode
  1637. * according to JEDEC Standard No. 68.01,
  1638. * a single bus sequence with address = 0x55, data = 0x98 should put
  1639. * the device into CFI query mode.
  1640. *
  1641. * SST flashes clearly violate this, and we will consider them incompatbile for now
  1642. */
  1643. cfi_command(bank, 0x98, command);
  1644. target->type->write_memory(target, flash_address(bank, 0, 0x55), bank->bus_width, 1, command);
  1645. cfi_info->qry[0] = cfi_query_u8(bank, 0, 0x10);
  1646. cfi_info->qry[1] = cfi_query_u8(bank, 0, 0x11);
  1647. cfi_info->qry[2] = cfi_query_u8(bank, 0, 0x12);
  1648. 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]);
  1649. if ((cfi_info->qry[0] != 'Q') || (cfi_info->qry[1] != 'R') || (cfi_info->qry[2] != 'Y'))
  1650. {
  1651. cfi_command(bank, 0xf0, command);
  1652. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  1653. cfi_command(bank, 0xff, command);
  1654. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  1655. LOG_ERROR("Could not probe bank");
  1656. return ERROR_FLASH_BANK_INVALID;
  1657. }
  1658. cfi_info->pri_id = cfi_query_u16(bank, 0, 0x13);
  1659. cfi_info->pri_addr = cfi_query_u16(bank, 0, 0x15);
  1660. cfi_info->alt_id = cfi_query_u16(bank, 0, 0x17);
  1661. cfi_info->alt_addr = cfi_query_u16(bank, 0, 0x19);
  1662. 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);
  1663. cfi_info->vcc_min = cfi_query_u8(bank, 0, 0x1b);
  1664. cfi_info->vcc_max = cfi_query_u8(bank, 0, 0x1c);
  1665. cfi_info->vpp_min = cfi_query_u8(bank, 0, 0x1d);
  1666. cfi_info->vpp_max = cfi_query_u8(bank, 0, 0x1e);
  1667. cfi_info->word_write_timeout_typ = cfi_query_u8(bank, 0, 0x1f);
  1668. cfi_info->buf_write_timeout_typ = cfi_query_u8(bank, 0, 0x20);
  1669. cfi_info->block_erase_timeout_typ = cfi_query_u8(bank, 0, 0x21);
  1670. cfi_info->chip_erase_timeout_typ = cfi_query_u8(bank, 0, 0x22);
  1671. cfi_info->word_write_timeout_max = cfi_query_u8(bank, 0, 0x23);
  1672. cfi_info->buf_write_timeout_max = cfi_query_u8(bank, 0, 0x24);
  1673. cfi_info->block_erase_timeout_max = cfi_query_u8(bank, 0, 0x25);
  1674. cfi_info->chip_erase_timeout_max = cfi_query_u8(bank, 0, 0x26);
  1675. 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",
  1676. (cfi_info->vcc_min & 0xf0) >> 4, cfi_info->vcc_min & 0x0f,
  1677. (cfi_info->vcc_max & 0xf0) >> 4, cfi_info->vcc_max & 0x0f,
  1678. (cfi_info->vpp_min & 0xf0) >> 4, cfi_info->vpp_min & 0x0f,
  1679. (cfi_info->vpp_max & 0xf0) >> 4, cfi_info->vpp_max & 0x0f);
  1680. 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,
  1681. 1 << cfi_info->block_erase_timeout_typ, 1 << cfi_info->chip_erase_timeout_typ);
  1682. 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),
  1683. (1 << cfi_info->buf_write_timeout_max) * (1 << cfi_info->buf_write_timeout_typ),
  1684. (1 << cfi_info->block_erase_timeout_max) * (1 << cfi_info->block_erase_timeout_typ),
  1685. (1 << cfi_info->chip_erase_timeout_max) * (1 << cfi_info->chip_erase_timeout_typ));
  1686. cfi_info->dev_size = cfi_query_u8(bank, 0, 0x27);
  1687. cfi_info->interface_desc = cfi_query_u16(bank, 0, 0x28);
  1688. cfi_info->max_buf_write_size = cfi_query_u16(bank, 0, 0x2a);
  1689. cfi_info->num_erase_regions = cfi_query_u8(bank, 0, 0x2c);
  1690. LOG_DEBUG("size: 0x%x, interface desc: %i, max buffer write size: %x", 1 << cfi_info->dev_size, cfi_info->interface_desc, (1 << cfi_info->max_buf_write_size));
  1691. if (((1 << cfi_info->dev_size) * bank->bus_width / bank->chip_width) != bank->size)
  1692. {
  1693. LOG_WARNING("configuration specifies 0x%x size, but a 0x%x size flash was found", bank->size, 1 << cfi_info->dev_size);
  1694. }
  1695. if (cfi_info->num_erase_regions)
  1696. {
  1697. cfi_info->erase_region_info = malloc(4 * cfi_info->num_erase_regions);
  1698. for (i = 0; i < cfi_info->num_erase_regions; i++)
  1699. {
  1700. cfi_info->erase_region_info[i] = cfi_query_u32(bank, 0, 0x2d + (4 * i));
  1701. 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);
  1702. }
  1703. }
  1704. else
  1705. {
  1706. cfi_info->erase_region_info = NULL;
  1707. }
  1708. /* We need to read the primary algorithm extended query table before calculating
  1709. * the sector layout to be able to apply fixups
  1710. */
  1711. switch(cfi_info->pri_id)
  1712. {
  1713. /* Intel command set (standard and extended) */
  1714. case 0x0001:
  1715. case 0x0003:
  1716. cfi_read_intel_pri_ext(bank);
  1717. break;
  1718. /* AMD/Spansion, Atmel, ... command set */
  1719. case 0x0002:
  1720. cfi_read_0002_pri_ext(bank);
  1721. break;
  1722. default:
  1723. LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
  1724. break;
  1725. }
  1726. /* return to read array mode
  1727. * we use both reset commands, as some Intel flashes fail to recognize the 0xF0 command
  1728. */
  1729. cfi_command(bank, 0xf0, command);
  1730. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  1731. cfi_command(bank, 0xff, command);
  1732. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  1733. }
  1734. /* apply fixups depending on the primary command set */
  1735. switch(cfi_info->pri_id)
  1736. {
  1737. /* Intel command set (standard and extended) */
  1738. case 0x0001:
  1739. case 0x0003:
  1740. cfi_fixup(bank, cfi_0001_fixups);
  1741. break;
  1742. /* AMD/Spansion, Atmel, ... command set */
  1743. case 0x0002:
  1744. cfi_fixup(bank, cfi_0002_fixups);
  1745. break;
  1746. default:
  1747. LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
  1748. break;
  1749. }
  1750. if (cfi_info->num_erase_regions == 0)
  1751. {
  1752. /* a device might have only one erase block, spanning the whole device */
  1753. bank->num_sectors = 1;
  1754. bank->sectors = malloc(sizeof(flash_sector_t));
  1755. bank->sectors[sector].offset = 0x0;
  1756. bank->sectors[sector].size = bank->size;
  1757. bank->sectors[sector].is_erased = -1;
  1758. bank->sectors[sector].is_protected = -1;
  1759. }
  1760. else
  1761. {
  1762. for (i = 0; i < cfi_info->num_erase_regions; i++)
  1763. {
  1764. num_sectors += (cfi_info->erase_region_info[i] & 0xffff) + 1;
  1765. }
  1766. bank->num_sectors = num_sectors;
  1767. bank->sectors = malloc(sizeof(flash_sector_t) * num_sectors);
  1768. for (i = 0; i < cfi_info->num_erase_regions; i++)
  1769. {
  1770. int j;
  1771. for (j = 0; j < (cfi_info->erase_region_info[i] & 0xffff) + 1; j++)
  1772. {
  1773. bank->sectors[sector].offset = offset;
  1774. bank->sectors[sector].size = ((cfi_info->erase_region_info[i] >> 16) * 256) * bank->bus_width / bank->chip_width;
  1775. offset += bank->sectors[sector].size;
  1776. bank->sectors[sector].is_erased = -1;
  1777. bank->sectors[sector].is_protected = -1;
  1778. sector++;
  1779. }
  1780. }
  1781. }
  1782. cfi_info->probed = 1;
  1783. return ERROR_OK;
  1784. }
  1785. int cfi_auto_probe(struct flash_bank_s *bank)
  1786. {
  1787. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1788. if (cfi_info->probed)
  1789. return ERROR_OK;
  1790. return cfi_probe(bank);
  1791. }
  1792. int cfi_intel_protect_check(struct flash_bank_s *bank)
  1793. {
  1794. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1795. cfi_intel_pri_ext_t *pri_ext = cfi_info->pri_ext;
  1796. target_t *target = bank->target;
  1797. u8 command[CFI_MAX_BUS_WIDTH];
  1798. int i;
  1799. /* check if block lock bits are supported on this device */
  1800. if (!(pri_ext->blk_status_reg_mask & 0x1))
  1801. return ERROR_FLASH_OPERATION_FAILED;
  1802. cfi_command(bank, 0x90, command);
  1803. target->type->write_memory(target, flash_address(bank, 0, 0x55), bank->bus_width, 1, command);
  1804. for (i = 0; i < bank->num_sectors; i++)
  1805. {
  1806. u8 block_status = cfi_get_u8(bank, i, 0x2);
  1807. if (block_status & 1)
  1808. bank->sectors[i].is_protected = 1;
  1809. else
  1810. bank->sectors[i].is_protected = 0;
  1811. }
  1812. cfi_command(bank, 0xff, command);
  1813. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  1814. return ERROR_OK;
  1815. }
  1816. int cfi_spansion_protect_check(struct flash_bank_s *bank)
  1817. {
  1818. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1819. cfi_spansion_pri_ext_t *pri_ext = cfi_info->pri_ext;
  1820. target_t *target = bank->target;
  1821. u8 command[8];
  1822. int i;
  1823. cfi_command(bank, 0xaa, command);
  1824. target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command);
  1825. cfi_command(bank, 0x55, command);
  1826. target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command);
  1827. cfi_command(bank, 0x90, command);
  1828. target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command);
  1829. for (i = 0; i < bank->num_sectors; i++)
  1830. {
  1831. u8 block_status = cfi_get_u8(bank, i, 0x2);
  1832. if (block_status & 1)
  1833. bank->sectors[i].is_protected = 1;
  1834. else
  1835. bank->sectors[i].is_protected = 0;
  1836. }
  1837. cfi_command(bank, 0xf0, command);
  1838. target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
  1839. return ERROR_OK;
  1840. }
  1841. int cfi_protect_check(struct flash_bank_s *bank)
  1842. {
  1843. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1844. if (bank->target->state != TARGET_HALTED)
  1845. {
  1846. LOG_ERROR("Target not halted");
  1847. return ERROR_TARGET_NOT_HALTED;
  1848. }
  1849. if (cfi_info->qry[0] != 'Q')
  1850. return ERROR_FLASH_BANK_NOT_PROBED;
  1851. switch(cfi_info->pri_id)
  1852. {
  1853. case 1:
  1854. case 3:
  1855. return cfi_intel_protect_check(bank);
  1856. break;
  1857. case 2:
  1858. return cfi_spansion_protect_check(bank);
  1859. break;
  1860. default:
  1861. LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
  1862. break;
  1863. }
  1864. return ERROR_OK;
  1865. }
  1866. int cfi_info(struct flash_bank_s *bank, char *buf, int buf_size)
  1867. {
  1868. int printed;
  1869. cfi_flash_bank_t *cfi_info = bank->driver_priv;
  1870. if (cfi_info->qry[0] == (char)-1)
  1871. {
  1872. printed = snprintf(buf, buf_size, "\ncfi flash bank not probed yet\n");
  1873. return ERROR_OK;
  1874. }
  1875. if (cfi_info->not_cfi == 0)
  1876. printed = snprintf(buf, buf_size, "\ncfi information:\n");
  1877. else
  1878. printed = snprintf(buf, buf_size, "\nnon-cfi flash:\n");
  1879. buf += printed;
  1880. buf_size -= printed;
  1881. printed = snprintf(buf, buf_size, "\nmfr: 0x%4.4x, id:0x%4.4x\n",
  1882. cfi_info->manufacturer, cfi_info->device_id);
  1883. buf += printed;
  1884. buf_size -= printed;
  1885. if (cfi_info->not_cfi == 0)
  1886. {
  1887. 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);
  1888. buf += printed;
  1889. buf_size -= printed;
  1890. 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",
  1891. (cfi_info->vcc_min & 0xf0) >> 4, cfi_info->vcc_min & 0x0f,
  1892. (cfi_info->vcc_max & 0xf0) >> 4, cfi_info->vcc_max & 0x0f,
  1893. (cfi_info->vpp_min & 0xf0) >> 4, cfi_info->vpp_min & 0x0f,
  1894. (cfi_info->vpp_max & 0xf0) >> 4, cfi_info->vpp_max & 0x0f);
  1895. buf += printed;
  1896. buf_size -= printed;
  1897. 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",
  1898. 1 << cfi_info->word_write_timeout_typ,
  1899. 1 << cfi_info->buf_write_timeout_typ,
  1900. 1 << cfi_info->block_erase_timeout_typ,
  1901. 1 << cfi_info->chip_erase_timeout_typ);
  1902. buf += printed;
  1903. buf_size -= printed;
  1904. 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",
  1905. (1 << cfi_info->word_write_timeout_max) * (1 << cfi_info->word_write_timeout_typ),
  1906. (1 << cfi_info->buf_write_timeout_max) * (1 << cfi_info->buf_write_timeout_typ),
  1907. (1 << cfi_info->block_erase_timeout_max) * (1 << cfi_info->block_erase_timeout_typ),
  1908. (1 << cfi_info->chip_erase_timeout_max) * (1 << cfi_info->chip_erase_timeout_typ));
  1909. buf += printed;
  1910. buf_size -= printed;
  1911. printed = snprintf(buf, buf_size, "size: 0x%x, interface desc: %i, max buffer write size: %x\n",
  1912. 1 << cfi_info->dev_size,
  1913. cfi_info->interface_desc,
  1914. cfi_info->max_buf_write_size);
  1915. buf += printed;
  1916. buf_size -= printed;
  1917. switch(cfi_info->pri_id)
  1918. {
  1919. case 1:
  1920. case 3:
  1921. cfi_intel_info(bank, buf, buf_size);
  1922. break;
  1923. case 2:
  1924. cfi_spansion_info(bank, buf, buf_size);
  1925. break;
  1926. default:
  1927. LOG_ERROR("cfi primary command set %i unsupported", cfi_info->pri_id);
  1928. break;
  1929. }
  1930. }
  1931. return ERROR_OK;
  1932. }