buspirate: change handling of communication speed setting + create serial port open...
[openocd.git] / src / jtag / drivers / buspirate.c
1 /***************************************************************************
2 * Copyright (C) 2010 by Michal Demin *
3 * based on usbprog.c and arm-jtag-ew.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
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include <jtag/interface.h>
26 #include <jtag/commands.h>
27
28 #include <termios.h>
29 #include <fcntl.h>
30 #include <sys/ioctl.h>
31
32 #undef DEBUG_SERIAL
33 /*#define DEBUG_SERIAL */
34 static int buspirate_execute_queue(void);
35 static int buspirate_speed(int speed);
36 static int buspirate_khz(int khz, int *jtag_speed);
37 static int buspirate_init(void);
38 static int buspirate_quit(void);
39
40 static void buspirate_end_state(tap_state_t state);
41 static void buspirate_state_move(void);
42 static void buspirate_path_move(int num_states, tap_state_t *path);
43 static void buspirate_runtest(int num_cycles);
44 static void buspirate_scan(bool ir_scan, enum scan_type type,
45 uint8_t *buffer, int scan_size, struct scan_command *command);
46
47
48 #define CMD_UNKOWN 0x00
49 #define CMD_PORT_MODE 0x01
50 #define CMD_FEATURE 0x02
51 #define CMD_READ_ADCS 0x03
52 /*#define CMD_TAP_SHIFT 0x04 // old protocol */
53 #define CMD_TAP_SHIFT 0x05
54 #define CMD_ENTER_OOCD 0x06
55 #define CMD_UART_SPEED 0x07
56 #define CMD_JTAG_SPEED 0x08
57
58 enum {
59 MODE_HIZ = 0,
60 MODE_JTAG = 1, /* push-pull outputs */
61 MODE_JTAG_OD = 2, /* open-drain outputs */
62 };
63
64 enum {
65 FEATURE_LED = 0x01,
66 FEATURE_VREG = 0x02,
67 FEATURE_TRST = 0x04,
68 FEATURE_SRST = 0x08,
69 FEATURE_PULLUP = 0x10
70 };
71
72 enum {
73 ACTION_DISABLE = 0,
74 ACTION_ENABLE = 1
75 };
76
77 enum {
78 SERIAL_NORMAL = 0,
79 SERIAL_FAST = 1
80 };
81
82
83 static int buspirate_fd = -1;
84 static int buspirate_pinmode = MODE_JTAG_OD;
85 static int buspirate_baudrate = SERIAL_NORMAL;
86 static int buspirate_vreg;
87 static int buspirate_pullup;
88 static char *buspirate_port;
89
90
91 /* TAP interface */
92 static void buspirate_tap_init(void);
93 static int buspirate_tap_execute(void);
94 static void buspirate_tap_append(int tms, int tdi);
95 static void buspirate_tap_append_scan(int length, uint8_t *buffer,
96 struct scan_command *command);
97 static void buspirate_tap_make_space(int scan, int bits);
98
99 static void buspirate_reset(int trst, int srst);
100
101 /* low level interface */
102 static void buspirate_jtag_reset(int);
103 static void buspirate_jtag_enable(int);
104 static unsigned char buspirate_jtag_command(int, char *, int);
105 static void buspirate_jtag_set_speed(int, char);
106 static void buspirate_jtag_set_mode(int, char);
107 static void buspirate_jtag_set_feature(int, char, char);
108 static void buspirate_jtag_get_adcs(int);
109
110 /* low level HW communication interface */
111 static int buspirate_serial_open(char *port);
112 static int buspirate_serial_setspeed(int fd, char speed);
113 static int buspirate_serial_write(int fd, char *buf, int size);
114 static int buspirate_serial_read(int fd, char *buf, int size);
115 static void buspirate_serial_close(int fd);
116 static void buspirate_print_buffer(char *buf, int size);
117
118 static int buspirate_speed(int speed)
119 {
120 /* TODO */
121 LOG_INFO("Want to set speed to %dkHz, but not implemented yet", speed);
122 return ERROR_OK;
123 }
124
125 static int buspirate_khz(int khz, int *jtag_speed)
126 {
127 *jtag_speed = khz;
128 return ERROR_OK;
129 }
130
131 static int buspirate_execute_queue(void)
132 {
133 /* currently processed command */
134 struct jtag_command *cmd = jtag_command_queue;
135 int scan_size;
136 enum scan_type type;
137 uint8_t *buffer;
138
139 while (cmd) {
140 switch (cmd->type) {
141 case JTAG_RUNTEST:
142 DEBUG_JTAG_IO("runtest %i cycles, end in %s",
143 cmd->cmd.runtest->num_cycles,
144 tap_state_name(cmd->cmd.runtest
145 ->end_state));
146 buspirate_end_state(cmd->cmd.runtest
147 ->end_state);
148 buspirate_runtest(cmd->cmd.runtest
149 ->num_cycles);
150 break;
151 case JTAG_TLR_RESET:
152 DEBUG_JTAG_IO("statemove end in %s",
153 tap_state_name(cmd->cmd.statemove
154 ->end_state));
155 buspirate_end_state(cmd->cmd.statemove
156 ->end_state);
157 buspirate_state_move();
158 break;
159 case JTAG_PATHMOVE:
160 DEBUG_JTAG_IO("pathmove: %i states, end in %s",
161 cmd->cmd.pathmove->num_states,
162 tap_state_name(cmd->cmd.pathmove
163 ->path[cmd->cmd.pathmove
164 ->num_states - 1]));
165 buspirate_path_move(cmd->cmd.pathmove
166 ->num_states,
167 cmd->cmd.pathmove->path);
168 break;
169 case JTAG_SCAN:
170 DEBUG_JTAG_IO("scan end in %s",
171 tap_state_name(cmd->cmd.scan
172 ->end_state));
173
174 buspirate_end_state(cmd->cmd.scan
175 ->end_state);
176
177 scan_size = jtag_build_buffer(cmd->cmd.scan,
178 &buffer);
179 type = jtag_scan_type(cmd->cmd.scan);
180 buspirate_scan(cmd->cmd.scan->ir_scan, type,
181 buffer, scan_size, cmd->cmd.scan);
182
183 break;
184 case JTAG_RESET:
185 DEBUG_JTAG_IO("reset trst: %i srst %i",
186 cmd->cmd.reset->trst, cmd->cmd.reset->srst);
187
188 /* flush buffers, so we can reset */
189 buspirate_tap_execute();
190
191 if (cmd->cmd.reset->trst == 1)
192 tap_set_state(TAP_RESET);
193 buspirate_reset(cmd->cmd.reset->trst,
194 cmd->cmd.reset->srst);
195 break;
196 case JTAG_SLEEP:
197 DEBUG_JTAG_IO("sleep %i", cmd->cmd.sleep->us);
198 buspirate_tap_execute();
199 jtag_sleep(cmd->cmd.sleep->us);
200 break;
201 default:
202 LOG_ERROR("BUG: unknown JTAG command type encountered");
203 exit(-1);
204 }
205
206 cmd = cmd->next;
207 }
208
209 return buspirate_tap_execute();
210 }
211
212 static int buspirate_init(void)
213 {
214 if (buspirate_port == NULL) {
215 LOG_ERROR("You need to specify port !");
216 return ERROR_JTAG_INIT_FAILED;
217 }
218
219 buspirate_fd = buspirate_serial_open(buspirate_port);
220 if (buspirate_fd == -1) {
221 LOG_ERROR("Could not open serial port.");
222 return ERROR_JTAG_INIT_FAILED;
223 }
224
225 buspirate_serial_setspeed(buspirate_fd, SERIAL_NORMAL);
226
227 buspirate_jtag_enable(buspirate_fd);
228
229 if (buspirate_baudrate != SERIAL_NORMAL)
230 buspirate_jtag_set_speed(buspirate_fd, SERIAL_FAST);
231
232 LOG_INFO("Buspirate Interface ready!");
233
234 buspirate_tap_init();
235 buspirate_jtag_set_mode(buspirate_fd, buspirate_pinmode);
236 buspirate_jtag_set_feature(buspirate_fd, FEATURE_VREG,
237 (buspirate_vreg == 1) ? ACTION_ENABLE : ACTION_DISABLE);
238 buspirate_jtag_set_feature(buspirate_fd, FEATURE_PULLUP,
239 (buspirate_pullup == 1) ? ACTION_ENABLE : ACTION_DISABLE);
240 buspirate_reset(0, 0);
241
242 return ERROR_OK;
243 }
244
245 static int buspirate_quit(void)
246 {
247 LOG_INFO("Shuting down buspirate ");
248 buspirate_jtag_set_mode(buspirate_fd, MODE_HIZ);
249
250 buspirate_jtag_set_speed(buspirate_fd, SERIAL_NORMAL);
251 buspirate_jtag_reset(buspirate_fd);
252
253 buspirate_serial_close(buspirate_fd);
254
255 if (buspirate_port) {
256 free(buspirate_port);
257 buspirate_port = NULL;
258 }
259 return ERROR_OK;
260 }
261
262 /* openocd command interface */
263 COMMAND_HANDLER(buspirate_handle_adc_command)
264 {
265 if (CMD_ARGC != 0) {
266 LOG_ERROR("usage: buspirate_adc");
267 return ERROR_OK;
268 }
269
270 if (buspirate_fd == -1)
271 return ERROR_OK;
272
273 /* send the command */
274 buspirate_jtag_get_adcs(buspirate_fd);
275
276 return ERROR_OK;
277
278 }
279
280 COMMAND_HANDLER(buspirate_handle_vreg_command)
281 {
282 if (CMD_ARGC != 1) {
283 LOG_ERROR("usage: buspirate_vreg <1|0>");
284 return ERROR_OK;
285 }
286
287 if (atoi(CMD_ARGV[0]) == 1)
288 buspirate_vreg = 1;
289 else
290 buspirate_vreg = 0;
291
292 return ERROR_OK;
293
294 }
295
296 COMMAND_HANDLER(buspirate_handle_pullup_command)
297 {
298 if (CMD_ARGC != 1) {
299 LOG_ERROR("usage: buspirate_pullup <1|0>");
300 return ERROR_OK;
301 }
302
303 if (atoi(CMD_ARGV[0]) == 1)
304 buspirate_pullup = 1;
305 else
306 buspirate_pullup = 0;
307
308 return ERROR_OK;
309
310 }
311
312 COMMAND_HANDLER(buspirate_handle_led_command)
313 {
314 if (CMD_ARGC != 1) {
315 LOG_ERROR("usage: buspirate_led <1|0>");
316 return ERROR_OK;
317 }
318
319 if (atoi(CMD_ARGV[0]) == 1) {
320 /* enable led */
321 buspirate_jtag_set_feature(buspirate_fd, FEATURE_LED,
322 ACTION_ENABLE);
323 } else {
324 /* disable led */
325 buspirate_jtag_set_feature(buspirate_fd, FEATURE_LED,
326 ACTION_DISABLE);
327 }
328
329 return ERROR_OK;
330
331 }
332
333 COMMAND_HANDLER(buspirate_handle_mode_command)
334 {
335 if (CMD_ARGC != 1) {
336 LOG_ERROR("usage: buspirate_mode <normal|open-drain>");
337 return ERROR_OK;
338 }
339
340 if (CMD_ARGV[0][0] == 'n')
341 buspirate_pinmode = MODE_JTAG;
342 else if (CMD_ARGV[0][0] == 'o')
343 buspirate_pinmode = MODE_JTAG_OD;
344 else
345 LOG_ERROR("usage: buspirate_mode <normal|open-drain>");
346
347 return ERROR_OK;
348
349 }
350
351 COMMAND_HANDLER(buspirate_handle_speed_command)
352 {
353 if (CMD_ARGC != 1) {
354 LOG_ERROR("usage: buspirate_speed <normal|fast>");
355 return ERROR_OK;
356 }
357
358 if (CMD_ARGV[0][0] == 'n')
359 buspirate_baudrate = SERIAL_NORMAL;
360 else if (CMD_ARGV[0][0] == 'f')
361 buspirate_baudrate = SERIAL_FAST;
362 else
363 LOG_ERROR("usage: buspirate_speed <normal|fast>");
364
365 return ERROR_OK;
366
367 }
368
369 COMMAND_HANDLER(buspirate_handle_port_command)
370 {
371 if (CMD_ARGC != 1) {
372 LOG_ERROR("usage: buspirate_port /dev/ttyUSB0");
373 return ERROR_OK;
374 }
375
376 if (buspirate_port == 0)
377 buspirate_port = strdup(CMD_ARGV[0]);
378
379 return ERROR_OK;
380
381 }
382
383 static const struct command_registration buspirate_command_handlers[] = {
384 {
385 .name = "buspirate_adc",
386 .handler = &buspirate_handle_adc_command,
387 .mode = COMMAND_EXEC,
388 .help = "reads voltages on adc pins",
389 },
390 {
391 .name = "buspirate_vreg",
392 .handler = &buspirate_handle_vreg_command,
393 .mode = COMMAND_CONFIG,
394 .help = "changes the state of voltage regulators",
395 },
396 {
397 .name = "buspirate_pullup",
398 .handler = &buspirate_handle_pullup_command,
399 .mode = COMMAND_CONFIG,
400 .help = "changes the state of pullup",
401 },
402 {
403 .name = "buspirate_led",
404 .handler = &buspirate_handle_led_command,
405 .mode = COMMAND_EXEC,
406 .help = "changes the state of led",
407 },
408 {
409 .name = "buspirate_speed",
410 .handler = &buspirate_handle_speed_command,
411 .mode = COMMAND_CONFIG,
412 .help = "speed of the interface",
413 },
414 {
415 .name = "buspirate_mode",
416 .handler = &buspirate_handle_mode_command,
417 .mode = COMMAND_CONFIG,
418 .help = "pin mode of the interface",
419 },
420 {
421 .name = "buspirate_port",
422 .handler = &buspirate_handle_port_command,
423 .mode = COMMAND_CONFIG,
424 .help = "name of the serial port to open",
425 },
426 COMMAND_REGISTRATION_DONE
427 };
428
429 struct jtag_interface buspirate_interface = {
430 .name = "buspirate",
431 .execute_queue = buspirate_execute_queue,
432 .speed = buspirate_speed,
433 .khz = buspirate_khz,
434 .commands = buspirate_command_handlers,
435 .init = buspirate_init,
436 .quit = buspirate_quit
437 };
438
439 /*************** jtag execute commands **********************/
440 static void buspirate_end_state(tap_state_t state)
441 {
442 if (tap_is_state_stable(state))
443 tap_set_end_state(state);
444 else {
445 LOG_ERROR("BUG: %i is not a valid end state", state);
446 exit(-1);
447 }
448 }
449
450 static void buspirate_state_move(void)
451 {
452 int i = 0, tms = 0;
453 uint8_t tms_scan = tap_get_tms_path(tap_get_state(),
454 tap_get_end_state());
455 int tms_count = tap_get_tms_path_len(tap_get_state(),
456 tap_get_end_state());
457
458 for (i = 0; i < tms_count; i++) {
459 tms = (tms_scan >> i) & 1;
460 buspirate_tap_append(tms, 0);
461 }
462
463 tap_set_state(tap_get_end_state());
464 }
465
466 static void buspirate_path_move(int num_states, tap_state_t *path)
467 {
468 int i;
469
470 for (i = 0; i < num_states; i++) {
471 if (tap_state_transition(tap_get_state(), false) == path[i]) {
472 buspirate_tap_append(0, 0);
473 } else if (tap_state_transition(tap_get_state(), true)
474 == path[i]) {
475 buspirate_tap_append(1, 0);
476 } else {
477 LOG_ERROR("BUG: %s -> %s isn't a valid "
478 "TAP transition",
479 tap_state_name(tap_get_state()),
480 tap_state_name(path[i]));
481 exit(-1);
482 }
483
484 tap_set_state(path[i]);
485 }
486
487 tap_set_end_state(tap_get_state());
488 }
489
490 static void buspirate_runtest(int num_cycles)
491 {
492 int i;
493
494 tap_state_t saved_end_state = tap_get_end_state();
495
496 /* only do a state_move when we're not already in IDLE */
497 if (tap_get_state() != TAP_IDLE) {
498 buspirate_end_state(TAP_IDLE);
499 buspirate_state_move();
500 }
501
502 for (i = 0; i < num_cycles; i++)
503 buspirate_tap_append(0, 0);
504
505 DEBUG_JTAG_IO("runtest: cur_state %s end_state %s",
506 tap_state_name(tap_get_state()),
507 tap_state_name(tap_get_end_state()));
508
509 /* finish in end_state */
510 buspirate_end_state(saved_end_state);
511 if (tap_get_state() != tap_get_end_state())
512 buspirate_state_move();
513 }
514
515 static void buspirate_scan(bool ir_scan, enum scan_type type,
516 uint8_t *buffer, int scan_size, struct scan_command *command)
517 {
518 tap_state_t saved_end_state;
519
520 buspirate_tap_make_space(1, scan_size+8);
521 /* is 8 correct ? (2 moves = 16) */
522
523 saved_end_state = tap_get_end_state();
524
525 buspirate_end_state(ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT);
526 buspirate_state_move();
527
528 buspirate_tap_append_scan(scan_size, buffer, command);
529
530 /* move to PAUSE */
531 buspirate_tap_append(0, 0);
532
533 /* restore the saved state */
534 buspirate_end_state(saved_end_state);
535 tap_set_state(ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE);
536
537 if (tap_get_state() != tap_get_end_state())
538 buspirate_state_move();
539 }
540
541
542 /************************* TAP related stuff **********/
543
544 #define BUSPIRATE_BUFFER_SIZE 1024
545 #define BUSPIRATE_MAX_PENDING_SCANS 32
546
547 static char tms_chain[BUSPIRATE_BUFFER_SIZE]; /* send */
548 static char tdi_chain[BUSPIRATE_BUFFER_SIZE]; /* send */
549 static int tap_chain_index;
550
551 struct pending_scan_result /* this was stolen from arm-jtag-ew */
552 {
553 int first; /* First bit position in tdo_buffer to read */
554 int length; /* Number of bits to read */
555 struct scan_command *command; /* Corresponding scan command */
556 uint8_t *buffer;
557 };
558
559 static struct pending_scan_result
560 tap_pending_scans[BUSPIRATE_MAX_PENDING_SCANS];
561 static int tap_pending_scans_num;
562
563 static void buspirate_tap_init(void)
564 {
565 tap_chain_index = 0;
566 tap_pending_scans_num = 0;
567 }
568
569 static int buspirate_tap_execute(void)
570 {
571 char tmp[4096];
572 uint8_t *in_buf;
573 int i;
574 int fill_index = 0;
575 int ret;
576 int bytes_to_send;
577
578 if (tap_chain_index <= 0)
579 return ERROR_OK;
580
581 LOG_DEBUG("executing tap num bits = %i scans = %i",
582 tap_chain_index, tap_pending_scans_num);
583
584 bytes_to_send = (tap_chain_index+7) / 8;
585
586 tmp[0] = CMD_TAP_SHIFT; /* this command expects number of bits */
587 tmp[1] = (char)(tap_chain_index >> 8); /* high */
588 tmp[2] = (char)(tap_chain_index); /* low */
589
590 fill_index = 3;
591 for (i = 0; i < bytes_to_send; i++) {
592 tmp[fill_index] = tdi_chain[i];
593 fill_index++;
594 tmp[fill_index] = tms_chain[i];
595 fill_index++;
596 }
597
598 ret = buspirate_serial_write(buspirate_fd, tmp, 3 + bytes_to_send*2);
599 if (ret != bytes_to_send*2+3) {
600 LOG_ERROR("error writing :(");
601 return ERROR_JTAG_DEVICE_ERROR;
602 }
603
604 ret = buspirate_serial_read(buspirate_fd, tmp, bytes_to_send + 3);
605 in_buf = (uint8_t *)(&tmp[3]);
606
607 /* parse the scans */
608 for (i = 0; i < tap_pending_scans_num; i++) {
609 uint8_t *buffer = tap_pending_scans[i].buffer;
610 int length = tap_pending_scans[i].length;
611 int first = tap_pending_scans[i].first;
612 struct scan_command *command = tap_pending_scans[i].command;
613
614 /* copy bits from buffer */
615 buf_set_buf(in_buf, first, buffer, 0, length);
616
617 /* return buffer to higher level */
618 if (jtag_read_buffer(buffer, command) != ERROR_OK) {
619 buspirate_tap_init();
620 return ERROR_JTAG_QUEUE_FAILED;
621 }
622
623 free(buffer);
624 }
625 tap_pending_scans_num = 0;
626 tap_chain_index = 0;
627 return ERROR_OK;
628 }
629
630 static void buspirate_tap_make_space(int scans, int bits)
631 {
632 int have_scans = BUSPIRATE_MAX_PENDING_SCANS - tap_pending_scans_num;
633 int have_bits = BUSPIRATE_BUFFER_SIZE * 8 - tap_chain_index;
634
635 if ((have_scans < scans) || (have_bits < bits))
636 buspirate_tap_execute();
637 }
638
639 static void buspirate_tap_append(int tms, int tdi)
640 {
641 int chain_index;
642
643 buspirate_tap_make_space(0, 1);
644 chain_index = tap_chain_index / 8;
645
646 if (chain_index < BUSPIRATE_BUFFER_SIZE) {
647 int bit_index = tap_chain_index % 8;
648 uint8_t bit = 1 << bit_index;
649
650 if (tms)
651 tms_chain[chain_index] |= bit;
652 else
653 tms_chain[chain_index] &= ~bit;
654
655 if (tdi)
656 tdi_chain[chain_index] |= bit;
657 else
658 tdi_chain[chain_index] &= ~bit;
659
660 tap_chain_index++;
661 } else
662 LOG_ERROR("tap_chain overflow, Bad things will happen");
663
664 }
665
666 static void buspirate_tap_append_scan(int length, uint8_t *buffer,
667 struct scan_command *command)
668 {
669 int i;
670 tap_pending_scans[tap_pending_scans_num].length = length;
671 tap_pending_scans[tap_pending_scans_num].buffer = buffer;
672 tap_pending_scans[tap_pending_scans_num].command = command;
673 tap_pending_scans[tap_pending_scans_num].first = tap_chain_index;
674
675 for (i = 0; i < length; i++) {
676 int tms = (i < length-1 ? 0 : 1);
677 int tdi = (buffer[i/8] >> (i%8)) & 1;
678 buspirate_tap_append(tms, tdi);
679 }
680 tap_pending_scans_num++;
681 }
682
683 /*************** jtag wrapper functions *********************/
684
685 /* (1) assert or (0) deassert reset lines */
686 static void buspirate_reset(int trst, int srst)
687 {
688 LOG_DEBUG("trst: %i, srst: %i", trst, srst);
689
690 if (trst)
691 buspirate_jtag_set_feature(buspirate_fd,
692 FEATURE_TRST, ACTION_DISABLE);
693 else
694 buspirate_jtag_set_feature(buspirate_fd,
695 FEATURE_TRST, ACTION_ENABLE);
696
697 if (srst)
698 buspirate_jtag_set_feature(buspirate_fd,
699 FEATURE_SRST, ACTION_DISABLE);
700 else
701 buspirate_jtag_set_feature(buspirate_fd,
702 FEATURE_SRST, ACTION_ENABLE);
703 }
704
705 /*************** jtag lowlevel functions ********************/
706 static void buspirate_jtag_enable(int fd)
707 {
708 int ret;
709 char tmp[21] = { [0 ... 20] = 0x00 };
710 int done = 0;
711 int cmd_sent = 0;
712
713 LOG_DEBUG("Entering binary mode");
714 buspirate_serial_write(fd, tmp, 20);
715 usleep(10000);
716
717 /* reads 1 to n "BBIO1"s and one "OCD1" */
718 while (!done) {
719 ret = buspirate_serial_read(fd, tmp, 4);
720 if (ret != 4) {
721 LOG_ERROR("Buspirate did not respond :"
722 "( restart everything");
723 exit(-1);
724 }
725 LOG_DEBUG("TUI");
726 if (strncmp(tmp, "BBIO", 4) == 0) {
727 ret = buspirate_serial_read(fd, tmp, 1);
728 if (ret != 1) {
729 LOG_ERROR("Buspirate did not respond well :"
730 "( restart everything");
731 exit(-1);
732 }
733 if (tmp[0] != '1') {
734 LOG_ERROR("Unsupported binary protocol ");
735 exit(-1);
736 }
737 if (cmd_sent == 0) {
738 cmd_sent = 1;
739 tmp[0] = CMD_ENTER_OOCD;
740 ret = buspirate_serial_write(fd, tmp, 1);
741 }
742 } else if (strncmp(tmp, "OCD1", 4) == 0)
743 done = 1;
744 else {
745 LOG_ERROR("Buspirate did not respond :"
746 "( restart everything");
747 exit(-1);
748 }
749 }
750
751 }
752
753 static void buspirate_jtag_reset(int fd)
754 {
755 int ret;
756 char tmp[5];
757
758 tmp[0] = 0x00; /* exit OCD1 mode */
759 buspirate_serial_write(fd, tmp, 1);
760 usleep(10000);
761 ret = buspirate_serial_read(fd, tmp, 5);
762 if (strncmp(tmp, "BBIO1", 5) == 0) {
763 tmp[0] = 0x0F; /* reset BP */
764 buspirate_serial_write(fd, tmp, 1);
765 } else
766 LOG_ERROR("Bad reply :( Please restart manually");
767 }
768
769 static void buspirate_jtag_set_speed(int fd, char speed)
770 {
771 int ret;
772 char tmp[2];
773 char ack[2];
774
775 ack[0] = 0xAA;
776 ack[1] = 0x55;
777
778 tmp[0] = CMD_UART_SPEED;
779 tmp[1] = speed;
780 buspirate_jtag_command(fd, tmp, 2);
781
782 /* here the adapter changes speed, we need follow */
783 buspirate_serial_setspeed(fd, speed);
784
785 buspirate_serial_write(fd, ack, 2);
786 ret = buspirate_serial_read(fd, tmp, 2);
787 if (ret != 2) {
788 LOG_ERROR("Buspirate did not respond :"
789 "( restart everything");
790 exit(-1);
791 }
792 if ((tmp[0] != CMD_UART_SPEED) || (tmp[1] != speed)) {
793 LOG_ERROR("Buspirate didn't reply as expected :"
794 "( restart everything");
795 exit(-1);
796 }
797 LOG_INFO("Buspirate switched to %s mode",
798 (speed == SERIAL_NORMAL) ? "normal" : "FAST");
799 }
800
801
802 static void buspirate_jtag_set_mode(int fd, char mode)
803 {
804 char tmp[2];
805 tmp[0] = CMD_PORT_MODE;
806 tmp[1] = mode;
807 buspirate_jtag_command(fd, tmp, 2);
808 }
809
810 static void buspirate_jtag_set_feature(int fd, char feat, char action)
811 {
812 char tmp[3];
813 tmp[0] = CMD_FEATURE;
814 tmp[1] = feat; /* what */
815 tmp[2] = action; /* action */
816 buspirate_jtag_command(fd, tmp, 3);
817 }
818
819 static void buspirate_jtag_get_adcs(int fd)
820 {
821 uint8_t tmp[10];
822 uint16_t a, b, c, d;
823 tmp[0] = CMD_READ_ADCS;
824 buspirate_jtag_command(fd, (char *)tmp, 1);
825 a = tmp[2] << 8 | tmp[3];
826 b = tmp[4] << 8 | tmp[5];
827 c = tmp[6] << 8 | tmp[7];
828 d = tmp[8] << 8 | tmp[9];
829
830 LOG_INFO("ADC: ADC_Pin = %.02f VPullup = %.02f V33 = %.02f "
831 "V50 = %.02f",
832 ((float)a)/155.1515, ((float)b)/155.1515,
833 ((float)c)/155.1515, ((float)d)/155.1515);
834 }
835
836 static unsigned char buspirate_jtag_command(int fd,
837 char *cmd, int cmdlen)
838 {
839 int res;
840 int len = 0;
841
842 res = buspirate_serial_write(fd, cmd, cmdlen);
843
844 if ((cmd[0] == CMD_UART_SPEED)
845 || (cmd[0] == CMD_PORT_MODE)
846 || (cmd[0] == CMD_FEATURE)
847 || (cmd[0] == CMD_JTAG_SPEED))
848 return 1;
849
850 if (res == cmdlen) {
851 switch (cmd[0]) {
852 case CMD_READ_ADCS:
853 len = 10; /* 2*sizeof(char)+4*sizeof(uint16_t) */
854 break;
855 case CMD_TAP_SHIFT:
856 len = cmdlen;
857 break;
858 default:
859 LOG_INFO("Wrong !");
860 }
861 res = buspirate_serial_read(fd, cmd, len);
862 if (res > 0)
863 return (unsigned char)cmd[1];
864 else
865 return -1;
866 } else
867 return -1;
868 return 0;
869 }
870
871 /* low level serial port */
872 /* TODO add support for WIN32 and others ! */
873 static int buspirate_serial_open(char *port)
874 {
875 int fd;
876 fd = open(buspirate_port, O_RDWR | O_NOCTTY | O_NDELAY);
877 return fd;
878 }
879
880 static int buspirate_serial_setspeed(int fd, char speed)
881 {
882 struct termios t_opt;
883 speed_t baud = (speed == SERIAL_FAST) ? B1000000 : B115200;
884
885 /* set the serial port parameters */
886 fcntl(fd, F_SETFL, 0);
887 tcgetattr(fd, &t_opt);
888 cfsetispeed(&t_opt, baud);
889 cfsetospeed(&t_opt, baud);
890 t_opt.c_cflag |= (CLOCAL | CREAD);
891 t_opt.c_cflag &= ~PARENB;
892 t_opt.c_cflag &= ~CSTOPB;
893 t_opt.c_cflag &= ~CSIZE;
894 t_opt.c_cflag |= CS8;
895 t_opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
896 t_opt.c_iflag &= ~(IXON | IXOFF | IXANY);
897 t_opt.c_oflag &= ~OPOST;
898 t_opt.c_cc[VMIN] = 0;
899 t_opt.c_cc[VTIME] = 10;
900 tcflush(fd, TCIFLUSH);
901 tcsetattr(fd, TCSANOW, &t_opt);
902
903 return 0;
904 }
905
906 static int buspirate_serial_write(int fd, char *buf, int size)
907 {
908 int ret = 0;
909
910 ret = write(fd, buf, size);
911
912 LOG_DEBUG("size = %d ret = %d", size, ret);
913 buspirate_print_buffer(buf, size);
914
915 if (ret != size)
916 LOG_ERROR("Error sending data");
917
918 return ret;
919 }
920
921 static int buspirate_serial_read(int fd, char *buf, int size)
922 {
923 int len = 0;
924 int ret = 0;
925 int timeout = 0;
926
927 while (len < size) {
928 ret = read(fd, buf+len, size-len);
929 if (ret == -1)
930 return -1;
931
932 if (ret == 0) {
933 timeout++;
934
935 if (timeout >= 10)
936 break;
937
938 continue;
939 }
940
941 len += ret;
942 }
943
944 LOG_DEBUG("should have read = %d actual size = %d", size, len);
945 buspirate_print_buffer(buf, len);
946
947 if (len != size)
948 LOG_ERROR("Error sending data");
949
950 return len;
951 }
952
953 static void buspirate_serial_close(int fd)
954 {
955 close(fd);
956 }
957
958 #define LINE_SIZE 81
959 #define BYTES_PER_LINE 16
960 static void buspirate_print_buffer(char *buf, int size)
961 {
962 char line[LINE_SIZE];
963 char tmp[10];
964 int offset = 0;
965
966 line[0] = 0;
967 while (offset < size) {
968 snprintf(tmp, 5, "%02x ", (uint8_t)buf[offset]);
969 offset++;
970
971 strcat(line, tmp);
972
973 if (offset % BYTES_PER_LINE == 0) {
974 LOG_DEBUG("%s", line);
975 line[0] = 0;
976 }
977 }
978
979 if (line[0] != 0) {
980 LOG_DEBUG("%s", line);
981 }
982 }
983

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)