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"
33 #include <sys/types.h>
34 #include <machine/sysarch.h>
35 #include <machine/cpufunc.h>
36 #define ioperm(startport,length,enable)\
37 i386_set_ioperm((startport), (length), (enable))
45 #endif /* __FreeBSD__ */
51 #if PARPORT_USE_PPDEV == 1
53 #include <dev/ppbus/ppi.h>
54 #include <dev/ppbus/ppbconf.h>
55 #define PPRSTATUS PPIGSTATUS
56 #define PPWDATA PPISDATA
58 #include <linux/parport.h>
59 #include <linux/ppdev.h>
62 #include <sys/ioctl.h>
63 #else /* not PARPORT_USE_PPDEV */
69 #if PARPORT_USE_GIVEIO == 1
79 /* parallel port cable description
81 typedef struct cable_s
84 u8 TDO_MASK
; /* status port bit containing current TDO value */
85 u8 TRST_MASK
; /* data port bit for TRST */
86 u8 TMS_MASK
; /* data port bit for TMS */
87 u8 TCK_MASK
; /* data port bit for TCK */
88 u8 TDI_MASK
; /* data port bit for TDI */
89 u8 SRST_MASK
; /* data port bit for SRST */
90 u8 OUTPUT_INVERT
; /* data port bits that should be inverted */
91 u8 INPUT_INVERT
; /* status port that should be inverted */
92 u8 PORT_INIT
; /* initialize data port with this value */
97 /* name tdo trst tms tck tdi srst o_inv i_inv init */
98 { "wiggler", 0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x01, 0x80, 0x80 },
99 { "wiggler_ntrst_inverted", 0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x11, 0x80, 0x80 },
100 { "old_amt_wiggler", 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x11, 0x80, 0x80 },
101 { "chameleon", 0x80, 0x00, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00 },
102 { "dlc5", 0x10, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x10 },
103 { "triton", 0x80, 0x08, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00 },
104 { "lattice", 0x40, 0x10, 0x04, 0x02, 0x01, 0x08, 0x00, 0x00, 0x18 },
105 { "flashlink", 0x20, 0x10, 0x02, 0x01, 0x04, 0x20, 0x30, 0x20, 0x00 },
106 { NULL
, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
111 unsigned long parport_port
;
113 /* interface variables
115 static cable_t
* cable
;
116 static u8 dataport_value
= 0x0;
118 #if PARPORT_USE_PPDEV == 1
119 static int device_handle
;
121 static unsigned long dataport
;
122 static unsigned long statusport
;
125 /* low level command set
127 int parport_read(void);
128 void parport_write(int tck
, int tms
, int tdi
);
129 void parport_reset(int trst
, int srst
);
131 int parport_speed(int speed
);
132 int parport_register_commands(struct command_context_s
*cmd_ctx
);
133 int parport_init(void);
134 int parport_quit(void);
136 /* interface commands */
137 int parport_handle_parport_port_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
138 int parport_handle_parport_cable_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
140 jtag_interface_t parport_interface
=
144 .execute_queue
= bitbang_execute_queue
,
146 .support_pathmove
= 1,
148 .speed
= parport_speed
,
149 .register_commands
= parport_register_commands
,
150 .init
= parport_init
,
151 .quit
= parport_quit
,
154 bitbang_interface_t parport_bitbang
=
156 .read
= parport_read
,
157 .write
= parport_write
,
158 .reset
= parport_reset
161 int parport_read(void)
165 #if PARPORT_USE_PPDEV == 1
166 ioctl(device_handle
, PPRSTATUS
, & data
);
168 data
= inb(statusport
);
171 if ((data
^ cable
->INPUT_INVERT
) & cable
->TDO_MASK
)
177 void parport_write(int tck
, int tms
, int tdi
)
180 int i
= jtag_speed
+ 1;
183 dataport_value
|= cable
->TCK_MASK
;
185 dataport_value
&= ~cable
->TCK_MASK
;
188 dataport_value
|= cable
->TMS_MASK
;
190 dataport_value
&= ~cable
->TMS_MASK
;
193 dataport_value
|= cable
->TDI_MASK
;
195 dataport_value
&= ~cable
->TDI_MASK
;
197 output
= dataport_value
^ cable
->OUTPUT_INVERT
;
200 #if PARPORT_USE_PPDEV == 1
201 ioctl(device_handle
, PPWDATA
, &output
);
204 outb(dataport
, output
);
206 outb(output
, dataport
);
211 /* (1) assert or (0) deassert reset lines */
212 void parport_reset(int trst
, int srst
)
215 DEBUG("trst: %i, srst: %i", trst
, srst
);
218 dataport_value
|= cable
->TRST_MASK
;
220 dataport_value
&= ~cable
->TRST_MASK
;
223 dataport_value
|= cable
->SRST_MASK
;
225 dataport_value
&= ~cable
->SRST_MASK
;
227 output
= dataport_value
^ cable
->OUTPUT_INVERT
;
229 #if PARPORT_USE_PPDEV == 1
230 ioctl(device_handle
, PPWDATA
, &output
);
233 outb(dataport
, output
);
235 outb(output
, dataport
);
241 int parport_speed(int speed
)
248 int parport_register_commands(struct command_context_s
*cmd_ctx
)
250 register_command(cmd_ctx
, NULL
, "parport_port", parport_handle_parport_port_command
,
251 COMMAND_CONFIG
, NULL
);
252 register_command(cmd_ctx
, NULL
, "parport_cable", parport_handle_parport_cable_command
,
253 COMMAND_CONFIG
, NULL
);
258 #if PARPORT_USE_GIVEIO == 1
259 int parport_get_giveio_access()
262 OSVERSIONINFO version
;
264 version
.dwOSVersionInfoSize
= sizeof version
;
265 if (!GetVersionEx( &version
)) {
269 if (version
.dwPlatformId
!= VER_PLATFORM_WIN32_NT
)
272 h
= CreateFile( "\\\\.\\giveio", GENERIC_READ
, 0, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
273 if (h
== INVALID_HANDLE_VALUE
) {
284 int parport_init(void)
287 #if PARPORT_USE_PPDEV == 1
294 if ((parport_cable
== NULL
) || (parport_cable
[0] == 0))
296 parport_cable
= "wiggler";
297 WARNING("No parport cable specified, using default 'wiggler'");
300 while (cur_cable
->name
)
302 if (strcmp(cur_cable
->name
, parport_cable
) == 0)
312 ERROR("No matching cable found for %s", parport_cable
);
313 return ERROR_JTAG_INIT_FAILED
;
316 dataport_value
= cable
->PORT_INIT
;
318 #if PARPORT_USE_PPDEV == 1
319 if (device_handle
> 0)
321 ERROR("device is already opened");
322 return ERROR_JTAG_INIT_FAILED
;
326 DEBUG("opening /dev/ppi%d...", parport_port
);
328 snprintf(buffer
, 256, "/dev/ppi%d", parport_port
);
329 device_handle
= open(buffer
, O_WRONLY
);
330 #else /* not __Free_BSD */
331 DEBUG("opening /dev/parport%d...", parport_port
);
333 snprintf(buffer
, 256, "/dev/parport%d", parport_port
);
334 device_handle
= open(buffer
, O_WRONLY
);
335 #endif /* __FreeBSD__ */
337 if (device_handle
< 0)
339 ERROR("cannot open device. check it exists and that user read and write rights are set");
340 return ERROR_JTAG_INIT_FAILED
;
346 i
=ioctl(device_handle
, PPCLAIM
);
349 ERROR("cannot claim device");
350 return ERROR_JTAG_INIT_FAILED
;
353 i
= PARPORT_MODE_COMPAT
;
354 i
= ioctl(device_handle
, PPSETMODE
, & i
);
357 ERROR(" cannot set compatible mode to device");
358 return ERROR_JTAG_INIT_FAILED
;
361 i
= IEEE1284_MODE_COMPAT
;
362 i
= ioctl(device_handle
, PPNEGOT
, & i
);
365 ERROR("cannot set compatible 1284 mode to device");
366 return ERROR_JTAG_INIT_FAILED
;
368 #endif /* not __Free_BSD__ */
370 #else /* not PARPORT_USE_PPDEV */
371 if (parport_port
== 0)
373 parport_port
= 0x378;
374 WARNING("No parport port specified, using default '0x378' (LPT1)");
377 dataport
= parport_port
;
378 statusport
= parport_port
+ 1;
380 DEBUG("requesting privileges for parallel port 0x%lx...", dataport
);
381 #if PARPORT_USE_GIVEIO == 1
382 if (parport_get_giveio_access() != 0)
383 #else /* PARPORT_USE_GIVEIO */
384 if (ioperm(dataport
, 3, 1) != 0)
385 #endif /* PARPORT_USE_GIVEIO */
387 ERROR("missing privileges for direct i/o");
388 return ERROR_JTAG_INIT_FAILED
;
390 DEBUG("...privileges granted");
392 /* make sure parallel port is in right mode (clear tristate and interrupt */
394 outb(parport_port
+ 2, 0x0);
396 outb(0x0, parport_port
+ 2);
399 #endif /* PARPORT_USE_PPDEV */
402 parport_write(0, 0, 0);
404 bitbang_interface
= &parport_bitbang
;
409 int parport_quit(void)
415 int parport_handle_parport_port_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
420 /* only if the port wasn't overwritten by cmdline */
421 if (parport_port
== 0)
422 parport_port
= strtoul(args
[0], NULL
, 0);
427 int parport_handle_parport_cable_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
432 /* only if the cable name wasn't overwritten by cmdline */
433 if (parport_cable
== 0)
435 parport_cable
= malloc(strlen(args
[0]) + sizeof(char));
436 strcpy(parport_cable
, args
[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)