]> git.sur5r.net Git - openocd/blob - src/jtag/jlink.c
a229cec58180c8cef9bac5d74de7c670074b9c65
[openocd] / src / jtag / jlink.c
1 /***************************************************************************
2  *   Copyright (C) 2007 by Juergen Stuber <juergen@jstuber.net>            *
3  *   based on Dominic Rath's and Benedikt Sauter's usbprog.c               *
4  *                                                                         *
5  *   Copyright (C) 2008 by Spencer Oliver                                  *
6  *   spen@spen-soft.co.uk                                                  *
7  *                                                                         *
8  *   This program is free software; you can redistribute it and/or modify  *
9  *   it under the terms of the GNU General Public License as published by  *
10  *   the Free Software Foundation; either version 2 of the License, or     *
11  *   (at your option) any later version.                                   *
12  *                                                                         *
13  *   This program is distributed in the hope that it will be useful,       *
14  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
15  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
16  *   GNU General Public License for more details.                          *
17  *                                                                         *
18  *   You should have received a copy of the GNU General Public License     *
19  *   along with this program; if not, write to the                         *
20  *   Free Software Foundation, Inc.,                                       *
21  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
22  ***************************************************************************/
23
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 #include "replacements.h"
29
30 #include "jtag.h"
31
32 #include <usb.h>
33 #include <string.h>
34
35 #include "log.h"
36
37 #define VID 0x1366
38 #define PID 0x0101
39
40 #define JLINK_WRITE_ENDPOINT    0x02
41 #define JLINK_READ_ENDPOINT             0x81
42
43 #define JLINK_USB_TIMEOUT               1000
44
45 // See Section 1.3.2 of the Segger JLink USB protocol manual
46 #define JLINK_IN_BUFFER_SIZE                    2048
47 #define JLINK_OUT_BUFFER_SIZE                   2048
48 #define JLINK_EMU_RESULT_BUFFER_SIZE    64
49
50 /* Global USB buffers */
51 static u8 usb_in_buffer[JLINK_IN_BUFFER_SIZE];
52 static u8 usb_out_buffer[JLINK_OUT_BUFFER_SIZE];
53 static u8 usb_emu_result_buffer[JLINK_EMU_RESULT_BUFFER_SIZE];
54
55 /* Constants for JLink command */
56 #define EMU_CMD_VERSION     0x01
57 #define EMU_CMD_SET_SPEED   0x05
58 #define EMU_CMD_GET_STATE   0x07
59 #define EMU_CMD_HW_JTAG3    0xcf
60 #define EMU_CMD_HW_RESET0   0xdc
61 #define EMU_CMD_HW_RESET1   0xdd
62 #define EMU_CMD_HW_TRST0    0xde
63 #define EMU_CMD_HW_TRST1    0xdf
64
65 /* max speed 12MHz v5.0 jlink */
66 #define JLINK_MAX_SPEED 12000
67
68 /* External interface functions */
69 static int jlink_execute_queue(void);
70 static int jlink_speed(int speed);
71 static int jlink_speed_div(int speed, int* khz);
72 static int jlink_khz(int khz, int *jtag_speed);
73 static int jlink_register_commands(struct command_context_s *cmd_ctx);
74 static int jlink_init(void);
75 static int jlink_quit(void);
76
77 /* CLI command handler functions */
78 static int jlink_handle_jlink_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
79
80 /* Queue command functions */
81 static void jlink_end_state(tap_state_t state);
82 static void jlink_state_move(void);
83 static void jlink_path_move(int num_states, tap_state_t *path);
84 static void jlink_runtest(int num_cycles);
85 static void jlink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, scan_command_t *command);
86 static void jlink_reset(int trst, int srst);
87 static void jlink_simple_command(u8 command);
88 static int jlink_get_status(void);
89
90 /* J-Link tap buffer functions */
91 static void jlink_tap_init(void);
92 static int jlink_tap_execute(void);
93 static void jlink_tap_ensure_space(int scans, int bits);
94 static void jlink_tap_append_step(int tms, int tdi);
95 static void jlink_tap_append_scan(int length, u8 *buffer, scan_command_t *command);
96
97 /* Jlink lowlevel functions */
98 typedef struct jlink_jtag
99 {
100         struct usb_dev_handle* usb_handle;
101 } jlink_jtag_t;
102
103 static jlink_jtag_t *jlink_usb_open(void);
104 static void jlink_usb_close(jlink_jtag_t *jlink_jtag);
105 static int jlink_usb_message(jlink_jtag_t *jlink_jtag, int out_length, int in_length);
106 static int jlink_usb_write(jlink_jtag_t *jlink_jtag, int out_length);
107 static int jlink_usb_read(jlink_jtag_t *jlink_jtag, int expected_size);
108 static int jlink_usb_read_emu_result(jlink_jtag_t *jlink_jtag);
109
110 /* helper functions */
111 static int jlink_get_version_info(void);
112
113 #ifdef _DEBUG_USB_COMMS_
114 static void jlink_debug_buffer(u8 *buffer, int length);
115 #endif
116
117 static jlink_jtag_t* jlink_jtag_handle;
118
119 /***************************************************************************/
120 /* External interface implementation */
121
122 jtag_interface_t jlink_interface =
123 {
124         .name = "jlink",
125         .execute_queue = jlink_execute_queue,
126         .speed = jlink_speed,
127         .speed_div = jlink_speed_div,
128         .khz = jlink_khz,
129         .register_commands = jlink_register_commands,
130         .init = jlink_init,
131         .quit = jlink_quit
132 };
133
134 static void jlink_execute_end_state(jtag_command_t *cmd)
135 {
136         DEBUG_JTAG_IO("end_state: %i", cmd->cmd.end_state->end_state);
137
138         if (cmd->cmd.end_state->end_state != TAP_INVALID)
139                 jlink_end_state(cmd->cmd.end_state->end_state);
140 }
141
142 static void jlink_execute_runtest(jtag_command_t *cmd)
143 {
144         DEBUG_JTAG_IO("runtest %i cycles, end in %i",
145                         cmd->cmd.runtest->num_cycles,
146                         cmd->cmd.runtest->end_state);
147
148         if (cmd->cmd.runtest->end_state != TAP_INVALID)
149                 jlink_end_state(cmd->cmd.runtest->end_state);
150
151         jlink_runtest(cmd->cmd.runtest->num_cycles);
152 }
153
154 static void jlink_execute_statemove(jtag_command_t *cmd)
155 {
156         DEBUG_JTAG_IO("statemove end in %i", cmd->cmd.statemove->end_state);
157
158         if (cmd->cmd.statemove->end_state != TAP_INVALID)
159         {
160                 jlink_end_state(cmd->cmd.statemove->end_state);
161         }
162         jlink_state_move();
163 }
164
165 static void jlink_execute_pathmove(jtag_command_t *cmd)
166 {
167         DEBUG_JTAG_IO("pathmove: %i states, end in %i",
168                 cmd->cmd.pathmove->num_states,
169                 cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
170
171         jlink_path_move(cmd->cmd.pathmove->num_states,
172                         cmd->cmd.pathmove->path);
173 }
174
175 static void jlink_execute_scan(jtag_command_t *cmd)
176 {
177         int scan_size;
178         enum scan_type type;
179         u8 *buffer;
180
181         DEBUG_JTAG_IO("scan end in %i", cmd->cmd.scan->end_state);
182
183         if (cmd->cmd.scan->end_state != TAP_INVALID)
184                 jlink_end_state(cmd->cmd.scan->end_state);
185
186         scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
187         DEBUG_JTAG_IO("scan input, length = %d", scan_size);
188
189 #ifdef _DEBUG_USB_COMMS_
190         jlink_debug_buffer(buffer, (scan_size + 7) / 8);
191 #endif
192         type = jtag_scan_type(cmd->cmd.scan);
193         jlink_scan(cmd->cmd.scan->ir_scan,
194                         type, buffer, scan_size, cmd->cmd.scan);
195 }
196
197 static void jlink_execute_reset(jtag_command_t *cmd)
198 {
199         DEBUG_JTAG_IO("reset trst: %i srst %i",
200                         cmd->cmd.reset->trst, cmd->cmd.reset->srst);
201
202         jlink_tap_execute();
203
204         if (cmd->cmd.reset->trst == 1)
205                 tap_set_state(TAP_RESET);
206
207         jlink_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
208 }
209
210 static void jlink_execute_sleep(jtag_command_t *cmd)
211 {
212         DEBUG_JTAG_IO("sleep %i", cmd->cmd.sleep->us);
213         jlink_tap_execute();
214         jtag_sleep(cmd->cmd.sleep->us);
215 }
216
217 static void jlink_execute_command(jtag_command_t *cmd)
218 {
219         switch (cmd->type)
220         {
221         case JTAG_END_STATE: jlink_execute_end_state(cmd); break;
222         case JTAG_RUNTEST:   jlink_execute_runtest(cmd); break;
223         case JTAG_STATEMOVE: jlink_execute_statemove(cmd); break;
224         case JTAG_PATHMOVE:  jlink_execute_pathmove(cmd); break;
225         case JTAG_SCAN:      jlink_execute_scan(cmd); break;
226         case JTAG_RESET:     jlink_execute_reset(cmd); break;
227         case JTAG_SLEEP:     jlink_execute_sleep(cmd); break;
228         default:
229                 LOG_ERROR("BUG: unknown JTAG command type encountered");
230                 exit(-1);
231         }
232 }
233
234 static int jlink_execute_queue(void)
235 {
236         jtag_command_t *cmd = jtag_command_queue;
237
238         while (cmd != NULL)
239         {
240                 jlink_execute_command(cmd);
241                 cmd = cmd->next;
242         }
243
244         return jlink_tap_execute();
245 }
246
247 /* Sets speed in kHz. */
248 static int jlink_speed(int speed)
249 {
250         int result;
251
252         if (speed > JLINK_MAX_SPEED)
253         {
254                 LOG_INFO("Ignoring speed request: %dkHz exceeds %dkHz maximum",
255                                 speed, JLINK_MAX_SPEED);
256                 return ERROR_OK;
257         }
258
259         /* check for RTCK setting */
260         if (speed == 0)
261                 speed = -1;
262
263         usb_out_buffer[0] = EMU_CMD_SET_SPEED;
264         usb_out_buffer[1] = (speed >> 0) & 0xff;
265         usb_out_buffer[2] = (speed >> 8) & 0xff;
266
267         result = jlink_usb_write(jlink_jtag_handle, 3);
268         if (result != 3)
269         {
270                 LOG_ERROR("J-Link setting speed failed (%d)", result);
271                 return ERROR_JTAG_DEVICE_ERROR;
272         }
273
274         return ERROR_OK;
275 }
276
277 static int jlink_speed_div(int speed, int* khz)
278 {
279         *khz = speed;
280
281         return ERROR_OK;
282 }
283
284 static int jlink_khz(int khz, int *jtag_speed)
285 {
286         *jtag_speed = khz;
287
288         return ERROR_OK;
289 }
290
291 static int jlink_register_commands(struct command_context_s *cmd_ctx)
292 {
293         register_command(cmd_ctx, NULL, "jlink_info", jlink_handle_jlink_info_command, COMMAND_EXEC,
294                 "query jlink info");
295         return ERROR_OK;
296 }
297
298 static int jlink_init(void)
299 {
300         int check_cnt;
301
302         jlink_jtag_handle = jlink_usb_open();
303
304         if (jlink_jtag_handle == 0)
305         {
306                 LOG_ERROR("Cannot find jlink Interface! Please check connection and permissions.");
307                 return ERROR_JTAG_INIT_FAILED;
308         }
309
310         check_cnt = 0;
311         while (check_cnt < 3)
312         {
313                 if (jlink_get_version_info() == ERROR_OK)
314                 {
315                         /* attempt to get status */
316                         jlink_get_status();
317                         break;
318                 }
319
320                 check_cnt++;
321         }
322
323         if (check_cnt == 3)
324         {
325                 LOG_INFO("J-Link initial read failed, don't worry");
326         }
327
328         LOG_INFO("J-Link JTAG Interface ready");
329
330         jlink_reset(0, 0);
331         jlink_tap_init();
332         jlink_speed(jtag_speed);
333
334         return ERROR_OK;
335 }
336
337 static int jlink_quit(void)
338 {
339         jlink_usb_close(jlink_jtag_handle);
340         return ERROR_OK;
341 }
342
343 /***************************************************************************/
344 /* Queue command implementations */
345
346 static void jlink_end_state(tap_state_t state)
347 {
348         if (tap_is_state_stable(state))
349         {
350                 tap_set_end_state(state);
351         }
352         else
353         {
354                 LOG_ERROR("BUG: %i is not a valid end state", state);
355                 exit(-1);
356         }
357 }
358
359 /* Goes to the end state. */
360 static void jlink_state_move(void)
361 {
362         int i;
363         int tms = 0;
364         u8 tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
365
366         for (i = 0; i < 7; i++)
367         {
368                 tms = (tms_scan >> i) & 1;
369                 jlink_tap_append_step(tms, 0);
370         }
371
372         tap_set_state(tap_get_end_state());
373 }
374
375 static void jlink_path_move(int num_states, tap_state_t *path)
376 {
377         int i;
378
379         for (i = 0; i < num_states; i++)
380         {
381                 if (path[i] == tap_state_transition(tap_get_state(), false))
382                 {
383                         jlink_tap_append_step(0, 0);
384                 }
385                 else if (path[i] == tap_state_transition(tap_get_state(), true))
386                 {
387                         jlink_tap_append_step(1, 0);
388                 }
389                 else
390                 {
391                         LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(path[i]));
392                         exit(-1);
393                 }
394
395                 tap_set_state(path[i]);
396         }
397
398         tap_set_end_state(tap_get_state());
399 }
400
401 static void jlink_runtest(int num_cycles)
402 {
403         int i;
404
405         tap_state_t saved_end_state = tap_get_end_state();
406
407         /* only do a state_move when we're not already in IDLE */
408         if (tap_get_state() != TAP_IDLE)
409         {
410                 jlink_end_state(TAP_IDLE);
411                 jlink_state_move();
412         }
413
414         /* execute num_cycles */
415         for (i = 0; i < num_cycles; i++)
416         {
417                 jlink_tap_append_step(0, 0);
418         }
419
420         /* finish in end_state */
421         jlink_end_state(saved_end_state);
422         if (tap_get_state() != tap_get_end_state())
423         {
424                 jlink_state_move();
425         }
426 }
427
428 static void jlink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, scan_command_t *command)
429 {
430         tap_state_t saved_end_state;
431
432         jlink_tap_ensure_space(1, scan_size + 8);
433
434         saved_end_state = tap_get_end_state();
435
436         /* Move to appropriate scan state */
437         jlink_end_state(ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT);
438
439         /* Only move if we're not already there */
440         if (tap_get_state() != tap_get_end_state())
441                 jlink_state_move();
442
443         jlink_end_state(saved_end_state);
444
445         /* Scan */
446         jlink_tap_append_scan(scan_size, buffer, command);
447
448         /* We are in Exit1, go to Pause */
449         jlink_tap_append_step(0, 0);
450
451         tap_set_state(ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE);
452
453         if (tap_get_state() != tap_get_end_state())
454         {
455                 jlink_state_move();
456         }
457 }
458
459 static void jlink_reset(int trst, int srst)
460 {
461         LOG_DEBUG("trst: %i, srst: %i", trst, srst);
462
463         /* Signals are active low */
464         if (srst == 0)
465         {
466                 jlink_simple_command(EMU_CMD_HW_RESET1);
467                 jlink_end_state(TAP_RESET);
468                 jlink_state_move();
469         }
470         else if (srst == 1)
471         {
472                 jlink_simple_command(EMU_CMD_HW_RESET0);
473         }
474
475         if (trst == 0)
476         {
477                 jlink_simple_command(EMU_CMD_HW_TRST1);
478                 jlink_end_state(TAP_RESET);
479                 jlink_state_move();
480         }
481         else if (trst == 1)
482         {
483                 jlink_simple_command(EMU_CMD_HW_TRST0);
484         }
485 }
486
487 static void jlink_simple_command(u8 command)
488 {
489         int result;
490
491         DEBUG_JTAG_IO("0x%02x", command);
492
493         usb_out_buffer[0] = command;
494         result = jlink_usb_write(jlink_jtag_handle, 1);
495
496         if (result != 1)
497         {
498                 LOG_ERROR("J-Link command 0x%02x failed (%d)", command, result);
499         }
500 }
501
502 static int jlink_get_status(void)
503 {
504         int result;
505
506         jlink_simple_command(EMU_CMD_GET_STATE);
507
508         result = jlink_usb_read(jlink_jtag_handle, 8);
509         if (result != 8)
510         {
511                 LOG_ERROR("J-Link command EMU_CMD_GET_STATE failed (%d)\n", result);
512                 return ERROR_JTAG_DEVICE_ERROR;
513         }
514
515         int vref = usb_in_buffer[0] + (usb_in_buffer[1] << 8);
516         LOG_INFO("Vref = %d.%d TCK = %d TDI = %d TDO = %d TMS = %d SRST = %d TRST = %d\n", \
517                 vref / 1000, vref % 1000, \
518                 usb_in_buffer[2], usb_in_buffer[3], usb_in_buffer[4], \
519                 usb_in_buffer[5], usb_in_buffer[6], usb_in_buffer[7]);
520
521         if (vref < 1500)
522                 LOG_ERROR("Vref too low. Check Target Power\n");
523
524         return ERROR_OK;
525 }
526
527 static int jlink_get_version_info(void)
528 {
529         int result;
530         int len;
531
532         /* query hardware version */
533         jlink_simple_command(EMU_CMD_VERSION);
534
535         result = jlink_usb_read(jlink_jtag_handle, 2);
536         if (2 != result)
537         {
538                 LOG_ERROR("J-Link command EMU_CMD_VERSION failed (%d)\n",
539                                 result);
540                 return ERROR_JTAG_DEVICE_ERROR;
541         }
542
543         len = buf_get_u32(usb_in_buffer, 0, 16);
544         result = jlink_usb_read(jlink_jtag_handle, len);
545         if (result != len)
546         {
547                 LOG_ERROR("J-Link command EMU_CMD_VERSION failed (%d)\n",
548                                 result);
549                 return ERROR_JTAG_DEVICE_ERROR;
550         }
551
552         usb_in_buffer[result] = 0;
553         LOG_INFO("%s", (char *)usb_in_buffer);
554
555         return ERROR_OK;
556 }
557
558 static int jlink_handle_jlink_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
559 {
560         if (jlink_get_version_info() == ERROR_OK)
561         {
562                 /* attempt to get status */
563                 jlink_get_status();
564         }
565
566         return ERROR_OK;
567 }
568
569 /***************************************************************************/
570 /* J-Link tap functions */
571
572 /* 2048 is the max value we can use here */
573 #define JLINK_TAP_BUFFER_SIZE 2048
574
575 static unsigned tap_length;
576 static u8 tms_buffer[JLINK_TAP_BUFFER_SIZE];
577 static u8 tdi_buffer[JLINK_TAP_BUFFER_SIZE];
578 static u8 tdo_buffer[JLINK_TAP_BUFFER_SIZE];
579
580 typedef struct
581 {
582         int first;      /* First bit position in tdo_buffer to read */
583         int length; /* Number of bits to read */
584         scan_command_t *command; /* Corresponding scan command */
585         u8 *buffer;
586 } pending_scan_result_t;
587
588 #define MAX_PENDING_SCAN_RESULTS 256
589
590 static int pending_scan_results_length;
591 static pending_scan_result_t pending_scan_results_buffer[MAX_PENDING_SCAN_RESULTS];
592
593 static int last_tms;
594
595 static void jlink_tap_init(void)
596 {
597         tap_length = 0;
598         pending_scan_results_length = 0;
599 }
600
601 static void jlink_tap_ensure_space(int scans, int bits)
602 {
603         int available_scans = MAX_PENDING_SCAN_RESULTS - pending_scan_results_length;
604         int available_bits = JLINK_TAP_BUFFER_SIZE * 8 - tap_length;
605
606         if (scans > available_scans || bits > available_bits)
607         {
608                 jlink_tap_execute();
609         }
610 }
611
612 static void jlink_tap_append_step(int tms, int tdi)
613 {
614         last_tms = tms;
615         int index = tap_length / 8;
616
617         if (index >= JLINK_TAP_BUFFER_SIZE)
618         {
619                 LOG_ERROR("jlink_tap_append_step: overflow");
620                 exit(-1);
621         }
622
623         int bit_index = tap_length % 8;
624         u8 bit = 1 << bit_index;
625
626         // we do not pad TMS, so be sure to initialize all bits
627         if (0 == bit_index)
628                 tms_buffer[index] = tdi_buffer[index] = 0;
629
630         if (tms)
631                 tms_buffer[index] |= bit;
632         else
633                 tms_buffer[index] &= ~bit;
634
635         if (tdi)
636                 tdi_buffer[index] |= bit;
637         else
638                 tdi_buffer[index] &= ~bit;
639
640         tap_length++;
641 }
642
643 static void jlink_tap_append_scan(int length, u8 *buffer, scan_command_t *command)
644 {
645         pending_scan_result_t *pending_scan_result =
646                 &pending_scan_results_buffer[pending_scan_results_length];
647         int i;
648
649         pending_scan_result->first = tap_length;
650         pending_scan_result->length = length;
651         pending_scan_result->command = command;
652         pending_scan_result->buffer = buffer;
653
654         for (i = 0; i < length; i++)
655         {
656                 int tms = i < length - 1 ? 0 : 1;
657                 int tdi = buffer[i / 8] & (1 << (i % 8));
658                 jlink_tap_append_step(tms, tdi);
659         }
660         pending_scan_results_length++;
661 }
662
663 /* Pad and send a tap sequence to the device, and receive the answer.
664  * For the purpose of padding we assume that we are in idle or pause state. */
665 static int jlink_tap_execute(void)
666 {
667         int byte_length;
668         int tms_offset;
669         int tdi_offset;
670         int i;
671         int result;
672
673         if (!tap_length)
674                 return ERROR_OK;
675
676         // number of full bytes (plus one if some would be left over)
677         byte_length = tap_length / 8 + !!(tap_length % 8);
678
679         usb_out_buffer[0] = EMU_CMD_HW_JTAG3;
680         usb_out_buffer[1] = 0;
681         usb_out_buffer[2] = (tap_length >> 0) & 0xff;
682         usb_out_buffer[3] = (tap_length >> 8) & 0xff;
683
684         tms_offset = 4;
685         for (i = 0; i < byte_length; i++)
686         {
687                 usb_out_buffer[tms_offset + i] = tms_buffer[i];
688         }
689
690         tdi_offset = tms_offset + byte_length;
691         for (i = 0; i < byte_length; i++)
692         {
693                 usb_out_buffer[tdi_offset + i] = tdi_buffer[i];
694         }
695
696         result = jlink_usb_message(jlink_jtag_handle, 4 + 2 * byte_length, byte_length);
697
698         if (result != byte_length)
699         {
700                 LOG_ERROR("jlink_tap_execute, wrong result %d (expected %d)",
701                                 result, byte_length);
702                 return ERROR_JTAG_QUEUE_FAILED;
703         }
704
705         for (i = 0; i < byte_length; i++)
706                 tdo_buffer[i] = usb_in_buffer[i];
707
708         for (i = 0; i < pending_scan_results_length; i++)
709         {
710                 pending_scan_result_t *pending_scan_result = &pending_scan_results_buffer[i];
711                 u8 *buffer = pending_scan_result->buffer;
712                 int length = pending_scan_result->length;
713                 int first = pending_scan_result->first;
714                 scan_command_t *command = pending_scan_result->command;
715
716                 /* Copy to buffer */
717                 buf_set_buf(tdo_buffer, first, buffer, 0, length);
718
719                 DEBUG_JTAG_IO("pending scan result, length = %d", length);
720
721 #ifdef _DEBUG_USB_COMMS_
722                 jlink_debug_buffer(buffer, byte_length);
723 #endif
724
725                 if (jtag_read_buffer(buffer, command) != ERROR_OK)
726                 {
727                         jlink_tap_init();
728                         return ERROR_JTAG_QUEUE_FAILED;
729                 }
730
731                 if (pending_scan_result->buffer != NULL)
732                 {
733                         free(pending_scan_result->buffer);
734                 }
735         }
736
737         jlink_tap_init();
738
739         return ERROR_OK;
740 }
741
742 /*****************************************************************************/
743 /* JLink USB low-level functions */
744
745 static jlink_jtag_t* jlink_usb_open()
746 {
747         struct usb_bus *busses;
748         struct usb_bus *bus;
749         struct usb_device *dev;
750
751         jlink_jtag_t *result;
752
753         result = (jlink_jtag_t*) malloc(sizeof(jlink_jtag_t));
754
755         usb_init();
756         usb_find_busses();
757         usb_find_devices();
758
759         busses = usb_get_busses();
760
761         /* find jlink_jtag device in usb bus */
762
763         for (bus = busses; bus; bus = bus->next)
764         {
765                 for (dev = bus->devices; dev; dev = dev->next)
766                 {
767                         if ((dev->descriptor.idVendor == VID) && (dev->descriptor.idProduct == PID))
768                         {
769                                 result->usb_handle = usb_open(dev);
770
771                                 /* usb_set_configuration required under win32 */
772                                 usb_set_configuration(result->usb_handle, dev->config[0].bConfigurationValue);
773                                 usb_claim_interface(result->usb_handle, 0);
774
775 #if 0
776                                 /*
777                                  * This makes problems under Mac OS X. And is not needed
778                                  * under Windows. Hopefully this will not break a linux build
779                                  */
780                                 usb_set_altinterface(result->usb_handle, 0);
781 #endif
782                                 return result;
783                         }
784                 }
785         }
786
787         free(result);
788         return NULL;
789 }
790
791 static void jlink_usb_close(jlink_jtag_t *jlink_jtag)
792 {
793         usb_close(jlink_jtag->usb_handle);
794         free(jlink_jtag);
795 }
796
797 /* Send a message and receive the reply. */
798 static int jlink_usb_message(jlink_jtag_t *jlink_jtag, int out_length, int in_length)
799 {
800         int result;
801         int result2;
802
803         result = jlink_usb_write(jlink_jtag, out_length);
804         if (result != out_length)
805         {
806                 LOG_ERROR("usb_bulk_write failed (requested=%d, result=%d)",
807                                 out_length, result);
808                 return ERROR_JTAG_DEVICE_ERROR;
809         }
810
811         result = jlink_usb_read(jlink_jtag, in_length);
812         if ((result != in_length) && (result != in_length + 1))
813         {
814                 LOG_ERROR("usb_bulk_read failed (requested=%d, result=%d)",
815                                 in_length, result);
816                 return ERROR_JTAG_DEVICE_ERROR;
817         }
818
819         if (result == in_length)
820         {
821                 /* Must read the result from the EMU too */
822                 result2 = jlink_usb_read_emu_result(jlink_jtag);
823                 if (1 != result2)
824                 {
825                         LOG_ERROR("jlink_usb_read_emu_result failed "
826                                 "(requested=1, result=%d)", result2);
827                         return ERROR_JTAG_DEVICE_ERROR;
828                 }
829
830                 /* Check the result itself */
831                 result2 = usb_emu_result_buffer[0];
832         }
833         else
834         {
835                 /* Save the result, then remove it from return value */
836                 result2 = usb_in_buffer[result--];
837         }
838
839         if (result2)
840         {
841                 LOG_ERROR("jlink_usb_message failed with result=%d)", result2);
842                 return ERROR_JTAG_DEVICE_ERROR;
843         }
844
845         return result;
846 }
847
848 /* calls the given usb_bulk_* function, allowing for the data to trickle in with some timeouts  */
849 static int usb_bulk_with_retries(
850                 int (*f)(usb_dev_handle *, int, char *, int, int),
851                 usb_dev_handle *dev, int ep,
852                 char *bytes, int size, int timeout)
853 {
854         int rc = 0, tries = 3, this_size;
855
856         while (tries && size) {
857
858                 this_size = f(dev, ep, bytes, size, timeout);
859                 if (this_size > 0) {
860                         
861                         size -= this_size;
862                         rc += this_size;
863                         bytes += this_size;
864
865                 } else
866                         tries --;
867         }
868         return rc;
869 }
870 static inline int usb_bulk_write_ex(usb_dev_handle *dev, int ep,
871                 char *bytes, int size, int timeout)
872 {
873         return usb_bulk_with_retries(&usb_bulk_write,
874                         dev, ep, bytes, size, timeout);
875 }
876 static inline int usb_bulk_read_ex(usb_dev_handle *dev, int ep,
877                 char *bytes, int size, int timeout)
878 {
879         return usb_bulk_with_retries(&usb_bulk_read,
880                         dev, ep, bytes, size, timeout);
881 }
882
883 /* Write data from out_buffer to USB. */
884 static int jlink_usb_write(jlink_jtag_t *jlink_jtag, int out_length)
885 {
886         int result;
887
888         if (out_length > JLINK_OUT_BUFFER_SIZE)
889         {
890                 LOG_ERROR("jlink_jtag_write illegal out_length=%d (max=%d)", out_length, JLINK_OUT_BUFFER_SIZE);
891                 return -1;
892         }
893
894         result = usb_bulk_write_ex(jlink_jtag->usb_handle, JLINK_WRITE_ENDPOINT,
895                 (char *)usb_out_buffer, out_length, JLINK_USB_TIMEOUT);
896
897         DEBUG_JTAG_IO("jlink_usb_write, out_length = %d, result = %d", out_length, result);
898
899 #ifdef _DEBUG_USB_COMMS_
900         jlink_debug_buffer(usb_out_buffer, out_length);
901 #endif
902         return result;
903 }
904
905 /* Read data from USB into in_buffer. */
906 static int jlink_usb_read(jlink_jtag_t *jlink_jtag, int expected_size)
907 {
908         int result = usb_bulk_read_ex(jlink_jtag->usb_handle, JLINK_READ_ENDPOINT,
909                 (char *)usb_in_buffer, expected_size, JLINK_USB_TIMEOUT);
910
911         DEBUG_JTAG_IO("jlink_usb_read, result = %d", result);
912
913 #ifdef _DEBUG_USB_COMMS_
914         jlink_debug_buffer(usb_in_buffer, result);
915 #endif
916         return result;
917 }
918
919 /* Read the result from the previous EMU cmd into result_buffer. */
920 static int jlink_usb_read_emu_result(jlink_jtag_t *jlink_jtag)
921 {
922         int result = usb_bulk_read_ex(jlink_jtag->usb_handle, JLINK_READ_ENDPOINT,
923                 (char *)usb_emu_result_buffer, 1 /* JLINK_EMU_RESULT_BUFFER_SIZE */,
924                 JLINK_USB_TIMEOUT);
925
926         DEBUG_JTAG_IO("jlink_usb_read_result, result = %d", result);
927
928 #ifdef _DEBUG_USB_COMMS_
929         jlink_debug_buffer(usb_emu_result_buffer, result);
930 #endif
931         return result;
932 }
933
934 #ifdef _DEBUG_USB_COMMS_
935 #define BYTES_PER_LINE  16
936
937 static void jlink_debug_buffer(u8 *buffer, int length)
938 {
939         char line[81];
940         char s[4];
941         int i;
942         int j;
943
944         for (i = 0; i < length; i += BYTES_PER_LINE)
945         {
946                 snprintf(line, 5, "%04x", i);
947                 for (j = i; j < i + BYTES_PER_LINE && j < length; j++)
948                 {
949                         snprintf(s, 4, " %02x", buffer[j]);
950                         strcat(line, s);
951                 }
952                 LOG_DEBUG("%s", line);
953         }
954 }
955 #endif