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.
 
 
 
 
 
 

940 lines
25 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2005 by Dominic Rath *
  3. * Dominic.Rath@gmx.de *
  4. * *
  5. * Copyright (C) 2008 by Spencer Oliver *
  6. * spen@spen-soft.co.uk *
  7. *
  8. * Copyright (C) 2011 by Erik Botö
  9. * erik.boto@pelagicore.com
  10. *
  11. * This program is free software; you can redistribute it and/or modify *
  12. * it under the terms of the GNU General Public License as published by *
  13. * the Free Software Foundation; either version 2 of the License, or *
  14. * (at your option) any later version. *
  15. * *
  16. * This program is distributed in the hope that it will be useful, *
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  19. * GNU General Public License for more details. *
  20. * *
  21. * You should have received a copy of the GNU General Public License *
  22. * along with this program. If not, see <http://www.gnu.org/licenses/>. *
  23. ***************************************************************************/
  24. #ifdef HAVE_CONFIG_H
  25. #include "config.h"
  26. #endif
  27. #include "imp.h"
  28. #include <helper/binarybuffer.h>
  29. #include <target/algorithm.h>
  30. #include <target/armv7m.h>
  31. /* em357 register locations */
  32. #define EM357_FLASH_ACR 0x40008000
  33. #define EM357_FLASH_KEYR 0x40008004
  34. #define EM357_FLASH_OPTKEYR 0x40008008
  35. #define EM357_FLASH_SR 0x4000800C
  36. #define EM357_FLASH_CR 0x40008010
  37. #define EM357_FLASH_AR 0x40008014
  38. #define EM357_FLASH_OBR 0x4000801C
  39. #define EM357_FLASH_WRPR 0x40008020
  40. #define EM357_FPEC_CLK 0x4000402c
  41. /* option byte location */
  42. #define EM357_OB_RDP 0x08040800
  43. #define EM357_OB_WRP0 0x08040808
  44. #define EM357_OB_WRP1 0x0804080A
  45. #define EM357_OB_WRP2 0x0804080C
  46. /* FLASH_CR register bits */
  47. #define FLASH_PG (1 << 0)
  48. #define FLASH_PER (1 << 1)
  49. #define FLASH_MER (1 << 2)
  50. #define FLASH_OPTPG (1 << 4)
  51. #define FLASH_OPTER (1 << 5)
  52. #define FLASH_STRT (1 << 6)
  53. #define FLASH_LOCK (1 << 7)
  54. #define FLASH_OPTWRE (1 << 9)
  55. /* FLASH_SR register bits */
  56. #define FLASH_BSY (1 << 0)
  57. #define FLASH_PGERR (1 << 2)
  58. #define FLASH_WRPRTERR (1 << 4)
  59. #define FLASH_EOP (1 << 5)
  60. /* EM357_FLASH_OBR bit definitions (reading) */
  61. #define OPT_ERROR 0
  62. #define OPT_READOUT 1
  63. /* register unlock keys */
  64. #define KEY1 0x45670123
  65. #define KEY2 0xCDEF89AB
  66. struct em357_options {
  67. uint16_t RDP;
  68. uint16_t user_options;
  69. uint16_t protection[3];
  70. };
  71. struct em357_flash_bank {
  72. struct em357_options option_bytes;
  73. int ppage_size;
  74. int probed;
  75. };
  76. static int em357_mass_erase(struct flash_bank *bank);
  77. /* flash bank em357 <base> <size> 0 0 <target#>
  78. */
  79. FLASH_BANK_COMMAND_HANDLER(em357_flash_bank_command)
  80. {
  81. struct em357_flash_bank *em357_info;
  82. if (CMD_ARGC < 6)
  83. return ERROR_COMMAND_SYNTAX_ERROR;
  84. em357_info = malloc(sizeof(struct em357_flash_bank));
  85. bank->driver_priv = em357_info;
  86. em357_info->probed = 0;
  87. return ERROR_OK;
  88. }
  89. static inline int em357_get_flash_status(struct flash_bank *bank, uint32_t *status)
  90. {
  91. struct target *target = bank->target;
  92. return target_read_u32(target, EM357_FLASH_SR, status);
  93. }
  94. static int em357_wait_status_busy(struct flash_bank *bank, int timeout)
  95. {
  96. struct target *target = bank->target;
  97. uint32_t status;
  98. int retval = ERROR_OK;
  99. /* wait for busy to clear */
  100. for (;; ) {
  101. retval = em357_get_flash_status(bank, &status);
  102. if (retval != ERROR_OK)
  103. return retval;
  104. LOG_DEBUG("status: 0x%" PRIx32 "", status);
  105. if ((status & FLASH_BSY) == 0)
  106. break;
  107. if (timeout-- <= 0) {
  108. LOG_ERROR("timed out waiting for flash");
  109. return ERROR_FAIL;
  110. }
  111. alive_sleep(1);
  112. }
  113. if (status & FLASH_WRPRTERR) {
  114. LOG_ERROR("em357 device protected");
  115. retval = ERROR_FAIL;
  116. }
  117. if (status & FLASH_PGERR) {
  118. LOG_ERROR("em357 device programming failed");
  119. retval = ERROR_FAIL;
  120. }
  121. /* Clear but report errors */
  122. if (status & (FLASH_WRPRTERR | FLASH_PGERR)) {
  123. /* If this operation fails, we ignore it and report the original
  124. * retval
  125. */
  126. target_write_u32(target, EM357_FLASH_SR, FLASH_WRPRTERR | FLASH_PGERR);
  127. }
  128. return retval;
  129. }
  130. static int em357_read_options(struct flash_bank *bank)
  131. {
  132. uint32_t optiondata;
  133. struct em357_flash_bank *em357_info = NULL;
  134. struct target *target = bank->target;
  135. em357_info = bank->driver_priv;
  136. /* read current option bytes */
  137. int retval = target_read_u32(target, EM357_FLASH_OBR, &optiondata);
  138. if (retval != ERROR_OK)
  139. return retval;
  140. em357_info->option_bytes.user_options = (uint16_t)0xFFFC | ((optiondata >> 2) & 0x03);
  141. em357_info->option_bytes.RDP = (optiondata & (1 << OPT_READOUT)) ? 0xFFFF : 0x5AA5;
  142. if (optiondata & (1 << OPT_READOUT))
  143. LOG_INFO("Device Security Bit Set");
  144. /* each bit refers to a 4bank protection */
  145. retval = target_read_u32(target, EM357_FLASH_WRPR, &optiondata);
  146. if (retval != ERROR_OK)
  147. return retval;
  148. em357_info->option_bytes.protection[0] = (uint16_t)optiondata;
  149. em357_info->option_bytes.protection[1] = (uint16_t)(optiondata >> 8);
  150. em357_info->option_bytes.protection[2] = (uint16_t)(optiondata >> 16);
  151. return ERROR_OK;
  152. }
  153. static int em357_erase_options(struct flash_bank *bank)
  154. {
  155. struct em357_flash_bank *em357_info = NULL;
  156. struct target *target = bank->target;
  157. em357_info = bank->driver_priv;
  158. /* read current options */
  159. em357_read_options(bank);
  160. /* unlock flash registers */
  161. int retval = target_write_u32(target, EM357_FLASH_KEYR, KEY1);
  162. if (retval != ERROR_OK)
  163. return retval;
  164. retval = target_write_u32(target, EM357_FLASH_KEYR, KEY2);
  165. if (retval != ERROR_OK)
  166. return retval;
  167. /* unlock option flash registers */
  168. retval = target_write_u32(target, EM357_FLASH_OPTKEYR, KEY1);
  169. if (retval != ERROR_OK)
  170. return retval;
  171. retval = target_write_u32(target, EM357_FLASH_OPTKEYR, KEY2);
  172. if (retval != ERROR_OK)
  173. return retval;
  174. /* erase option bytes */
  175. retval = target_write_u32(target, EM357_FLASH_CR, FLASH_OPTER | FLASH_OPTWRE);
  176. if (retval != ERROR_OK)
  177. return retval;
  178. retval = target_write_u32(target, EM357_FLASH_CR, FLASH_OPTER | FLASH_STRT | FLASH_OPTWRE);
  179. if (retval != ERROR_OK)
  180. return retval;
  181. retval = em357_wait_status_busy(bank, 10);
  182. if (retval != ERROR_OK)
  183. return retval;
  184. /* clear readout protection and complementary option bytes
  185. * this will also force a device unlock if set */
  186. em357_info->option_bytes.RDP = 0x5AA5;
  187. return ERROR_OK;
  188. }
  189. static int em357_write_options(struct flash_bank *bank)
  190. {
  191. struct em357_flash_bank *em357_info = NULL;
  192. struct target *target = bank->target;
  193. em357_info = bank->driver_priv;
  194. /* unlock flash registers */
  195. int retval = target_write_u32(target, EM357_FLASH_KEYR, KEY1);
  196. if (retval != ERROR_OK)
  197. return retval;
  198. retval = target_write_u32(target, EM357_FLASH_KEYR, KEY2);
  199. if (retval != ERROR_OK)
  200. return retval;
  201. /* unlock option flash registers */
  202. retval = target_write_u32(target, EM357_FLASH_OPTKEYR, KEY1);
  203. if (retval != ERROR_OK)
  204. return retval;
  205. retval = target_write_u32(target, EM357_FLASH_OPTKEYR, KEY2);
  206. if (retval != ERROR_OK)
  207. return retval;
  208. /* program option bytes */
  209. retval = target_write_u32(target, EM357_FLASH_CR, FLASH_OPTPG | FLASH_OPTWRE);
  210. if (retval != ERROR_OK)
  211. return retval;
  212. retval = em357_wait_status_busy(bank, 10);
  213. if (retval != ERROR_OK)
  214. return retval;
  215. /* write protection byte 1 */
  216. retval = target_write_u16(target, EM357_OB_WRP0, em357_info->option_bytes.protection[0]);
  217. if (retval != ERROR_OK)
  218. return retval;
  219. retval = em357_wait_status_busy(bank, 10);
  220. if (retval != ERROR_OK)
  221. return retval;
  222. /* write protection byte 2 */
  223. retval = target_write_u16(target, EM357_OB_WRP1, em357_info->option_bytes.protection[1]);
  224. if (retval != ERROR_OK)
  225. return retval;
  226. retval = em357_wait_status_busy(bank, 10);
  227. if (retval != ERROR_OK)
  228. return retval;
  229. /* write protection byte 3 */
  230. retval = target_write_u16(target, EM357_OB_WRP2, em357_info->option_bytes.protection[2]);
  231. if (retval != ERROR_OK)
  232. return retval;
  233. retval = em357_wait_status_busy(bank, 10);
  234. if (retval != ERROR_OK)
  235. return retval;
  236. /* write readout protection bit */
  237. retval = target_write_u16(target, EM357_OB_RDP, em357_info->option_bytes.RDP);
  238. if (retval != ERROR_OK)
  239. return retval;
  240. retval = em357_wait_status_busy(bank, 10);
  241. if (retval != ERROR_OK)
  242. return retval;
  243. retval = target_write_u32(target, EM357_FLASH_CR, FLASH_LOCK);
  244. if (retval != ERROR_OK)
  245. return retval;
  246. return ERROR_OK;
  247. }
  248. static int em357_protect_check(struct flash_bank *bank)
  249. {
  250. struct target *target = bank->target;
  251. struct em357_flash_bank *em357_info = bank->driver_priv;
  252. uint32_t protection;
  253. int i, s;
  254. int num_bits;
  255. int set;
  256. if (target->state != TARGET_HALTED) {
  257. LOG_ERROR("Target not halted");
  258. return ERROR_TARGET_NOT_HALTED;
  259. }
  260. /* each bit refers to a 4bank protection (bit 0-23) */
  261. int retval = target_read_u32(target, EM357_FLASH_WRPR, &protection);
  262. if (retval != ERROR_OK)
  263. return retval;
  264. /* each protection bit is for 4 * 2K pages */
  265. num_bits = (bank->num_sectors / em357_info->ppage_size);
  266. for (i = 0; i < num_bits; i++) {
  267. set = 1;
  268. if (protection & (1 << i))
  269. set = 0;
  270. for (s = 0; s < em357_info->ppage_size; s++)
  271. bank->sectors[(i * em357_info->ppage_size) + s].is_protected = set;
  272. }
  273. return ERROR_OK;
  274. }
  275. static int em357_erase(struct flash_bank *bank, int first, int last)
  276. {
  277. struct target *target = bank->target;
  278. int i;
  279. if (bank->target->state != TARGET_HALTED) {
  280. LOG_ERROR("Target not halted");
  281. return ERROR_TARGET_NOT_HALTED;
  282. }
  283. if ((first == 0) && (last == (bank->num_sectors - 1)))
  284. return em357_mass_erase(bank);
  285. /* Enable FPEC clock */
  286. target_write_u32(target, EM357_FPEC_CLK, 0x00000001);
  287. /* unlock flash registers */
  288. int retval = target_write_u32(target, EM357_FLASH_KEYR, KEY1);
  289. if (retval != ERROR_OK)
  290. return retval;
  291. retval = target_write_u32(target, EM357_FLASH_KEYR, KEY2);
  292. if (retval != ERROR_OK)
  293. return retval;
  294. for (i = first; i <= last; i++) {
  295. retval = target_write_u32(target, EM357_FLASH_CR, FLASH_PER);
  296. if (retval != ERROR_OK)
  297. return retval;
  298. retval = target_write_u32(target, EM357_FLASH_AR,
  299. bank->base + bank->sectors[i].offset);
  300. if (retval != ERROR_OK)
  301. return retval;
  302. retval = target_write_u32(target, EM357_FLASH_CR, FLASH_PER | FLASH_STRT);
  303. if (retval != ERROR_OK)
  304. return retval;
  305. retval = em357_wait_status_busy(bank, 100);
  306. if (retval != ERROR_OK)
  307. return retval;
  308. bank->sectors[i].is_erased = 1;
  309. }
  310. retval = target_write_u32(target, EM357_FLASH_CR, FLASH_LOCK);
  311. if (retval != ERROR_OK)
  312. return retval;
  313. return ERROR_OK;
  314. }
  315. static int em357_protect(struct flash_bank *bank, int set, int first, int last)
  316. {
  317. struct em357_flash_bank *em357_info = NULL;
  318. struct target *target = bank->target;
  319. uint16_t prot_reg[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF};
  320. int i, reg, bit;
  321. int status;
  322. uint32_t protection;
  323. em357_info = bank->driver_priv;
  324. if (target->state != TARGET_HALTED) {
  325. LOG_ERROR("Target not halted");
  326. return ERROR_TARGET_NOT_HALTED;
  327. }
  328. if ((first % em357_info->ppage_size) != 0) {
  329. LOG_WARNING("aligned start protect sector to a %d sector boundary",
  330. em357_info->ppage_size);
  331. first = first - (first % em357_info->ppage_size);
  332. }
  333. if (((last + 1) % em357_info->ppage_size) != 0) {
  334. LOG_WARNING("aligned end protect sector to a %d sector boundary",
  335. em357_info->ppage_size);
  336. last++;
  337. last = last - (last % em357_info->ppage_size);
  338. last--;
  339. }
  340. /* each bit refers to a 4bank protection */
  341. int retval = target_read_u32(target, EM357_FLASH_WRPR, &protection);
  342. if (retval != ERROR_OK)
  343. return retval;
  344. prot_reg[0] = (uint16_t)protection;
  345. prot_reg[1] = (uint16_t)(protection >> 8);
  346. prot_reg[2] = (uint16_t)(protection >> 16);
  347. for (i = first; i <= last; i++) {
  348. reg = (i / em357_info->ppage_size) / 8;
  349. bit = (i / em357_info->ppage_size) - (reg * 8);
  350. LOG_WARNING("reg, bit: %d, %d", reg, bit);
  351. if (set)
  352. prot_reg[reg] &= ~(1 << bit);
  353. else
  354. prot_reg[reg] |= (1 << bit);
  355. }
  356. status = em357_erase_options(bank);
  357. if (retval != ERROR_OK)
  358. return status;
  359. em357_info->option_bytes.protection[0] = prot_reg[0];
  360. em357_info->option_bytes.protection[1] = prot_reg[1];
  361. em357_info->option_bytes.protection[2] = prot_reg[2];
  362. return em357_write_options(bank);
  363. }
  364. static int em357_write_block(struct flash_bank *bank, const uint8_t *buffer,
  365. uint32_t offset, uint32_t count)
  366. {
  367. struct target *target = bank->target;
  368. uint32_t buffer_size = 16384;
  369. struct working_area *write_algorithm;
  370. struct working_area *source;
  371. uint32_t address = bank->base + offset;
  372. struct reg_param reg_params[4];
  373. struct armv7m_algorithm armv7m_info;
  374. int retval = ERROR_OK;
  375. /* see contib/loaders/flash/stm32x.s for src, the same is used here except for
  376. * a modified *_FLASH_BASE */
  377. static const uint8_t em357_flash_write_code[] = {
  378. /* #define EM357_FLASH_CR_OFFSET 0x10
  379. * #define EM357_FLASH_SR_OFFSET 0x0C
  380. * write: */
  381. 0x08, 0x4c, /* ldr r4, EM357_FLASH_BASE */
  382. 0x1c, 0x44, /* add r4, r3 */
  383. /* write_half_word: */
  384. 0x01, 0x23, /* movs r3, #0x01 */
  385. 0x23, 0x61, /* str r3, [r4,
  386. *#EM357_FLASH_CR_OFFSET] */
  387. 0x30, 0xf8, 0x02, 0x3b, /* ldrh r3, [r0], #0x02 */
  388. 0x21, 0xf8, 0x02, 0x3b, /* strh r3, [r1], #0x02 */
  389. /* busy: */
  390. 0xe3, 0x68, /* ldr r3, [r4,
  391. *#EM357_FLASH_SR_OFFSET] */
  392. 0x13, 0xf0, 0x01, 0x0f, /* tst r3, #0x01 */
  393. 0xfb, 0xd0, /* beq busy */
  394. 0x13, 0xf0, 0x14, 0x0f, /* tst r3, #0x14 */
  395. 0x01, 0xd1, /* bne exit */
  396. 0x01, 0x3a, /* subs r2, r2, #0x01 */
  397. 0xf0, 0xd1, /* bne write_half_word */
  398. /* exit: */
  399. 0x00, 0xbe, /* bkpt #0x00 */
  400. 0x00, 0x80, 0x00, 0x40, /* EM357_FLASH_BASE: .word 0x40008000 */
  401. };
  402. /* flash write code */
  403. if (target_alloc_working_area(target, sizeof(em357_flash_write_code),
  404. &write_algorithm) != ERROR_OK) {
  405. LOG_WARNING("no working area available, can't do block memory writes");
  406. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  407. }
  408. retval = target_write_buffer(target, write_algorithm->address,
  409. sizeof(em357_flash_write_code), em357_flash_write_code);
  410. if (retval != ERROR_OK)
  411. return retval;
  412. /* memory buffer */
  413. while (target_alloc_working_area_try(target, buffer_size, &source) != ERROR_OK) {
  414. buffer_size /= 2;
  415. if (buffer_size <= 256) {
  416. /* we already allocated the writing code, but failed to get a
  417. * buffer, free the algorithm */
  418. target_free_working_area(target, write_algorithm);
  419. LOG_WARNING(
  420. "no large enough working area available, can't do block memory writes");
  421. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  422. }
  423. }
  424. armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
  425. armv7m_info.core_mode = ARM_MODE_THREAD;
  426. init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);
  427. init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);
  428. init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);
  429. init_reg_param(&reg_params[3], "r3", 32, PARAM_IN_OUT);
  430. while (count > 0) {
  431. uint32_t thisrun_count = (count > (buffer_size / 2)) ?
  432. (buffer_size / 2) : count;
  433. retval = target_write_buffer(target, source->address, thisrun_count * 2, buffer);
  434. if (retval != ERROR_OK)
  435. break;
  436. buf_set_u32(reg_params[0].value, 0, 32, source->address);
  437. buf_set_u32(reg_params[1].value, 0, 32, address);
  438. buf_set_u32(reg_params[2].value, 0, 32, thisrun_count);
  439. buf_set_u32(reg_params[3].value, 0, 32, 0);
  440. retval = target_run_algorithm(target, 0, NULL, 4, reg_params,
  441. write_algorithm->address, 0, 10000, &armv7m_info);
  442. if (retval != ERROR_OK) {
  443. LOG_ERROR("error executing em357 flash write algorithm");
  444. break;
  445. }
  446. if (buf_get_u32(reg_params[3].value, 0, 32) & FLASH_PGERR) {
  447. LOG_ERROR("flash memory not erased before writing");
  448. /* Clear but report errors */
  449. target_write_u32(target, EM357_FLASH_SR, FLASH_PGERR);
  450. retval = ERROR_FAIL;
  451. break;
  452. }
  453. if (buf_get_u32(reg_params[3].value, 0, 32) & FLASH_WRPRTERR) {
  454. LOG_ERROR("flash memory write protected");
  455. /* Clear but report errors */
  456. target_write_u32(target, EM357_FLASH_SR, FLASH_WRPRTERR);
  457. retval = ERROR_FAIL;
  458. break;
  459. }
  460. buffer += thisrun_count * 2;
  461. address += thisrun_count * 2;
  462. count -= thisrun_count;
  463. }
  464. target_free_working_area(target, source);
  465. target_free_working_area(target, write_algorithm);
  466. destroy_reg_param(&reg_params[0]);
  467. destroy_reg_param(&reg_params[1]);
  468. destroy_reg_param(&reg_params[2]);
  469. destroy_reg_param(&reg_params[3]);
  470. return retval;
  471. }
  472. static int em357_write(struct flash_bank *bank, const uint8_t *buffer,
  473. uint32_t offset, uint32_t count)
  474. {
  475. struct target *target = bank->target;
  476. uint32_t words_remaining = (count / 2);
  477. uint32_t bytes_remaining = (count & 0x00000001);
  478. uint32_t address = bank->base + offset;
  479. uint32_t bytes_written = 0;
  480. int retval;
  481. if (bank->target->state != TARGET_HALTED) {
  482. LOG_ERROR("Target not halted");
  483. return ERROR_TARGET_NOT_HALTED;
  484. }
  485. if (offset & 0x1) {
  486. LOG_WARNING("offset 0x%" PRIx32 " breaks required 2-byte alignment", offset);
  487. return ERROR_FLASH_DST_BREAKS_ALIGNMENT;
  488. }
  489. /* unlock flash registers */
  490. retval = target_write_u32(target, EM357_FLASH_KEYR, KEY1);
  491. if (retval != ERROR_OK)
  492. return retval;
  493. retval = target_write_u32(target, EM357_FLASH_KEYR, KEY2);
  494. if (retval != ERROR_OK)
  495. return retval;
  496. target_write_u32(target, EM357_FPEC_CLK, 0x00000001);
  497. /* multiple half words (2-byte) to be programmed? */
  498. if (words_remaining > 0) {
  499. /* try using a block write */
  500. retval = em357_write_block(bank, buffer, offset, words_remaining);
  501. if (retval != ERROR_OK) {
  502. if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE) {
  503. /* if block write failed (no sufficient working area),
  504. * we use normal (slow) single dword accesses */
  505. LOG_WARNING(
  506. "couldn't use block writes, falling back to single memory accesses");
  507. }
  508. } else {
  509. buffer += words_remaining * 2;
  510. address += words_remaining * 2;
  511. words_remaining = 0;
  512. }
  513. }
  514. if ((retval != ERROR_OK) && (retval != ERROR_TARGET_RESOURCE_NOT_AVAILABLE))
  515. return retval;
  516. while (words_remaining > 0) {
  517. uint16_t value;
  518. memcpy(&value, buffer + bytes_written, sizeof(uint16_t));
  519. retval = target_write_u32(target, EM357_FLASH_CR, FLASH_PG);
  520. if (retval != ERROR_OK)
  521. return retval;
  522. retval = target_write_u16(target, address, value);
  523. if (retval != ERROR_OK)
  524. return retval;
  525. retval = em357_wait_status_busy(bank, 5);
  526. if (retval != ERROR_OK)
  527. return retval;
  528. bytes_written += 2;
  529. words_remaining--;
  530. address += 2;
  531. }
  532. if (bytes_remaining) {
  533. uint16_t value = 0xffff;
  534. memcpy(&value, buffer + bytes_written, bytes_remaining);
  535. retval = target_write_u32(target, EM357_FLASH_CR, FLASH_PG);
  536. if (retval != ERROR_OK)
  537. return retval;
  538. retval = target_write_u16(target, address, value);
  539. if (retval != ERROR_OK)
  540. return retval;
  541. retval = em357_wait_status_busy(bank, 5);
  542. if (retval != ERROR_OK)
  543. return retval;
  544. }
  545. return target_write_u32(target, EM357_FLASH_CR, FLASH_LOCK);
  546. }
  547. static int em357_probe(struct flash_bank *bank)
  548. {
  549. struct target *target = bank->target;
  550. struct em357_flash_bank *em357_info = bank->driver_priv;
  551. int i;
  552. uint16_t num_pages;
  553. int page_size;
  554. uint32_t base_address = 0x08000000;
  555. em357_info->probed = 0;
  556. switch (bank->size) {
  557. case 0x10000:
  558. /* 64k -- 64 1k pages */
  559. num_pages = 64;
  560. page_size = 1024;
  561. break;
  562. case 0x20000:
  563. /* 128k -- 128 1k pages */
  564. num_pages = 128;
  565. page_size = 1024;
  566. break;
  567. case 0x30000:
  568. /* 192k -- 96 2k pages */
  569. num_pages = 96;
  570. page_size = 2048;
  571. break;
  572. case 0x40000:
  573. /* 256k -- 128 2k pages */
  574. num_pages = 128;
  575. page_size = 2048;
  576. break;
  577. default:
  578. LOG_WARNING("No size specified for em357 flash driver, assuming 192k!");
  579. num_pages = 96;
  580. page_size = 2048;
  581. break;
  582. }
  583. /* Enable FPEC CLK */
  584. int retval = target_write_u32(target, EM357_FPEC_CLK, 0x00000001);
  585. if (retval != ERROR_OK)
  586. return retval;
  587. em357_info->ppage_size = 4;
  588. LOG_INFO("flash size = %dkbytes", num_pages*page_size/1024);
  589. if (bank->sectors) {
  590. free(bank->sectors);
  591. bank->sectors = NULL;
  592. }
  593. bank->base = base_address;
  594. bank->size = (num_pages * page_size);
  595. bank->num_sectors = num_pages;
  596. bank->sectors = malloc(sizeof(struct flash_sector) * num_pages);
  597. for (i = 0; i < num_pages; i++) {
  598. bank->sectors[i].offset = i * page_size;
  599. bank->sectors[i].size = page_size;
  600. bank->sectors[i].is_erased = -1;
  601. bank->sectors[i].is_protected = 1;
  602. }
  603. em357_info->probed = 1;
  604. return ERROR_OK;
  605. }
  606. static int em357_auto_probe(struct flash_bank *bank)
  607. {
  608. struct em357_flash_bank *em357_info = bank->driver_priv;
  609. if (em357_info->probed)
  610. return ERROR_OK;
  611. return em357_probe(bank);
  612. }
  613. COMMAND_HANDLER(em357_handle_lock_command)
  614. {
  615. struct target *target = NULL;
  616. struct em357_flash_bank *em357_info = NULL;
  617. if (CMD_ARGC < 1)
  618. return ERROR_COMMAND_SYNTAX_ERROR;
  619. struct flash_bank *bank;
  620. int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
  621. if (ERROR_OK != retval)
  622. return retval;
  623. em357_info = bank->driver_priv;
  624. target = bank->target;
  625. if (target->state != TARGET_HALTED) {
  626. LOG_ERROR("Target not halted");
  627. return ERROR_TARGET_NOT_HALTED;
  628. }
  629. if (em357_erase_options(bank) != ERROR_OK) {
  630. command_print(CMD_CTX, "em357 failed to erase options");
  631. return ERROR_OK;
  632. }
  633. /* set readout protection */
  634. em357_info->option_bytes.RDP = 0;
  635. if (em357_write_options(bank) != ERROR_OK) {
  636. command_print(CMD_CTX, "em357 failed to lock device");
  637. return ERROR_OK;
  638. }
  639. command_print(CMD_CTX, "em357 locked");
  640. return ERROR_OK;
  641. }
  642. COMMAND_HANDLER(em357_handle_unlock_command)
  643. {
  644. struct target *target = NULL;
  645. if (CMD_ARGC < 1)
  646. return ERROR_COMMAND_SYNTAX_ERROR;
  647. struct flash_bank *bank;
  648. int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
  649. if (ERROR_OK != retval)
  650. return retval;
  651. target = bank->target;
  652. if (target->state != TARGET_HALTED) {
  653. LOG_ERROR("Target not halted");
  654. return ERROR_TARGET_NOT_HALTED;
  655. }
  656. if (em357_erase_options(bank) != ERROR_OK) {
  657. command_print(CMD_CTX, "em357 failed to unlock device");
  658. return ERROR_OK;
  659. }
  660. if (em357_write_options(bank) != ERROR_OK) {
  661. command_print(CMD_CTX, "em357 failed to lock device");
  662. return ERROR_OK;
  663. }
  664. command_print(CMD_CTX, "em357 unlocked.\n"
  665. "INFO: a reset or power cycle is required "
  666. "for the new settings to take effect.");
  667. return ERROR_OK;
  668. }
  669. static int em357_mass_erase(struct flash_bank *bank)
  670. {
  671. struct target *target = bank->target;
  672. if (target->state != TARGET_HALTED) {
  673. LOG_ERROR("Target not halted");
  674. return ERROR_TARGET_NOT_HALTED;
  675. }
  676. /* Make sure the flash clock is on */
  677. target_write_u32(target, EM357_FPEC_CLK, 0x00000001);
  678. /* unlock option flash registers */
  679. int retval = target_write_u32(target, EM357_FLASH_KEYR, KEY1);
  680. if (retval != ERROR_OK)
  681. return retval;
  682. retval = target_write_u32(target, EM357_FLASH_KEYR, KEY2);
  683. if (retval != ERROR_OK)
  684. return retval;
  685. /* mass erase flash memory */
  686. retval = target_write_u32(target, EM357_FLASH_CR, FLASH_MER);
  687. if (retval != ERROR_OK)
  688. return retval;
  689. retval = target_write_u32(target, EM357_FLASH_CR, FLASH_MER | FLASH_STRT);
  690. if (retval != ERROR_OK)
  691. return retval;
  692. retval = em357_wait_status_busy(bank, 100);
  693. if (retval != ERROR_OK)
  694. return retval;
  695. retval = target_write_u32(target, EM357_FLASH_CR, FLASH_LOCK);
  696. if (retval != ERROR_OK)
  697. return retval;
  698. return ERROR_OK;
  699. }
  700. COMMAND_HANDLER(em357_handle_mass_erase_command)
  701. {
  702. int i;
  703. if (CMD_ARGC < 1)
  704. return ERROR_COMMAND_SYNTAX_ERROR;
  705. struct flash_bank *bank;
  706. int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
  707. if (ERROR_OK != retval)
  708. return retval;
  709. retval = em357_mass_erase(bank);
  710. if (retval == ERROR_OK) {
  711. /* set all sectors as erased */
  712. for (i = 0; i < bank->num_sectors; i++)
  713. bank->sectors[i].is_erased = 1;
  714. command_print(CMD_CTX, "em357 mass erase complete");
  715. } else
  716. command_print(CMD_CTX, "em357 mass erase failed");
  717. return retval;
  718. }
  719. static const struct command_registration em357_exec_command_handlers[] = {
  720. {
  721. .name = "lock",
  722. .usage = "<bank>",
  723. .handler = em357_handle_lock_command,
  724. .mode = COMMAND_EXEC,
  725. .help = "Lock entire flash device.",
  726. },
  727. {
  728. .name = "unlock",
  729. .usage = "<bank>",
  730. .handler = em357_handle_unlock_command,
  731. .mode = COMMAND_EXEC,
  732. .help = "Unlock entire protected flash device.",
  733. },
  734. {
  735. .name = "mass_erase",
  736. .usage = "<bank>",
  737. .handler = em357_handle_mass_erase_command,
  738. .mode = COMMAND_EXEC,
  739. .help = "Erase entire flash device.",
  740. },
  741. COMMAND_REGISTRATION_DONE
  742. };
  743. static const struct command_registration em357_command_handlers[] = {
  744. {
  745. .name = "em357",
  746. .mode = COMMAND_ANY,
  747. .help = "em357 flash command group",
  748. .usage = "",
  749. .chain = em357_exec_command_handlers,
  750. },
  751. COMMAND_REGISTRATION_DONE
  752. };
  753. struct flash_driver em357_flash = {
  754. .name = "em357",
  755. .commands = em357_command_handlers,
  756. .flash_bank_command = em357_flash_bank_command,
  757. .erase = em357_erase,
  758. .protect = em357_protect,
  759. .write = em357_write,
  760. .read = default_flash_read,
  761. .probe = em357_probe,
  762. .auto_probe = em357_auto_probe,
  763. .erase_check = default_flash_blank_check,
  764. .protect_check = em357_protect_check,
  765. };