]> git.sur5r.net Git - openocd/blob - src/jtag/zy1000.c
Change tap_state naming to be consistent with SVF documentation.
[openocd] / 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_IDLE, 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_RESET);
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_DRSHIFT)?TAP_DRSHIFT:TAP_IRSHIFT;
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_DRSHIFT)?TAP_DRPAUSE:TAP_IRPAUSE;
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_IRSHIFT, 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_IRSHIFT, 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_IRSHIFT, 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_DRSHIFT, 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_DRSHIFT, 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_DRSHIFT, 1);
612         gotoEndState();
613         return ERROR_OK;
614 }
615
616
617 int interface_jtag_add_tlr()
618 {
619         setCurrentState(TAP_RESET);
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_IDLE);
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_IDLE, TAP_IDLE, num, 0);
651         }
652
653 #if !TEST_MANUAL()
654         /* finish in end_state */
655         setCurrentState(state);
656 #else
657         enum tap_state t=TAP_IDLE;
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_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, 1));
738                                 shiftValueInner(TAP_DRSHIFT, 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_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, 0));
747                                 shiftValueInner(TAP_DRSHIFT, 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