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.
 
 
 
 
 
 

1435 lines
36 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2005 by Dominic Rath <Dominic.Rath@gmx.de> *
  3. * Copyright (C) 2007,2008 Øyvind Harboe <oyvind.harboe@zylin.com> *
  4. * Copyright (C) 2008 by Spencer Oliver <spen@spen-soft.co.uk> *
  5. * Copyright (C) 2009 Zachary T Welch <zw@superlucidity.net> *
  6. * Copyright (C) 2017-2018 Tomas Vanek <vanekt@fbl.cz> *
  7. * *
  8. * This program is free software; you can redistribute it and/or modify *
  9. * it under the terms of the GNU General Public License as published by *
  10. * the Free Software Foundation; either version 2 of the License, or *
  11. * (at your option) any later version. *
  12. * *
  13. * This program is distributed in the hope that it will be useful, *
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  16. * GNU General Public License for more details. *
  17. * *
  18. * You should have received a copy of the GNU General Public License *
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>. *
  20. ***************************************************************************/
  21. #ifdef HAVE_CONFIG_H
  22. #include "config.h"
  23. #endif
  24. #include "imp.h"
  25. #include <helper/time_support.h>
  26. #include <target/image.h>
  27. /**
  28. * @file
  29. * Implements Tcl commands used to access NOR flash facilities.
  30. */
  31. static COMMAND_HELPER(flash_command_get_bank_maybe_probe, unsigned name_index,
  32. struct flash_bank **bank, bool do_probe)
  33. {
  34. const char *name = CMD_ARGV[name_index];
  35. int retval;
  36. if (do_probe) {
  37. retval = get_flash_bank_by_name(name, bank);
  38. } else {
  39. *bank = get_flash_bank_by_name_noprobe(name);
  40. retval = ERROR_OK;
  41. }
  42. if (retval != ERROR_OK)
  43. return retval;
  44. if (*bank)
  45. return ERROR_OK;
  46. unsigned bank_num;
  47. COMMAND_PARSE_NUMBER(uint, name, bank_num);
  48. if (do_probe) {
  49. return get_flash_bank_by_num(bank_num, bank);
  50. } else {
  51. *bank = get_flash_bank_by_num_noprobe(bank_num);
  52. retval = (bank) ? ERROR_OK : ERROR_FAIL;
  53. return retval;
  54. }
  55. }
  56. COMMAND_HELPER(flash_command_get_bank, unsigned name_index,
  57. struct flash_bank **bank)
  58. {
  59. return CALL_COMMAND_HANDLER(flash_command_get_bank_maybe_probe,
  60. name_index, bank, true);
  61. }
  62. COMMAND_HANDLER(handle_flash_info_command)
  63. {
  64. struct flash_bank *p;
  65. int j = 0;
  66. int retval;
  67. bool show_sectors = false;
  68. bool prot_block_available;
  69. if (CMD_ARGC < 1 || CMD_ARGC > 2)
  70. return ERROR_COMMAND_SYNTAX_ERROR;
  71. if (CMD_ARGC == 2) {
  72. if (strcmp("sectors", CMD_ARGV[1]) == 0)
  73. show_sectors = true;
  74. else
  75. return ERROR_COMMAND_SYNTAX_ERROR;
  76. }
  77. retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &p);
  78. if (retval != ERROR_OK)
  79. return retval;
  80. if (p) {
  81. int num_blocks;
  82. struct flash_sector *block_array;
  83. /* attempt auto probe */
  84. retval = p->driver->auto_probe(p);
  85. if (retval != ERROR_OK)
  86. return retval;
  87. /* If the driver does not implement protection, we show the default
  88. * state of is_protected array - usually protection state unknown */
  89. if (!p->driver->protect_check) {
  90. retval = ERROR_FLASH_OPER_UNSUPPORTED;
  91. } else {
  92. /* We must query the hardware to avoid printing stale information! */
  93. retval = p->driver->protect_check(p);
  94. if (retval != ERROR_OK && retval != ERROR_FLASH_OPER_UNSUPPORTED)
  95. return retval;
  96. }
  97. if (retval == ERROR_FLASH_OPER_UNSUPPORTED)
  98. LOG_INFO("Flash protection check is not implemented.");
  99. command_print(CMD,
  100. "#%u : %s at " TARGET_ADDR_FMT ", size 0x%8.8" PRIx32
  101. ", buswidth %u, chipwidth %u",
  102. p->bank_number,
  103. p->driver->name,
  104. p->base,
  105. p->size,
  106. p->bus_width,
  107. p->chip_width);
  108. prot_block_available = p->num_prot_blocks && p->prot_blocks;
  109. if (!show_sectors && prot_block_available) {
  110. block_array = p->prot_blocks;
  111. num_blocks = p->num_prot_blocks;
  112. } else {
  113. block_array = p->sectors;
  114. num_blocks = p->num_sectors;
  115. }
  116. for (j = 0; j < num_blocks; j++) {
  117. char *protect_state = "";
  118. if (block_array[j].is_protected == 0)
  119. protect_state = "not protected";
  120. else if (block_array[j].is_protected == 1)
  121. protect_state = "protected";
  122. else if (!show_sectors || !prot_block_available)
  123. protect_state = "protection state unknown";
  124. command_print(CMD,
  125. "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIu32 "kB) %s",
  126. j,
  127. block_array[j].offset,
  128. block_array[j].size,
  129. block_array[j].size >> 10,
  130. protect_state);
  131. }
  132. if (p->driver->info) {
  133. /* Let the flash driver print extra custom info */
  134. retval = p->driver->info(p, CMD);
  135. command_print_sameline(CMD, "\n");
  136. if (retval != ERROR_OK)
  137. LOG_ERROR("error retrieving flash info");
  138. }
  139. }
  140. return retval;
  141. }
  142. COMMAND_HANDLER(handle_flash_probe_command)
  143. {
  144. struct flash_bank *p;
  145. int retval;
  146. if (CMD_ARGC != 1)
  147. return ERROR_COMMAND_SYNTAX_ERROR;
  148. retval = CALL_COMMAND_HANDLER(flash_command_get_bank_maybe_probe, 0, &p, false);
  149. if (retval != ERROR_OK)
  150. return retval;
  151. if (p) {
  152. retval = p->driver->probe(p);
  153. if (retval == ERROR_OK)
  154. command_print(CMD,
  155. "flash '%s' found at " TARGET_ADDR_FMT,
  156. p->driver->name,
  157. p->base);
  158. } else {
  159. command_print(CMD, "flash bank '#%s' is out of bounds", CMD_ARGV[0]);
  160. retval = ERROR_FAIL;
  161. }
  162. return retval;
  163. }
  164. COMMAND_HANDLER(handle_flash_erase_check_command)
  165. {
  166. bool blank = true;
  167. if (CMD_ARGC != 1)
  168. return ERROR_COMMAND_SYNTAX_ERROR;
  169. struct flash_bank *p;
  170. int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &p);
  171. if (retval != ERROR_OK)
  172. return retval;
  173. retval = p->driver->erase_check(p);
  174. if (retval == ERROR_OK)
  175. command_print(CMD, "successfully checked erase state");
  176. else {
  177. command_print(CMD,
  178. "unknown error when checking erase state of flash bank #%s at "
  179. TARGET_ADDR_FMT,
  180. CMD_ARGV[0],
  181. p->base);
  182. }
  183. for (unsigned int j = 0; j < p->num_sectors; j++) {
  184. char *erase_state;
  185. if (p->sectors[j].is_erased == 0)
  186. erase_state = "not erased";
  187. else if (p->sectors[j].is_erased == 1)
  188. continue;
  189. else
  190. erase_state = "erase state unknown";
  191. blank = false;
  192. command_print(CMD,
  193. "\t#%3i: 0x%8.8" PRIx32 " (0x%" PRIx32 " %" PRIu32 "kB) %s",
  194. j,
  195. p->sectors[j].offset,
  196. p->sectors[j].size,
  197. p->sectors[j].size >> 10,
  198. erase_state);
  199. }
  200. if (blank)
  201. command_print(CMD, "\tBank is erased");
  202. return retval;
  203. }
  204. COMMAND_HANDLER(handle_flash_erase_address_command)
  205. {
  206. struct flash_bank *p;
  207. int retval = ERROR_OK;
  208. target_addr_t address;
  209. uint32_t length;
  210. bool do_pad = false;
  211. bool do_unlock = false;
  212. struct target *target = get_current_target(CMD_CTX);
  213. while (CMD_ARGC >= 3) {
  214. /* Optionally pad out the address range to block/sector
  215. * boundaries. We can't know if there's data in that part
  216. * of the flash; only do padding if we're told to.
  217. */
  218. if (strcmp("pad", CMD_ARGV[0]) == 0)
  219. do_pad = true;
  220. else if (strcmp("unlock", CMD_ARGV[0]) == 0)
  221. do_unlock = true;
  222. else
  223. return ERROR_COMMAND_SYNTAX_ERROR;
  224. CMD_ARGC--;
  225. CMD_ARGV++;
  226. }
  227. if (CMD_ARGC != 2)
  228. return ERROR_COMMAND_SYNTAX_ERROR;
  229. COMMAND_PARSE_ADDRESS(CMD_ARGV[0], address);
  230. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], length);
  231. if (length <= 0) {
  232. command_print(CMD, "Length must be >0");
  233. return ERROR_COMMAND_SYNTAX_ERROR;
  234. }
  235. retval = get_flash_bank_by_addr(target, address, true, &p);
  236. if (retval != ERROR_OK)
  237. return retval;
  238. /* We can't know if we did a resume + halt, in which case we no longer know the erased state
  239. **/
  240. flash_set_dirty();
  241. struct duration bench;
  242. duration_start(&bench);
  243. if (do_unlock)
  244. retval = flash_unlock_address_range(target, address, length);
  245. if (retval == ERROR_OK)
  246. retval = flash_erase_address_range(target, do_pad, address, length);
  247. if ((retval == ERROR_OK) && (duration_measure(&bench) == ERROR_OK)) {
  248. command_print(CMD, "erased address " TARGET_ADDR_FMT " (length %" PRIu32 ")"
  249. " in %fs (%0.3f KiB/s)", address, length,
  250. duration_elapsed(&bench), duration_kbps(&bench, length));
  251. }
  252. return retval;
  253. }
  254. COMMAND_HANDLER(handle_flash_erase_command)
  255. {
  256. if (CMD_ARGC != 3)
  257. return ERROR_COMMAND_SYNTAX_ERROR;
  258. uint32_t first;
  259. uint32_t last;
  260. struct flash_bank *p;
  261. int retval;
  262. retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &p);
  263. if (retval != ERROR_OK)
  264. return retval;
  265. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], first);
  266. if (strcmp(CMD_ARGV[2], "last") == 0)
  267. last = p->num_sectors - 1;
  268. else
  269. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], last);
  270. if (!(first <= last)) {
  271. command_print(CMD, "ERROR: "
  272. "first sector must be <= last");
  273. return ERROR_FAIL;
  274. }
  275. if (!(last <= (p->num_sectors - 1))) {
  276. command_print(CMD, "ERROR: "
  277. "last sector must be <= %u",
  278. p->num_sectors - 1);
  279. return ERROR_FAIL;
  280. }
  281. struct duration bench;
  282. duration_start(&bench);
  283. retval = flash_driver_erase(p, first, last);
  284. if ((retval == ERROR_OK) && (duration_measure(&bench) == ERROR_OK)) {
  285. command_print(CMD, "erased sectors %" PRIu32 " "
  286. "through %" PRIu32 " on flash bank %u "
  287. "in %fs", first, last, p->bank_number, duration_elapsed(&bench));
  288. }
  289. return retval;
  290. }
  291. COMMAND_HANDLER(handle_flash_protect_command)
  292. {
  293. if (CMD_ARGC != 4)
  294. return ERROR_COMMAND_SYNTAX_ERROR;
  295. uint32_t first;
  296. uint32_t last;
  297. struct flash_bank *p;
  298. int retval;
  299. int num_blocks;
  300. retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &p);
  301. if (retval != ERROR_OK)
  302. return retval;
  303. if (p->num_prot_blocks)
  304. num_blocks = p->num_prot_blocks;
  305. else
  306. num_blocks = p->num_sectors;
  307. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], first);
  308. if (strcmp(CMD_ARGV[2], "last") == 0)
  309. last = num_blocks - 1;
  310. else
  311. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], last);
  312. bool set;
  313. COMMAND_PARSE_ON_OFF(CMD_ARGV[3], set);
  314. if (!(first <= last)) {
  315. command_print(CMD, "ERROR: "
  316. "first %s must be <= last",
  317. (p->num_prot_blocks) ? "block" : "sector");
  318. return ERROR_FAIL;
  319. }
  320. if (!(last <= (uint32_t)(num_blocks - 1))) {
  321. command_print(CMD, "ERROR: "
  322. "last %s must be <= %d",
  323. (p->num_prot_blocks) ? "block" : "sector",
  324. num_blocks - 1);
  325. return ERROR_FAIL;
  326. }
  327. retval = flash_driver_protect(p, set, first, last);
  328. if (retval == ERROR_OK) {
  329. command_print(CMD, "%s protection for %s %" PRIu32
  330. " through %" PRIu32 " on flash bank %d",
  331. (set) ? "set" : "cleared",
  332. (p->num_prot_blocks) ? "blocks" : "sectors",
  333. first, last, p->bank_number);
  334. }
  335. return retval;
  336. }
  337. COMMAND_HANDLER(handle_flash_write_image_command)
  338. {
  339. struct target *target = get_current_target(CMD_CTX);
  340. struct image image;
  341. uint32_t written;
  342. int retval;
  343. /* flash auto-erase is disabled by default*/
  344. int auto_erase = 0;
  345. bool auto_unlock = false;
  346. while (CMD_ARGC) {
  347. if (strcmp(CMD_ARGV[0], "erase") == 0) {
  348. auto_erase = 1;
  349. CMD_ARGV++;
  350. CMD_ARGC--;
  351. command_print(CMD, "auto erase enabled");
  352. } else if (strcmp(CMD_ARGV[0], "unlock") == 0) {
  353. auto_unlock = true;
  354. CMD_ARGV++;
  355. CMD_ARGC--;
  356. command_print(CMD, "auto unlock enabled");
  357. } else
  358. break;
  359. }
  360. if (CMD_ARGC < 1)
  361. return ERROR_COMMAND_SYNTAX_ERROR;
  362. if (!target) {
  363. LOG_ERROR("no target selected");
  364. return ERROR_FAIL;
  365. }
  366. struct duration bench;
  367. duration_start(&bench);
  368. if (CMD_ARGC >= 2) {
  369. image.base_address_set = true;
  370. COMMAND_PARSE_NUMBER(llong, CMD_ARGV[1], image.base_address);
  371. } else {
  372. image.base_address_set = false;
  373. image.base_address = 0x0;
  374. }
  375. image.start_address_set = false;
  376. retval = image_open(&image, CMD_ARGV[0], (CMD_ARGC == 3) ? CMD_ARGV[2] : NULL);
  377. if (retval != ERROR_OK)
  378. return retval;
  379. retval = flash_write_unlock_verify(target, &image, &written, auto_erase,
  380. auto_unlock, true, false);
  381. if (retval != ERROR_OK) {
  382. image_close(&image);
  383. return retval;
  384. }
  385. if ((retval == ERROR_OK) && (duration_measure(&bench) == ERROR_OK)) {
  386. command_print(CMD, "wrote %" PRIu32 " bytes from file %s "
  387. "in %fs (%0.3f KiB/s)", written, CMD_ARGV[0],
  388. duration_elapsed(&bench), duration_kbps(&bench, written));
  389. }
  390. image_close(&image);
  391. return retval;
  392. }
  393. COMMAND_HANDLER(handle_flash_verify_image_command)
  394. {
  395. struct target *target = get_current_target(CMD_CTX);
  396. struct image image;
  397. uint32_t verified;
  398. int retval;
  399. if (CMD_ARGC < 1)
  400. return ERROR_COMMAND_SYNTAX_ERROR;
  401. if (!target) {
  402. LOG_ERROR("no target selected");
  403. return ERROR_FAIL;
  404. }
  405. struct duration bench;
  406. duration_start(&bench);
  407. if (CMD_ARGC >= 2) {
  408. image.base_address_set = 1;
  409. COMMAND_PARSE_NUMBER(llong, CMD_ARGV[1], image.base_address);
  410. } else {
  411. image.base_address_set = 0;
  412. image.base_address = 0x0;
  413. }
  414. image.start_address_set = 0;
  415. retval = image_open(&image, CMD_ARGV[0], (CMD_ARGC == 3) ? CMD_ARGV[2] : NULL);
  416. if (retval != ERROR_OK)
  417. return retval;
  418. retval = flash_write_unlock_verify(target, &image, &verified, false,
  419. false, false, true);
  420. if (retval != ERROR_OK) {
  421. image_close(&image);
  422. return retval;
  423. }
  424. if ((retval == ERROR_OK) && (duration_measure(&bench) == ERROR_OK)) {
  425. command_print(CMD, "verified %" PRIu32 " bytes from file %s "
  426. "in %fs (%0.3f KiB/s)", verified, CMD_ARGV[0],
  427. duration_elapsed(&bench), duration_kbps(&bench, verified));
  428. }
  429. image_close(&image);
  430. return retval;
  431. }
  432. COMMAND_HANDLER(handle_flash_fill_command)
  433. {
  434. target_addr_t address;
  435. uint64_t pattern;
  436. uint32_t count;
  437. struct target *target = get_current_target(CMD_CTX);
  438. unsigned i;
  439. uint32_t wordsize;
  440. int retval;
  441. if (CMD_ARGC != 3)
  442. return ERROR_COMMAND_SYNTAX_ERROR;
  443. COMMAND_PARSE_ADDRESS(CMD_ARGV[0], address);
  444. COMMAND_PARSE_NUMBER(u64, CMD_ARGV[1], pattern);
  445. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], count);
  446. struct flash_bank *bank;
  447. retval = get_flash_bank_by_addr(target, address, true, &bank);
  448. if (retval != ERROR_OK)
  449. return retval;
  450. switch (CMD_NAME[4]) {
  451. case 'd':
  452. wordsize = 8;
  453. break;
  454. case 'w':
  455. wordsize = 4;
  456. break;
  457. case 'h':
  458. wordsize = 2;
  459. break;
  460. case 'b':
  461. wordsize = 1;
  462. break;
  463. default:
  464. return ERROR_COMMAND_SYNTAX_ERROR;
  465. }
  466. if ((wordsize < sizeof(pattern)) && (pattern >> (8 * wordsize) != 0)) {
  467. command_print(CMD, "Fill pattern 0x%" PRIx64 " does not fit within %" PRIu32 "-byte word", pattern, wordsize);
  468. return ERROR_FAIL;
  469. }
  470. if (count == 0)
  471. return ERROR_OK;
  472. if (address + count * wordsize > bank->base + bank->size) {
  473. LOG_ERROR("Cannot cross flash bank borders");
  474. return ERROR_FAIL;
  475. }
  476. uint32_t size_bytes = count * wordsize;
  477. target_addr_t aligned_start = flash_write_align_start(bank, address);
  478. target_addr_t end_addr = address + size_bytes - 1;
  479. target_addr_t aligned_end = flash_write_align_end(bank, end_addr);
  480. uint32_t aligned_size = aligned_end + 1 - aligned_start;
  481. uint32_t padding_at_start = address - aligned_start;
  482. uint32_t padding_at_end = aligned_end - end_addr;
  483. uint8_t *buffer = malloc(aligned_size);
  484. if (!buffer)
  485. return ERROR_FAIL;
  486. if (padding_at_start) {
  487. memset(buffer, bank->default_padded_value, padding_at_start);
  488. LOG_WARNING("Start address " TARGET_ADDR_FMT
  489. " breaks the required alignment of flash bank %s",
  490. address, bank->name);
  491. LOG_WARNING("Padding %" PRIu32 " bytes from " TARGET_ADDR_FMT,
  492. padding_at_start, aligned_start);
  493. }
  494. uint8_t *ptr = buffer + padding_at_start;
  495. switch (wordsize) {
  496. case 8:
  497. for (i = 0; i < count; i++, ptr += wordsize)
  498. target_buffer_set_u64(target, ptr, pattern);
  499. break;
  500. case 4:
  501. for (i = 0; i < count; i++, ptr += wordsize)
  502. target_buffer_set_u32(target, ptr, pattern);
  503. break;
  504. case 2:
  505. for (i = 0; i < count; i++, ptr += wordsize)
  506. target_buffer_set_u16(target, ptr, pattern);
  507. break;
  508. case 1:
  509. memset(ptr, pattern, count);
  510. ptr += count;
  511. break;
  512. default:
  513. LOG_ERROR("BUG: can't happen");
  514. exit(-1);
  515. }
  516. if (padding_at_end) {
  517. memset(ptr, bank->default_padded_value, padding_at_end);
  518. LOG_INFO("Padding at " TARGET_ADDR_FMT " with %" PRIu32
  519. " bytes (bank write end alignment)",
  520. end_addr + 1, padding_at_end);
  521. }
  522. struct duration bench;
  523. duration_start(&bench);
  524. retval = flash_driver_write(bank, buffer, aligned_start - bank->base, aligned_size);
  525. if (retval != ERROR_OK)
  526. goto done;
  527. retval = flash_driver_read(bank, buffer, address - bank->base, size_bytes);
  528. if (retval != ERROR_OK)
  529. goto done;
  530. for (i = 0, ptr = buffer; i < count; i++) {
  531. uint64_t readback = 0;
  532. switch (wordsize) {
  533. case 8:
  534. readback = target_buffer_get_u64(target, ptr);
  535. break;
  536. case 4:
  537. readback = target_buffer_get_u32(target, ptr);
  538. break;
  539. case 2:
  540. readback = target_buffer_get_u16(target, ptr);
  541. break;
  542. case 1:
  543. readback = *ptr;
  544. break;
  545. }
  546. if (readback != pattern) {
  547. LOG_ERROR(
  548. "Verification error address " TARGET_ADDR_FMT
  549. ", read back 0x%02" PRIx64 ", expected 0x%02" PRIx64,
  550. address + i * wordsize, readback, pattern);
  551. retval = ERROR_FAIL;
  552. goto done;
  553. }
  554. ptr += wordsize;
  555. }
  556. if ((retval == ERROR_OK) && (duration_measure(&bench) == ERROR_OK)) {
  557. command_print(CMD, "wrote %" PRIu32 " bytes to " TARGET_ADDR_FMT
  558. " in %fs (%0.3f KiB/s)", size_bytes, address,
  559. duration_elapsed(&bench), duration_kbps(&bench, size_bytes));
  560. }
  561. done:
  562. free(buffer);
  563. return retval;
  564. }
  565. COMMAND_HANDLER(handle_flash_md_command)
  566. {
  567. int retval;
  568. if (CMD_ARGC < 1 || CMD_ARGC > 2)
  569. return ERROR_COMMAND_SYNTAX_ERROR;
  570. target_addr_t address;
  571. COMMAND_PARSE_ADDRESS(CMD_ARGV[0], address);
  572. uint32_t count = 1;
  573. if (CMD_ARGC == 2)
  574. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], count);
  575. unsigned int wordsize;
  576. switch (CMD_NAME[2]) {
  577. case 'w':
  578. wordsize = 4;
  579. break;
  580. case 'h':
  581. wordsize = 2;
  582. break;
  583. case 'b':
  584. wordsize = 1;
  585. break;
  586. default:
  587. return ERROR_COMMAND_SYNTAX_ERROR;
  588. }
  589. if (count == 0)
  590. return ERROR_OK;
  591. struct target *target = get_current_target(CMD_CTX);
  592. struct flash_bank *bank;
  593. retval = get_flash_bank_by_addr(target, address, true, &bank);
  594. if (retval != ERROR_OK)
  595. return retval;
  596. uint32_t offset = address - bank->base;
  597. uint32_t sizebytes = count * wordsize;
  598. if (offset + sizebytes > bank->size) {
  599. command_print(CMD, "Cannot cross flash bank borders");
  600. return ERROR_FAIL;
  601. }
  602. uint8_t *buffer = calloc(count, wordsize);
  603. if (!buffer) {
  604. command_print(CMD, "No memory for flash read buffer");
  605. return ERROR_FAIL;
  606. }
  607. retval = flash_driver_read(bank, buffer, offset, sizebytes);
  608. if (retval == ERROR_OK)
  609. target_handle_md_output(CMD, target, address, wordsize, count, buffer);
  610. free(buffer);
  611. return retval;
  612. }
  613. COMMAND_HANDLER(handle_flash_write_bank_command)
  614. {
  615. uint32_t offset;
  616. uint8_t *buffer;
  617. size_t length;
  618. struct fileio *fileio;
  619. if (CMD_ARGC < 2 || CMD_ARGC > 3)
  620. return ERROR_COMMAND_SYNTAX_ERROR;
  621. struct duration bench;
  622. duration_start(&bench);
  623. struct flash_bank *bank;
  624. int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
  625. if (retval != ERROR_OK)
  626. return retval;
  627. offset = 0;
  628. if (CMD_ARGC > 2)
  629. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], offset);
  630. if (offset > bank->size) {
  631. LOG_ERROR("Offset 0x%8.8" PRIx32 " is out of range of the flash bank",
  632. offset);
  633. return ERROR_COMMAND_ARGUMENT_INVALID;
  634. }
  635. if (fileio_open(&fileio, CMD_ARGV[1], FILEIO_READ, FILEIO_BINARY) != ERROR_OK)
  636. return ERROR_FAIL;
  637. size_t filesize;
  638. retval = fileio_size(fileio, &filesize);
  639. if (retval != ERROR_OK) {
  640. fileio_close(fileio);
  641. return retval;
  642. }
  643. length = MIN(filesize, bank->size - offset);
  644. if (!length) {
  645. LOG_INFO("Nothing to write to flash bank");
  646. fileio_close(fileio);
  647. return ERROR_OK;
  648. }
  649. if (length != filesize)
  650. LOG_INFO("File content exceeds flash bank size. Only writing the "
  651. "first %zu bytes of the file", length);
  652. target_addr_t start_addr = bank->base + offset;
  653. target_addr_t aligned_start = flash_write_align_start(bank, start_addr);
  654. target_addr_t end_addr = start_addr + length - 1;
  655. target_addr_t aligned_end = flash_write_align_end(bank, end_addr);
  656. uint32_t aligned_size = aligned_end + 1 - aligned_start;
  657. uint32_t padding_at_start = start_addr - aligned_start;
  658. uint32_t padding_at_end = aligned_end - end_addr;
  659. buffer = malloc(aligned_size);
  660. if (!buffer) {
  661. fileio_close(fileio);
  662. LOG_ERROR("Out of memory");
  663. return ERROR_FAIL;
  664. }
  665. if (padding_at_start) {
  666. memset(buffer, bank->default_padded_value, padding_at_start);
  667. LOG_WARNING("Start offset 0x%08" PRIx32
  668. " breaks the required alignment of flash bank %s",
  669. offset, bank->name);
  670. LOG_WARNING("Padding %" PRIu32 " bytes from " TARGET_ADDR_FMT,
  671. padding_at_start, aligned_start);
  672. }
  673. uint8_t *ptr = buffer + padding_at_start;
  674. size_t buf_cnt;
  675. if (fileio_read(fileio, length, ptr, &buf_cnt) != ERROR_OK) {
  676. free(buffer);
  677. fileio_close(fileio);
  678. return ERROR_FAIL;
  679. }
  680. if (buf_cnt != length) {
  681. LOG_ERROR("Short read");
  682. free(buffer);
  683. return ERROR_FAIL;
  684. }
  685. ptr += length;
  686. if (padding_at_end) {
  687. memset(ptr, bank->default_padded_value, padding_at_end);
  688. LOG_INFO("Padding at " TARGET_ADDR_FMT " with %" PRIu32
  689. " bytes (bank write end alignment)",
  690. end_addr + 1, padding_at_end);
  691. }
  692. retval = flash_driver_write(bank, buffer, aligned_start - bank->base, aligned_size);
  693. free(buffer);
  694. if ((retval == ERROR_OK) && (duration_measure(&bench) == ERROR_OK)) {
  695. command_print(CMD, "wrote %zu bytes from file %s to flash bank %u"
  696. " at offset 0x%8.8" PRIx32 " in %fs (%0.3f KiB/s)",
  697. length, CMD_ARGV[1], bank->bank_number, offset,
  698. duration_elapsed(&bench), duration_kbps(&bench, length));
  699. }
  700. fileio_close(fileio);
  701. return retval;
  702. }
  703. COMMAND_HANDLER(handle_flash_read_bank_command)
  704. {
  705. uint32_t offset;
  706. uint8_t *buffer;
  707. struct fileio *fileio;
  708. uint32_t length;
  709. size_t written;
  710. if (CMD_ARGC < 2 || CMD_ARGC > 4)
  711. return ERROR_COMMAND_SYNTAX_ERROR;
  712. struct duration bench;
  713. duration_start(&bench);
  714. struct flash_bank *p;
  715. int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &p);
  716. if (retval != ERROR_OK)
  717. return retval;
  718. offset = 0;
  719. if (CMD_ARGC > 2)
  720. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], offset);
  721. if (offset > p->size) {
  722. LOG_ERROR("Offset 0x%8.8" PRIx32 " is out of range of the flash bank",
  723. offset);
  724. return ERROR_COMMAND_ARGUMENT_INVALID;
  725. }
  726. length = p->size - offset;
  727. if (CMD_ARGC > 3)
  728. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[3], length);
  729. if (offset + length > p->size) {
  730. LOG_ERROR("Length of %" PRIu32 " bytes with offset 0x%8.8" PRIx32
  731. " is out of range of the flash bank", length, offset);
  732. return ERROR_COMMAND_ARGUMENT_INVALID;
  733. }
  734. buffer = malloc(length);
  735. if (!buffer) {
  736. LOG_ERROR("Out of memory");
  737. return ERROR_FAIL;
  738. }
  739. retval = flash_driver_read(p, buffer, offset, length);
  740. if (retval != ERROR_OK) {
  741. LOG_ERROR("Read error");
  742. free(buffer);
  743. return retval;
  744. }
  745. retval = fileio_open(&fileio, CMD_ARGV[1], FILEIO_WRITE, FILEIO_BINARY);
  746. if (retval != ERROR_OK) {
  747. LOG_ERROR("Could not open file");
  748. free(buffer);
  749. return retval;
  750. }
  751. retval = fileio_write(fileio, length, buffer, &written);
  752. fileio_close(fileio);
  753. free(buffer);
  754. if (retval != ERROR_OK) {
  755. LOG_ERROR("Could not write file");
  756. return ERROR_FAIL;
  757. }
  758. if (duration_measure(&bench) == ERROR_OK)
  759. command_print(CMD, "wrote %zd bytes to file %s from flash bank %u"
  760. " at offset 0x%8.8" PRIx32 " in %fs (%0.3f KiB/s)",
  761. written, CMD_ARGV[1], p->bank_number, offset,
  762. duration_elapsed(&bench), duration_kbps(&bench, written));
  763. return retval;
  764. }
  765. COMMAND_HANDLER(handle_flash_verify_bank_command)
  766. {
  767. uint32_t offset;
  768. uint8_t *buffer_file, *buffer_flash;
  769. struct fileio *fileio;
  770. size_t read_cnt;
  771. size_t filesize;
  772. size_t length;
  773. int differ;
  774. if (CMD_ARGC < 2 || CMD_ARGC > 3)
  775. return ERROR_COMMAND_SYNTAX_ERROR;
  776. struct duration bench;
  777. duration_start(&bench);
  778. struct flash_bank *p;
  779. int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &p);
  780. if (retval != ERROR_OK)
  781. return retval;
  782. offset = 0;
  783. if (CMD_ARGC > 2)
  784. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], offset);
  785. if (offset > p->size) {
  786. LOG_ERROR("Offset 0x%8.8" PRIx32 " is out of range of the flash bank",
  787. offset);
  788. return ERROR_COMMAND_ARGUMENT_INVALID;
  789. }
  790. retval = fileio_open(&fileio, CMD_ARGV[1], FILEIO_READ, FILEIO_BINARY);
  791. if (retval != ERROR_OK) {
  792. LOG_ERROR("Could not open file");
  793. return retval;
  794. }
  795. retval = fileio_size(fileio, &filesize);
  796. if (retval != ERROR_OK) {
  797. fileio_close(fileio);
  798. return retval;
  799. }
  800. length = MIN(filesize, p->size - offset);
  801. if (!length) {
  802. LOG_INFO("Nothing to compare with flash bank");
  803. fileio_close(fileio);
  804. return ERROR_OK;
  805. }
  806. if (length != filesize)
  807. LOG_INFO("File content exceeds flash bank size. Only comparing the "
  808. "first %zu bytes of the file", length);
  809. buffer_file = malloc(length);
  810. if (!buffer_file) {
  811. LOG_ERROR("Out of memory");
  812. fileio_close(fileio);
  813. return ERROR_FAIL;
  814. }
  815. retval = fileio_read(fileio, length, buffer_file, &read_cnt);
  816. fileio_close(fileio);
  817. if (retval != ERROR_OK) {
  818. LOG_ERROR("File read failure");
  819. free(buffer_file);
  820. return retval;
  821. }
  822. if (read_cnt != length) {
  823. LOG_ERROR("Short read");
  824. free(buffer_file);
  825. return ERROR_FAIL;
  826. }
  827. buffer_flash = malloc(length);
  828. if (!buffer_flash) {
  829. LOG_ERROR("Out of memory");
  830. free(buffer_file);
  831. return ERROR_FAIL;
  832. }
  833. retval = flash_driver_read(p, buffer_flash, offset, length);
  834. if (retval != ERROR_OK) {
  835. LOG_ERROR("Flash read error");
  836. free(buffer_flash);
  837. free(buffer_file);
  838. return retval;
  839. }
  840. if (duration_measure(&bench) == ERROR_OK)
  841. command_print(CMD, "read %zd bytes from file %s and flash bank %u"
  842. " at offset 0x%8.8" PRIx32 " in %fs (%0.3f KiB/s)",
  843. length, CMD_ARGV[1], p->bank_number, offset,
  844. duration_elapsed(&bench), duration_kbps(&bench, length));
  845. differ = memcmp(buffer_file, buffer_flash, length);
  846. command_print(CMD, "contents %s", differ ? "differ" : "match");
  847. if (differ) {
  848. uint32_t t;
  849. int diffs = 0;
  850. for (t = 0; t < length; t++) {
  851. if (buffer_flash[t] == buffer_file[t])
  852. continue;
  853. command_print(CMD, "diff %d address 0x%08" PRIx32 ". Was 0x%02x instead of 0x%02x",
  854. diffs, t + offset, buffer_flash[t], buffer_file[t]);
  855. if (diffs++ >= 127) {
  856. command_print(CMD, "More than 128 errors, the rest are not printed.");
  857. break;
  858. }
  859. keep_alive();
  860. }
  861. }
  862. free(buffer_flash);
  863. free(buffer_file);
  864. return differ ? ERROR_FAIL : ERROR_OK;
  865. }
  866. void flash_set_dirty(void)
  867. {
  868. struct flash_bank *c;
  869. /* set all flash to require erasing */
  870. for (c = flash_bank_list(); c; c = c->next) {
  871. for (unsigned int i = 0; i < c->num_sectors; i++)
  872. c->sectors[i].is_erased = 0;
  873. }
  874. }
  875. COMMAND_HANDLER(handle_flash_padded_value_command)
  876. {
  877. if (CMD_ARGC != 2)
  878. return ERROR_COMMAND_SYNTAX_ERROR;
  879. struct flash_bank *p;
  880. int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &p);
  881. if (retval != ERROR_OK)
  882. return retval;
  883. COMMAND_PARSE_NUMBER(u8, CMD_ARGV[1], p->default_padded_value);
  884. command_print(CMD, "Default padded value set to 0x%" PRIx8 " for flash bank %u",
  885. p->default_padded_value, p->bank_number);
  886. return retval;
  887. }
  888. static const struct command_registration flash_exec_command_handlers[] = {
  889. {
  890. .name = "probe",
  891. .handler = handle_flash_probe_command,
  892. .mode = COMMAND_EXEC,
  893. .usage = "bank_id",
  894. .help = "Identify a flash bank.",
  895. },
  896. {
  897. .name = "info",
  898. .handler = handle_flash_info_command,
  899. .mode = COMMAND_EXEC,
  900. .usage = "bank_id ['sectors']",
  901. .help = "Print information about a flash bank.",
  902. },
  903. {
  904. .name = "erase_check",
  905. .handler = handle_flash_erase_check_command,
  906. .mode = COMMAND_EXEC,
  907. .usage = "bank_id",
  908. .help = "Check erase state of all blocks in a "
  909. "flash bank.",
  910. },
  911. {
  912. .name = "erase_sector",
  913. .handler = handle_flash_erase_command,
  914. .mode = COMMAND_EXEC,
  915. .usage = "bank_id first_sector_num (last_sector_num|'last')",
  916. .help = "Erase a range of sectors in a flash bank.",
  917. },
  918. {
  919. .name = "erase_address",
  920. .handler = handle_flash_erase_address_command,
  921. .mode = COMMAND_EXEC,
  922. .usage = "['pad'] ['unlock'] address length",
  923. .help = "Erase flash sectors starting at address and "
  924. "continuing for length bytes. If 'pad' is specified, "
  925. "data outside that range may also be erased: the start "
  926. "address may be decreased, and length increased, so "
  927. "that all of the first and last sectors are erased. "
  928. "If 'unlock' is specified, then the flash is unprotected "
  929. "before erasing.",
  930. },
  931. {
  932. .name = "filld",
  933. .handler = handle_flash_fill_command,
  934. .mode = COMMAND_EXEC,
  935. .usage = "address value n",
  936. .help = "Fill n double-words with 64-bit value, starting at "
  937. "word address. (No autoerase.)",
  938. },
  939. {
  940. .name = "fillw",
  941. .handler = handle_flash_fill_command,
  942. .mode = COMMAND_EXEC,
  943. .usage = "address value n",
  944. .help = "Fill n words with 32-bit value, starting at "
  945. "word address. (No autoerase.)",
  946. },
  947. {
  948. .name = "fillh",
  949. .handler = handle_flash_fill_command,
  950. .mode = COMMAND_EXEC,
  951. .usage = "address value n",
  952. .help = "Fill n halfwords with 16-bit value, starting at "
  953. "word address. (No autoerase.)",
  954. },
  955. {
  956. .name = "fillb",
  957. .handler = handle_flash_fill_command,
  958. .mode = COMMAND_EXEC,
  959. .usage = "address value n",
  960. .help = "Fill n bytes with 8-bit value, starting at "
  961. "word address. (No autoerase.)",
  962. },
  963. {
  964. .name = "mdb",
  965. .handler = handle_flash_md_command,
  966. .mode = COMMAND_EXEC,
  967. .usage = "address [count]",
  968. .help = "Display bytes from flash.",
  969. },
  970. {
  971. .name = "mdh",
  972. .handler = handle_flash_md_command,
  973. .mode = COMMAND_EXEC,
  974. .usage = "address [count]",
  975. .help = "Display half-words from flash.",
  976. },
  977. {
  978. .name = "mdw",
  979. .handler = handle_flash_md_command,
  980. .mode = COMMAND_EXEC,
  981. .usage = "address [count]",
  982. .help = "Display words from flash.",
  983. },
  984. {
  985. .name = "write_bank",
  986. .handler = handle_flash_write_bank_command,
  987. .mode = COMMAND_EXEC,
  988. .usage = "bank_id filename [offset]",
  989. .help = "Write binary data from file to flash bank. Allow optional "
  990. "offset from beginning of the bank (defaults to zero).",
  991. },
  992. {
  993. .name = "write_image",
  994. .handler = handle_flash_write_image_command,
  995. .mode = COMMAND_EXEC,
  996. .usage = "[erase] [unlock] filename [offset [file_type]]",
  997. .help = "Write an image to flash. Optionally first unprotect "
  998. "and/or erase the region to be used. Allow optional "
  999. "offset from beginning of bank (defaults to zero)",
  1000. },
  1001. {
  1002. .name = "verify_image",
  1003. .handler = handle_flash_verify_image_command,
  1004. .mode = COMMAND_EXEC,
  1005. .usage = "filename [offset [file_type]]",
  1006. .help = "Verify an image against flash. Allow optional "
  1007. "offset from beginning of bank (defaults to zero)",
  1008. },
  1009. {
  1010. .name = "read_bank",
  1011. .handler = handle_flash_read_bank_command,
  1012. .mode = COMMAND_EXEC,
  1013. .usage = "bank_id filename [offset [length]]",
  1014. .help = "Read binary data from flash bank to file. Allow optional "
  1015. "offset from beginning of the bank (defaults to zero).",
  1016. },
  1017. {
  1018. .name = "verify_bank",
  1019. .handler = handle_flash_verify_bank_command,
  1020. .mode = COMMAND_EXEC,
  1021. .usage = "bank_id filename [offset]",
  1022. .help = "Compare the contents of a file with the contents of the "
  1023. "flash bank. Allow optional offset from beginning of the bank "
  1024. "(defaults to zero).",
  1025. },
  1026. {
  1027. .name = "protect",
  1028. .handler = handle_flash_protect_command,
  1029. .mode = COMMAND_EXEC,
  1030. .usage = "bank_id first_block [last_block|'last'] "
  1031. "('on'|'off')",
  1032. .help = "Turn protection on or off for a range of protection "
  1033. "blocks or sectors in a given flash bank. "
  1034. "See 'flash info' output for a list of blocks.",
  1035. },
  1036. {
  1037. .name = "padded_value",
  1038. .handler = handle_flash_padded_value_command,
  1039. .mode = COMMAND_EXEC,
  1040. .usage = "bank_id value",
  1041. .help = "Set default flash padded value",
  1042. },
  1043. COMMAND_REGISTRATION_DONE
  1044. };
  1045. static int flash_init_drivers(struct command_context *cmd_ctx)
  1046. {
  1047. if (!flash_bank_list())
  1048. return ERROR_OK;
  1049. return register_commands(cmd_ctx, "flash", flash_exec_command_handlers);
  1050. }
  1051. COMMAND_HANDLER(handle_flash_bank_command)
  1052. {
  1053. if (CMD_ARGC < 7) {
  1054. LOG_ERROR("usage: flash bank <name> <driver> "
  1055. "<base> <size> <chip_width> <bus_width> <target>");
  1056. return ERROR_COMMAND_SYNTAX_ERROR;
  1057. }
  1058. /* save bank name and advance arguments for compatibility */
  1059. const char *bank_name = *CMD_ARGV++;
  1060. CMD_ARGC--;
  1061. struct target *target = get_target(CMD_ARGV[5]);
  1062. if (!target) {
  1063. LOG_ERROR("target '%s' not defined", CMD_ARGV[5]);
  1064. return ERROR_FAIL;
  1065. }
  1066. const char *driver_name = CMD_ARGV[0];
  1067. const struct flash_driver *driver = flash_driver_find_by_name(driver_name);
  1068. if (!driver) {
  1069. /* no matching flash driver found */
  1070. LOG_ERROR("flash driver '%s' not found", driver_name);
  1071. return ERROR_FAIL;
  1072. }
  1073. /* check the flash bank name is unique */
  1074. if (get_flash_bank_by_name_noprobe(bank_name) != NULL) {
  1075. /* flash bank name already exists */
  1076. LOG_ERROR("flash bank name '%s' already exists", bank_name);
  1077. return ERROR_FAIL;
  1078. }
  1079. /* register flash specific commands */
  1080. if (driver->commands) {
  1081. int retval = register_commands(CMD_CTX, NULL,
  1082. driver->commands);
  1083. if (retval != ERROR_OK) {
  1084. LOG_ERROR("couldn't register '%s' commands",
  1085. driver_name);
  1086. return ERROR_FAIL;
  1087. }
  1088. }
  1089. struct flash_bank *c = calloc(1, sizeof(*c));
  1090. c->name = strdup(bank_name);
  1091. c->target = target;
  1092. c->driver = driver;
  1093. COMMAND_PARSE_NUMBER(target_addr, CMD_ARGV[1], c->base);
  1094. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], c->size);
  1095. COMMAND_PARSE_NUMBER(uint, CMD_ARGV[3], c->chip_width);
  1096. COMMAND_PARSE_NUMBER(uint, CMD_ARGV[4], c->bus_width);
  1097. c->default_padded_value = c->erased_value = 0xff;
  1098. c->minimal_write_gap = FLASH_WRITE_GAP_SECTOR;
  1099. int retval;
  1100. retval = CALL_COMMAND_HANDLER(driver->flash_bank_command, c);
  1101. if (retval != ERROR_OK) {
  1102. LOG_ERROR("'%s' driver rejected flash bank at " TARGET_ADDR_FMT
  1103. "; usage: %s", driver_name, c->base, driver->usage);
  1104. free(c);
  1105. return retval;
  1106. }
  1107. if (!driver->usage)
  1108. LOG_DEBUG("'%s' driver usage field missing", driver_name);
  1109. flash_bank_add(c);
  1110. return ERROR_OK;
  1111. }
  1112. COMMAND_HANDLER(handle_flash_banks_command)
  1113. {
  1114. if (CMD_ARGC != 0)
  1115. return ERROR_COMMAND_SYNTAX_ERROR;
  1116. unsigned n = 0;
  1117. for (struct flash_bank *p = flash_bank_list(); p; p = p->next, n++) {
  1118. command_print(CMD, "#%d : %s (%s) at " TARGET_ADDR_FMT ", size 0x%8.8" PRIx32 ", "
  1119. "buswidth %u, chipwidth %u", p->bank_number,
  1120. p->name, p->driver->name, p->base, p->size,
  1121. p->bus_width, p->chip_width);
  1122. }
  1123. return ERROR_OK;
  1124. }
  1125. static int jim_flash_list(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
  1126. {
  1127. if (argc != 1) {
  1128. Jim_WrongNumArgs(interp, 1, argv,
  1129. "no arguments to 'flash list' command");
  1130. return JIM_ERR;
  1131. }
  1132. Jim_Obj *list = Jim_NewListObj(interp, NULL, 0);
  1133. for (struct flash_bank *p = flash_bank_list(); p; p = p->next) {
  1134. Jim_Obj *elem = Jim_NewListObj(interp, NULL, 0);
  1135. Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "name", -1));
  1136. Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, p->driver->name, -1));
  1137. Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "base", -1));
  1138. Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->base));
  1139. Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "size", -1));
  1140. Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->size));
  1141. Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "bus_width", -1));
  1142. Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->bus_width));
  1143. Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "chip_width", -1));
  1144. Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->chip_width));
  1145. Jim_ListAppendElement(interp, list, elem);
  1146. }
  1147. Jim_SetResult(interp, list);
  1148. return JIM_OK;
  1149. }
  1150. COMMAND_HANDLER(handle_flash_init_command)
  1151. {
  1152. if (CMD_ARGC != 0)
  1153. return ERROR_COMMAND_SYNTAX_ERROR;
  1154. static bool flash_initialized;
  1155. if (flash_initialized) {
  1156. LOG_INFO("'flash init' has already been called");
  1157. return ERROR_OK;
  1158. }
  1159. flash_initialized = true;
  1160. LOG_DEBUG("Initializing flash devices...");
  1161. return flash_init_drivers(CMD_CTX);
  1162. }
  1163. static const struct command_registration flash_config_command_handlers[] = {
  1164. {
  1165. .name = "bank",
  1166. .handler = handle_flash_bank_command,
  1167. .mode = COMMAND_CONFIG,
  1168. .usage = "bank_id driver_name base_address size_bytes "
  1169. "chip_width_bytes bus_width_bytes target "
  1170. "[driver_options ...]",
  1171. .help = "Define a new bank with the given name, "
  1172. "using the specified NOR flash driver.",
  1173. },
  1174. {
  1175. .name = "init",
  1176. .mode = COMMAND_CONFIG,
  1177. .handler = handle_flash_init_command,
  1178. .help = "Initialize flash devices.",
  1179. .usage = "",
  1180. },
  1181. {
  1182. .name = "banks",
  1183. .mode = COMMAND_ANY,
  1184. .handler = handle_flash_banks_command,
  1185. .help = "Display table with information about flash banks.",
  1186. .usage = "",
  1187. },
  1188. {
  1189. .name = "list",
  1190. .mode = COMMAND_ANY,
  1191. .jim_handler = jim_flash_list,
  1192. .help = "Returns a list of details about the flash banks.",
  1193. },
  1194. COMMAND_REGISTRATION_DONE
  1195. };
  1196. static const struct command_registration flash_command_handlers[] = {
  1197. {
  1198. .name = "flash",
  1199. .mode = COMMAND_ANY,
  1200. .help = "NOR flash command group",
  1201. .chain = flash_config_command_handlers,
  1202. .usage = "",
  1203. },
  1204. COMMAND_REGISTRATION_DONE
  1205. };
  1206. int flash_register_commands(struct command_context *cmd_ctx)
  1207. {
  1208. return register_commands(cmd_ctx, NULL, flash_command_handlers);
  1209. }