1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
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. *
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. *
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 ***************************************************************************/
24 #include "replacements.h"
37 #if PARPORT_USE_PPDEV == 1
38 #include <linux/parport.h>
39 #include <linux/ppdev.h>
41 #include <sys/ioctl.h>
43 #else /* not PARPORT_USE_PPDEV */
49 #if PARPORT_USE_GIVEIO == 1
59 u16 amt_jtagaccel_port
;
61 /* interface variables
63 static u8 aw_control_rst
= 0x00;
64 static u8 aw_control_fsm
= 0x10;
65 static u8 aw_control_baudrate
= 0x20;
67 static int rtck_enabled
= 0;
69 #if PARPORT_USE_PPDEV == 1
70 static int device_handle
;
71 int addr_mode
= IEEE1284_MODE_EPP
| IEEE1284_ADDR
;
72 int data_mode
= IEEE1284_MODE_EPP
| IEEE1284_DATA
;
73 #define AMT_AW(val) do { ioctl(device_handle, PPSETMODE, &addr_mode); write(device_handle, &val, 1); } while (0)
74 #define AMT_AR(val) do { ioctl(device_handle, PPSETMODE, &addr_mode); read(device_handle, &val, 1); } while (0)
75 #define AMT_DW(val) do { ioctl(device_handle, PPSETMODE, &data_mode); write(device_handle, &val, 1); } while (0)
76 #define AMT_DR(val) do { ioctl(device_handle, PPSETMODE, &data_mode); read(device_handle, &val, 1); } while (0)
78 #define AMT_AW(val) do { outb(val, amt_jtagaccel_port + 3); } while (0)
79 #define AMT_AR(val) do { val = inb(amt_jtagaccel_port + 3); } while (0)
80 #define AMT_DW(val) do { outb(val, amt_jtagaccel_port + 4); } while (0)
81 #define AMT_DR(val) do { val = inb(amt_jtagaccel_port + 4); } while (0)
84 int amt_jtagaccel_execute_queue(void);
85 int amt_jtagaccel_register_commands(struct command_context_s
*cmd_ctx
);
86 int amt_jtagaccel_speed(int speed
);
87 int amt_jtagaccel_init(void);
88 int amt_jtagaccel_quit(void);
90 int amt_jtagaccel_handle_parport_port_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
91 int amt_jtagaccel_handle_rtck_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
93 /* tap_move[i][j]: tap movement command to go from state i to state j
101 u8 amt_jtagaccel_tap_move
[6][6][2] =
103 /* TLR RTI SD PD SI PI */
104 {{0x1f, 0x00}, {0x0f, 0x00}, {0x8a, 0x04}, {0x0a, 0x00}, {0x06, 0x00}, {0x96, 0x00}}, /* TLR */
105 {{0x1f, 0x00}, {0x00, 0x00}, {0x85, 0x08}, {0x05, 0x00}, {0x8b, 0x08}, {0x0b, 0x00}}, /* RTI */
106 {{0x1f, 0x00}, {0x0d, 0x00}, {0x00, 0x00}, {0x01, 0x00}, {0x8f, 0x09}, {0x8f, 0x01}}, /* SD */
107 {{0x1f, 0x00}, {0x0c, 0x00}, {0x08, 0x00}, {0x00, 0x00}, {0x8f, 0x09}, {0x8f, 0x01}}, /* PD */
108 {{0x1f, 0x00}, {0x0d, 0x00}, {0x07, 0x00}, {0x97, 0x00}, {0x00, 0x00}, {0x01, 0x00}}, /* SI */
109 {{0x1f, 0x00}, {0x0c, 0x00}, {0x07, 0x00}, {0x97, 0x00}, {0x08, 0x00}, {0x00, 0x00}}, /* PI */
112 jtag_interface_t amt_jtagaccel_interface
=
114 .name
= "amt_jtagaccel",
116 .execute_queue
= amt_jtagaccel_execute_queue
,
118 .speed
= amt_jtagaccel_speed
,
119 .register_commands
= amt_jtagaccel_register_commands
,
120 .init
= amt_jtagaccel_init
,
121 .quit
= amt_jtagaccel_quit
,
124 int amt_jtagaccel_register_commands(struct command_context_s
*cmd_ctx
)
126 register_command(cmd_ctx
, NULL
, "parport_port", amt_jtagaccel_handle_parport_port_command
,
127 COMMAND_CONFIG
, NULL
);
128 register_command(cmd_ctx
, NULL
, "rtck", amt_jtagaccel_handle_rtck_command
,
129 COMMAND_CONFIG
, NULL
);
134 void amt_jtagaccel_reset(int trst
, int srst
)
137 aw_control_rst
|= 0x4;
139 aw_control_rst
&= ~0x4;
142 aw_control_rst
|= 0x1;
144 aw_control_rst
&= ~0x1;
146 AMT_AW(aw_control_rst
);
149 int amt_jtagaccel_speed(int speed
)
151 aw_control_baudrate
&= 0xf0;
152 aw_control_baudrate
|= speed
& 0x0f;
153 AMT_AW(aw_control_baudrate
);
158 void amt_jtagaccel_end_state(state
)
160 if (tap_move_map
[state
] != -1)
164 LOG_ERROR("BUG: %i is not a valid end state", state
);
169 void amt_wait_scan_busy(void)
175 while (((ar_status
) & 0x80) && (timeout
-- > 0))
178 if (ar_status
& 0x80)
180 LOG_ERROR("amt_jtagaccel timed out while waiting for end of scan, rtck was %s, last AR_STATUS: 0x%2.2x", (rtck_enabled
) ? "enabled" : "disabled", ar_status
);
185 void amt_jtagaccel_state_move(void)
190 tms_scan
[0] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][0];
191 tms_scan
[1] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][1];
193 aw_scan_tms_5
= 0x40 | (tms_scan
[0] & 0x1f);
194 AMT_AW(aw_scan_tms_5
);
195 if (jtag_speed
> 3 || rtck_enabled
)
196 amt_wait_scan_busy();
198 if (tms_scan
[0] & 0x80)
200 aw_scan_tms_5
= 0x40 | (tms_scan
[1] & 0x1f);
201 AMT_AW(aw_scan_tms_5
);
202 if (jtag_speed
> 3 || rtck_enabled
)
203 amt_wait_scan_busy();
206 cur_state
= end_state
;
209 void amt_jtagaccel_runtest(int num_cycles
)
215 enum tap_state saved_end_state
= end_state
;
217 /* only do a state_move when we're not already in RTI */
218 if (cur_state
!= TAP_RTI
)
220 amt_jtagaccel_end_state(TAP_RTI
);
221 amt_jtagaccel_state_move();
224 while (num_cycles
- i
>= 5)
226 aw_scan_tms_5
= 0x40;
227 AMT_AW(aw_scan_tms_5
);
231 if (num_cycles
- i
> 0)
233 aw_scan_tms_1to4
= 0x80 | ((num_cycles
- i
- 1) & 0x3) << 4;
234 AMT_AW(aw_scan_tms_1to4
);
237 amt_jtagaccel_end_state(saved_end_state
);
238 if (cur_state
!= end_state
)
239 amt_jtagaccel_state_move();
242 void amt_jtagaccel_scan(int ir_scan
, enum scan_type type
, u8
*buffer
, int scan_size
)
244 int bits_left
= scan_size
;
246 enum tap_state saved_end_state
= end_state
;
254 amt_jtagaccel_end_state(TAP_SI
);
256 amt_jtagaccel_end_state(TAP_SD
);
258 amt_jtagaccel_state_move();
259 amt_jtagaccel_end_state(saved_end_state
);
261 /* handle unaligned bits at the beginning */
262 if ((scan_size
- 1) % 8)
264 aw_tdi_option
= 0x30 | (((scan_size
- 1) % 8) - 1);
265 AMT_AW(aw_tdi_option
);
267 dw_tdi_scan
= buf_get_u32(buffer
, bit_count
, (scan_size
- 1) % 8) & 0xff;
269 if (jtag_speed
> 3 || rtck_enabled
)
270 amt_wait_scan_busy();
272 if ((type
== SCAN_IN
) || (type
== SCAN_IO
))
275 dr_tdo
= dr_tdo
>> (8 - ((scan_size
- 1) % 8));
276 buf_set_u32(buffer
, bit_count
, (scan_size
- 1) % 8, dr_tdo
);
279 bit_count
+= (scan_size
- 1) % 8;
280 bits_left
-= (scan_size
- 1) % 8;
283 while (bits_left
- 1 >= 8)
285 dw_tdi_scan
= buf_get_u32(buffer
, bit_count
, 8) & 0xff;
287 if (jtag_speed
> 3 || rtck_enabled
)
288 amt_wait_scan_busy();
290 if ((type
== SCAN_IN
) || (type
== SCAN_IO
))
293 buf_set_u32(buffer
, bit_count
, 8, dr_tdo
);
300 tms_scan
[0] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][0];
301 tms_scan
[1] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][1];
302 aw_tms_scan
= 0x40 | (tms_scan
[0] & 0x1f) | (buf_get_u32(buffer
, bit_count
, 1) << 5);
304 if (jtag_speed
> 3 || rtck_enabled
)
305 amt_wait_scan_busy();
307 if ((type
== SCAN_IN
) || (type
== SCAN_IO
))
310 dr_tdo
= dr_tdo
>> 7;
311 buf_set_u32(buffer
, bit_count
, 1, dr_tdo
);
314 if (tms_scan
[0] & 0x80)
316 aw_tms_scan
= 0x40 | (tms_scan
[1] & 0x1f);
318 if (jtag_speed
> 3 || rtck_enabled
)
319 amt_wait_scan_busy();
321 cur_state
= end_state
;
324 int amt_jtagaccel_execute_queue(void)
326 jtag_command_t
*cmd
= jtag_command_queue
; /* currently processed command */
332 /* return ERROR_OK, unless a jtag_read_buffer returns a failed check
333 * that wasn't handled by a caller-provided error handler
342 #ifdef _DEBUG_JTAG_IO_
343 LOG_DEBUG("end_state: %i", cmd
->cmd
.end_state
->end_state
);
345 if (cmd
->cmd
.end_state
->end_state
!= -1)
346 amt_jtagaccel_end_state(cmd
->cmd
.end_state
->end_state
);
349 #ifdef _DEBUG_JTAG_IO_
350 LOG_DEBUG("reset trst: %i srst %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
352 if (cmd
->cmd
.reset
->trst
== 1)
356 amt_jtagaccel_reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
359 #ifdef _DEBUG_JTAG_IO_
360 LOG_DEBUG("runtest %i cycles, end in %i", cmd
->cmd
.runtest
->num_cycles
, cmd
->cmd
.runtest
->end_state
);
362 if (cmd
->cmd
.runtest
->end_state
!= -1)
363 amt_jtagaccel_end_state(cmd
->cmd
.runtest
->end_state
);
364 amt_jtagaccel_runtest(cmd
->cmd
.runtest
->num_cycles
);
367 #ifdef _DEBUG_JTAG_IO_
368 LOG_DEBUG("statemove end in %i", cmd
->cmd
.statemove
->end_state
);
370 if (cmd
->cmd
.statemove
->end_state
!= -1)
371 amt_jtagaccel_end_state(cmd
->cmd
.statemove
->end_state
);
372 amt_jtagaccel_state_move();
375 #ifdef _DEBUG_JTAG_IO_
376 LOG_DEBUG("scan end in %i", cmd
->cmd
.scan
->end_state
);
378 if (cmd
->cmd
.scan
->end_state
!= -1)
379 amt_jtagaccel_end_state(cmd
->cmd
.scan
->end_state
);
380 scan_size
= jtag_build_buffer(cmd
->cmd
.scan
, &buffer
);
381 type
= jtag_scan_type(cmd
->cmd
.scan
);
382 amt_jtagaccel_scan(cmd
->cmd
.scan
->ir_scan
, type
, buffer
, scan_size
);
383 if (jtag_read_buffer(buffer
, cmd
->cmd
.scan
) != ERROR_OK
)
384 retval
= ERROR_JTAG_QUEUE_FAILED
;
389 #ifdef _DEBUG_JTAG_IO_
390 LOG_DEBUG("sleep %i", cmd
->cmd
.sleep
->us
);
392 jtag_sleep(cmd
->cmd
.sleep
->us
);
395 LOG_ERROR("BUG: unknown JTAG command type encountered");
404 #if PARPORT_USE_GIVEIO == 1
405 int amt_jtagaccel_get_giveio_access()
408 OSVERSIONINFO version
;
410 version
.dwOSVersionInfoSize
= sizeof version
;
411 if (!GetVersionEx( &version
)) {
415 if (version
.dwPlatformId
!= VER_PLATFORM_WIN32_NT
)
418 h
= CreateFile( "\\\\.\\giveio", GENERIC_READ
, 0, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
419 if (h
== INVALID_HANDLE_VALUE
) {
430 int amt_jtagaccel_init(void)
432 #if PARPORT_USE_PPDEV == 1
441 #if PARPORT_USE_PPDEV == 1
442 if (device_handle
> 0)
444 LOG_ERROR("device is already opened");
445 return ERROR_JTAG_INIT_FAILED
;
448 snprintf(buffer
, 256, "/dev/parport%d", amt_jtagaccel_port
);
449 device_handle
= open(buffer
, O_RDWR
);
451 if (device_handle
< 0)
453 LOG_ERROR("cannot open device. check it exists and that user read and write rights are set");
454 return ERROR_JTAG_INIT_FAILED
;
457 i
= ioctl(device_handle
, PPCLAIM
);
460 LOG_ERROR("cannot claim device");
461 return ERROR_JTAG_INIT_FAILED
;
464 i
= IEEE1284_MODE_EPP
;
465 i
= ioctl(device_handle
, PPSETMODE
, & i
);
468 LOG_ERROR(" cannot set compatible mode to device");
469 return ERROR_JTAG_INIT_FAILED
;
473 i
= ioctl(device_handle
, PPWCONTROL
, &control_port
);
476 i
= ioctl(device_handle
, PPWCONTROL
, &control_port
);
479 if (amt_jtagaccel_port
== 0)
481 amt_jtagaccel_port
= 0x378;
482 LOG_WARNING("No parport port specified, using default '0x378' (LPT1)");
485 #if PARPORT_USE_GIVEIO == 1
486 if (amt_jtagaccel_get_giveio_access() != 0) {
487 #else /* PARPORT_USE_GIVEIO */
488 if (ioperm(amt_jtagaccel_port
, 5, 1) != 0) {
489 #endif /* PARPORT_USE_GIVEIO */
490 LOG_ERROR("missing privileges for direct i/o");
491 return ERROR_JTAG_INIT_FAILED
;
494 /* prepare epp port */
496 status_port
= inb(amt_jtagaccel_port
+ 1);
497 outb(status_port
| 0x1, amt_jtagaccel_port
+ 1);
500 outb(0x00, amt_jtagaccel_port
+ 2);
501 outb(0x04, amt_jtagaccel_port
+ 2);
506 /* set RTCK enable bit */
507 aw_control_fsm
|= 0x02;
510 /* enable JTAG port */
511 aw_control_fsm
|= 0x04;
512 AMT_AW(aw_control_fsm
);
514 amt_jtagaccel_speed(jtag_speed
);
516 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
517 aw_control_rst
&= ~0x8;
519 aw_control_rst
|= 0x8;
521 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
522 aw_control_rst
&= ~0x2;
524 aw_control_rst
|= 0x2;
526 amt_jtagaccel_reset(0, 0);
528 /* read status register */
530 LOG_DEBUG("AR_STATUS: 0x%2.2x", ar_status
);
535 int amt_jtagaccel_quit(void)
541 int amt_jtagaccel_handle_parport_port_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
546 /* only if the port wasn't overwritten by cmdline */
547 if (amt_jtagaccel_port
== 0)
548 amt_jtagaccel_port
= strtoul(args
[0], NULL
, 0);
553 int amt_jtagaccel_handle_rtck_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
557 command_print(cmd_ctx
, "amt_jtagaccel RTCK feature %s", (rtck_enabled
) ? "enabled" : "disabled");
562 if (strcmp(args
[0], "enabled") == 0)
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)