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 ***************************************************************************/
35 #if PARPORT_USE_PPDEV == 1
36 #include <linux/parport.h>
37 #include <linux/ppdev.h>
39 #include <sys/ioctl.h>
44 unsigned long amt_jtagaccel_port
;
46 /* interface variables
48 static u8 aw_control_rst
= 0x00;
49 static u8 aw_control_fsm
= 0x10;
50 static u8 aw_control_baudrate
= 0x20;
52 static int rtck_enabled
= 0;
54 #if PARPORT_USE_PPDEV == 1
55 static int device_handle
;
56 int addr_mode
= IEEE1284_MODE_EPP
| IEEE1284_ADDR
;
57 int data_mode
= IEEE1284_MODE_EPP
| IEEE1284_DATA
;
58 #define AMT_AW(val) do { ioctl(device_handle, PPSETMODE, &addr_mode); write(device_handle, &val, 1); } while (0)
59 #define AMT_AR(val) do { ioctl(device_handle, PPSETMODE, &addr_mode); read(device_handle, &val, 1); } while (0)
60 #define AMT_DW(val) do { ioctl(device_handle, PPSETMODE, &data_mode); write(device_handle, &val, 1); } while (0)
61 #define AMT_DR(val) do { ioctl(device_handle, PPSETMODE, &data_mode); read(device_handle, &val, 1); } while (0)
63 #define AMT_AW(val) do { outb(val, amt_jtagaccel_port + 3); } while (0)
64 #define AMT_AR(val) do { val = inb(amt_jtagaccel_port + 3); } while (0)
65 #define AMT_DW(val) do { outb(val, amt_jtagaccel_port + 4); } while (0)
66 #define AMT_DR(val) do { val = inb(amt_jtagaccel_port + 4); } while (0)
69 int amt_jtagaccel_execute_queue(void);
70 int amt_jtagaccel_register_commands(struct command_context_s
*cmd_ctx
);
71 int amt_jtagaccel_speed(int speed
);
72 int amt_jtagaccel_init(void);
73 int amt_jtagaccel_quit(void);
75 int amt_jtagaccel_handle_parport_port_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
76 int amt_jtagaccel_handle_rtck_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
78 /* tap_move[i][j]: tap movement command to go from state i to state j
86 u8 amt_jtagaccel_tap_move
[6][6][2] =
88 /* TLR RTI SD PD SI PI */
89 {{0x1f, 0x00}, {0x0f, 0x00}, {0x8a, 0x04}, {0x0a, 0x00}, {0x06, 0x00}, {0x96, 0x00}}, /* TLR */
90 {{0x1f, 0x00}, {0x00, 0x00}, {0x85, 0x08}, {0x05, 0x00}, {0x8b, 0x08}, {0x0b, 0x00}}, /* RTI */
91 {{0x1f, 0x00}, {0x0d, 0x00}, {0x00, 0x00}, {0x01, 0x00}, {0x8f, 0x09}, {0x8f, 0x01}}, /* SD */
92 {{0x1f, 0x00}, {0x0c, 0x00}, {0x08, 0x00}, {0x00, 0x00}, {0x8f, 0x09}, {0x8f, 0x01}}, /* PD */
93 {{0x1f, 0x00}, {0x0d, 0x00}, {0x07, 0x00}, {0x97, 0x00}, {0x00, 0x00}, {0x01, 0x00}}, /* SI */
94 {{0x1f, 0x00}, {0x0c, 0x00}, {0x07, 0x00}, {0x97, 0x00}, {0x08, 0x00}, {0x00, 0x00}}, /* PI */
97 jtag_interface_t amt_jtagaccel_interface
=
99 .name
= "amt_jtagaccel",
101 .execute_queue
= amt_jtagaccel_execute_queue
,
103 .support_statemove
= 0,
105 .speed
= amt_jtagaccel_speed
,
106 .register_commands
= amt_jtagaccel_register_commands
,
107 .init
= amt_jtagaccel_init
,
108 .quit
= amt_jtagaccel_quit
,
111 int amt_jtagaccel_register_commands(struct command_context_s
*cmd_ctx
)
113 register_command(cmd_ctx
, NULL
, "parport_port", amt_jtagaccel_handle_parport_port_command
,
114 COMMAND_CONFIG
, NULL
);
115 register_command(cmd_ctx
, NULL
, "rtck", amt_jtagaccel_handle_rtck_command
,
116 COMMAND_CONFIG
, NULL
);
121 void amt_jtagaccel_reset(int trst
, int srst
)
124 aw_control_rst
|= 0x4;
126 aw_control_rst
&= ~0x4;
129 aw_control_rst
|= 0x1;
131 aw_control_rst
&= ~0x1;
133 AMT_AW(aw_control_rst
);
136 int amt_jtagaccel_speed(int speed
)
138 aw_control_baudrate
&= 0xf0;
139 aw_control_baudrate
|= speed
& 0x0f;
140 AMT_AW(aw_control_baudrate
);
145 void amt_jtagaccel_end_state(state
)
147 if (tap_move_map
[state
] != -1)
151 ERROR("BUG: %i is not a valid end state", state
);
156 void amt_wait_scan_busy()
162 while (((ar_status
) & 0x80) && (timeout
-- > 0))
165 if (ar_status
& 0x80)
167 ERROR("amt_jtagaccel timed out while waiting for end of scan, rtck was %s", (rtck_enabled
) ? "enabled" : "disabled");
172 void amt_jtagaccel_state_move(void)
177 tms_scan
[0] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][0];
178 tms_scan
[1] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][1];
180 aw_scan_tms_5
= 0x40 | (tms_scan
[0] & 0x1f);
181 AMT_AW(aw_scan_tms_5
);
182 if (jtag_speed
> 3 || rtck_enabled
)
183 amt_wait_scan_busy();
185 if (tms_scan
[0] & 0x80)
187 aw_scan_tms_5
= 0x40 | (tms_scan
[1] & 0x1f);
188 AMT_AW(aw_scan_tms_5
);
189 if (jtag_speed
> 3 || rtck_enabled
)
190 amt_wait_scan_busy();
193 cur_state
= end_state
;
196 void amt_jtagaccel_runtest(int num_cycles
)
202 enum tap_state saved_end_state
= end_state
;
204 /* only do a state_move when we're not already in RTI */
205 if (cur_state
!= TAP_RTI
)
207 amt_jtagaccel_end_state(TAP_RTI
);
208 amt_jtagaccel_state_move();
211 while (num_cycles
- i
>= 5)
213 aw_scan_tms_5
= 0x40;
214 AMT_AW(aw_scan_tms_5
);
218 if (num_cycles
- i
> 0)
220 aw_scan_tms_1to4
= 0x80 | ((num_cycles
- i
- 1) & 0x3) << 4;
221 AMT_AW(aw_scan_tms_1to4
);
224 amt_jtagaccel_end_state(saved_end_state
);
225 if (cur_state
!= end_state
)
226 amt_jtagaccel_state_move();
229 void amt_jtagaccel_scan(int ir_scan
, enum scan_type type
, u8
*buffer
, int scan_size
)
231 int bits_left
= scan_size
;
233 enum tap_state saved_end_state
= end_state
;
241 amt_jtagaccel_end_state(TAP_SI
);
243 amt_jtagaccel_end_state(TAP_SD
);
245 amt_jtagaccel_state_move();
246 amt_jtagaccel_end_state(saved_end_state
);
248 /* handle unaligned bits at the beginning */
249 if ((scan_size
- 1) % 8)
251 aw_tdi_option
= 0x30 | (((scan_size
- 1) % 8) - 1);
252 AMT_AW(aw_tdi_option
);
254 dw_tdi_scan
= buf_get_u32(buffer
, bit_count
, (scan_size
- 1) % 8) & 0xff;
256 if (jtag_speed
> 3 || rtck_enabled
)
257 amt_wait_scan_busy();
259 if ((type
== SCAN_IN
) || (type
== SCAN_IO
))
262 dr_tdo
= dr_tdo
>> (8 - ((scan_size
- 1) % 8));
263 buf_set_u32(buffer
, bit_count
, (scan_size
- 1) % 8, dr_tdo
);
266 bit_count
+= (scan_size
- 1) % 8;
267 bits_left
-= (scan_size
- 1) % 8;
270 while (bits_left
- 1 >= 8)
272 dw_tdi_scan
= buf_get_u32(buffer
, bit_count
, 8) & 0xff;
274 if (jtag_speed
> 3 || rtck_enabled
)
275 amt_wait_scan_busy();
277 if ((type
== SCAN_IN
) || (type
== SCAN_IO
))
280 buf_set_u32(buffer
, bit_count
, 8, dr_tdo
);
287 tms_scan
[0] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][0];
288 tms_scan
[1] = amt_jtagaccel_tap_move
[tap_move_map
[cur_state
]][tap_move_map
[end_state
]][1];
289 aw_tms_scan
= 0x40 | (tms_scan
[0] & 0x1f) | (buf_get_u32(buffer
, bit_count
, 1) << 5);
291 if (jtag_speed
> 3 || rtck_enabled
)
292 amt_wait_scan_busy();
294 if ((type
== SCAN_IN
) || (type
== SCAN_IO
))
297 dr_tdo
= dr_tdo
>> 7;
298 buf_set_u32(buffer
, bit_count
, 1, dr_tdo
);
301 if (tms_scan
[0] & 0x80)
303 aw_tms_scan
= 0x40 | (tms_scan
[1] & 0x1f);
305 if (jtag_speed
> 3 || rtck_enabled
)
306 amt_wait_scan_busy();
308 cur_state
= end_state
;
311 int amt_jtagaccel_execute_queue(void)
313 jtag_command_t
*cmd
= jtag_command_queue
; /* currently processed command */
323 #ifdef _DEBUG_JTAG_IO_
324 DEBUG("end_state: %i", cmd
->cmd
.end_state
->end_state
);
326 if (cmd
->cmd
.end_state
->end_state
!= -1)
327 amt_jtagaccel_end_state(cmd
->cmd
.end_state
->end_state
);
330 #ifdef _DEBUG_JTAG_IO_
331 DEBUG("reset trst: %i srst %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
333 if (cmd
->cmd
.reset
->trst
== 1)
337 amt_jtagaccel_reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
340 #ifdef _DEBUG_JTAG_IO_
341 DEBUG("runtest %i cycles, end in %i", cmd
->cmd
.runtest
->num_cycles
, cmd
->cmd
.runtest
->end_state
);
343 if (cmd
->cmd
.runtest
->end_state
!= -1)
344 amt_jtagaccel_end_state(cmd
->cmd
.runtest
->end_state
);
345 amt_jtagaccel_runtest(cmd
->cmd
.runtest
->num_cycles
);
348 #ifdef _DEBUG_JTAG_IO_
349 DEBUG("statemove end in %i", cmd
->cmd
.statemove
->end_state
);
351 if (cmd
->cmd
.statemove
->end_state
!= -1)
352 amt_jtagaccel_end_state(cmd
->cmd
.statemove
->end_state
);
353 amt_jtagaccel_state_move();
356 #ifdef _DEBUG_JTAG_IO_
357 DEBUG("scan end in %i", cmd
->cmd
.scan
->end_state
);
359 if (cmd
->cmd
.scan
->end_state
!= -1)
360 amt_jtagaccel_end_state(cmd
->cmd
.scan
->end_state
);
361 scan_size
= jtag_build_buffer(cmd
->cmd
.scan
, &buffer
);
362 type
= jtag_scan_type(cmd
->cmd
.scan
);
363 amt_jtagaccel_scan(cmd
->cmd
.scan
->ir_scan
, type
, buffer
, scan_size
);
364 if (jtag_read_buffer(buffer
, cmd
->cmd
.scan
) != ERROR_OK
)
365 return ERROR_JTAG_QUEUE_FAILED
;
370 #ifdef _DEBUG_JTAG_IO_
371 DEBUG("sleep", cmd
->cmd
.sleep
->us
);
373 jtag_sleep(cmd
->cmd
.sleep
->us
);
376 ERROR("BUG: unknown JTAG command type encountered");
385 int amt_jtagaccel_init(void)
387 #if PARPORT_USE_PPDEV == 1
395 #if PARPORT_USE_PPDEV == 1
396 if (device_handle
> 0)
398 ERROR("device is already opened");
399 return ERROR_JTAG_INIT_FAILED
;
402 snprintf(buffer
, 256, "/dev/parport%d", amt_jtagaccel_port
);
403 device_handle
= open(buffer
, O_RDWR
);
405 if (device_handle
< 0)
407 ERROR("cannot open device. check it exists and that user read and write rights are set");
408 return ERROR_JTAG_INIT_FAILED
;
411 i
= ioctl(device_handle
, PPCLAIM
);
414 ERROR("cannot claim device");
415 return ERROR_JTAG_INIT_FAILED
;
418 i
= IEEE1284_MODE_EPP
;
419 i
= ioctl(device_handle
, PPSETMODE
, & i
);
422 ERROR(" cannot set compatible mode to device");
423 return ERROR_JTAG_INIT_FAILED
;
427 i
= ioctl(device_handle
, PPWCONTROL
, &control_port
);
430 i
= ioctl(device_handle
, PPWCONTROL
, &control_port
);
433 if (amt_jtagaccel_port
== 0)
435 amt_jtagaccel_port
= 0x378;
436 WARNING("No parport port specified, using default '0x378' (LPT1)");
439 if (ioperm(amt_jtagaccel_port
, 5, 1) != 0) {
440 ERROR("missing privileges for direct i/o");
441 return ERROR_JTAG_INIT_FAILED
;
444 /* prepare epp port */
446 status_port
= inb(amt_jtagaccel_port
+ 1);
447 outb(status_port
| 0x1, amt_jtagaccel_port
+ 1);
450 outb(0x00, amt_jtagaccel_port
+ 2);
451 outb(0x04, amt_jtagaccel_port
+ 2);
454 /* enable JTAG port */
455 aw_control_fsm
|= 0x04;
456 AMT_AW(aw_control_fsm
);
458 amt_jtagaccel_speed(jtag_speed
);
460 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
461 aw_control_rst
&= ~0x8;
463 aw_control_rst
|= 0x8;
465 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
466 aw_control_rst
&= ~0x2;
468 aw_control_rst
|= 0x2;
470 amt_jtagaccel_reset(0, 0);
475 int amt_jtagaccel_quit(void)
481 int amt_jtagaccel_handle_parport_port_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
486 /* only if the port wasn't overwritten by cmdline */
487 if (amt_jtagaccel_port
== 0)
488 amt_jtagaccel_port
= strtoul(args
[0], NULL
, 0);
493 int amt_jtagaccel_handle_rtck_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
497 command_print(cmd_ctx
, "amt_jtagaccel RTCK feature %s", (rtck_enabled
) ? "enabled" : "disabled");
502 if (strcmp(args
[0], "enabled") == 0)
506 /* set RTCK enable bit */
507 aw_control_fsm
|= 0x02;
508 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)