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"
42 #if PARPORT_USE_PPDEV == 1
43 #include <linux/parport.h>
44 #include <linux/ppdev.h>
46 #include <sys/ioctl.h>
50 #if PARPORT_USE_GIVEIO == 1
61 unsigned long amt_jtagaccel_port
;
63 /* interface variables
65 static u8 aw_control_rst
= 0x00;
66 static u8 aw_control_fsm
= 0x10;
67 static u8 aw_control_baudrate
= 0x20;
69 static int rtck_enabled
= 0;
71 #if PARPORT_USE_PPDEV == 1
72 static int device_handle
;
73 int addr_mode
= IEEE1284_MODE_EPP
| IEEE1284_ADDR
;
74 int data_mode
= IEEE1284_MODE_EPP
| IEEE1284_DATA
;
75 #define AMT_AW(val) do { ioctl(device_handle, PPSETMODE, &addr_mode); write(device_handle, &val, 1); } while (0)
76 #define AMT_AR(val) do { ioctl(device_handle, PPSETMODE, &addr_mode); read(device_handle, &val, 1); } while (0)
77 #define AMT_DW(val) do { ioctl(device_handle, PPSETMODE, &data_mode); write(device_handle, &val, 1); } while (0)
78 #define AMT_DR(val) do { ioctl(device_handle, PPSETMODE, &data_mode); read(device_handle, &val, 1); } while (0)
80 #define AMT_AW(val) do { outb(val, amt_jtagaccel_port + 3); } while (0)
81 #define AMT_AR(val) do { val = inb(amt_jtagaccel_port + 3); } while (0)
82 #define AMT_DW(val) do { outb(val, amt_jtagaccel_port + 4); } while (0)
83 #define AMT_DR(val) do { val = inb(amt_jtagaccel_port + 4); } while (0)
86 int amt_jtagaccel_execute_queue(void);
87 int amt_jtagaccel_register_commands(struct command_context_s
*cmd_ctx
);
88 int amt_jtagaccel_speed(int speed
);
89 int amt_jtagaccel_init(void);
90 int amt_jtagaccel_quit(void);
92 int amt_jtagaccel_handle_parport_port_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
93 int amt_jtagaccel_handle_rtck_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
95 /* tap_move[i][j]: tap movement command to go from state i to state j
103 u8 amt_jtagaccel_tap_move
[6][6][2] =
105 /* TLR RTI SD PD SI PI */
106 {{0x1f, 0x00}, {0x0f, 0x00}, {0x8a, 0x04}, {0x0a, 0x00}, {0x06, 0x00}, {0x96, 0x00}}, /* TLR */
107 {{0x1f, 0x00}, {0x00, 0x00}, {0x85, 0x08}, {0x05, 0x00}, {0x8b, 0x08}, {0x0b, 0x00}}, /* RTI */
108 {{0x1f, 0x00}, {0x0d, 0x00}, {0x00, 0x00}, {0x01, 0x00}, {0x8f, 0x09}, {0x8f, 0x01}}, /* SD */
109 {{0x1f, 0x00}, {0x0c, 0x00}, {0x08, 0x00}, {0x00, 0x00}, {0x8f, 0x09}, {0x8f, 0x01}}, /* PD */
110 {{0x1f, 0x00}, {0x0d, 0x00}, {0x07, 0x00}, {0x97, 0x00}, {0x00, 0x00}, {0x01, 0x00}}, /* SI */
111 {{0x1f, 0x00}, {0x0c, 0x00}, {0x07, 0x00}, {0x97, 0x00}, {0x08, 0x00}, {0x00, 0x00}}, /* PI */
114 jtag_interface_t amt_jtagaccel_interface
=
116 .name
= "amt_jtagaccel",
118 .execute_queue
= amt_jtagaccel_execute_queue
,
120 .support_pathmove
= 0,
122 .speed
= amt_jtagaccel_speed
,
123 .register_commands
= amt_jtagaccel_register_commands
,
124 .init
= amt_jtagaccel_init
,
125 .quit
= amt_jtagaccel_quit
,
128 int amt_jtagaccel_register_commands(struct command_context_s
*cmd_ctx
)
130 register_command(cmd_ctx
, NULL
, "parport_port", amt_jtagaccel_handle_parport_port_command
,
131 COMMAND_CONFIG
, NULL
);
132 register_command(cmd_ctx
, NULL
, "rtck", amt_jtagaccel_handle_rtck_command
,
133 COMMAND_CONFIG
, NULL
);
138 void amt_jtagaccel_reset(int trst
, int srst
)
141 aw_control_rst
|= 0x4;
143 aw_control_rst
&= ~0x4;
146 aw_control_rst
|= 0x1;
148 aw_control_rst
&= ~0x1;
150 AMT_AW(aw_control_rst
);
153 int amt_jtagaccel_speed(int speed
)
155 aw_control_baudrate
&= 0xf0;
156 aw_control_baudrate
|= speed
& 0x0f;
157 AMT_AW(aw_control_baudrate
);
162 void amt_jtagaccel_end_state(state
)
164 if (tap_move_map
[state
] != -1)
168 ERROR("BUG: %i is not a valid end state", state
);
173 void amt_wait_scan_busy()
179 while (((ar_status
) & 0x80) && (timeout
-- > 0))
182 if (ar_status
& 0x80)
184 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
);
189 void amt_jtagaccel_state_move(void)
194 tms_scan
[0] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][0];
195 tms_scan
[1] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][1];
197 aw_scan_tms_5
= 0x40 | (tms_scan
[0] & 0x1f);
198 AMT_AW(aw_scan_tms_5
);
199 if (jtag_speed
> 3 || rtck_enabled
)
200 amt_wait_scan_busy();
202 if (tms_scan
[0] & 0x80)
204 aw_scan_tms_5
= 0x40 | (tms_scan
[1] & 0x1f);
205 AMT_AW(aw_scan_tms_5
);
206 if (jtag_speed
> 3 || rtck_enabled
)
207 amt_wait_scan_busy();
210 cur_state
= end_state
;
213 void amt_jtagaccel_runtest(int num_cycles
)
219 enum tap_state saved_end_state
= end_state
;
221 /* only do a state_move when we're not already in RTI */
222 if (cur_state
!= TAP_RTI
)
224 amt_jtagaccel_end_state(TAP_RTI
);
225 amt_jtagaccel_state_move();
228 while (num_cycles
- i
>= 5)
230 aw_scan_tms_5
= 0x40;
231 AMT_AW(aw_scan_tms_5
);
235 if (num_cycles
- i
> 0)
237 aw_scan_tms_1to4
= 0x80 | ((num_cycles
- i
- 1) & 0x3) << 4;
238 AMT_AW(aw_scan_tms_1to4
);
241 amt_jtagaccel_end_state(saved_end_state
);
242 if (cur_state
!= end_state
)
243 amt_jtagaccel_state_move();
246 void amt_jtagaccel_scan(int ir_scan
, enum scan_type type
, u8
*buffer
, int scan_size
)
248 int bits_left
= scan_size
;
250 enum tap_state saved_end_state
= end_state
;
258 amt_jtagaccel_end_state(TAP_SI
);
260 amt_jtagaccel_end_state(TAP_SD
);
262 amt_jtagaccel_state_move();
263 amt_jtagaccel_end_state(saved_end_state
);
265 /* handle unaligned bits at the beginning */
266 if ((scan_size
- 1) % 8)
268 aw_tdi_option
= 0x30 | (((scan_size
- 1) % 8) - 1);
269 AMT_AW(aw_tdi_option
);
271 dw_tdi_scan
= buf_get_u32(buffer
, bit_count
, (scan_size
- 1) % 8) & 0xff;
273 if (jtag_speed
> 3 || rtck_enabled
)
274 amt_wait_scan_busy();
276 if ((type
== SCAN_IN
) || (type
== SCAN_IO
))
279 dr_tdo
= dr_tdo
>> (8 - ((scan_size
- 1) % 8));
280 buf_set_u32(buffer
, bit_count
, (scan_size
- 1) % 8, dr_tdo
);
283 bit_count
+= (scan_size
- 1) % 8;
284 bits_left
-= (scan_size
- 1) % 8;
287 while (bits_left
- 1 >= 8)
289 dw_tdi_scan
= buf_get_u32(buffer
, bit_count
, 8) & 0xff;
291 if (jtag_speed
> 3 || rtck_enabled
)
292 amt_wait_scan_busy();
294 if ((type
== SCAN_IN
) || (type
== SCAN_IO
))
297 buf_set_u32(buffer
, bit_count
, 8, dr_tdo
);
304 tms_scan
[0] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][0];
305 tms_scan
[1] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][1];
306 aw_tms_scan
= 0x40 | (tms_scan
[0] & 0x1f) | (buf_get_u32(buffer
, bit_count
, 1) << 5);
308 if (jtag_speed
> 3 || rtck_enabled
)
309 amt_wait_scan_busy();
311 if ((type
== SCAN_IN
) || (type
== SCAN_IO
))
314 dr_tdo
= dr_tdo
>> 7;
315 buf_set_u32(buffer
, bit_count
, 1, dr_tdo
);
318 if (tms_scan
[0] & 0x80)
320 aw_tms_scan
= 0x40 | (tms_scan
[1] & 0x1f);
322 if (jtag_speed
> 3 || rtck_enabled
)
323 amt_wait_scan_busy();
325 cur_state
= end_state
;
328 int amt_jtagaccel_execute_queue(void)
330 jtag_command_t
*cmd
= jtag_command_queue
; /* currently processed command */
336 /* return ERROR_OK, unless a jtag_read_buffer returns a failed check
337 * that wasn't handled by a caller-provided error handler
346 #ifdef _DEBUG_JTAG_IO_
347 DEBUG("end_state: %i", cmd
->cmd
.end_state
->end_state
);
349 if (cmd
->cmd
.end_state
->end_state
!= -1)
350 amt_jtagaccel_end_state(cmd
->cmd
.end_state
->end_state
);
353 #ifdef _DEBUG_JTAG_IO_
354 DEBUG("reset trst: %i srst %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
356 if (cmd
->cmd
.reset
->trst
== 1)
360 amt_jtagaccel_reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
363 #ifdef _DEBUG_JTAG_IO_
364 DEBUG("runtest %i cycles, end in %i", cmd
->cmd
.runtest
->num_cycles
, cmd
->cmd
.runtest
->end_state
);
366 if (cmd
->cmd
.runtest
->end_state
!= -1)
367 amt_jtagaccel_end_state(cmd
->cmd
.runtest
->end_state
);
368 amt_jtagaccel_runtest(cmd
->cmd
.runtest
->num_cycles
);
371 #ifdef _DEBUG_JTAG_IO_
372 DEBUG("statemove end in %i", cmd
->cmd
.statemove
->end_state
);
374 if (cmd
->cmd
.statemove
->end_state
!= -1)
375 amt_jtagaccel_end_state(cmd
->cmd
.statemove
->end_state
);
376 amt_jtagaccel_state_move();
379 #ifdef _DEBUG_JTAG_IO_
380 DEBUG("scan end in %i", cmd
->cmd
.scan
->end_state
);
382 if (cmd
->cmd
.scan
->end_state
!= -1)
383 amt_jtagaccel_end_state(cmd
->cmd
.scan
->end_state
);
384 scan_size
= jtag_build_buffer(cmd
->cmd
.scan
, &buffer
);
385 type
= jtag_scan_type(cmd
->cmd
.scan
);
386 amt_jtagaccel_scan(cmd
->cmd
.scan
->ir_scan
, type
, buffer
, scan_size
);
387 if (jtag_read_buffer(buffer
, cmd
->cmd
.scan
) != ERROR_OK
)
388 retval
= ERROR_JTAG_QUEUE_FAILED
;
393 #ifdef _DEBUG_JTAG_IO_
394 DEBUG("sleep %i", cmd
->cmd
.sleep
->us
);
396 jtag_sleep(cmd
->cmd
.sleep
->us
);
399 ERROR("BUG: unknown JTAG command type encountered");
408 #if PARPORT_USE_GIVEIO == 1
409 int amt_jtagaccel_get_giveio_access()
412 OSVERSIONINFO version
;
414 version
.dwOSVersionInfoSize
= sizeof version
;
415 if (!GetVersionEx( &version
)) {
419 if (version
.dwPlatformId
!= VER_PLATFORM_WIN32_NT
)
422 h
= CreateFile( "\\\\.\\giveio", GENERIC_READ
, 0, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
423 if (h
== INVALID_HANDLE_VALUE
) {
434 int amt_jtagaccel_init(void)
436 #if PARPORT_USE_PPDEV == 1
445 #if PARPORT_USE_PPDEV == 1
446 if (device_handle
> 0)
448 ERROR("device is already opened");
449 return ERROR_JTAG_INIT_FAILED
;
452 snprintf(buffer
, 256, "/dev/parport%d", amt_jtagaccel_port
);
453 device_handle
= open(buffer
, O_RDWR
);
455 if (device_handle
< 0)
457 ERROR("cannot open device. check it exists and that user read and write rights are set");
458 return ERROR_JTAG_INIT_FAILED
;
461 i
= ioctl(device_handle
, PPCLAIM
);
464 ERROR("cannot claim device");
465 return ERROR_JTAG_INIT_FAILED
;
468 i
= IEEE1284_MODE_EPP
;
469 i
= ioctl(device_handle
, PPSETMODE
, & i
);
472 ERROR(" cannot set compatible mode to device");
473 return ERROR_JTAG_INIT_FAILED
;
477 i
= ioctl(device_handle
, PPWCONTROL
, &control_port
);
480 i
= ioctl(device_handle
, PPWCONTROL
, &control_port
);
483 if (amt_jtagaccel_port
== 0)
485 amt_jtagaccel_port
= 0x378;
486 WARNING("No parport port specified, using default '0x378' (LPT1)");
489 #if PARPORT_USE_GIVEIO == 1
490 if (amt_jtagaccel_get_giveio_access() != 0) {
491 #else /* PARPORT_USE_GIVEIO */
492 if (ioperm(amt_jtagaccel_port
, 5, 1) != 0) {
493 #endif /* PARPORT_USE_GIVEIO */
494 ERROR("missing privileges for direct i/o");
495 return ERROR_JTAG_INIT_FAILED
;
498 /* prepare epp port */
500 status_port
= inb(amt_jtagaccel_port
+ 1);
501 outb(status_port
| 0x1, amt_jtagaccel_port
+ 1);
504 outb(0x00, amt_jtagaccel_port
+ 2);
505 outb(0x04, amt_jtagaccel_port
+ 2);
510 /* set RTCK enable bit */
511 aw_control_fsm
|= 0x02;
514 /* enable JTAG port */
515 aw_control_fsm
|= 0x04;
516 AMT_AW(aw_control_fsm
);
518 amt_jtagaccel_speed(jtag_speed
);
520 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
521 aw_control_rst
&= ~0x8;
523 aw_control_rst
|= 0x8;
525 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
526 aw_control_rst
&= ~0x2;
528 aw_control_rst
|= 0x2;
530 amt_jtagaccel_reset(0, 0);
532 /* read status register */
534 DEBUG("AR_STATUS: 0x%2.2x", ar_status
);
539 int amt_jtagaccel_quit(void)
545 int amt_jtagaccel_handle_parport_port_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
550 /* only if the port wasn't overwritten by cmdline */
551 if (amt_jtagaccel_port
== 0)
552 amt_jtagaccel_port
= strtoul(args
[0], NULL
, 0);
557 int amt_jtagaccel_handle_rtck_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
561 command_print(cmd_ctx
, "amt_jtagaccel RTCK feature %s", (rtck_enabled
) ? "enabled" : "disabled");
566 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)