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"
40 #if PARPORT_USE_PPDEV == 1
41 #include <linux/parport.h>
42 #include <linux/ppdev.h>
44 #include <sys/ioctl.h>
46 #else /* not PARPORT_USE_PPDEV */
52 #if PARPORT_USE_GIVEIO == 1
62 u16 amt_jtagaccel_port
;
64 /* interface variables
66 static u8 aw_control_rst
= 0x00;
67 static u8 aw_control_fsm
= 0x10;
68 static u8 aw_control_baudrate
= 0x20;
70 static int rtck_enabled
= 0;
72 #if PARPORT_USE_PPDEV == 1
73 static int device_handle
;
74 int addr_mode
= IEEE1284_MODE_EPP
| IEEE1284_ADDR
;
75 int data_mode
= IEEE1284_MODE_EPP
| IEEE1284_DATA
;
76 #define AMT_AW(val) do { ioctl(device_handle, PPSETMODE, &addr_mode); write(device_handle, &val, 1); } while (0)
77 #define AMT_AR(val) do { ioctl(device_handle, PPSETMODE, &addr_mode); read(device_handle, &val, 1); } while (0)
78 #define AMT_DW(val) do { ioctl(device_handle, PPSETMODE, &data_mode); write(device_handle, &val, 1); } while (0)
79 #define AMT_DR(val) do { ioctl(device_handle, PPSETMODE, &data_mode); read(device_handle, &val, 1); } while (0)
81 #define AMT_AW(val) do { outb(val, amt_jtagaccel_port + 3); } while (0)
82 #define AMT_AR(val) do { val = inb(amt_jtagaccel_port + 3); } while (0)
83 #define AMT_DW(val) do { outb(val, amt_jtagaccel_port + 4); } while (0)
84 #define AMT_DR(val) do { val = inb(amt_jtagaccel_port + 4); } while (0)
87 int amt_jtagaccel_execute_queue(void);
88 int amt_jtagaccel_register_commands(struct command_context_s
*cmd_ctx
);
89 int amt_jtagaccel_speed(int speed
);
90 int amt_jtagaccel_init(void);
91 int amt_jtagaccel_quit(void);
93 int amt_jtagaccel_handle_parport_port_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
94 int amt_jtagaccel_handle_rtck_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
96 /* tap_move[i][j]: tap movement command to go from state i to state j
104 u8 amt_jtagaccel_tap_move
[6][6][2] =
106 /* TLR RTI SD PD SI PI */
107 {{0x1f, 0x00}, {0x0f, 0x00}, {0x8a, 0x04}, {0x0a, 0x00}, {0x06, 0x00}, {0x96, 0x00}}, /* TLR */
108 {{0x1f, 0x00}, {0x00, 0x00}, {0x85, 0x08}, {0x05, 0x00}, {0x8b, 0x08}, {0x0b, 0x00}}, /* RTI */
109 {{0x1f, 0x00}, {0x0d, 0x00}, {0x00, 0x00}, {0x01, 0x00}, {0x8f, 0x09}, {0x8f, 0x01}}, /* SD */
110 {{0x1f, 0x00}, {0x0c, 0x00}, {0x08, 0x00}, {0x00, 0x00}, {0x8f, 0x09}, {0x8f, 0x01}}, /* PD */
111 {{0x1f, 0x00}, {0x0d, 0x00}, {0x07, 0x00}, {0x97, 0x00}, {0x00, 0x00}, {0x01, 0x00}}, /* SI */
112 {{0x1f, 0x00}, {0x0c, 0x00}, {0x07, 0x00}, {0x97, 0x00}, {0x08, 0x00}, {0x00, 0x00}}, /* PI */
115 jtag_interface_t amt_jtagaccel_interface
=
117 .name
= "amt_jtagaccel",
119 .execute_queue
= amt_jtagaccel_execute_queue
,
121 .speed
= amt_jtagaccel_speed
,
122 .register_commands
= amt_jtagaccel_register_commands
,
123 .init
= amt_jtagaccel_init
,
124 .quit
= amt_jtagaccel_quit
,
127 int amt_jtagaccel_register_commands(struct command_context_s
*cmd_ctx
)
129 register_command(cmd_ctx
, NULL
, "parport_port", amt_jtagaccel_handle_parport_port_command
,
130 COMMAND_CONFIG
, NULL
);
131 register_command(cmd_ctx
, NULL
, "rtck", amt_jtagaccel_handle_rtck_command
,
132 COMMAND_CONFIG
, NULL
);
137 void amt_jtagaccel_reset(int trst
, int srst
)
140 aw_control_rst
|= 0x4;
142 aw_control_rst
&= ~0x4;
145 aw_control_rst
|= 0x1;
147 aw_control_rst
&= ~0x1;
149 AMT_AW(aw_control_rst
);
152 int amt_jtagaccel_speed(int speed
)
154 aw_control_baudrate
&= 0xf0;
155 aw_control_baudrate
|= speed
& 0x0f;
156 AMT_AW(aw_control_baudrate
);
161 void amt_jtagaccel_end_state(state
)
163 if (tap_move_map
[state
] != -1)
167 LOG_ERROR("BUG: %i is not a valid end state", state
);
172 void amt_wait_scan_busy()
178 while (((ar_status
) & 0x80) && (timeout
-- > 0))
181 if (ar_status
& 0x80)
183 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
);
188 void amt_jtagaccel_state_move(void)
193 tms_scan
[0] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][0];
194 tms_scan
[1] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][1];
196 aw_scan_tms_5
= 0x40 | (tms_scan
[0] & 0x1f);
197 AMT_AW(aw_scan_tms_5
);
198 if (jtag_speed
> 3 || rtck_enabled
)
199 amt_wait_scan_busy();
201 if (tms_scan
[0] & 0x80)
203 aw_scan_tms_5
= 0x40 | (tms_scan
[1] & 0x1f);
204 AMT_AW(aw_scan_tms_5
);
205 if (jtag_speed
> 3 || rtck_enabled
)
206 amt_wait_scan_busy();
209 cur_state
= end_state
;
212 void amt_jtagaccel_runtest(int num_cycles
)
218 enum tap_state saved_end_state
= end_state
;
220 /* only do a state_move when we're not already in RTI */
221 if (cur_state
!= TAP_RTI
)
223 amt_jtagaccel_end_state(TAP_RTI
);
224 amt_jtagaccel_state_move();
227 while (num_cycles
- i
>= 5)
229 aw_scan_tms_5
= 0x40;
230 AMT_AW(aw_scan_tms_5
);
234 if (num_cycles
- i
> 0)
236 aw_scan_tms_1to4
= 0x80 | ((num_cycles
- i
- 1) & 0x3) << 4;
237 AMT_AW(aw_scan_tms_1to4
);
240 amt_jtagaccel_end_state(saved_end_state
);
241 if (cur_state
!= end_state
)
242 amt_jtagaccel_state_move();
245 void amt_jtagaccel_scan(int ir_scan
, enum scan_type type
, u8
*buffer
, int scan_size
)
247 int bits_left
= scan_size
;
249 enum tap_state saved_end_state
= end_state
;
257 amt_jtagaccel_end_state(TAP_SI
);
259 amt_jtagaccel_end_state(TAP_SD
);
261 amt_jtagaccel_state_move();
262 amt_jtagaccel_end_state(saved_end_state
);
264 /* handle unaligned bits at the beginning */
265 if ((scan_size
- 1) % 8)
267 aw_tdi_option
= 0x30 | (((scan_size
- 1) % 8) - 1);
268 AMT_AW(aw_tdi_option
);
270 dw_tdi_scan
= buf_get_u32(buffer
, bit_count
, (scan_size
- 1) % 8) & 0xff;
272 if (jtag_speed
> 3 || rtck_enabled
)
273 amt_wait_scan_busy();
275 if ((type
== SCAN_IN
) || (type
== SCAN_IO
))
278 dr_tdo
= dr_tdo
>> (8 - ((scan_size
- 1) % 8));
279 buf_set_u32(buffer
, bit_count
, (scan_size
- 1) % 8, dr_tdo
);
282 bit_count
+= (scan_size
- 1) % 8;
283 bits_left
-= (scan_size
- 1) % 8;
286 while (bits_left
- 1 >= 8)
288 dw_tdi_scan
= buf_get_u32(buffer
, bit_count
, 8) & 0xff;
290 if (jtag_speed
> 3 || rtck_enabled
)
291 amt_wait_scan_busy();
293 if ((type
== SCAN_IN
) || (type
== SCAN_IO
))
296 buf_set_u32(buffer
, bit_count
, 8, dr_tdo
);
303 tms_scan
[0] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][0];
304 tms_scan
[1] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][1];
305 aw_tms_scan
= 0x40 | (tms_scan
[0] & 0x1f) | (buf_get_u32(buffer
, bit_count
, 1) << 5);
307 if (jtag_speed
> 3 || rtck_enabled
)
308 amt_wait_scan_busy();
310 if ((type
== SCAN_IN
) || (type
== SCAN_IO
))
313 dr_tdo
= dr_tdo
>> 7;
314 buf_set_u32(buffer
, bit_count
, 1, dr_tdo
);
317 if (tms_scan
[0] & 0x80)
319 aw_tms_scan
= 0x40 | (tms_scan
[1] & 0x1f);
321 if (jtag_speed
> 3 || rtck_enabled
)
322 amt_wait_scan_busy();
324 cur_state
= end_state
;
327 int amt_jtagaccel_execute_queue(void)
329 jtag_command_t
*cmd
= jtag_command_queue
; /* currently processed command */
335 /* return ERROR_OK, unless a jtag_read_buffer returns a failed check
336 * that wasn't handled by a caller-provided error handler
345 #ifdef _DEBUG_JTAG_IO_
346 LOG_DEBUG("end_state: %i", cmd
->cmd
.end_state
->end_state
);
348 if (cmd
->cmd
.end_state
->end_state
!= -1)
349 amt_jtagaccel_end_state(cmd
->cmd
.end_state
->end_state
);
352 #ifdef _DEBUG_JTAG_IO_
353 LOG_DEBUG("reset trst: %i srst %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
355 if (cmd
->cmd
.reset
->trst
== 1)
359 amt_jtagaccel_reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
362 #ifdef _DEBUG_JTAG_IO_
363 LOG_DEBUG("runtest %i cycles, end in %i", cmd
->cmd
.runtest
->num_cycles
, cmd
->cmd
.runtest
->end_state
);
365 if (cmd
->cmd
.runtest
->end_state
!= -1)
366 amt_jtagaccel_end_state(cmd
->cmd
.runtest
->end_state
);
367 amt_jtagaccel_runtest(cmd
->cmd
.runtest
->num_cycles
);
370 #ifdef _DEBUG_JTAG_IO_
371 LOG_DEBUG("statemove end in %i", cmd
->cmd
.statemove
->end_state
);
373 if (cmd
->cmd
.statemove
->end_state
!= -1)
374 amt_jtagaccel_end_state(cmd
->cmd
.statemove
->end_state
);
375 amt_jtagaccel_state_move();
378 #ifdef _DEBUG_JTAG_IO_
379 LOG_DEBUG("scan end in %i", cmd
->cmd
.scan
->end_state
);
381 if (cmd
->cmd
.scan
->end_state
!= -1)
382 amt_jtagaccel_end_state(cmd
->cmd
.scan
->end_state
);
383 scan_size
= jtag_build_buffer(cmd
->cmd
.scan
, &buffer
);
384 type
= jtag_scan_type(cmd
->cmd
.scan
);
385 amt_jtagaccel_scan(cmd
->cmd
.scan
->ir_scan
, type
, buffer
, scan_size
);
386 if (jtag_read_buffer(buffer
, cmd
->cmd
.scan
) != ERROR_OK
)
387 retval
= ERROR_JTAG_QUEUE_FAILED
;
392 #ifdef _DEBUG_JTAG_IO_
393 LOG_DEBUG("sleep %i", cmd
->cmd
.sleep
->us
);
395 jtag_sleep(cmd
->cmd
.sleep
->us
);
398 LOG_ERROR("BUG: unknown JTAG command type encountered");
407 #if PARPORT_USE_GIVEIO == 1
408 int amt_jtagaccel_get_giveio_access()
411 OSVERSIONINFO version
;
413 version
.dwOSVersionInfoSize
= sizeof version
;
414 if (!GetVersionEx( &version
)) {
418 if (version
.dwPlatformId
!= VER_PLATFORM_WIN32_NT
)
421 h
= CreateFile( "\\\\.\\giveio", GENERIC_READ
, 0, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
422 if (h
== INVALID_HANDLE_VALUE
) {
433 int amt_jtagaccel_init(void)
435 #if PARPORT_USE_PPDEV == 1
444 #if PARPORT_USE_PPDEV == 1
445 if (device_handle
> 0)
447 LOG_ERROR("device is already opened");
448 return ERROR_JTAG_INIT_FAILED
;
451 snprintf(buffer
, 256, "/dev/parport%d", amt_jtagaccel_port
);
452 device_handle
= open(buffer
, O_RDWR
);
454 if (device_handle
< 0)
456 LOG_ERROR("cannot open device. check it exists and that user read and write rights are set");
457 return ERROR_JTAG_INIT_FAILED
;
460 i
= ioctl(device_handle
, PPCLAIM
);
463 LOG_ERROR("cannot claim device");
464 return ERROR_JTAG_INIT_FAILED
;
467 i
= IEEE1284_MODE_EPP
;
468 i
= ioctl(device_handle
, PPSETMODE
, & i
);
471 LOG_ERROR(" cannot set compatible mode to device");
472 return ERROR_JTAG_INIT_FAILED
;
476 i
= ioctl(device_handle
, PPWCONTROL
, &control_port
);
479 i
= ioctl(device_handle
, PPWCONTROL
, &control_port
);
482 if (amt_jtagaccel_port
== 0)
484 amt_jtagaccel_port
= 0x378;
485 LOG_WARNING("No parport port specified, using default '0x378' (LPT1)");
488 #if PARPORT_USE_GIVEIO == 1
489 if (amt_jtagaccel_get_giveio_access() != 0) {
490 #else /* PARPORT_USE_GIVEIO */
491 if (ioperm(amt_jtagaccel_port
, 5, 1) != 0) {
492 #endif /* PARPORT_USE_GIVEIO */
493 LOG_ERROR("missing privileges for direct i/o");
494 return ERROR_JTAG_INIT_FAILED
;
497 /* prepare epp port */
499 status_port
= inb(amt_jtagaccel_port
+ 1);
500 outb(status_port
| 0x1, amt_jtagaccel_port
+ 1);
503 outb(0x00, amt_jtagaccel_port
+ 2);
504 outb(0x04, amt_jtagaccel_port
+ 2);
509 /* set RTCK enable bit */
510 aw_control_fsm
|= 0x02;
513 /* enable JTAG port */
514 aw_control_fsm
|= 0x04;
515 AMT_AW(aw_control_fsm
);
517 amt_jtagaccel_speed(jtag_speed
);
519 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
520 aw_control_rst
&= ~0x8;
522 aw_control_rst
|= 0x8;
524 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
525 aw_control_rst
&= ~0x2;
527 aw_control_rst
|= 0x2;
529 amt_jtagaccel_reset(0, 0);
531 /* read status register */
533 LOG_DEBUG("AR_STATUS: 0x%2.2x", ar_status
);
538 int amt_jtagaccel_quit(void)
544 int amt_jtagaccel_handle_parport_port_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
549 /* only if the port wasn't overwritten by cmdline */
550 if (amt_jtagaccel_port
== 0)
551 amt_jtagaccel_port
= strtoul(args
[0], NULL
, 0);
556 int amt_jtagaccel_handle_rtck_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
560 command_print(cmd_ctx
, "amt_jtagaccel RTCK feature %s", (rtck_enabled
) ? "enabled" : "disabled");
565 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)