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

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)