- minimum autoconf 2.59 is now required and verified - due to issues with AS_HELP_STRING
[fw/openocd] / src / jtag / usbprog.c
1 /***************************************************************************
2  *   Copyright (C) 2007 by Benedikt Sauter sauter@ixbat.de                         *
3  *   based on Dominic Rath's amt_jtagaccel.c                                       *
4  *                                                                                                             * 
5  *   usbprog is a free programming adapter. You can easily install             *
6  *   different firmware versions from an "online pool" over USB.               * 
7  *   The adapter can be used for programming and debugging AVR and ARM     *
8  *   processors, as USB to RS232 converter, as JTAG interface or as        *
9  *   simple I/O interface (5 lines).                                                       *
10  *                                                                                                             *
11  *   http://www.embedded-projects.net/usbprog                                          *
12  *                                                                         *
13  *   This program is free software; you can redistribute it and/or modify  *
14  *   it under the terms of the GNU General Public License as published by  *
15  *   the Free Software Foundation; either version 2 of the License, or     *
16  *   (at your option) any later version.                                   *
17  *                                                                         *
18  *   This program is distributed in the hope that it will be useful,       *
19  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
20  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
21  *   GNU General Public License for more details.                          *
22  *                                                                         *
23  *   You should have received a copy of the GNU General Public License     *
24  *   along with this program; if not, write to the                         *
25  *   Free Software Foundation, Inc.,                                       *
26  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
27  ***************************************************************************/
28
29 #ifdef HAVE_CONFIG_H
30 #include "config.h"
31 #endif
32
33 #include "replacements.h"
34
35 #include "jtag.h"
36 #include <usb.h>
37
38 /* system includes */
39
40 #include "log.h"
41
42 #define VID 0x1781
43 #define PID 0x0c63
44
45 /* Pins at usbprog */
46 #define TDO_BIT         0
47 #define TDI_BIT         3
48 #define TCK_BIT         2
49 #define TMS_BIT         1
50
51 int usbprog_execute_queue(void);
52 int usbprog_speed(int speed);
53 int usbprog_register_commands(struct command_context_s *cmd_ctx);
54 int usbprog_init(void);
55 int usbprog_quit(void);
56
57 void usbprog_end_state(enum tap_state state);
58 void usbprog_state_move(void);
59 void usbprog_path_move(pathmove_command_t *cmd);
60 void usbprog_runtest(int num_cycles);
61 void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size);
62
63 jtag_interface_t usbprog_interface = 
64 {
65         .name = "usbprog",
66         .execute_queue = usbprog_execute_queue,
67         .support_pathmove = 0,
68         .speed = usbprog_speed, 
69         .register_commands = usbprog_register_commands,
70         .init = usbprog_init,
71         .quit = usbprog_quit
72 };
73
74 #define UNKOWN_COMMAND  0x00
75 #define PORT_DIRECTION  0x01
76 #define PORT_SET        0x02
77 #define PORT_GET        0x03
78 #define PORT_SETBIT     0x04
79 #define PORT_GETBIT     0x05
80 #define WRITE_TDI       0x06
81 #define READ_TDO        0x07
82 #define WRITE_AND_READ  0x08
83 #define WRITE_TMS       0x09
84 #define WRITE_TMS_CHAIN 0x0A
85
86 struct usbprog_jtag 
87 {
88         struct usb_dev_handle* usb_handle;
89 };
90
91 struct usbprog_jtag * usbprog_jtag_handle;
92
93 struct usbprog_jtag* usbprog_jtag_open();
94 void usbprog_jtag_close(struct usbprog_jtag *usbprog_jtag);
95 void usbprog_jtag_init(struct usbprog_jtag *usbprog_jtag);
96 unsigned char usbprog_jtag_message(struct usbprog_jtag *usbprog_jtag, char *msg, int msglen);
97
98 void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
99 void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
100 void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
101 void usbprog_jtag_write_tms(struct usbprog_jtag *usbprog_jtag, char tms_scan);
102
103 char tms_chain[64];
104 int tms_chain_index;
105 void usbprog_jtag_tms_collect(char tms_scan);
106 void usbprog_jtag_tms_send(struct usbprog_jtag *usbprog_jtag);
107
108 void usbprog_write(int tck, int tms, int tdi);
109 void usbprog_reset(int trst, int srst);
110
111 void usbprog_jtag_set_direction(struct usbprog_jtag *usbprog_jtag, unsigned char direction);
112 void usbprog_jtag_write_slice(struct usbprog_jtag *usbprog_jtag,unsigned char value);
113 unsigned char usbprog_jtag_get_port(struct usbprog_jtag *usbprog_jtag);
114 void usbprog_jtag_set_bit(struct usbprog_jtag *usbprog_jtag,int bit, int value);
115 int usbprog_jtag_get_bit(struct usbprog_jtag *usbprog_jtag, int bit);
116
117 int usbprog_speed(int speed)
118 {
119         return ERROR_OK;
120 }
121
122 int usbprog_register_commands(struct command_context_s *cmd_ctx)
123 {
124         return ERROR_OK;
125 }
126
127 int usbprog_execute_queue(void)
128 {
129         jtag_command_t *cmd = jtag_command_queue; /* currently processed command */
130         int scan_size;
131         enum scan_type type;
132         u8 *buffer;
133         
134         while (cmd)
135         {
136                 switch (cmd->type)
137                 {
138                         case JTAG_END_STATE:
139 #ifdef _DEBUG_JTAG_IO_
140                                 DEBUG("end_state: %i", cmd->cmd.end_state->end_state);
141 #endif
142                                 if (cmd->cmd.end_state->end_state != -1)
143                                         usbprog_end_state(cmd->cmd.end_state->end_state);
144                                 break;
145                         case JTAG_RESET:
146 #ifdef _DEBUG_JTAG_IO_
147                                 DEBUG("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
148 #endif
149                                 if (cmd->cmd.reset->trst == 1)
150                                 {
151                                         cur_state = TAP_TLR;
152                                 }
153                                 usbprog_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
154                                 break;
155                         case JTAG_RUNTEST:
156 #ifdef _DEBUG_JTAG_IO_
157                                 DEBUG("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->end_state);
158 #endif
159                                 if (cmd->cmd.runtest->end_state != -1)
160                                         usbprog_end_state(cmd->cmd.runtest->end_state);
161                                 usbprog_runtest(cmd->cmd.runtest->num_cycles);
162                                 break;
163                         case JTAG_STATEMOVE:
164 #ifdef _DEBUG_JTAG_IO_
165                                 DEBUG("statemove end in %i", cmd->cmd.statemove->end_state);
166 #endif
167                                 if (cmd->cmd.statemove->end_state != -1)
168                                         usbprog_end_state(cmd->cmd.statemove->end_state);
169                                 usbprog_state_move();
170                                 break;
171                         case JTAG_PATHMOVE:
172 #ifdef _DEBUG_JTAG_IO_
173                                 DEBUG("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states, 
174                                         cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
175 #endif
176                                 usbprog_path_move(cmd->cmd.pathmove);
177                                 break;
178                         case JTAG_SCAN:
179 #ifdef _DEBUG_JTAG_IO_
180                                 DEBUG("scan end in %i", cmd->cmd.scan->end_state);
181 #endif
182                                 if (cmd->cmd.scan->end_state != -1)
183                                         usbprog_end_state(cmd->cmd.scan->end_state);
184                                 scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
185                                 type = jtag_scan_type(cmd->cmd.scan);
186                                 usbprog_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size);
187                                 if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)
188                                         return ERROR_JTAG_QUEUE_FAILED;
189                                 if (buffer)
190                                         free(buffer);
191                                 break;
192                         case JTAG_SLEEP:
193 #ifdef _DEBUG_JTAG_IO_
194                                 DEBUG("sleep %i", cmd->cmd.sleep->us);
195 #endif
196                                 jtag_sleep(cmd->cmd.sleep->us);
197                                         break;
198                         default:
199                                 ERROR("BUG: unknown JTAG command type encountered");
200                                 exit(-1);
201                 }
202                         
203                 cmd = cmd->next;
204         }
205         
206         return ERROR_OK;
207 }
208
209 int usbprog_init(void)
210 {
211         usbprog_jtag_handle = usbprog_jtag_open();
212         
213         tms_chain_index = 0;
214         if (usbprog_jtag_handle == 0)
215         {
216                 ERROR("Can't find USB JTAG Interface! Please check connection and permissions.");
217                 return ERROR_JTAG_INIT_FAILED;
218         }
219         
220         INFO("USB JTAG Interface ready!");
221         
222         usbprog_jtag_init(usbprog_jtag_handle);
223         usbprog_reset(0, 0);
224         usbprog_write(0, 0, 0);
225         
226         return ERROR_OK;
227 }
228
229 int usbprog_quit(void)
230 {
231         return ERROR_OK;
232 }
233
234 /*************** jtag execute commands **********************/
235 void usbprog_end_state(enum tap_state state)
236 {
237         if (tap_move_map[state] != -1)
238                 end_state = state;
239         else
240         {
241                 ERROR("BUG: %i is not a valid end state", state);
242                 exit(-1);
243         }
244 }
245
246 void usbprog_state_move(void)
247 {       
248         int i = 0, tms = 0;
249         u8 tms_scan = TAP_MOVE(cur_state, end_state);
250         
251         usbprog_jtag_write_tms(usbprog_jtag_handle, (char)tms_scan);
252         for (i = 0; i < 7; i++)
253         {
254                 tms = (tms_scan >> i) & 1;
255         }
256         
257         cur_state = end_state;
258 }
259
260 void usbprog_path_move(pathmove_command_t *cmd)
261 {
262         int num_states = cmd->num_states;
263         int state_count;
264         
265         state_count = 0;
266         while (num_states)
267         {
268                 if (tap_transitions[cur_state].low == cmd->path[state_count])
269                 {
270                         //INFO("1");
271                         usbprog_write(0, 0, 0);
272                         usbprog_write(1, 0, 0);
273                 }
274                 else if (tap_transitions[cur_state].high == cmd->path[state_count])
275                 {
276                         //INFO("2");
277                         usbprog_write(0, 1, 0);
278                         usbprog_write(1, 1, 0);
279                 }
280                 else
281                 {
282                         ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings[cur_state], tap_state_strings[cmd->path[state_count]]);
283                         exit(-1);
284                 }
285                 
286                 cur_state = cmd->path[state_count];
287                 state_count++;
288                 num_states--;
289         }
290         
291         end_state = cur_state;
292 }
293
294 void usbprog_runtest(int num_cycles)
295 {
296         int i;
297         
298         /* only do a state_move when we're not already in RTI */
299         if (cur_state != TAP_RTI)
300         {
301                 usbprog_end_state(TAP_RTI);
302                 usbprog_state_move();
303         }
304         
305         /* execute num_cycles */
306         if (num_cycles > 0)
307         {
308                 usbprog_jtag_tms_send(usbprog_jtag_handle);
309                 usbprog_write(0, 0, 0);
310         }
311         else
312         {
313                 usbprog_jtag_tms_send(usbprog_jtag_handle);
314                 //INFO("NUM CYCLES %i",num_cycles);
315         }
316         
317         for (i = 0; i < num_cycles; i++)
318         {
319                 usbprog_write(1, 0, 0);
320                 usbprog_write(0, 0, 0);
321         }
322         
323         /* finish in end_state */
324         /*
325         usbprog_end_state(saved_end_state);
326         if (cur_state != end_state)
327                 usbprog_state_move();
328         */
329 }
330
331 void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
332 {
333         enum tap_state saved_end_state = end_state;
334         
335         if (ir_scan)
336                 usbprog_end_state(TAP_SI);
337         else
338                 usbprog_end_state(TAP_SD);
339         
340         //usbprog_jtag_tms_send(usbprog_jtag_handle);
341         
342         usbprog_state_move();
343         usbprog_end_state(saved_end_state);
344         
345         usbprog_jtag_tms_send(usbprog_jtag_handle);
346         
347         if (type == SCAN_OUT)
348         {
349                 usbprog_jtag_write_tdi(usbprog_jtag_handle,buffer, scan_size);
350         }
351         if (type == SCAN_IN)
352         {
353                 usbprog_jtag_read_tdo(usbprog_jtag_handle,buffer, scan_size);
354         }
355         if (type == SCAN_IO)
356         {
357                 usbprog_jtag_write_and_read(usbprog_jtag_handle,buffer, scan_size);
358         }
359         
360         if (ir_scan)
361                 cur_state = TAP_PI;
362         else
363                 cur_state = TAP_PD;
364         
365         if (cur_state != end_state)
366                 usbprog_state_move();
367 }
368
369 /*************** jtag wrapper functions *********************/
370
371 void usbprog_write(int tck, int tms, int tdi)
372 {
373         unsigned char output_value=0x00;
374         
375         if (tms)
376                 output_value |= (1<<TMS_BIT);
377         if (tdi)
378                 output_value |= (1<<TDI_BIT);
379         if (tck)
380                 output_value |= (1<<TCK_BIT);
381         
382         usbprog_jtag_write_slice(usbprog_jtag_handle,output_value);
383 }
384
385 /* (1) assert or (0) deassert reset lines */
386 void usbprog_reset(int trst, int srst)
387 {
388         DEBUG("trst: %i, srst: %i", trst, srst);
389         
390         if (trst)
391                 usbprog_jtag_set_bit(usbprog_jtag_handle, 5, 0);
392         else
393                 usbprog_jtag_set_bit(usbprog_jtag_handle, 5, 1);
394         
395         if (srst)
396                 usbprog_jtag_set_bit(usbprog_jtag_handle, 4, 0);
397         else
398                 usbprog_jtag_set_bit(usbprog_jtag_handle, 4, 1);
399 }
400
401 /*************** jtag lowlevel functions ********************/
402
403 struct usb_bus *busses;
404
405 struct usbprog_jtag* usbprog_jtag_open()
406 {
407         struct usb_bus *bus;
408         struct usb_device *dev;
409         
410         struct usbprog_jtag *tmp;
411         
412         tmp = (struct usbprog_jtag*)malloc(sizeof(struct usbprog_jtag));
413         
414         usb_set_debug(10);      
415         usb_init();
416         usb_find_busses();
417         usb_find_devices();
418         
419         busses = usb_get_busses();
420         
421         /* find usbprog_jtag device in usb bus */
422         
423         for (bus = busses; bus; bus = bus->next)
424         {
425                 for (dev = bus->devices; dev; dev = dev->next)
426                 {
427                         /* condition for sucessfully hit (too bad, I only check the vendor id)*/
428                         if (dev->descriptor.idVendor == VID && dev->descriptor.idProduct == PID)
429                         {
430                                 tmp->usb_handle = usb_open(dev);
431                                 usb_set_configuration(tmp->usb_handle, 1);
432                                 usb_claim_interface(tmp->usb_handle, 0);
433                                 usb_set_altinterface(tmp->usb_handle, 0);
434                                 return tmp;
435                         }
436                 } 
437         }
438         return 0;
439 }
440
441 void usbprog_jtag_close(struct usbprog_jtag *usbprog_jtag)
442 {
443         usb_close(usbprog_jtag->usb_handle);
444         free(usbprog_jtag);
445 }
446
447 unsigned char usbprog_jtag_message(struct usbprog_jtag *usbprog_jtag, char *msg, int msglen)
448 {
449         int res = usb_bulk_write(usbprog_jtag->usb_handle, 3, msg,msglen, 100);
450         if ((msg[0] == 2) || (msg[0] == 1) || (msg[0] == 4) || (msg[0] == 0) || \
451                         (msg[0] == 6) || (msg[0] == 0x0A) || (msg[0] == 9))
452                 return 1;  
453         if (res == msglen)
454         {
455                 //INFO("HALLLLOOO %i",(int)msg[0]);
456                 res =  usb_bulk_read(usbprog_jtag->usb_handle, 0x82, msg, 2, 100);
457                 if (res > 0)
458                         return (unsigned char)msg[1];
459                 else 
460                         return -1;
461         }
462         else
463                 return -1;
464         return 0;
465 }
466
467 void usbprog_jtag_init(struct usbprog_jtag *usbprog_jtag)
468 {
469         usbprog_jtag_set_direction(usbprog_jtag, 0xFE);
470 }
471
472 void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
473 {
474         char tmp[64];   // fastes packet size for usb controller
475         int send_bits, bufindex = 0, fillindex = 0, i, loops;
476         
477         char swap;
478         // 61 byte can be transfered (488 bit)
479         
480         while (size > 0)
481         {  
482                 if (size > 488)
483                 {
484                         send_bits = 488;
485                         size = size - 488;
486                         loops = 61;
487                 }
488                 else
489                 {
490                         send_bits = size;
491                         loops = size / 8;
492                         loops++;
493                         size = 0;
494                 }
495                 tmp[0] = WRITE_AND_READ;
496                 tmp[1] = (char)(send_bits >> 8);        // high 
497                 tmp[2] = (char)(send_bits);                     // low
498                 i = 0; 
499                 
500                 for (i = 0; i < loops; i++)
501                 {
502                         tmp[3 + i] = buffer[bufindex];
503                         bufindex++;
504                 }
505                 
506                 if (usb_bulk_write(usbprog_jtag->usb_handle, 3, tmp, 64, 1000) == 64)
507                 {
508                         //INFO("HALLLLOOO2 %i",(int)tmp[0]);
509                         usleep(1);
510                         int timeout = 0;
511                         while (usb_bulk_read(usbprog_jtag->usb_handle, 0x82, tmp, 64, 1000) < 1)
512                         {
513                                 timeout++;
514                                 if (timeout > 10)
515                                         break;
516                         }       
517                         
518                         for (i = 0; i < loops; i++)
519                         {
520                                 swap =  tmp[3 + i];
521                                 buffer[fillindex++] = swap;
522                         } 
523                 }
524         }
525 }
526
527 void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
528 {
529         char tmp[64];   // fastes packet size for usb controller
530         int send_bits, fillindex = 0, i, loops;
531
532         char swap;
533         // 61 byte can be transfered (488 bit)
534     
535         while (size > 0)
536         {  
537                 if (size > 488)
538                 {
539                         send_bits = 488;
540                         size = size - 488;
541                         loops = 61;
542                 }
543                 else
544                 {
545                         send_bits = size;
546                         loops = size / 8;
547                         loops++;
548                         size = 0;
549                 }
550                 tmp[0] = WRITE_AND_READ;
551                 tmp[1] = (char)(send_bits >> 8);        // high 
552                 tmp[2] = (char)(send_bits);                     // low
553     
554                 usb_bulk_write(usbprog_jtag->usb_handle, 3, tmp, 3, 1000);
555     
556                 //INFO("HALLLLOOO3 %i",(int)tmp[0]);
557                 int timeout = 0;
558                 usleep(1);
559                 while (usb_bulk_read(usbprog_jtag->usb_handle, 0x82, tmp, 64, 10) < 1)
560                 {
561                         timeout++;
562                         if (timeout > 10)
563                                 break;
564                 }
565
566                 for (i = 0; i < loops; i++)
567                 {
568                         swap = tmp[3 + i];
569                         buffer[fillindex++] = swap;
570                 } 
571         }
572 }
573
574 void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
575 {
576         char tmp[64];   // fastes packet size for usb controller
577         int send_bits, bufindex = 0, i, loops;
578
579         // 61 byte can be transfered (488 bit)
580         while (size > 0)
581         {
582                 if (size > 488)
583                 {
584                         send_bits = 488;
585                         size = size - 488;
586                         loops = 61;
587                 }
588                 else
589                 {
590                         send_bits = size;
591                         loops = size/8;
592                         //if(loops==0)
593                         loops++;
594                         size = 0;
595                 }
596                 tmp[0] = WRITE_TDI;
597                 tmp[1] = (char)(send_bits >> 8);        // high 
598                 tmp[2] = (char)(send_bits);                     // low
599                 i = 0; 
600                 
601                 for (i = 0; i < loops; i++)
602                 {
603                         tmp[3 + i] = buffer[bufindex];
604                         bufindex++;
605                 }
606                 usb_bulk_write(usbprog_jtag->usb_handle, 3, tmp, 64, 1000);
607         }
608 }
609
610 void usbprog_jtag_write_tms(struct usbprog_jtag *usbprog_jtag, char tms_scan)
611 {
612         usbprog_jtag_tms_collect(tms_scan);
613 }
614
615 void usbprog_jtag_set_direction(struct usbprog_jtag *usbprog_jtag, unsigned char direction)
616 {
617         char tmp[2];
618         tmp[0] = PORT_DIRECTION;
619         tmp[1] = (char)direction;
620         usbprog_jtag_message(usbprog_jtag, tmp, 2);
621 }
622
623 void usbprog_jtag_write_slice(struct usbprog_jtag *usbprog_jtag,unsigned char value)
624 {
625         char tmp[2];
626         tmp[0] = PORT_SET;
627         tmp[1] = (char)value;
628         usbprog_jtag_message(usbprog_jtag, tmp, 2);
629 }
630
631 unsigned char usbprog_jtag_get_port(struct usbprog_jtag *usbprog_jtag)
632 {
633         char tmp[2];
634         tmp[0] = PORT_GET;
635         tmp[1] = 0x00;
636         return usbprog_jtag_message(usbprog_jtag, tmp, 2);
637 }
638
639 void usbprog_jtag_set_bit(struct usbprog_jtag *usbprog_jtag,int bit, int value)
640 {
641         char tmp[3];
642         tmp[0] = PORT_SETBIT;
643         tmp[1] = (char)bit;
644         if (value == 1)  
645                 tmp[2] = 0x01;
646         else
647                 tmp[2] = 0x00;
648         usbprog_jtag_message(usbprog_jtag, tmp, 3);
649 }
650
651 int usbprog_jtag_get_bit(struct usbprog_jtag *usbprog_jtag, int bit)
652 {
653         char tmp[2];
654         tmp[0] = PORT_GETBIT;
655         tmp[1] = (char)bit;
656         
657         if (usbprog_jtag_message(usbprog_jtag, tmp, 2) > 0)
658                 return 1;
659         else
660                 return 0;
661 }
662
663 void usbprog_jtag_tms_collect(char tms_scan)
664 {
665         tms_chain[tms_chain_index] = tms_scan;
666         tms_chain_index++;
667 }
668
669 void usbprog_jtag_tms_send(struct usbprog_jtag *usbprog_jtag)
670 {
671         int i;
672         //INFO("TMS SEND");
673         if (tms_chain_index > 0)
674         {
675                 char tmp[tms_chain_index + 2];
676                 tmp[0] = WRITE_TMS_CHAIN;
677                 tmp[1] = (char)(tms_chain_index);
678                 for (i = 0; i < tms_chain_index + 1; i++)
679                         tmp[2 + i] = tms_chain[i];
680                 usb_bulk_write(usbprog_jtag->usb_handle, 3, tmp, tms_chain_index + 2, 1000);
681                 tms_chain_index = 0;
682         }
683 }