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_statemove
= 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", (rtck_enabled
) ? "enabled" : "disabled");
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 */
340 #ifdef _DEBUG_JTAG_IO_
341 DEBUG("end_state: %i", cmd
->cmd
.end_state
->end_state
);
343 if (cmd
->cmd
.end_state
->end_state
!= -1)
344 amt_jtagaccel_end_state(cmd
->cmd
.end_state
->end_state
);
347 #ifdef _DEBUG_JTAG_IO_
348 DEBUG("reset trst: %i srst %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
350 if (cmd
->cmd
.reset
->trst
== 1)
354 amt_jtagaccel_reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
357 #ifdef _DEBUG_JTAG_IO_
358 DEBUG("runtest %i cycles, end in %i", cmd
->cmd
.runtest
->num_cycles
, cmd
->cmd
.runtest
->end_state
);
360 if (cmd
->cmd
.runtest
->end_state
!= -1)
361 amt_jtagaccel_end_state(cmd
->cmd
.runtest
->end_state
);
362 amt_jtagaccel_runtest(cmd
->cmd
.runtest
->num_cycles
);
365 #ifdef _DEBUG_JTAG_IO_
366 DEBUG("statemove end in %i", cmd
->cmd
.statemove
->end_state
);
368 if (cmd
->cmd
.statemove
->end_state
!= -1)
369 amt_jtagaccel_end_state(cmd
->cmd
.statemove
->end_state
);
370 amt_jtagaccel_state_move();
373 #ifdef _DEBUG_JTAG_IO_
374 DEBUG("scan end in %i", cmd
->cmd
.scan
->end_state
);
376 if (cmd
->cmd
.scan
->end_state
!= -1)
377 amt_jtagaccel_end_state(cmd
->cmd
.scan
->end_state
);
378 scan_size
= jtag_build_buffer(cmd
->cmd
.scan
, &buffer
);
379 type
= jtag_scan_type(cmd
->cmd
.scan
);
380 amt_jtagaccel_scan(cmd
->cmd
.scan
->ir_scan
, type
, buffer
, scan_size
);
381 if (jtag_read_buffer(buffer
, cmd
->cmd
.scan
) != ERROR_OK
)
382 return ERROR_JTAG_QUEUE_FAILED
;
387 #ifdef _DEBUG_JTAG_IO_
388 DEBUG("sleep", cmd
->cmd
.sleep
->us
);
390 jtag_sleep(cmd
->cmd
.sleep
->us
);
393 ERROR("BUG: unknown JTAG command type encountered");
402 #if PARPORT_USE_GIVEIO == 1
403 int amt_jtagaccel_get_giveio_access()
406 OSVERSIONINFO version
;
408 version
.dwOSVersionInfoSize
= sizeof version
;
409 if (!GetVersionEx( &version
)) {
413 if (version
.dwPlatformId
!= VER_PLATFORM_WIN32_NT
)
416 h
= CreateFile( "\\\\.\\giveio", GENERIC_READ
, 0, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
417 if (h
== INVALID_HANDLE_VALUE
) {
428 int amt_jtagaccel_init(void)
430 #if PARPORT_USE_PPDEV == 1
438 #if PARPORT_USE_PPDEV == 1
439 if (device_handle
> 0)
441 ERROR("device is already opened");
442 return ERROR_JTAG_INIT_FAILED
;
445 snprintf(buffer
, 256, "/dev/parport%d", amt_jtagaccel_port
);
446 device_handle
= open(buffer
, O_RDWR
);
448 if (device_handle
< 0)
450 ERROR("cannot open device. check it exists and that user read and write rights are set");
451 return ERROR_JTAG_INIT_FAILED
;
454 i
= ioctl(device_handle
, PPCLAIM
);
457 ERROR("cannot claim device");
458 return ERROR_JTAG_INIT_FAILED
;
461 i
= IEEE1284_MODE_EPP
;
462 i
= ioctl(device_handle
, PPSETMODE
, & i
);
465 ERROR(" cannot set compatible mode to device");
466 return ERROR_JTAG_INIT_FAILED
;
470 i
= ioctl(device_handle
, PPWCONTROL
, &control_port
);
473 i
= ioctl(device_handle
, PPWCONTROL
, &control_port
);
476 if (amt_jtagaccel_port
== 0)
478 amt_jtagaccel_port
= 0x378;
479 WARNING("No parport port specified, using default '0x378' (LPT1)");
482 #if PARPORT_USE_GIVEIO == 1
483 if (amt_jtagaccel_get_giveio_access() != 0) {
484 #else /* PARPORT_USE_GIVEIO */
485 if (ioperm(amt_jtagaccel_port
, 5, 1) != 0) {
486 #endif /* PARPORT_USE_GIVEIO */
487 ERROR("missing privileges for direct i/o");
488 return ERROR_JTAG_INIT_FAILED
;
491 /* prepare epp port */
493 status_port
= inb(amt_jtagaccel_port
+ 1);
494 outb(status_port
| 0x1, amt_jtagaccel_port
+ 1);
497 outb(0x00, amt_jtagaccel_port
+ 2);
498 outb(0x04, amt_jtagaccel_port
+ 2);
501 /* enable JTAG port */
502 aw_control_fsm
|= 0x04;
503 AMT_AW(aw_control_fsm
);
505 amt_jtagaccel_speed(jtag_speed
);
507 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
508 aw_control_rst
&= ~0x8;
510 aw_control_rst
|= 0x8;
512 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
513 aw_control_rst
&= ~0x2;
515 aw_control_rst
|= 0x2;
517 amt_jtagaccel_reset(0, 0);
522 int amt_jtagaccel_quit(void)
528 int amt_jtagaccel_handle_parport_port_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
533 /* only if the port wasn't overwritten by cmdline */
534 if (amt_jtagaccel_port
== 0)
535 amt_jtagaccel_port
= strtoul(args
[0], NULL
, 0);
540 int amt_jtagaccel_handle_rtck_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
544 command_print(cmd_ctx
, "amt_jtagaccel RTCK feature %s", (rtck_enabled
) ? "enabled" : "disabled");
549 if (strcmp(args
[0], "enabled") == 0)
553 /* set RTCK enable bit */
554 aw_control_fsm
|= 0x02;
555 AMT_AW(aw_control_fsm
);
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)