flash/jtagspi: sending command and setting parameters without probing.
[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 unsigned int index = 1;
305 const int max = 21;
306 uint8_t num_write, num_read, write_buffer[max], read_buffer[1 << CHAR_BIT];
307 uint8_t data, *ptr;
308 char temp[4], output[(2 + max + (1 << CHAR_BIT)) * 3 + 8];
309 int retval;
310
311 LOG_DEBUG("%s", __func__);
312
313 if (CMD_ARGC < 3) {
314 command_print(CMD, "jtagspi: not enough arguments");
315 return ERROR_COMMAND_SYNTAX_ERROR;
316 }
317
318 num_write = CMD_ARGC - 2;
319 if (num_write > max) {
320 LOG_ERROR("at most %d bytes may be send", max);
321 return ERROR_COMMAND_SYNTAX_ERROR;
322 }
323
324 /* calling flash_command_get_bank without probing because we like to be
325 able to send commands before auto-probing occurred. For example sending
326 "release from power down" is needed before probing when flash is in
327 power down mode.
328 */
329 retval = CALL_COMMAND_HANDLER(flash_command_get_bank_probe_optional, 0,
330 &bank, false);
331 if (ERROR_OK != retval)
332 return retval;
333
334 COMMAND_PARSE_NUMBER(u8, CMD_ARGV[index++], num_read);
335
336 snprintf(output, sizeof(output), "spi: ");
337 for (ptr = &write_buffer[0] ; index < CMD_ARGC; index++) {
338 COMMAND_PARSE_NUMBER(u8, CMD_ARGV[index], data);
339 *ptr++ = data;
340 snprintf(temp, sizeof(temp), "%02" PRIx8 " ", data);
341 strncat(output, temp, sizeof(output) - strlen(output) - 1);
342 }
343 strncat(output, "-> ", sizeof(output) - strlen(output) - 1);
344
345 /* process command */
346 ptr = &read_buffer[0];
347 retval = jtagspi_cmd(bank, write_buffer[0], &write_buffer[1], num_write - 1, ptr, -num_read);
348 if (retval != ERROR_OK)
349 return retval;
350
351 for ( ; num_read > 0; num_read--) {
352 snprintf(temp, sizeof(temp), "%02" PRIx8 " ", *ptr++);
353 strncat(output, temp, sizeof(output) - strlen(output) - 1);
354 }
355 command_print(CMD, "%s", output);
356
357 return ERROR_OK;
358 }
359
360 COMMAND_HANDLER(jtagspi_handle_always_4byte)
361 {
362 struct flash_bank *bank;
363 struct jtagspi_flash_bank *jtagspi_info;
364 int retval;
365
366 LOG_DEBUG("%s", __func__);
367
368 if ((CMD_ARGC != 1) && (CMD_ARGC != 2))
369 return ERROR_COMMAND_SYNTAX_ERROR;
370
371 retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
372 if (ERROR_OK != retval)
373 return retval;
374
375 jtagspi_info = bank->driver_priv;
376
377 if (CMD_ARGC == 1)
378 command_print(CMD, jtagspi_info->always_4byte ? "on" : "off");
379 else
380 COMMAND_PARSE_BOOL(CMD_ARGV[1], jtagspi_info->always_4byte, "on", "off");
381
382 return ERROR_OK;
383 }
384
385 static int jtagspi_probe(struct flash_bank *bank)
386 {
387 struct jtagspi_flash_bank *info = bank->driver_priv;
388 struct flash_sector *sectors;
389 const struct flash_device *p;
390 uint8_t in_buf[3];
391 uint32_t id, sectorsize;
392
393 if (bank->sectors) {
394 free(bank->sectors);
395 bank->sectors = NULL;
396 }
397 info->probed = false;
398
399 jtagspi_cmd(bank, SPIFLASH_READ_ID, NULL, 0, in_buf, -3);
400 /* the table in spi.c has the manufacturer byte (first) as the lsb */
401 id = le_to_h_u24(in_buf);
402
403 memset(&info->dev, 0, sizeof(info->dev));
404 for (p = flash_devices; p->name ; p++)
405 if (p->device_id == id) {
406 memcpy(&info->dev, p, sizeof(info->dev));
407 break;
408 }
409
410 if (!(p->name)) {
411 LOG_ERROR("Unknown flash device (ID 0x%06" PRIx32 ")", id & 0xFFFFFF);
412 return ERROR_FAIL;
413 }
414
415 LOG_INFO("Found flash device \'%s\' (ID 0x%06" PRIx32 ")",
416 info->dev.name, info->dev.device_id & 0xFFFFFF);
417
418 /* Set correct size value */
419 bank->size = info->dev.size_in_bytes;
420
421 /* calculate address length in bytes */
422 if (bank->size <= (1UL << 8))
423 info->addr_len = 1;
424 else if (bank->size <= (1UL << 16))
425 info->addr_len = 2;
426 else if (bank->size <= (1UL << 24))
427 info->addr_len = 3;
428 else {
429 info->addr_len = 4;
430 LOG_WARNING("4-byte addresses needed, might need extra command to enable");
431 }
432
433 /* if no sectors, treat whole bank as single sector */
434 sectorsize = info->dev.sectorsize ?
435 info->dev.sectorsize : info->dev.size_in_bytes;
436
437 /* create and fill sectors array */
438 bank->num_sectors = info->dev.size_in_bytes / sectorsize;
439 sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
440 if (!sectors) {
441 LOG_ERROR("not enough memory");
442 return ERROR_FAIL;
443 }
444
445 for (unsigned int sector = 0; sector < bank->num_sectors; sector++) {
446 sectors[sector].offset = sector * sectorsize;
447 sectors[sector].size = sectorsize;
448 sectors[sector].is_erased = -1;
449 sectors[sector].is_protected = 0;
450 }
451
452 bank->sectors = sectors;
453 info->probed = true;
454 return ERROR_OK;
455 }
456
457 static int jtagspi_auto_probe(struct flash_bank *bank)
458 {
459 struct jtagspi_flash_bank *info = bank->driver_priv;
460
461 if (info->probed)
462 return ERROR_OK;
463 return jtagspi_probe(bank);
464 }
465
466 static int jtagspi_read_status(struct flash_bank *bank, uint32_t *status)
467 {
468 uint8_t buf;
469 int err = jtagspi_cmd(bank, SPIFLASH_READ_STATUS, NULL, 0, &buf, -1);
470 if (err == ERROR_OK) {
471 *status = buf;
472 LOG_DEBUG("status=0x%02" PRIx32, *status);
473 }
474 return err;
475 }
476
477 static int jtagspi_wait(struct flash_bank *bank, int timeout_ms)
478 {
479 int64_t t0 = timeval_ms();
480 int64_t dt;
481
482 do {
483 dt = timeval_ms() - t0;
484
485 uint32_t status = (uint32_t)-1;
486 int retval = jtagspi_read_status(bank, &status);
487 if (retval != ERROR_OK)
488 return retval;
489
490 if ((status & SPIFLASH_BSY_BIT) == 0) {
491 LOG_DEBUG("waited %" PRId64 " ms", dt);
492 return ERROR_OK;
493 }
494 alive_sleep(1);
495 } while (dt <= timeout_ms);
496
497 LOG_ERROR("timeout, device still busy");
498 return ERROR_FAIL;
499 }
500
501 static int jtagspi_write_enable(struct flash_bank *bank)
502 {
503 jtagspi_cmd(bank, SPIFLASH_WRITE_ENABLE, NULL, 0, NULL, 0);
504
505 uint32_t status = (uint32_t)-1;
506 int retval = jtagspi_read_status(bank, &status);
507 if (retval != ERROR_OK)
508 return retval;
509
510 if ((status & SPIFLASH_WE_BIT) == 0) {
511 LOG_ERROR("Cannot enable write to flash. Status=0x%02" PRIx32, status);
512 return ERROR_FAIL;
513 }
514 return ERROR_OK;
515 }
516
517 static int jtagspi_bulk_erase(struct flash_bank *bank)
518 {
519 struct jtagspi_flash_bank *info = bank->driver_priv;
520 int retval;
521 int64_t t0 = timeval_ms();
522
523 if (info->dev.chip_erase_cmd == 0x00)
524 return ERROR_FLASH_OPER_UNSUPPORTED;
525
526 retval = jtagspi_write_enable(bank);
527 if (retval != ERROR_OK)
528 return retval;
529
530 retval = jtagspi_cmd(bank, info->dev.chip_erase_cmd, NULL, 0, NULL, 0);
531 if (retval != ERROR_OK)
532 return retval;
533
534 retval = jtagspi_wait(bank, bank->num_sectors * JTAGSPI_MAX_TIMEOUT);
535 LOG_INFO("took %" PRId64 " ms", timeval_ms() - t0);
536 return retval;
537 }
538
539 static uint8_t *fill_addr(uint32_t addr, unsigned int addr_len, uint8_t *buffer)
540 {
541 for (buffer += addr_len; addr_len > 0; --addr_len) {
542 *--buffer = addr;
543 addr >>= 8;
544 }
545
546 return buffer;
547 }
548
549 static int jtagspi_sector_erase(struct flash_bank *bank, unsigned int sector)
550 {
551 struct jtagspi_flash_bank *info = bank->driver_priv;
552 int retval;
553 uint8_t addr[sizeof(uint32_t)];
554 int64_t t0 = timeval_ms();
555
556 retval = jtagspi_write_enable(bank);
557 if (retval != ERROR_OK)
558 return retval;
559
560 /* ATXP032/064/128 use always 4-byte addresses except for 0x03 read */
561 unsigned int addr_len = info->always_4byte ? 4 : info->addr_len;
562
563 retval = jtagspi_cmd(bank, info->dev.erase_cmd, fill_addr(bank->sectors[sector].offset, addr_len, addr),
564 addr_len, NULL, 0);
565 if (retval != ERROR_OK)
566 return retval;
567
568 retval = jtagspi_wait(bank, JTAGSPI_MAX_TIMEOUT);
569 LOG_INFO("sector %u took %" PRId64 " ms", sector, timeval_ms() - t0);
570 return retval;
571 }
572
573 static int jtagspi_erase(struct flash_bank *bank, unsigned int first,
574 unsigned int last)
575 {
576 struct jtagspi_flash_bank *info = bank->driver_priv;
577 int retval = ERROR_OK;
578
579 LOG_DEBUG("erase from sector %u to sector %u", first, last);
580
581 if ((last < first) || (last >= bank->num_sectors)) {
582 LOG_ERROR("Flash sector invalid");
583 return ERROR_FLASH_SECTOR_INVALID;
584 }
585
586 if (!(info->probed)) {
587 LOG_ERROR("Flash bank not probed");
588 return ERROR_FLASH_BANK_NOT_PROBED;
589 }
590
591 for (unsigned int sector = first; sector <= last; sector++) {
592 if (bank->sectors[sector].is_protected) {
593 LOG_ERROR("Flash sector %u protected", sector);
594 return ERROR_FAIL;
595 }
596 }
597
598 if (first == 0 && last == (bank->num_sectors - 1) &&
599 info->dev.chip_erase_cmd != 0x00 &&
600 info->dev.chip_erase_cmd != info->dev.erase_cmd) {
601 LOG_DEBUG("Trying bulk erase.");
602 retval = jtagspi_bulk_erase(bank);
603 if (retval == ERROR_OK)
604 return retval;
605 else
606 LOG_WARNING("Bulk flash erase failed. Falling back to sector erase.");
607 }
608
609 if (info->dev.erase_cmd == 0x00)
610 return ERROR_FLASH_OPER_UNSUPPORTED;
611
612 for (unsigned int sector = first; sector <= last; sector++) {
613 retval = jtagspi_sector_erase(bank, sector);
614 if (retval != ERROR_OK) {
615 LOG_ERROR("Sector erase failed.");
616 break;
617 }
618 }
619
620 return retval;
621 }
622
623 static int jtagspi_protect(struct flash_bank *bank, int set, unsigned int first,
624 unsigned int last)
625 {
626 for (unsigned int sector = first; sector <= last; sector++)
627 bank->sectors[sector].is_protected = set;
628 return ERROR_OK;
629 }
630
631 static int jtagspi_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
632 {
633 struct jtagspi_flash_bank *info = bank->driver_priv;
634 uint32_t pagesize, currsize;
635 uint8_t addr[sizeof(uint32_t)];
636 int retval;
637
638 if (!(info->probed)) {
639 LOG_ERROR("Flash bank not probed.");
640 return ERROR_FLASH_BANK_NOT_PROBED;
641 }
642
643 /* if no sectorsize, use reasonable default */
644 pagesize = info->dev.sectorsize ? info->dev.sectorsize : info->dev.pagesize;
645 if (pagesize == 0)
646 pagesize = (info->dev.size_in_bytes <= SPIFLASH_DEF_PAGESIZE) ?
647 info->dev.size_in_bytes : SPIFLASH_DEF_PAGESIZE;
648
649 /* ATXP032/064/128 use always 4-byte addresses except for 0x03 read */
650 unsigned int addr_len = ((info->dev.read_cmd != 0x03) && info->always_4byte) ? 4 : info->addr_len;
651
652 while (count > 0) {
653 /* length up to end of current page */
654 currsize = ((offset + pagesize) & ~(pagesize - 1)) - offset;
655 /* but no more than remaining size */
656 currsize = (count < currsize) ? count : currsize;
657
658 retval = jtagspi_cmd(bank, info->dev.read_cmd, fill_addr(offset, addr_len, addr),
659 addr_len, buffer, -currsize);
660 if (retval != ERROR_OK) {
661 LOG_ERROR("page read error");
662 return retval;
663 }
664 LOG_DEBUG("read page at 0x%08" PRIx32, offset);
665 offset += currsize;
666 buffer += currsize;
667 count -= currsize;
668 }
669 return ERROR_OK;
670 }
671
672 static int jtagspi_page_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
673 {
674 struct jtagspi_flash_bank *info = bank->driver_priv;
675 uint8_t addr[sizeof(uint32_t)];
676 int retval;
677
678 retval = jtagspi_write_enable(bank);
679 if (retval != ERROR_OK)
680 return retval;
681
682 /* ATXP032/064/128 use always 4-byte addresses except for 0x03 read */
683 unsigned int addr_len = ((info->dev.read_cmd != 0x03) && info->always_4byte) ? 4 : info->addr_len;
684
685 retval = jtagspi_cmd(bank, info->dev.pprog_cmd, fill_addr(offset, addr_len, addr),
686 addr_len, (uint8_t *) buffer, count);
687 if (retval != ERROR_OK)
688 return retval;
689 return jtagspi_wait(bank, JTAGSPI_MAX_TIMEOUT);
690 }
691
692 static int jtagspi_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
693 {
694 struct jtagspi_flash_bank *info = bank->driver_priv;
695 uint32_t pagesize, currsize;
696 int retval;
697
698 if (!(info->probed)) {
699 LOG_ERROR("Flash bank not probed.");
700 return ERROR_FLASH_BANK_NOT_PROBED;
701 }
702
703 /* if no write pagesize, use reasonable default */
704 pagesize = info->dev.pagesize ? info->dev.pagesize : SPIFLASH_DEF_PAGESIZE;
705
706 while (count > 0) {
707 /* length up to end of current page */
708 currsize = ((offset + pagesize) & ~(pagesize - 1)) - offset;
709 /* but no more than remaining size */
710 currsize = (count < currsize) ? count : currsize;
711
712 retval = jtagspi_page_write(bank, buffer, offset, currsize);
713 if (retval != ERROR_OK) {
714 LOG_ERROR("page write error");
715 return retval;
716 }
717 LOG_DEBUG("wrote page at 0x%08" PRIx32, offset);
718 offset += currsize;
719 buffer += currsize;
720 count -= currsize;
721 }
722 return ERROR_OK;
723 }
724
725 static int jtagspi_info(struct flash_bank *bank, struct command_invocation *cmd)
726 {
727 struct jtagspi_flash_bank *info = bank->driver_priv;
728
729 if (!(info->probed)) {
730 command_print_sameline(cmd, "\nJTAGSPI flash bank not probed yet\n");
731 return ERROR_OK;
732 }
733
734 command_print_sameline(cmd, "flash \'%s\', device id = 0x%06" PRIx32
735 ", flash size = %" PRIu32 " %sbytes\n(page size = %" PRIu32
736 ", read = 0x%02" PRIx8 ", qread = 0x%02" PRIx8
737 ", pprog = 0x%02" PRIx8 ", mass_erase = 0x%02" PRIx8
738 ", sector size = %" PRIu32 " %sbytes, sector_erase = 0x%02" PRIx8 ")",
739 info->dev.name, info->dev.device_id & 0xFFFFFF,
740 bank->size / 4096 ? bank->size / 1024 : bank->size,
741 bank->size / 4096 ? "k" : "", info->dev.pagesize,
742 info->dev.read_cmd, info->dev.qread_cmd,
743 info->dev.pprog_cmd, info->dev.chip_erase_cmd,
744 info->dev.sectorsize / 4096 ?
745 info->dev.sectorsize / 1024 : info->dev.sectorsize,
746 info->dev.sectorsize / 4096 ? "k" : "",
747 info->dev.erase_cmd);
748
749 return ERROR_OK;
750 }
751
752 static const struct command_registration jtagspi_exec_command_handlers[] = {
753 {
754 .name = "set",
755 .handler = jtagspi_handle_set,
756 .mode = COMMAND_EXEC,
757 .usage = "bank_id name chip_size page_size read_cmd unused pprg_cmd "
758 "[ mass_erase_cmd ] [ sector_size sector_erase_cmd ]",
759 .help = "Set device parameters if not autodetected.",
760 },
761 {
762 .name = "cmd",
763 .handler = jtagspi_handle_cmd,
764 .mode = COMMAND_EXEC,
765 .usage = "bank_id num_resp cmd_byte ...",
766 .help = "Send low-level command cmd_byte and following bytes, read num_bytes.",
767 },
768 {
769 .name = "always_4byte",
770 .handler = jtagspi_handle_always_4byte,
771 .mode = COMMAND_EXEC,
772 .usage = "bank_id [ on | off ]",
773 .help = "Use always 4-byte address except for basic 0x03.",
774 },
775
776 COMMAND_REGISTRATION_DONE
777 };
778
779 static const struct command_registration jtagspi_command_handlers[] = {
780 {
781 .name = "jtagspi",
782 .mode = COMMAND_ANY,
783 .help = "jtagspi command group",
784 .usage = "",
785 .chain = jtagspi_exec_command_handlers,
786 },
787 COMMAND_REGISTRATION_DONE
788 };
789
790 const struct flash_driver jtagspi_flash = {
791 .name = "jtagspi",
792 .commands = jtagspi_command_handlers,
793 .flash_bank_command = jtagspi_flash_bank_command,
794 .erase = jtagspi_erase,
795 .protect = jtagspi_protect,
796 .write = jtagspi_write,
797 .read = jtagspi_read,
798 .probe = jtagspi_probe,
799 .auto_probe = jtagspi_auto_probe,
800 .erase_check = default_flash_blank_check,
801 .info = jtagspi_info,
802 .free_driver_priv = default_flash_free_driver_priv,
803 };

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)