flash/stm32l4x: support STM32WBA5xx devices
[openocd.git] / src / flash / nor / jtagspi.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2
3 /***************************************************************************
4 * Copyright (C) 2015 Robert Jordens <jordens@gmail.com> *
5 ***************************************************************************/
6
7 #ifdef HAVE_CONFIG_H
8 #include "config.h"
9 #endif
10
11 #include "imp.h"
12 #include <jtag/jtag.h>
13 #include <flash/nor/spi.h>
14 #include <helper/time_support.h>
15
16 #define JTAGSPI_MAX_TIMEOUT 3000
17
18
19 struct jtagspi_flash_bank {
20 struct jtag_tap *tap;
21 struct flash_device dev;
22 char devname[32];
23 bool probed;
24 bool always_4byte; /* use always 4-byte address except for basic read 0x03 */
25 uint32_t ir;
26 unsigned int addr_len; /* address length in bytes */
27 };
28
29 FLASH_BANK_COMMAND_HANDLER(jtagspi_flash_bank_command)
30 {
31 struct jtagspi_flash_bank *info;
32
33 if (CMD_ARGC < 7)
34 return ERROR_COMMAND_SYNTAX_ERROR;
35
36 info = malloc(sizeof(struct jtagspi_flash_bank));
37 if (!info) {
38 LOG_ERROR("no memory for flash bank info");
39 return ERROR_FAIL;
40 }
41 bank->sectors = NULL;
42 bank->driver_priv = info;
43
44 if (!bank->target->tap) {
45 LOG_ERROR("Target has no JTAG tap");
46 return ERROR_FAIL;
47 }
48 info->tap = bank->target->tap;
49 info->probed = false;
50 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[6], info->ir);
51
52 return ERROR_OK;
53 }
54
55 static void jtagspi_set_ir(struct flash_bank *bank)
56 {
57 struct jtagspi_flash_bank *info = bank->driver_priv;
58 struct scan_field field;
59 uint8_t buf[4] = { 0 };
60
61 LOG_DEBUG("loading jtagspi ir");
62 buf_set_u32(buf, 0, info->tap->ir_length, info->ir);
63 field.num_bits = info->tap->ir_length;
64 field.out_value = buf;
65 field.in_value = NULL;
66 jtag_add_ir_scan(info->tap, &field, TAP_IDLE);
67 }
68
69 static void flip_u8(const uint8_t *in, uint8_t *out, unsigned int len)
70 {
71 for (unsigned int i = 0; i < len; i++)
72 out[i] = flip_u32(in[i], 8);
73 }
74
75 static int jtagspi_cmd(struct flash_bank *bank, uint8_t cmd,
76 uint8_t *write_buffer, unsigned int write_len, uint8_t *data_buffer, int data_len)
77 {
78 assert(write_buffer || write_len == 0);
79 assert(data_buffer || data_len == 0);
80
81 struct scan_field fields[6];
82
83 LOG_DEBUG("cmd=0x%02x write_len=%d data_len=%d", cmd, write_len, data_len);
84
85 /* negative data_len == read operation */
86 const bool is_read = (data_len < 0);
87 if (is_read)
88 data_len = -data_len;
89
90 int n = 0;
91 const uint8_t marker = 1;
92 fields[n].num_bits = 1;
93 fields[n].out_value = &marker;
94 fields[n].in_value = NULL;
95 n++;
96
97 /* transfer length = cmd + address + read/write,
98 * -1 due to the counter implementation */
99 uint8_t xfer_bits[4];
100 h_u32_to_be(xfer_bits, ((sizeof(cmd) + write_len + data_len) * CHAR_BIT) - 1);
101 flip_u8(xfer_bits, xfer_bits, sizeof(xfer_bits));
102 fields[n].num_bits = sizeof(xfer_bits) * CHAR_BIT;
103 fields[n].out_value = xfer_bits;
104 fields[n].in_value = NULL;
105 n++;
106
107 flip_u8(&cmd, &cmd, sizeof(cmd));
108 fields[n].num_bits = sizeof(cmd) * CHAR_BIT;
109 fields[n].out_value = &cmd;
110 fields[n].in_value = NULL;
111 n++;
112
113 if (write_len) {
114 flip_u8(write_buffer, write_buffer, write_len);
115 fields[n].num_bits = write_len * CHAR_BIT;
116 fields[n].out_value = write_buffer;
117 fields[n].in_value = NULL;
118 n++;
119 }
120
121 if (data_len > 0) {
122 if (is_read) {
123 fields[n].num_bits = jtag_tap_count_enabled();
124 fields[n].out_value = NULL;
125 fields[n].in_value = NULL;
126 n++;
127
128 fields[n].out_value = NULL;
129 fields[n].in_value = data_buffer;
130 } else {
131 flip_u8(data_buffer, data_buffer, data_len);
132 fields[n].out_value = data_buffer;
133 fields[n].in_value = NULL;
134 }
135 fields[n].num_bits = data_len * CHAR_BIT;
136 n++;
137 }
138
139 jtagspi_set_ir(bank);
140 /* passing from an IR scan to SHIFT-DR clears BYPASS registers */
141 struct jtagspi_flash_bank *info = bank->driver_priv;
142 jtag_add_dr_scan(info->tap, n, fields, TAP_IDLE);
143 int retval = jtag_execute_queue();
144
145 if (is_read)
146 flip_u8(data_buffer, data_buffer, data_len);
147 return retval;
148 }
149
150 COMMAND_HANDLER(jtagspi_handle_set)
151 {
152 struct flash_bank *bank = NULL;
153 struct jtagspi_flash_bank *info = NULL;
154 struct flash_sector *sectors = NULL;
155 uint32_t temp;
156 unsigned int index = 1;
157 int retval;
158
159 LOG_DEBUG("%s", __func__);
160
161 /* there are 6 mandatory arguments:
162 * devname, size_in_bytes, pagesize, read_cmd, unused, pprog_cmd */
163 if (index + 6 > CMD_ARGC) {
164 command_print(CMD, "jtagspi: not enough arguments");
165 return ERROR_COMMAND_SYNTAX_ERROR;
166 }
167
168 /* calling flash_command_get_bank without probing because handle_set is used
169 to set device parameters if not autodetected. So probing would fail
170 anyhow.
171 */
172 retval = CALL_COMMAND_HANDLER(flash_command_get_bank_probe_optional, 0,
173 &bank, false);
174 if (ERROR_OK != retval)
175 return retval;
176 info = bank->driver_priv;
177
178 /* invalidate all old info */
179 if (info->probed) {
180 bank->size = 0;
181 bank->num_sectors = 0;
182 if (bank->sectors)
183 free(bank->sectors);
184 bank->sectors = NULL;
185 info->always_4byte = false;
186 info->probed = false;
187 }
188 memset(&info->dev, 0, sizeof(info->dev));
189
190 strncpy(info->devname, CMD_ARGV[index++], sizeof(info->devname) - 1);
191 info->devname[sizeof(info->devname) - 1] = '\0';
192
193 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[index++], temp);
194 info->dev.size_in_bytes = temp;
195 if ((temp & (temp - 1)) || (temp < (1UL << 8))) {
196 command_print(CMD, "jtagspi: device size must be 2^n with n >= 8");
197 return ERROR_COMMAND_SYNTAX_ERROR;
198 }
199
200 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[index++], temp);
201 info->dev.pagesize = temp;
202 if (info->dev.pagesize == 0)
203 info->dev.pagesize = SPIFLASH_DEF_PAGESIZE;
204 if ((temp & (temp - 1)) || (temp > info->dev.size_in_bytes)) {
205 command_print(CMD, "jtagspi: page size must be 2^n and <= device size");
206 return ERROR_COMMAND_SYNTAX_ERROR;
207 }
208
209 COMMAND_PARSE_NUMBER(u8, CMD_ARGV[index++], info->dev.read_cmd);
210 if ((info->dev.read_cmd != 0x03) &&
211 (info->dev.read_cmd != 0x13)) {
212 command_print(CMD, "jtagspi: only 0x03/0x13 READ allowed");
213 return ERROR_COMMAND_SYNTAX_ERROR;
214 }
215
216 COMMAND_PARSE_NUMBER(u8, CMD_ARGV[index++], info->dev.qread_cmd);
217
218 COMMAND_PARSE_NUMBER(u8, CMD_ARGV[index++], info->dev.pprog_cmd);
219 if ((info->dev.pprog_cmd != 0x02) &&
220 (info->dev.pprog_cmd != 0x12)) {
221 command_print(CMD, "jtagspi: only 0x02/0x12 PPRG allowed");
222 return ERROR_COMMAND_SYNTAX_ERROR;
223 }
224
225 /* remaining params are optional */
226 if (index < CMD_ARGC)
227 COMMAND_PARSE_NUMBER(u8, CMD_ARGV[index++], info->dev.chip_erase_cmd);
228 else
229 info->dev.chip_erase_cmd = 0x00;
230
231 if (index < CMD_ARGC) {
232 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[index++], temp);
233 info->dev.sectorsize = temp;
234 if ((info->dev.sectorsize > info->dev.size_in_bytes) ||
235 (info->dev.sectorsize < info->dev.pagesize) || (temp & (temp - 1))) {
236 command_print(CMD, "jtagspi: sector size must be 2^n and <= device size");
237 return ERROR_COMMAND_SYNTAX_ERROR;
238 }
239
240 if (index < CMD_ARGC)
241 COMMAND_PARSE_NUMBER(u8, CMD_ARGV[index++], info->dev.erase_cmd);
242 else {
243 command_print(CMD, "jtagspi: erase command missing");
244 return ERROR_COMMAND_SYNTAX_ERROR;
245 }
246 } else {
247 /* no sector size / sector erase cmd given, treat whole bank as a single sector */
248 info->dev.erase_cmd = 0x00;
249 info->dev.sectorsize = info->dev.size_in_bytes;
250 }
251
252 if (index < CMD_ARGC) {
253 command_print(CMD, "jtagspi: extra arguments");
254 return ERROR_COMMAND_SYNTAX_ERROR;
255 }
256
257 /* set correct size value */
258 bank->size = info->dev.size_in_bytes;
259
260 /* calculate address length in bytes */
261 if (bank->size <= (1UL << 8))
262 info->addr_len = 1;
263 else if (bank->size <= (1UL << 16))
264 info->addr_len = 2;
265 else if (bank->size <= (1UL << 24))
266 info->addr_len = 3;
267 else {
268 info->addr_len = 4;
269 LOG_WARNING("4-byte addresses needed, might need extra command to enable");
270 }
271
272 /* create and fill sectors array */
273 bank->num_sectors =
274 info->dev.size_in_bytes / info->dev.sectorsize;
275 sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
276 if (!sectors) {
277 LOG_ERROR("Not enough memory");
278 return ERROR_FAIL;
279 }
280
281 for (unsigned int sector = 0; sector < bank->num_sectors; sector++) {
282 sectors[sector].offset = sector * (info->dev.sectorsize);
283 sectors[sector].size = info->dev.sectorsize;
284 sectors[sector].is_erased = -1;
285 sectors[sector].is_protected = 0;
286 }
287
288 bank->sectors = sectors;
289 info->dev.name = info->devname;
290 if (info->dev.size_in_bytes / 4096)
291 LOG_INFO("flash \'%s\' id = unknown\nflash size = %" PRIu32 " kbytes",
292 info->dev.name, info->dev.size_in_bytes / 1024);
293 else
294 LOG_INFO("flash \'%s\' id = unknown\nflash size = %" PRIu32 " bytes",
295 info->dev.name, info->dev.size_in_bytes);
296 info->probed = true;
297
298 return ERROR_OK;
299 }
300
301 COMMAND_HANDLER(jtagspi_handle_cmd)
302 {
303 struct flash_bank *bank;
304 const unsigned int max = 20;
305 uint8_t cmd_byte, num_read, write_buffer[max], read_buffer[1 << CHAR_BIT];
306
307 LOG_DEBUG("%s", __func__);
308
309 if (CMD_ARGC < 3)
310 return ERROR_COMMAND_SYNTAX_ERROR;
311
312 uint8_t num_write = CMD_ARGC - 3;
313 if (num_write > max) {
314 command_print(CMD, "at most %d bytes may be send", max);
315 return ERROR_COMMAND_ARGUMENT_INVALID;
316 }
317
318 /* calling flash_command_get_bank without probing because we like to be
319 able to send commands before auto-probing occurred. For example sending
320 "release from power down" is needed before probing when flash is in
321 power down mode.
322 */
323 int retval = CALL_COMMAND_HANDLER(flash_command_get_bank_probe_optional, 0,
324 &bank, false);
325 if (retval != ERROR_OK)
326 return retval;
327
328 COMMAND_PARSE_NUMBER(u8, CMD_ARGV[1], num_read);
329 COMMAND_PARSE_NUMBER(u8, CMD_ARGV[2], cmd_byte);
330
331 for (unsigned int i = 0; i < num_write; i++)
332 COMMAND_PARSE_NUMBER(u8, CMD_ARGV[i + 3], write_buffer[i]);
333
334 /* process command */
335 retval = jtagspi_cmd(bank, cmd_byte, write_buffer, num_write, read_buffer, -num_read);
336 if (retval != ERROR_OK)
337 return retval;
338
339 command_print_sameline(CMD, "spi: %02" PRIx8, cmd_byte);
340
341 for (unsigned int i = 0; i < num_write; i++)
342 command_print_sameline(CMD, " %02" PRIx8, write_buffer[i]);
343
344 command_print_sameline(CMD, " ->");
345
346 for (unsigned int i = 0; i < num_read; i++)
347 command_print_sameline(CMD, " %02" PRIx8, read_buffer[i]);
348
349 return ERROR_OK;
350 }
351
352 COMMAND_HANDLER(jtagspi_handle_always_4byte)
353 {
354 struct flash_bank *bank;
355 struct jtagspi_flash_bank *jtagspi_info;
356 int retval;
357
358 LOG_DEBUG("%s", __func__);
359
360 if ((CMD_ARGC != 1) && (CMD_ARGC != 2))
361 return ERROR_COMMAND_SYNTAX_ERROR;
362
363 retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
364 if (ERROR_OK != retval)
365 return retval;
366
367 jtagspi_info = bank->driver_priv;
368
369 if (CMD_ARGC == 1)
370 command_print(CMD, jtagspi_info->always_4byte ? "on" : "off");
371 else
372 COMMAND_PARSE_BOOL(CMD_ARGV[1], jtagspi_info->always_4byte, "on", "off");
373
374 return ERROR_OK;
375 }
376
377 static int jtagspi_probe(struct flash_bank *bank)
378 {
379 struct jtagspi_flash_bank *info = bank->driver_priv;
380 struct flash_sector *sectors;
381 const struct flash_device *p;
382 uint8_t in_buf[3];
383 uint32_t id, sectorsize;
384
385 if (bank->sectors) {
386 free(bank->sectors);
387 bank->sectors = NULL;
388 }
389 info->probed = false;
390
391 jtagspi_cmd(bank, SPIFLASH_READ_ID, NULL, 0, in_buf, -3);
392 /* the table in spi.c has the manufacturer byte (first) as the lsb */
393 id = le_to_h_u24(in_buf);
394
395 memset(&info->dev, 0, sizeof(info->dev));
396 for (p = flash_devices; p->name ; p++)
397 if (p->device_id == id) {
398 memcpy(&info->dev, p, sizeof(info->dev));
399 break;
400 }
401
402 if (!(p->name)) {
403 LOG_ERROR("Unknown flash device (ID 0x%06" PRIx32 ")", id & 0xFFFFFF);
404 return ERROR_FAIL;
405 }
406
407 LOG_INFO("Found flash device \'%s\' (ID 0x%06" PRIx32 ")",
408 info->dev.name, info->dev.device_id & 0xFFFFFF);
409
410 /* Set correct size value */
411 bank->size = info->dev.size_in_bytes;
412
413 /* calculate address length in bytes */
414 if (bank->size <= (1UL << 8))
415 info->addr_len = 1;
416 else if (bank->size <= (1UL << 16))
417 info->addr_len = 2;
418 else if (bank->size <= (1UL << 24))
419 info->addr_len = 3;
420 else {
421 info->addr_len = 4;
422 LOG_WARNING("4-byte addresses needed, might need extra command to enable");
423 }
424
425 /* if no sectors, treat whole bank as single sector */
426 sectorsize = info->dev.sectorsize ?
427 info->dev.sectorsize : info->dev.size_in_bytes;
428
429 /* create and fill sectors array */
430 bank->num_sectors = info->dev.size_in_bytes / sectorsize;
431 sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
432 if (!sectors) {
433 LOG_ERROR("not enough memory");
434 return ERROR_FAIL;
435 }
436
437 for (unsigned int sector = 0; sector < bank->num_sectors; sector++) {
438 sectors[sector].offset = sector * sectorsize;
439 sectors[sector].size = sectorsize;
440 sectors[sector].is_erased = -1;
441 sectors[sector].is_protected = 0;
442 }
443
444 bank->sectors = sectors;
445 info->probed = true;
446 return ERROR_OK;
447 }
448
449 static int jtagspi_auto_probe(struct flash_bank *bank)
450 {
451 struct jtagspi_flash_bank *info = bank->driver_priv;
452
453 if (info->probed)
454 return ERROR_OK;
455 return jtagspi_probe(bank);
456 }
457
458 static int jtagspi_read_status(struct flash_bank *bank, uint32_t *status)
459 {
460 uint8_t buf;
461 int err = jtagspi_cmd(bank, SPIFLASH_READ_STATUS, NULL, 0, &buf, -1);
462 if (err == ERROR_OK) {
463 *status = buf;
464 LOG_DEBUG("status=0x%02" PRIx32, *status);
465 }
466 return err;
467 }
468
469 static int jtagspi_wait(struct flash_bank *bank, int timeout_ms)
470 {
471 int64_t t0 = timeval_ms();
472 int64_t dt;
473
474 do {
475 dt = timeval_ms() - t0;
476
477 uint32_t status = (uint32_t)-1;
478 int retval = jtagspi_read_status(bank, &status);
479 if (retval != ERROR_OK)
480 return retval;
481
482 if ((status & SPIFLASH_BSY_BIT) == 0) {
483 LOG_DEBUG("waited %" PRId64 " ms", dt);
484 return ERROR_OK;
485 }
486 alive_sleep(1);
487 } while (dt <= timeout_ms);
488
489 LOG_ERROR("timeout, device still busy");
490 return ERROR_FAIL;
491 }
492
493 static int jtagspi_write_enable(struct flash_bank *bank)
494 {
495 jtagspi_cmd(bank, SPIFLASH_WRITE_ENABLE, NULL, 0, NULL, 0);
496
497 uint32_t status = (uint32_t)-1;
498 int retval = jtagspi_read_status(bank, &status);
499 if (retval != ERROR_OK)
500 return retval;
501
502 if ((status & SPIFLASH_WE_BIT) == 0) {
503 LOG_ERROR("Cannot enable write to flash. Status=0x%02" PRIx32, status);
504 return ERROR_FAIL;
505 }
506 return ERROR_OK;
507 }
508
509 static int jtagspi_bulk_erase(struct flash_bank *bank)
510 {
511 struct jtagspi_flash_bank *info = bank->driver_priv;
512 int retval;
513 int64_t t0 = timeval_ms();
514
515 if (info->dev.chip_erase_cmd == 0x00)
516 return ERROR_FLASH_OPER_UNSUPPORTED;
517
518 retval = jtagspi_write_enable(bank);
519 if (retval != ERROR_OK)
520 return retval;
521
522 retval = jtagspi_cmd(bank, info->dev.chip_erase_cmd, NULL, 0, NULL, 0);
523 if (retval != ERROR_OK)
524 return retval;
525
526 retval = jtagspi_wait(bank, bank->num_sectors * JTAGSPI_MAX_TIMEOUT);
527 LOG_INFO("took %" PRId64 " ms", timeval_ms() - t0);
528 return retval;
529 }
530
531 static uint8_t *fill_addr(uint32_t addr, unsigned int addr_len, uint8_t *buffer)
532 {
533 for (buffer += addr_len; addr_len > 0; --addr_len) {
534 *--buffer = addr;
535 addr >>= 8;
536 }
537
538 return buffer;
539 }
540
541 static int jtagspi_sector_erase(struct flash_bank *bank, unsigned int sector)
542 {
543 struct jtagspi_flash_bank *info = bank->driver_priv;
544 int retval;
545 uint8_t addr[sizeof(uint32_t)];
546 int64_t t0 = timeval_ms();
547
548 retval = jtagspi_write_enable(bank);
549 if (retval != ERROR_OK)
550 return retval;
551
552 /* ATXP032/064/128 use always 4-byte addresses except for 0x03 read */
553 unsigned int addr_len = info->always_4byte ? 4 : info->addr_len;
554
555 retval = jtagspi_cmd(bank, info->dev.erase_cmd, fill_addr(bank->sectors[sector].offset, addr_len, addr),
556 addr_len, NULL, 0);
557 if (retval != ERROR_OK)
558 return retval;
559
560 retval = jtagspi_wait(bank, JTAGSPI_MAX_TIMEOUT);
561 LOG_INFO("sector %u took %" PRId64 " ms", sector, timeval_ms() - t0);
562 return retval;
563 }
564
565 static int jtagspi_erase(struct flash_bank *bank, unsigned int first,
566 unsigned int last)
567 {
568 struct jtagspi_flash_bank *info = bank->driver_priv;
569 int retval = ERROR_OK;
570
571 LOG_DEBUG("erase from sector %u to sector %u", first, last);
572
573 if ((last < first) || (last >= bank->num_sectors)) {
574 LOG_ERROR("Flash sector invalid");
575 return ERROR_FLASH_SECTOR_INVALID;
576 }
577
578 if (!(info->probed)) {
579 LOG_ERROR("Flash bank not probed");
580 return ERROR_FLASH_BANK_NOT_PROBED;
581 }
582
583 for (unsigned int sector = first; sector <= last; sector++) {
584 if (bank->sectors[sector].is_protected) {
585 LOG_ERROR("Flash sector %u protected", sector);
586 return ERROR_FAIL;
587 }
588 }
589
590 if (first == 0 && last == (bank->num_sectors - 1) &&
591 info->dev.chip_erase_cmd != 0x00 &&
592 info->dev.chip_erase_cmd != info->dev.erase_cmd) {
593 LOG_DEBUG("Trying bulk erase.");
594 retval = jtagspi_bulk_erase(bank);
595 if (retval == ERROR_OK)
596 return retval;
597 else
598 LOG_WARNING("Bulk flash erase failed. Falling back to sector erase.");
599 }
600
601 if (info->dev.erase_cmd == 0x00)
602 return ERROR_FLASH_OPER_UNSUPPORTED;
603
604 for (unsigned int sector = first; sector <= last; sector++) {
605 retval = jtagspi_sector_erase(bank, sector);
606 if (retval != ERROR_OK) {
607 LOG_ERROR("Sector erase failed.");
608 break;
609 }
610 }
611
612 return retval;
613 }
614
615 static int jtagspi_protect(struct flash_bank *bank, int set, unsigned int first,
616 unsigned int last)
617 {
618 for (unsigned int sector = first; sector <= last; sector++)
619 bank->sectors[sector].is_protected = set;
620 return ERROR_OK;
621 }
622
623 static int jtagspi_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
624 {
625 struct jtagspi_flash_bank *info = bank->driver_priv;
626 uint32_t pagesize, currsize;
627 uint8_t addr[sizeof(uint32_t)];
628 int retval;
629
630 if (!(info->probed)) {
631 LOG_ERROR("Flash bank not probed.");
632 return ERROR_FLASH_BANK_NOT_PROBED;
633 }
634
635 /* if no sectorsize, use reasonable default */
636 pagesize = info->dev.sectorsize ? info->dev.sectorsize : info->dev.pagesize;
637 if (pagesize == 0)
638 pagesize = (info->dev.size_in_bytes <= SPIFLASH_DEF_PAGESIZE) ?
639 info->dev.size_in_bytes : SPIFLASH_DEF_PAGESIZE;
640
641 /* ATXP032/064/128 use always 4-byte addresses except for 0x03 read */
642 unsigned int addr_len = ((info->dev.read_cmd != 0x03) && info->always_4byte) ? 4 : info->addr_len;
643
644 while (count > 0) {
645 /* length up to end of current page */
646 currsize = ((offset + pagesize) & ~(pagesize - 1)) - offset;
647 /* but no more than remaining size */
648 currsize = (count < currsize) ? count : currsize;
649
650 retval = jtagspi_cmd(bank, info->dev.read_cmd, fill_addr(offset, addr_len, addr),
651 addr_len, buffer, -currsize);
652 if (retval != ERROR_OK) {
653 LOG_ERROR("page read error");
654 return retval;
655 }
656 LOG_DEBUG("read page at 0x%08" PRIx32, offset);
657 offset += currsize;
658 buffer += currsize;
659 count -= currsize;
660 }
661 return ERROR_OK;
662 }
663
664 static int jtagspi_page_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
665 {
666 struct jtagspi_flash_bank *info = bank->driver_priv;
667 uint8_t addr[sizeof(uint32_t)];
668 int retval;
669
670 retval = jtagspi_write_enable(bank);
671 if (retval != ERROR_OK)
672 return retval;
673
674 /* ATXP032/064/128 use always 4-byte addresses except for 0x03 read */
675 unsigned int addr_len = ((info->dev.read_cmd != 0x03) && info->always_4byte) ? 4 : info->addr_len;
676
677 retval = jtagspi_cmd(bank, info->dev.pprog_cmd, fill_addr(offset, addr_len, addr),
678 addr_len, (uint8_t *) buffer, count);
679 if (retval != ERROR_OK)
680 return retval;
681 return jtagspi_wait(bank, JTAGSPI_MAX_TIMEOUT);
682 }
683
684 static int jtagspi_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
685 {
686 struct jtagspi_flash_bank *info = bank->driver_priv;
687 uint32_t pagesize, currsize;
688 int retval;
689
690 if (!(info->probed)) {
691 LOG_ERROR("Flash bank not probed.");
692 return ERROR_FLASH_BANK_NOT_PROBED;
693 }
694
695 /* if no write pagesize, use reasonable default */
696 pagesize = info->dev.pagesize ? info->dev.pagesize : SPIFLASH_DEF_PAGESIZE;
697
698 while (count > 0) {
699 /* length up to end of current page */
700 currsize = ((offset + pagesize) & ~(pagesize - 1)) - offset;
701 /* but no more than remaining size */
702 currsize = (count < currsize) ? count : currsize;
703
704 retval = jtagspi_page_write(bank, buffer, offset, currsize);
705 if (retval != ERROR_OK) {
706 LOG_ERROR("page write error");
707 return retval;
708 }
709 LOG_DEBUG("wrote page at 0x%08" PRIx32, offset);
710 offset += currsize;
711 buffer += currsize;
712 count -= currsize;
713 }
714 return ERROR_OK;
715 }
716
717 static int jtagspi_info(struct flash_bank *bank, struct command_invocation *cmd)
718 {
719 struct jtagspi_flash_bank *info = bank->driver_priv;
720
721 if (!(info->probed)) {
722 command_print_sameline(cmd, "\nJTAGSPI flash bank not probed yet\n");
723 return ERROR_OK;
724 }
725
726 command_print_sameline(cmd, "flash \'%s\', device id = 0x%06" PRIx32
727 ", flash size = %" PRIu32 " %sbytes\n(page size = %" PRIu32
728 ", read = 0x%02" PRIx8 ", qread = 0x%02" PRIx8
729 ", pprog = 0x%02" PRIx8 ", mass_erase = 0x%02" PRIx8
730 ", sector size = %" PRIu32 " %sbytes, sector_erase = 0x%02" PRIx8 ")",
731 info->dev.name, info->dev.device_id & 0xFFFFFF,
732 bank->size / 4096 ? bank->size / 1024 : bank->size,
733 bank->size / 4096 ? "k" : "", info->dev.pagesize,
734 info->dev.read_cmd, info->dev.qread_cmd,
735 info->dev.pprog_cmd, info->dev.chip_erase_cmd,
736 info->dev.sectorsize / 4096 ?
737 info->dev.sectorsize / 1024 : info->dev.sectorsize,
738 info->dev.sectorsize / 4096 ? "k" : "",
739 info->dev.erase_cmd);
740
741 return ERROR_OK;
742 }
743
744 static const struct command_registration jtagspi_exec_command_handlers[] = {
745 {
746 .name = "set",
747 .handler = jtagspi_handle_set,
748 .mode = COMMAND_EXEC,
749 .usage = "bank_id name chip_size page_size read_cmd unused pprg_cmd "
750 "[ mass_erase_cmd ] [ sector_size sector_erase_cmd ]",
751 .help = "Set device parameters if not autodetected.",
752 },
753 {
754 .name = "cmd",
755 .handler = jtagspi_handle_cmd,
756 .mode = COMMAND_EXEC,
757 .usage = "bank_id num_resp cmd_byte ...",
758 .help = "Send low-level command cmd_byte and following bytes, read num_bytes.",
759 },
760 {
761 .name = "always_4byte",
762 .handler = jtagspi_handle_always_4byte,
763 .mode = COMMAND_EXEC,
764 .usage = "bank_id [ on | off ]",
765 .help = "Use always 4-byte address except for basic 0x03.",
766 },
767
768 COMMAND_REGISTRATION_DONE
769 };
770
771 static const struct command_registration jtagspi_command_handlers[] = {
772 {
773 .name = "jtagspi",
774 .mode = COMMAND_ANY,
775 .help = "jtagspi command group",
776 .usage = "",
777 .chain = jtagspi_exec_command_handlers,
778 },
779 COMMAND_REGISTRATION_DONE
780 };
781
782 const struct flash_driver jtagspi_flash = {
783 .name = "jtagspi",
784 .commands = jtagspi_command_handlers,
785 .flash_bank_command = jtagspi_flash_bank_command,
786 .erase = jtagspi_erase,
787 .protect = jtagspi_protect,
788 .write = jtagspi_write,
789 .read = jtagspi_read,
790 .probe = jtagspi_probe,
791 .auto_probe = jtagspi_auto_probe,
792 .erase_check = default_flash_blank_check,
793 .info = jtagspi_info,
794 .free_driver_priv = default_flash_free_driver_priv,
795 };

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)