1ff5efff74005baf3d4ad4266d75c80603310a5a
[openocd.git] / src / jtag / zy1000.c
1 /***************************************************************************
2 * Copyright (C) 2007-2008 by Øyvind Harboe *
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, write to the *
16 * Free Software Foundation, Inc., *
17 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
18 ***************************************************************************/
19 #ifdef HAVE_CONFIG_H
20 #include "config.h"
21 #endif
22
23
24 #include "log.h"
25 #include "jtag.h"
26 #include "bitbang.h"
27 #include "../target/embeddedice.h"
28
29
30 #include <cyg/hal/hal_io.h> // low level i/o
31 #include <cyg/hal/hal_diag.h>
32
33 #include <stdlib.h>
34
35
36 extern int jtag_error;
37
38 /* low level command set
39 */
40 int zy1000_read(void);
41 static void zy1000_write(int tck, int tms, int tdi);
42 void zy1000_reset(int trst, int srst);
43
44
45 int zy1000_speed(int speed);
46 int zy1000_register_commands(struct command_context_s *cmd_ctx);
47 int zy1000_init(void);
48 int zy1000_quit(void);
49
50 /* interface commands */
51 int zy1000_handle_zy1000_port_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
52
53 static int zy1000_khz(int khz, int *jtag_speed)
54 {
55 if (khz==0)
56 {
57 *jtag_speed=0;
58 }
59 else
60 {
61 *jtag_speed=64000/khz;
62 }
63 return ERROR_OK;
64 }
65
66 static int zy1000_speed_div(int speed, int *khz)
67 {
68 if (speed==0)
69 {
70 *khz = 0;
71 }
72 else
73 {
74 *khz=64000/speed;
75 }
76
77 return ERROR_OK;
78 }
79
80 static bool readPowerDropout()
81 {
82 cyg_uint32 state;
83 // sample and clear power dropout
84 HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x10, 0x80);
85 HAL_READ_UINT32(ZY1000_JTAG_BASE+0x10, state);
86 bool powerDropout;
87 powerDropout = (state & 0x80) != 0;
88 return powerDropout;
89 }
90
91
92 static bool readSRST()
93 {
94 cyg_uint32 state;
95 // sample and clear SRST sensing
96 HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x10, 0x00000040);
97 HAL_READ_UINT32(ZY1000_JTAG_BASE+0x10, state);
98 bool srstAsserted;
99 srstAsserted = (state & 0x40) != 0;
100 return srstAsserted;
101 }
102
103 static int zy1000_srst_asserted(int *srst_asserted)
104 {
105 *srst_asserted=readSRST();
106 return ERROR_OK;
107 }
108
109 static int zy1000_power_dropout(int *dropout)
110 {
111 *dropout=readPowerDropout();
112 return ERROR_OK;
113 }
114
115
116 jtag_interface_t zy1000_interface =
117 {
118 .name = "ZY1000",
119 .execute_queue = bitbang_execute_queue,
120 .speed = zy1000_speed,
121 .register_commands = zy1000_register_commands,
122 .init = zy1000_init,
123 .quit = zy1000_quit,
124 .khz = zy1000_khz,
125 .speed_div = zy1000_speed_div,
126 .power_dropout = zy1000_power_dropout,
127 .srst_asserted = zy1000_srst_asserted,
128 };
129
130 bitbang_interface_t zy1000_bitbang =
131 {
132 .read = zy1000_read,
133 .write = zy1000_write,
134 .reset = zy1000_reset
135 };
136
137
138
139 static void zy1000_write(int tck, int tms, int tdi)
140 {
141
142 }
143
144 int zy1000_read(void)
145 {
146 return -1;
147 }
148
149 extern bool readSRST();
150
151 void zy1000_reset(int trst, int srst)
152 {
153 LOG_DEBUG("zy1000 trst=%d, srst=%d", trst, srst);
154 if(!srst)
155 {
156 ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x00000001);
157 }
158 else
159 {
160 /* Danger!!! if clk!=0 when in
161 * idle in TAP_RTI, reset halt on str912 will fail.
162 */
163 ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x00000001);
164 }
165
166 if(!trst)
167 {
168 ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x00000002);
169 }
170 else
171 {
172 /* assert reset */
173 ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x00000002);
174 }
175
176 if (trst||(srst&&(jtag_reset_config & RESET_SRST_PULLS_TRST)))
177 {
178 waitIdle();
179 /* we're now in the TLR state until trst is deasserted */
180 ZY1000_POKE(ZY1000_JTAG_BASE+0x20, TAP_TLR);
181 } else
182 {
183 /* We'll get RCLK failure when we assert TRST, so clear any false positives here */
184 ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x400);
185 }
186
187 /* wait for srst to float back up */
188 if (!srst)
189 {
190 int i;
191 for (i=0; i<1000; i++)
192 {
193 // We don't want to sense our own reset, so we clear here.
194 // There is of course a timing hole where we could loose
195 // a "real" reset.
196 if (!readSRST())
197 break;
198
199 /* wait 1ms */
200 alive_sleep(1);
201 }
202
203 if (i==1000)
204 {
205 LOG_USER("SRST didn't deassert after %dms", i);
206 } else if (i>1)
207 {
208 LOG_USER("SRST took %dms to deassert", i);
209 }
210 }
211 }
212
213 int zy1000_speed(int speed)
214 {
215 if(speed == 0)
216 {
217 /*0 means RCLK*/
218 speed = 0;
219 ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x100);
220 LOG_DEBUG("jtag_speed using RCLK");
221 }
222 else
223 {
224 if(speed > 8190 || speed < 2)
225 {
226 LOG_ERROR("valid ZY1000 jtag_speed=[8190,2]. Divisor is 64MHz / even values between 8190-2, i.e. min 7814Hz, max 32MHz");
227 return ERROR_INVALID_ARGUMENTS;
228 }
229
230 LOG_USER("jtag_speed %d => JTAG clk=%f", speed, 64.0/(float)speed);
231 ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x100);
232 ZY1000_POKE(ZY1000_JTAG_BASE+0x1c, speed&~1);
233 }
234 return ERROR_OK;
235 }
236
237 int zy1000_register_commands(struct command_context_s *cmd_ctx)
238 {
239 return ERROR_OK;
240 }
241
242
243 int zy1000_init(void)
244 {
245 ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x30); // Turn on LED1 & LED2
246
247 /* deassert resets. Important to avoid infinite loop waiting for SRST to deassert */
248 zy1000_reset(0, 0);
249 zy1000_speed(jtag_speed);
250
251 bitbang_interface = &zy1000_bitbang;
252
253 return ERROR_OK;
254 }
255
256 int zy1000_quit(void)
257 {
258
259 return ERROR_OK;
260 }
261
262
263
264 /* loads a file and returns a pointer to it in memory. The file contains
265 * a 0 byte(sentinel) after len bytes - the length of the file. */
266 int loadFile(const char *fileName, void **data, int *len)
267 {
268 FILE * pFile;
269 pFile = fopen (fileName,"rb");
270 if (pFile==NULL)
271 {
272 LOG_ERROR("Can't open %s\n", fileName);
273 return ERROR_JTAG_DEVICE_ERROR;
274 }
275 if (fseek (pFile, 0, SEEK_END)!=0)
276 {
277 LOG_ERROR("Can't open %s\n", fileName);
278 fclose(pFile);
279 return ERROR_JTAG_DEVICE_ERROR;
280 }
281 *len=ftell (pFile);
282 if (*len==-1)
283 {
284 LOG_ERROR("Can't open %s\n", fileName);
285 fclose(pFile);
286 return ERROR_JTAG_DEVICE_ERROR;
287 }
288
289 if (fseek (pFile, 0, SEEK_SET)!=0)
290 {
291 LOG_ERROR("Can't open %s\n", fileName);
292 fclose(pFile);
293 return ERROR_JTAG_DEVICE_ERROR;
294 }
295 *data=malloc(*len+1);
296 if (*data==NULL)
297 {
298 LOG_ERROR("Can't open %s\n", fileName);
299 fclose(pFile);
300 return ERROR_JTAG_DEVICE_ERROR;
301 }
302
303 if (fread(*data, 1, *len, pFile)!=*len)
304 {
305 fclose(pFile);
306 free(*data);
307 LOG_ERROR("Can't open %s\n", fileName);
308 return ERROR_JTAG_DEVICE_ERROR;
309 }
310 fclose (pFile);
311 *(((char *)(*data))+*len)=0; /* sentinel */
312
313 return ERROR_OK;
314
315
316
317 }
318
319
320
321
322 int interface_jtag_execute_queue(void)
323 {
324 cyg_uint32 empty;
325
326 waitIdle();
327 ZY1000_PEEK(ZY1000_JTAG_BASE+0x10, empty);
328 /* clear JTAG error register */
329 ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x400);
330
331 if ((empty&0x400)!=0)
332 {
333 LOG_WARNING("RCLK timeout");
334 /* the error is informative only as we don't want to break the firmware if there
335 * is a false positive.
336 */
337 // return ERROR_FAIL;
338 }
339 return ERROR_OK;
340 }
341
342
343
344
345
346 static cyg_uint32 getShiftValue()
347 {
348 cyg_uint32 value;
349 waitIdle();
350 ZY1000_PEEK(ZY1000_JTAG_BASE+0xc, value);
351 VERBOSE(LOG_INFO("getShiftValue %08x", value));
352 return value;
353 }
354 #if 0
355 static cyg_uint32 getShiftValueFlip()
356 {
357 cyg_uint32 value;
358 waitIdle();
359 ZY1000_PEEK(ZY1000_JTAG_BASE+0x18, value);
360 VERBOSE(LOG_INFO("getShiftValue %08x (flipped)", value));
361 return value;
362 }
363 #endif
364
365 #if 0
366 static void shiftValueInnerFlip(const enum tap_state state, const enum tap_state endState, int repeat, cyg_uint32 value)
367 {
368 VERBOSE(LOG_INFO("shiftValueInner %s %s %d %08x (flipped)", tap_state_strings[state], tap_state_strings[endState], repeat, value));
369 cyg_uint32 a,b;
370 a=state;
371 b=endState;
372 ZY1000_POKE(ZY1000_JTAG_BASE+0xc, value);
373 ZY1000_POKE(ZY1000_JTAG_BASE+0x8, (1<<15)|(repeat<<8)|(a<<4)|b);
374 VERBOSE(getShiftValueFlip());
375 }
376 #endif
377
378 extern int jtag_check_value(u8 *captured, void *priv);
379
380 static void gotoEndState()
381 {
382 setCurrentState(cmd_queue_end_state);
383 }
384
385 static __inline void scanFields(int num_fields, scan_field_t *fields, enum tap_state shiftState, int pause)
386 {
387 int i;
388 int j;
389 int k;
390
391 for (i = 0; i < num_fields; i++)
392 {
393 cyg_uint32 value;
394
395 static u8 *in_buff=NULL; /* pointer to buffer for scanned data */
396 static int in_buff_size=0;
397 u8 *inBuffer=NULL;
398
399
400 // figure out where to store the input data
401 int num_bits=fields[i].num_bits;
402 if (fields[i].in_value!=NULL)
403 {
404 inBuffer=fields[i].in_value;
405 } else if (fields[i].in_handler!=NULL)
406 {
407 if (in_buff_size*8<num_bits)
408 {
409 // we need more space
410 if (in_buff!=NULL)
411 free(in_buff);
412 in_buff=NULL;
413 in_buff_size=(num_bits+7)/8;
414 in_buff=malloc(in_buff_size);
415 if (in_buff==NULL)
416 {
417 LOG_ERROR("Out of memory");
418 jtag_error=ERROR_JTAG_QUEUE_FAILED;
419 return;
420 }
421 }
422 inBuffer=in_buff;
423 }
424
425 // here we shuffle N bits out/in
426 j=0;
427 while (j<num_bits)
428 {
429 enum tap_state pause_state;
430 int l;
431 k=num_bits-j;
432 pause_state=(shiftState==TAP_SD)?TAP_SD:TAP_SI;
433 if (k>32)
434 {
435 k=32;
436 /* we have more to shift out */
437 } else if (pause&&(i == num_fields-1))
438 {
439 /* this was the last to shift out this time */
440 pause_state=(shiftState==TAP_SD)?TAP_PD:TAP_PI;
441 }
442
443 // we have (num_bits+7)/8 bytes of bits to toggle out.
444 // bits are pushed out LSB to MSB
445 value=0;
446 if (fields[i].out_value!=NULL)
447 {
448 for (l=0; l<k; l+=8)
449 {
450 value|=fields[i].out_value[(j+l)/8]<<l;
451 }
452 }
453 /* mask away unused bits for easier debugging */
454 value&=~(((u32)0xffffffff)<<k);
455
456 shiftValueInner(shiftState, pause_state, k, value);
457
458 if (inBuffer!=NULL)
459 {
460 // data in, LSB to MSB
461 value=getShiftValue();
462 // we're shifting in data to MSB, shift data to be aligned for returning the value
463 value >>= 32-k;
464
465 for (l=0; l<k; l+=8)
466 {
467 inBuffer[(j+l)/8]=(value>>l)&0xff;
468 }
469 }
470 j+=k;
471 }
472
473 if (fields[i].in_handler!=NULL)
474 {
475 // invoke callback
476 int r=fields[i].in_handler(inBuffer, fields[i].in_handler_priv, fields+i);
477 if (r!=ERROR_OK)
478 {
479 /* this will cause jtag_execute_queue() to return an error */
480 jtag_error=r;
481 }
482 }
483 }
484 }
485
486 int interface_jtag_add_end_state(enum tap_state state)
487 {
488 return ERROR_OK;
489 }
490
491
492 int interface_jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
493 {
494
495 int j;
496 int scan_size = 0;
497 jtag_tap_t *tap, *nextTap;
498 for(tap = jtag_NextEnabledTap(NULL); tap!= NULL; tap=nextTap)
499 {
500 nextTap=jtag_NextEnabledTap(tap);
501 int pause=(nextTap==NULL);
502
503 int found = 0;
504
505 scan_size = tap->ir_length;
506
507 /* search the list */
508 for (j=0; j < num_fields; j++)
509 {
510 if (tap == fields[j].tap)
511 {
512 found = 1;
513
514 if ((jtag_verify_capture_ir)&&(fields[j].in_handler==NULL))
515 {
516 jtag_set_check_value(fields+j, tap->expected, tap->expected_mask, NULL);
517 } else if (jtag_verify_capture_ir)
518 {
519 fields[j].in_check_value = tap->expected;
520 fields[j].in_check_mask = tap->expected_mask;
521 }
522
523 scanFields(1, fields+j, TAP_SI, pause);
524 /* update device information */
525 buf_cpy(fields[j].out_value, tap->cur_instr, scan_size);
526
527 tap->bypass = 0;
528 break;
529 }
530 }
531
532 if (!found)
533 {
534 /* if a device isn't listed, set it to BYPASS */
535 u8 ones[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
536
537 scan_field_t tmp;
538 memset(&tmp, 0, sizeof(tmp));
539 tmp.out_value = ones;
540 tmp.num_bits = scan_size;
541 scanFields(1, &tmp, TAP_SI, pause);
542 /* update device information */
543 buf_cpy(tmp.out_value, tap->cur_instr, scan_size);
544 tap->bypass = 1;
545 }
546 }
547 gotoEndState();
548
549 return ERROR_OK;
550 }
551
552
553
554
555
556 int interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
557 {
558 scanFields(num_fields, fields, TAP_SI, 1);
559 gotoEndState();
560
561 return ERROR_OK;
562 }
563
564 /*extern jtag_command_t **jtag_get_last_command_p(void);*/
565
566 int interface_jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state state)
567 {
568
569 int j;
570 jtag_tap_t *tap, *nextTap;
571 for(tap = jtag_NextEnabledTap(NULL); tap!= NULL; tap=nextTap)
572 {
573 nextTap=jtag_NextEnabledTap(tap);
574 int found=0;
575 int pause=(nextTap==NULL);
576
577 for (j=0; j < num_fields; j++)
578 {
579 if (tap == fields[j].tap)
580 {
581 found = 1;
582
583 scanFields(1, fields+j, TAP_SD, pause);
584 }
585 }
586 if (!found)
587 {
588 scan_field_t tmp;
589 /* program the scan field to 1 bit length, and ignore it's value */
590 tmp.num_bits = 1;
591 tmp.out_value = NULL;
592 tmp.out_mask = NULL;
593 tmp.in_value = NULL;
594 tmp.in_check_value = NULL;
595 tmp.in_check_mask = NULL;
596 tmp.in_handler = NULL;
597 tmp.in_handler_priv = NULL;
598
599 scanFields(1, &tmp, TAP_SD, pause);
600 }
601 else
602 {
603 }
604 }
605 gotoEndState();
606 return ERROR_OK;
607 }
608
609 int interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state state)
610 {
611 scanFields(num_fields, fields, TAP_SD, 1);
612 gotoEndState();
613 return ERROR_OK;
614 }
615
616
617 int interface_jtag_add_tlr()
618 {
619 setCurrentState(TAP_TLR);
620 return ERROR_OK;
621 }
622
623
624
625
626 extern int jtag_nsrst_delay;
627 extern int jtag_ntrst_delay;
628
629 int interface_jtag_add_reset(int req_trst, int req_srst)
630 {
631 zy1000_reset(req_trst, req_srst);
632 return ERROR_OK;
633 }
634
635 int interface_jtag_add_runtest(int num_cycles, enum tap_state state)
636 {
637 /* num_cycles can be 0 */
638 setCurrentState(TAP_RTI);
639
640 /* execute num_cycles, 32 at the time. */
641 int i;
642 for (i=0; i<num_cycles; i+=32)
643 {
644 int num;
645 num=32;
646 if (num_cycles-i<num)
647 {
648 num=num_cycles-i;
649 }
650 shiftValueInner(TAP_RTI, TAP_RTI, num, 0);
651 }
652
653 #if !TEST_MANUAL()
654 /* finish in end_state */
655 setCurrentState(state);
656 #else
657 enum tap_state t=TAP_RTI;
658 /* test manual drive code on any target */
659 int tms;
660 u8 tms_scan = TAP_MOVE(t, state);
661
662 for (i = 0; i < 7; i++)
663 {
664 tms = (tms_scan >> i) & 1;
665 waitIdle();
666 ZY1000_POKE(ZY1000_JTAG_BASE+0x28, tms);
667 }
668 waitIdle();
669 ZY1000_POKE(ZY1000_JTAG_BASE+0x20, state);
670 #endif
671
672
673 return ERROR_OK;
674 }
675
676 int interface_jtag_add_sleep(u32 us)
677 {
678 jtag_sleep(us);
679 return ERROR_OK;
680 }
681
682 int interface_jtag_add_pathmove(int num_states, enum tap_state *path)
683 {
684 int state_count;
685 int tms = 0;
686
687 /*wait for the fifo to be empty*/
688 waitIdle();
689
690 state_count = 0;
691
692 enum tap_state cur_state=cmd_queue_cur_state;
693
694 while (num_states)
695 {
696 if (tap_transitions[cur_state].low == path[state_count])
697 {
698 tms = 0;
699 }
700 else if (tap_transitions[cur_state].high == path[state_count])
701 {
702 tms = 1;
703 }
704 else
705 {
706 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings[cur_state], tap_state_strings[path[state_count]]);
707 exit(-1);
708 }
709
710 waitIdle();
711 ZY1000_POKE(ZY1000_JTAG_BASE+0x28, tms);
712
713 cur_state = path[state_count];
714 state_count++;
715 num_states--;
716 }
717
718 waitIdle();
719 ZY1000_POKE(ZY1000_JTAG_BASE+0x20, cur_state);
720 return ERROR_OK;
721 }
722
723
724
725 void embeddedice_write_dcc(jtag_tap_t *tap, int reg_addr, u8 *buffer, int little, int count)
726 {
727 // static int const reg_addr=0x5;
728 enum tap_state end_state=cmd_queue_end_state;
729 if (jtag_NextEnabledTap(jtag_NextEnabledTap(NULL))==NULL)
730 {
731 /* better performance via code duplication */
732 if (little)
733 {
734 int i;
735 for (i = 0; i < count; i++)
736 {
737 shiftValueInner(TAP_SD, TAP_SD, 32, fast_target_buffer_get_u32(buffer, 1));
738 shiftValueInner(TAP_SD, end_state, 6, reg_addr|(1<<5));
739 buffer+=4;
740 }
741 } else
742 {
743 int i;
744 for (i = 0; i < count; i++)
745 {
746 shiftValueInner(TAP_SD, TAP_SD, 32, fast_target_buffer_get_u32(buffer, 0));
747 shiftValueInner(TAP_SD, end_state, 6, reg_addr|(1<<5));
748 buffer+=4;
749 }
750 }
751 }
752 else
753 {
754 int i;
755 for (i = 0; i < count; i++)
756 {
757 embeddedice_write_reg_inner(tap, reg_addr, fast_target_buffer_get_u32(buffer, little));
758 buffer += 4;
759 }
760 }
761 }
762

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)