1 /***************************************************************************
2 * Copyright (C) 2006 by Anders Larsen *
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 ***************************************************************************/
37 #define AT91C_BASE_SYS (0xfffff000)
45 #define PIO_PER (0) /* PIO enable */
46 #define PIO_OER (4) /* output enable */
47 #define PIO_ODR (5) /* output disable */
48 #define PIO_SODR (12) /* set output data */
49 #define PIO_CODR (13) /* clear output data */
50 #define PIO_PDSR (15) /* pin data status */
51 #define PIO_PPUER (25) /* pull-up enable */
53 #define NC (0) /* not connected */
90 int TDO_PIO
; /* PIO holding TDO */
91 u32 TDO_MASK
; /* TDO bitmask */
92 int TRST_PIO
; /* PIO holding TRST */
93 u32 TRST_MASK
; /* TRST bitmask */
94 int TMS_PIO
; /* PIO holding TMS */
95 u32 TMS_MASK
; /* TMS bitmask */
96 int TCK_PIO
; /* PIO holding TCK */
97 u32 TCK_MASK
; /* TCK bitmask */
98 int TDI_PIO
; /* PIO holding TDI */
99 u32 TDI_MASK
; /* TDI bitmask */
100 int SRST_PIO
; /* PIO holding SRST */
101 u32 SRST_MASK
; /* SRST bitmask */
104 struct device_t devices
[] =
106 { "rea_ecr", PIOD
, P27
, PIOA
, NC
, PIOD
, P23
, PIOD
, P24
, PIOD
, P26
, PIOC
, P5
},
111 char* at91rm9200_device
;
113 /* interface variables
115 static struct device_t
* device
;
116 static int dev_mem_fd
;
117 static void *sys_controller
;
118 static u32
* pio_base
;
120 /* low level command set
122 int at91rm9200_read(void);
123 void at91rm9200_write(int tck
, int tms
, int tdi
);
124 void at91rm9200_reset(int trst
, int srst
);
126 int at91rm9200_speed(int speed
);
127 int at91rm9200_register_commands(struct command_context_s
*cmd_ctx
);
128 int at91rm9200_init(void);
129 int at91rm9200_quit(void);
131 jtag_interface_t at91rm9200_interface
=
133 .name
= "at91rm9200",
135 .execute_queue
= bitbang_execute_queue
,
137 .support_pathmove
= 0,
139 .speed
= at91rm9200_speed
,
140 .register_commands
= at91rm9200_register_commands
,
141 .init
= at91rm9200_init
,
142 .quit
= at91rm9200_quit
,
145 bitbang_interface_t at91rm9200_bitbang
=
147 .read
= at91rm9200_read
,
148 .write
= at91rm9200_write
,
149 .reset
= at91rm9200_reset
,
153 int at91rm9200_read(void)
155 return (pio_base
[device
->TDO_PIO
+ PIO_PDSR
] & device
->TDO_MASK
) != 0;
158 void at91rm9200_write(int tck
, int tms
, int tdi
)
161 pio_base
[device
->TCK_PIO
+ PIO_SODR
] = device
->TCK_MASK
;
163 pio_base
[device
->TCK_PIO
+ PIO_CODR
] = device
->TCK_MASK
;
166 pio_base
[device
->TMS_PIO
+ PIO_SODR
] = device
->TMS_MASK
;
168 pio_base
[device
->TMS_PIO
+ PIO_CODR
] = device
->TMS_MASK
;
171 pio_base
[device
->TDI_PIO
+ PIO_SODR
] = device
->TDI_MASK
;
173 pio_base
[device
->TDI_PIO
+ PIO_CODR
] = device
->TDI_MASK
;
176 /* (1) assert or (0) deassert reset lines */
177 void at91rm9200_reset(int trst
, int srst
)
180 pio_base
[device
->TRST_PIO
+ PIO_SODR
] = device
->TRST_MASK
;
182 pio_base
[device
->TRST_PIO
+ PIO_CODR
] = device
->TRST_MASK
;
185 pio_base
[device
->SRST_PIO
+ PIO_SODR
] = device
->SRST_MASK
;
187 pio_base
[device
->SRST_PIO
+ PIO_CODR
] = device
->SRST_MASK
;
190 int at91rm9200_speed(int speed
)
196 int at91rm9200_handle_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
201 /* only if the device name wasn't overwritten by cmdline */
202 if (at91rm9200_device
== 0)
204 at91rm9200_device
= malloc(strlen(args
[0]) + sizeof(char));
205 strcpy(at91rm9200_device
, args
[0]);
211 int at91rm9200_register_commands(struct command_context_s
*cmd_ctx
)
213 register_command(cmd_ctx
, NULL
, "at91rm9200_device", at91rm9200_handle_device_command
,
214 COMMAND_CONFIG
, NULL
);
218 int at91rm9200_init(void)
220 struct device_t
*cur_device
;
222 cur_device
= devices
;
224 if (at91rm9200_device
== NULL
|| at91rm9200_device
[0] == 0)
226 at91rm9200_device
= "rea_ecr";
227 WARNING("No at91rm9200 device specified, using default 'rea_ecr'");
230 while (cur_device
->name
)
232 if (strcmp(cur_device
->name
, at91rm9200_device
) == 0)
242 ERROR("No matching device found for %s", at91rm9200_device
);
243 return ERROR_JTAG_INIT_FAILED
;
246 bitbang_interface
= &at91rm9200_bitbang
;
248 dev_mem_fd
= open("/dev/mem", O_RDWR
| O_SYNC
);
249 if (dev_mem_fd
< 0) {
251 return ERROR_JTAG_INIT_FAILED
;
254 sys_controller
= mmap(NULL
, 4096, PROT_READ
| PROT_WRITE
,
255 MAP_SHARED
, dev_mem_fd
, AT91C_BASE_SYS
);
256 if (sys_controller
== MAP_FAILED
) {
259 return ERROR_JTAG_INIT_FAILED
;
261 pio_base
= (u32
*)sys_controller
+ 0x100;
264 * Configure TDO as an input, and TDI, TCK, TMS, TRST, SRST
265 * as outputs. Drive TDI and TCK low, and TMS/TRST/SRST high.
267 pio_base
[device
->TDI_PIO
+ PIO_CODR
] = device
->TDI_MASK
;
268 pio_base
[device
->TDI_PIO
+ PIO_OER
] = device
->TDI_MASK
;
269 pio_base
[device
->TDI_PIO
+ PIO_PER
] = device
->TDI_MASK
;
270 pio_base
[device
->TCK_PIO
+ PIO_CODR
] = device
->TCK_MASK
;
271 pio_base
[device
->TCK_PIO
+ PIO_OER
] = device
->TCK_MASK
;
272 pio_base
[device
->TCK_PIO
+ PIO_PER
] = device
->TCK_MASK
;
273 pio_base
[device
->TMS_PIO
+ PIO_SODR
] = device
->TMS_MASK
;
274 pio_base
[device
->TMS_PIO
+ PIO_OER
] = device
->TMS_MASK
;
275 pio_base
[device
->TMS_PIO
+ PIO_PER
] = device
->TMS_MASK
;
276 pio_base
[device
->TRST_PIO
+ PIO_SODR
] = device
->TRST_MASK
;
277 pio_base
[device
->TRST_PIO
+ PIO_OER
] = device
->TRST_MASK
;
278 pio_base
[device
->TRST_PIO
+ PIO_PER
] = device
->TRST_MASK
;
279 pio_base
[device
->SRST_PIO
+ PIO_SODR
] = device
->SRST_MASK
;
280 pio_base
[device
->SRST_PIO
+ PIO_OER
] = device
->SRST_MASK
;
281 pio_base
[device
->SRST_PIO
+ PIO_PER
] = device
->SRST_MASK
;
282 pio_base
[device
->TDO_PIO
+ PIO_ODR
] = device
->TDO_MASK
;
283 pio_base
[device
->TDO_PIO
+ PIO_PPUER
] = device
->TDO_MASK
;
284 pio_base
[device
->TDO_PIO
+ PIO_PER
] = device
->TDO_MASK
;
289 int at91rm9200_quit(void)
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)