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.
 
 
 
 
 
 

414 lines
11 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2015 Robert Jordens <jordens@gmail.com> *
  3. * *
  4. * This program is free software; you can redistribute it and/or modify *
  5. * it under the terms of the GNU General Public License as published by *
  6. * the Free Software Foundation; either version 2 of the License, or *
  7. * (at your option) any later version. *
  8. * *
  9. * This program is distributed in the hope that it will be useful, *
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  12. * GNU General Public License for more details. *
  13. * *
  14. * You should have received a copy of the GNU General Public License *
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>. *
  16. ***************************************************************************/
  17. #ifdef HAVE_CONFIG_H
  18. #include "config.h"
  19. #endif
  20. #include "imp.h"
  21. #include <jtag/jtag.h>
  22. #include <flash/nor/spi.h>
  23. #include <helper/time_support.h>
  24. #define JTAGSPI_MAX_TIMEOUT 3000
  25. struct jtagspi_flash_bank {
  26. struct jtag_tap *tap;
  27. const struct flash_device *dev;
  28. int probed;
  29. uint32_t ir;
  30. uint32_t dr_len;
  31. };
  32. FLASH_BANK_COMMAND_HANDLER(jtagspi_flash_bank_command)
  33. {
  34. struct jtagspi_flash_bank *info;
  35. if (CMD_ARGC < 8)
  36. return ERROR_COMMAND_SYNTAX_ERROR;
  37. info = malloc(sizeof(struct jtagspi_flash_bank));
  38. if (info == NULL) {
  39. LOG_ERROR("no memory for flash bank info");
  40. return ERROR_FAIL;
  41. }
  42. bank->driver_priv = info;
  43. info->tap = NULL;
  44. info->probed = 0;
  45. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[6], info->ir);
  46. COMMAND_PARSE_NUMBER(u32, CMD_ARGV[7], info->dr_len);
  47. return ERROR_OK;
  48. }
  49. static void jtagspi_set_ir(struct flash_bank *bank)
  50. {
  51. struct jtagspi_flash_bank *info = bank->driver_priv;
  52. struct scan_field field;
  53. uint8_t buf[4];
  54. if (buf_get_u32(info->tap->cur_instr, 0, info->tap->ir_length) == info->ir)
  55. return;
  56. LOG_DEBUG("loading jtagspi ir");
  57. buf_set_u32(buf, 0, info->tap->ir_length, info->ir);
  58. field.num_bits = info->tap->ir_length;
  59. field.out_value = buf;
  60. field.in_value = NULL;
  61. jtag_add_ir_scan(info->tap, &field, TAP_IDLE);
  62. }
  63. static void flip_u8(uint8_t *in, uint8_t *out, int len)
  64. {
  65. for (int i = 0; i < len; i++)
  66. out[i] = flip_u32(in[i], 8);
  67. }
  68. static int jtagspi_cmd(struct flash_bank *bank, uint8_t cmd,
  69. uint32_t *addr, uint8_t *data, int len)
  70. {
  71. struct jtagspi_flash_bank *info = bank->driver_priv;
  72. struct scan_field fields[3];
  73. uint8_t cmd_buf[4];
  74. uint8_t *data_buf;
  75. int is_read, lenb, n;
  76. /* LOG_DEBUG("cmd=0x%02x len=%i", cmd, len); */
  77. n = 0;
  78. fields[n].num_bits = 8;
  79. cmd_buf[0] = cmd;
  80. if (addr) {
  81. h_u24_to_be(cmd_buf + 1, *addr);
  82. fields[n].num_bits += 24;
  83. }
  84. flip_u8(cmd_buf, cmd_buf, 4);
  85. fields[n].out_value = cmd_buf;
  86. fields[n].in_value = NULL;
  87. n++;
  88. is_read = (len < 0);
  89. if (is_read)
  90. len = -len;
  91. lenb = DIV_ROUND_UP(len, 8);
  92. data_buf = malloc(lenb);
  93. if (lenb > 0) {
  94. if (data_buf == NULL) {
  95. LOG_ERROR("no memory for spi buffer");
  96. return ERROR_FAIL;
  97. }
  98. if (is_read) {
  99. fields[n].num_bits = info->dr_len;
  100. fields[n].out_value = NULL;
  101. fields[n].in_value = NULL;
  102. n++;
  103. fields[n].out_value = NULL;
  104. fields[n].in_value = data_buf;
  105. } else {
  106. flip_u8(data, data_buf, lenb);
  107. fields[n].out_value = data_buf;
  108. fields[n].in_value = NULL;
  109. }
  110. fields[n].num_bits = len;
  111. n++;
  112. }
  113. jtagspi_set_ir(bank);
  114. jtag_add_dr_scan(info->tap, n, fields, TAP_IDLE);
  115. jtag_execute_queue();
  116. if (is_read)
  117. flip_u8(data_buf, data, lenb);
  118. free(data_buf);
  119. return ERROR_OK;
  120. }
  121. static int jtagspi_probe(struct flash_bank *bank)
  122. {
  123. struct jtagspi_flash_bank *info = bank->driver_priv;
  124. struct flash_sector *sectors;
  125. uint8_t in_buf[3];
  126. uint32_t id;
  127. if (info->probed)
  128. free(bank->sectors);
  129. info->probed = 0;
  130. if (bank->target->tap == NULL) {
  131. LOG_ERROR("Target has no JTAG tap");
  132. return ERROR_FAIL;
  133. }
  134. info->tap = bank->target->tap;
  135. jtagspi_cmd(bank, SPIFLASH_READ_ID, NULL, in_buf, -24);
  136. /* the table in spi.c has the manufacturer byte (first) as the lsb */
  137. id = le_to_h_u24(in_buf);
  138. info->dev = NULL;
  139. for (const struct flash_device *p = flash_devices; p->name ; p++)
  140. if (p->device_id == id) {
  141. info->dev = p;
  142. break;
  143. }
  144. if (!(info->dev)) {
  145. LOG_ERROR("Unknown flash device (ID 0x%08" PRIx32 ")", id);
  146. return ERROR_FAIL;
  147. }
  148. LOG_INFO("Found flash device \'%s\' (ID 0x%08" PRIx32 ")",
  149. info->dev->name, info->dev->device_id);
  150. /* Set correct size value */
  151. bank->size = info->dev->size_in_bytes;
  152. /* create and fill sectors array */
  153. bank->num_sectors =
  154. info->dev->size_in_bytes / info->dev->sectorsize;
  155. sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
  156. if (sectors == NULL) {
  157. LOG_ERROR("not enough memory");
  158. return ERROR_FAIL;
  159. }
  160. for (int sector = 0; sector < bank->num_sectors; sector++) {
  161. sectors[sector].offset = sector * info->dev->sectorsize;
  162. sectors[sector].size = info->dev->sectorsize;
  163. sectors[sector].is_erased = -1;
  164. sectors[sector].is_protected = 0;
  165. }
  166. bank->sectors = sectors;
  167. info->probed = 1;
  168. return ERROR_OK;
  169. }
  170. static void jtagspi_read_status(struct flash_bank *bank, uint32_t *status)
  171. {
  172. uint8_t buf;
  173. jtagspi_cmd(bank, SPIFLASH_READ_STATUS, NULL, &buf, -8);
  174. *status = buf;
  175. /* LOG_DEBUG("status=0x%08" PRIx32, *status); */
  176. }
  177. static int jtagspi_wait(struct flash_bank *bank, int timeout_ms)
  178. {
  179. uint32_t status;
  180. long long t0 = timeval_ms();
  181. long long dt;
  182. do {
  183. dt = timeval_ms() - t0;
  184. jtagspi_read_status(bank, &status);
  185. if ((status & SPIFLASH_BSY_BIT) == 0) {
  186. LOG_DEBUG("waited %lld ms", dt);
  187. return ERROR_OK;
  188. }
  189. alive_sleep(1);
  190. } while (dt <= timeout_ms);
  191. LOG_ERROR("timeout, device still busy");
  192. return ERROR_FAIL;
  193. }
  194. static int jtagspi_write_enable(struct flash_bank *bank)
  195. {
  196. uint32_t status;
  197. jtagspi_cmd(bank, SPIFLASH_WRITE_ENABLE, NULL, NULL, 0);
  198. jtagspi_read_status(bank, &status);
  199. if ((status & SPIFLASH_WE_BIT) == 0) {
  200. LOG_ERROR("Cannot enable write to flash. Status=0x%08" PRIx32, status);
  201. return ERROR_FAIL;
  202. }
  203. return ERROR_OK;
  204. }
  205. static int jtagspi_bulk_erase(struct flash_bank *bank)
  206. {
  207. struct jtagspi_flash_bank *info = bank->driver_priv;
  208. int retval;
  209. long long t0 = timeval_ms();
  210. retval = jtagspi_write_enable(bank);
  211. if (retval != ERROR_OK)
  212. return retval;
  213. jtagspi_cmd(bank, info->dev->chip_erase_cmd, NULL, NULL, 0);
  214. retval = jtagspi_wait(bank, bank->num_sectors*JTAGSPI_MAX_TIMEOUT);
  215. LOG_INFO("took %lld ms", timeval_ms() - t0);
  216. return retval;
  217. }
  218. static int jtagspi_sector_erase(struct flash_bank *bank, int sector)
  219. {
  220. struct jtagspi_flash_bank *info = bank->driver_priv;
  221. int retval;
  222. long long t0 = timeval_ms();
  223. retval = jtagspi_write_enable(bank);
  224. if (retval != ERROR_OK)
  225. return retval;
  226. jtagspi_cmd(bank, info->dev->erase_cmd, &bank->sectors[sector].offset, NULL, 0);
  227. retval = jtagspi_wait(bank, JTAGSPI_MAX_TIMEOUT);
  228. LOG_INFO("sector %d took %lld ms", sector, timeval_ms() - t0);
  229. return retval;
  230. }
  231. static int jtagspi_erase(struct flash_bank *bank, int first, int last)
  232. {
  233. int sector;
  234. struct jtagspi_flash_bank *info = bank->driver_priv;
  235. int retval = ERROR_OK;
  236. LOG_DEBUG("erase from sector %d to sector %d", first, last);
  237. if ((first < 0) || (last < first) || (last >= bank->num_sectors)) {
  238. LOG_ERROR("Flash sector invalid");
  239. return ERROR_FLASH_SECTOR_INVALID;
  240. }
  241. if (!(info->probed)) {
  242. LOG_ERROR("Flash bank not probed");
  243. return ERROR_FLASH_BANK_NOT_PROBED;
  244. }
  245. for (sector = first; sector <= last; sector++) {
  246. if (bank->sectors[sector].is_protected) {
  247. LOG_ERROR("Flash sector %d protected", sector);
  248. return ERROR_FAIL;
  249. }
  250. }
  251. if (first == 0 && last == (bank->num_sectors - 1)
  252. && info->dev->chip_erase_cmd != info->dev->erase_cmd) {
  253. LOG_DEBUG("Trying bulk erase.");
  254. retval = jtagspi_bulk_erase(bank);
  255. if (retval == ERROR_OK)
  256. return retval;
  257. else
  258. LOG_WARNING("Bulk flash erase failed. Falling back to sector erase.");
  259. }
  260. for (sector = first; sector <= last; sector++) {
  261. retval = jtagspi_sector_erase(bank, sector);
  262. if (retval != ERROR_OK) {
  263. LOG_ERROR("Sector erase failed.");
  264. break;
  265. }
  266. }
  267. return retval;
  268. }
  269. static int jtagspi_protect(struct flash_bank *bank, int set, int first, int last)
  270. {
  271. int sector;
  272. if ((first < 0) || (last < first) || (last >= bank->num_sectors)) {
  273. LOG_ERROR("Flash sector invalid");
  274. return ERROR_FLASH_SECTOR_INVALID;
  275. }
  276. for (sector = first; sector <= last; sector++)
  277. bank->sectors[sector].is_protected = set;
  278. return ERROR_OK;
  279. }
  280. static int jtagspi_protect_check(struct flash_bank *bank)
  281. {
  282. return ERROR_OK;
  283. }
  284. static int jtagspi_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
  285. {
  286. struct jtagspi_flash_bank *info = bank->driver_priv;
  287. if (!(info->probed)) {
  288. LOG_ERROR("Flash bank not yet probed.");
  289. return ERROR_FLASH_BANK_NOT_PROBED;
  290. }
  291. jtagspi_cmd(bank, SPIFLASH_READ, &offset, buffer, -count*8);
  292. return ERROR_OK;
  293. }
  294. static int jtagspi_page_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
  295. {
  296. int retval;
  297. retval = jtagspi_write_enable(bank);
  298. if (retval != ERROR_OK)
  299. return retval;
  300. jtagspi_cmd(bank, SPIFLASH_PAGE_PROGRAM, &offset, (uint8_t *) buffer, count*8);
  301. return jtagspi_wait(bank, JTAGSPI_MAX_TIMEOUT);
  302. }
  303. static int jtagspi_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
  304. {
  305. struct jtagspi_flash_bank *info = bank->driver_priv;
  306. int retval;
  307. uint32_t n;
  308. if (!(info->probed)) {
  309. LOG_ERROR("Flash bank not yet probed.");
  310. return ERROR_FLASH_BANK_NOT_PROBED;
  311. }
  312. for (n = 0; n < count; n += info->dev->pagesize) {
  313. retval = jtagspi_page_write(bank, buffer + n, offset + n,
  314. MIN(count - n, info->dev->pagesize));
  315. if (retval != ERROR_OK) {
  316. LOG_ERROR("page write error");
  317. return retval;
  318. }
  319. LOG_DEBUG("wrote page at 0x%08" PRIx32, offset + n);
  320. }
  321. return ERROR_OK;
  322. }
  323. static int jtagspi_info(struct flash_bank *bank, char *buf, int buf_size)
  324. {
  325. struct jtagspi_flash_bank *info = bank->driver_priv;
  326. if (!(info->probed)) {
  327. snprintf(buf, buf_size, "\nJTAGSPI flash bank not probed yet\n");
  328. return ERROR_OK;
  329. }
  330. snprintf(buf, buf_size, "\nSPIFI flash information:\n"
  331. " Device \'%s\' (ID 0x%08" PRIx32 ")\n",
  332. info->dev->name, info->dev->device_id);
  333. return ERROR_OK;
  334. }
  335. struct flash_driver jtagspi_flash = {
  336. .name = "jtagspi",
  337. .flash_bank_command = jtagspi_flash_bank_command,
  338. .erase = jtagspi_erase,
  339. .protect = jtagspi_protect,
  340. .write = jtagspi_write,
  341. .read = jtagspi_read,
  342. .probe = jtagspi_probe,
  343. .auto_probe = jtagspi_probe,
  344. .erase_check = default_flash_blank_check,
  345. .protect_check = jtagspi_protect_check,
  346. .info = jtagspi_info
  347. };