]> git.sur5r.net Git - openocd/blob - src/jtag/zy1000.c
jtag_get_device() now returns NULL and reports error instead of invoking exit()
[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(0x08000010, 0x80);
85         HAL_READ_UINT32(0x08000010, 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(0x08000010, 0x00000040);
97         HAL_READ_UINT32(0x08000010, 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(0x08000014, 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(0x08000010, 0x00000001);
164         }
165
166         if(!trst)
167         {
168                 ZY1000_POKE(0x08000014, 0x00000002);
169         }
170         else
171         {
172                 /* assert reset */
173                 ZY1000_POKE(0x08000010, 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(0x08000020, TAP_TLR);
181         } else
182         {
183                 /* We'll get RCLK failure when we assert TRST, so clear any false positives here */
184                 ZY1000_POKE(0x08000014, 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(0x08000010, 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(0x08000014, 0x100);
232                 ZY1000_POKE(0x0800001c, 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(0x08000010, 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(0x08000010, empty);
328         /* clear JTAG error register */
329         ZY1000_POKE(0x08000014, 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(0x0800000c, 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(0x08000018, 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(0x0800000c, value);
373         ZY1000_POKE(0x08000008, (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 i, j;
496         int scan_size = 0;
497         jtag_device_t *device;
498
499         for (i=0; i < jtag_num_devices; i++)
500         {
501                 int pause=i==(jtag_num_devices-1);
502                 int found = 0;
503                 device = jtag_get_device(i);
504                 if (device==NULL)
505                 {
506                         return ERROR_FAIL;
507                 }
508
509                 scan_size = device->ir_length;
510
511                 /* search the list */
512                 for (j=0; j < num_fields; j++)
513                 {
514                         if (i == fields[j].device)
515                         {
516                                 found = 1;
517
518                                 if ((jtag_verify_capture_ir)&&(fields[j].in_handler==NULL))
519                                 {
520                                         jtag_set_check_value(fields+j, device->expected, device->expected_mask, NULL);
521                                 } else if (jtag_verify_capture_ir)
522                                 {
523                                         fields[j].in_check_value = device->expected;
524                                         fields[j].in_check_mask = device->expected_mask;
525                                 }
526
527                                 scanFields(1, fields+j, TAP_SI, pause);
528                                 /* update device information */
529                                 buf_cpy(fields[j].out_value, device->cur_instr, scan_size);
530
531                                 device->bypass = 0;
532                                 break;
533                         }
534                 }
535
536                 if (!found)
537                 {
538                         /* if a device isn't listed, set it to BYPASS */
539                         u8 ones[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
540
541                         scan_field_t tmp;
542                         memset(&tmp, 0, sizeof(tmp));
543                         tmp.out_value = ones;
544                         tmp.num_bits = scan_size;
545                         scanFields(1, &tmp, TAP_SI, pause);
546                         /* update device information */
547                         buf_cpy(tmp.out_value, device->cur_instr, scan_size);
548                         device->bypass = 1;
549                 }
550         }
551         gotoEndState();
552
553         return ERROR_OK;
554 }
555
556
557
558
559
560 int interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
561 {
562         scanFields(num_fields, fields, TAP_SI, 1);
563         gotoEndState();
564
565         return ERROR_OK;
566 }
567
568 /*extern jtag_command_t **jtag_get_last_command_p(void);*/
569
570 int interface_jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state state)
571 {
572         int i, j;
573         for (i=0; i < jtag_num_devices; i++)
574         {
575                 int found = 0;
576                 int pause = (i==(jtag_num_devices-1));
577
578                 for (j=0; j < num_fields; j++)
579                 {
580                         if (i == fields[j].device)
581                         {
582                                 found = 1;
583
584                                 scanFields(1, fields+j, TAP_SD, pause);
585                         }
586                 }
587                 if (!found)
588                 {
589 #ifdef _DEBUG_JTAG_IO_
590                         /* if a device isn't listed, the BYPASS register should be selected */
591                         if (!jtag_get_device(i)->bypass)
592                         {
593                                 LOG_ERROR("BUG: no scan data for a device not in BYPASS");
594                                 exit(-1);
595                         }
596 #endif
597
598                         scan_field_t tmp;
599                         /* program the scan field to 1 bit length, and ignore it's value */
600                         tmp.num_bits = 1;
601                         tmp.out_value = NULL;
602                         tmp.out_mask = NULL;
603                         tmp.in_value = NULL;
604                         tmp.in_check_value = NULL;
605                         tmp.in_check_mask = NULL;
606                         tmp.in_handler = NULL;
607                         tmp.in_handler_priv = NULL;
608
609                         scanFields(1, &tmp, TAP_SD, pause);
610                 }
611                 else
612                 {
613 #ifdef _DEBUG_JTAG_IO_
614                         /* if a device is listed, the BYPASS register must not be selected */
615                         if (jtag_get_device(i)->bypass)
616                         {
617                                 LOG_WARNING("scan data for a device in BYPASS");
618                         }
619 #endif
620                 }
621         }
622         gotoEndState();
623         return ERROR_OK;
624 }
625
626 int interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state state)
627 {
628         scanFields(num_fields, fields, TAP_SD, 1);
629         gotoEndState();
630         return ERROR_OK;
631 }
632
633
634 int interface_jtag_add_tlr()
635 {
636         setCurrentState(TAP_TLR);
637         return ERROR_OK;
638 }
639
640
641
642
643 extern int jtag_nsrst_delay;
644 extern int jtag_ntrst_delay;
645
646 int interface_jtag_add_reset(int req_trst, int req_srst)
647 {
648         zy1000_reset(req_trst, req_srst);
649         return ERROR_OK;
650 }
651
652 int interface_jtag_add_runtest(int num_cycles, enum tap_state state)
653 {
654         /* num_cycles can be 0 */
655         setCurrentState(TAP_RTI);
656
657         /* execute num_cycles, 32 at the time. */
658         int i;
659         for (i=0; i<num_cycles; i+=32)
660         {
661                 int num;
662                 num=32;
663                 if (num_cycles-i<num)
664                 {
665                         num=num_cycles-i;
666                 }
667                 shiftValueInner(TAP_RTI, TAP_RTI, num, 0);
668         }
669
670 #if !TEST_MANUAL()
671         /* finish in end_state */
672         setCurrentState(state);
673 #else
674         enum tap_state t=TAP_RTI;
675         /* test manual drive code on any target */
676         int tms;
677         u8 tms_scan = TAP_MOVE(t, state);
678
679         for (i = 0; i < 7; i++)
680         {
681                 tms = (tms_scan >> i) & 1;
682                 waitIdle();
683                 ZY1000_POKE(0x08000028,  tms);
684         }
685         waitIdle();
686         ZY1000_POKE(0x08000020, state);
687 #endif
688
689
690         return ERROR_OK;
691 }
692
693 int interface_jtag_add_sleep(u32 us)
694 {
695         jtag_sleep(us);
696         return ERROR_OK;
697 }
698
699 int interface_jtag_add_pathmove(int num_states, enum tap_state *path)
700 {
701         int state_count;
702         int tms = 0;
703
704         /*wait for the fifo to be empty*/
705         waitIdle();
706
707         state_count = 0;
708
709         enum tap_state cur_state=cmd_queue_cur_state;
710
711         while (num_states)
712         {
713                 if (tap_transitions[cur_state].low == path[state_count])
714                 {
715                         tms = 0;
716                 }
717                 else if (tap_transitions[cur_state].high == path[state_count])
718                 {
719                         tms = 1;
720                 }
721                 else
722                 {
723                         LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings[cur_state], tap_state_strings[path[state_count]]);
724                         exit(-1);
725                 }
726
727                 waitIdle();
728                 ZY1000_POKE(0x08000028,  tms);
729
730                 cur_state = path[state_count];
731                 state_count++;
732                 num_states--;
733         }
734
735         waitIdle();
736         ZY1000_POKE(0x08000020,  cur_state);
737         return ERROR_OK;
738 }
739
740
741
742 void embeddedice_write_dcc(int chain_pos, int reg_addr, u8 *buffer, int little, int count)
743 {
744 //      static int const reg_addr=0x5;
745         enum tap_state end_state=cmd_queue_end_state;
746         if (jtag_num_devices==1)
747         {
748                 /* better performance via code duplication */
749                 if (little)
750                 {
751                         int i;
752                         for (i = 0; i < count; i++)
753                         {
754                                 shiftValueInner(TAP_SD, TAP_SD, 32, fast_target_buffer_get_u32(buffer, 1));
755                                 shiftValueInner(TAP_SD, end_state, 6, reg_addr|(1<<5));
756                                 buffer+=4;
757                         }
758                 } else
759                 {
760                         int i;
761                         for (i = 0; i < count; i++)
762                         {
763                                 shiftValueInner(TAP_SD, TAP_SD, 32, fast_target_buffer_get_u32(buffer, 0));
764                                 shiftValueInner(TAP_SD, end_state, 6, reg_addr|(1<<5));
765                                 buffer+=4;
766                         }
767                 }
768         }
769         else
770         {
771                 int i;
772                 for (i = 0; i < count; i++)
773                 {
774                         embeddedice_write_reg_inner(chain_pos, reg_addr, fast_target_buffer_get_u32(buffer, little));
775                         buffer += 4;
776                 }
777         }
778 }
779