1 // SPDX-License-Identifier: GPL-2.0-or-later
3 /***************************************************************************
4 * Copyright (C) 2006 by Anders Larsen *
6 ***************************************************************************/
12 #include <jtag/interface.h>
18 #define AT91C_BASE_SYS (0xfffff000)
26 #define PIO_PER (0) /* PIO enable */
27 #define PIO_OER (4) /* output enable */
28 #define PIO_ODR (5) /* output disable */
29 #define PIO_SODR (12) /* set output data */
30 #define PIO_CODR (13) /* clear output data */
31 #define PIO_PDSR (15) /* pin data status */
32 #define PIO_PPUER (25) /* pull-up enable */
34 #define NC (0) /* not connected */
70 int TDO_PIO
; /* PIO holding TDO */
71 uint32_t TDO_MASK
; /* TDO bitmask */
72 int TRST_PIO
; /* PIO holding TRST */
73 uint32_t TRST_MASK
; /* TRST bitmask */
74 int TMS_PIO
; /* PIO holding TMS */
75 uint32_t TMS_MASK
; /* TMS bitmask */
76 int TCK_PIO
; /* PIO holding TCK */
77 uint32_t TCK_MASK
; /* TCK bitmask */
78 int TDI_PIO
; /* PIO holding TDI */
79 uint32_t TDI_MASK
; /* TDI bitmask */
80 int SRST_PIO
; /* PIO holding SRST */
81 uint32_t SRST_MASK
; /* SRST bitmask */
84 static const struct device_t devices
[] = {
85 { "rea_ecr", PIOD
, P27
, PIOA
, NC
, PIOD
, P23
, PIOD
, P24
, PIOD
, P26
, PIOC
, P5
},
90 static char *at91rm9200_device
;
92 /* interface variables
94 static const struct device_t
*device
;
95 static int dev_mem_fd
;
96 static void *sys_controller
;
97 static uint32_t *pio_base
;
99 /* low level command set
101 static bb_value_t
at91rm9200_read(void);
102 static int at91rm9200_write(int tck
, int tms
, int tdi
);
104 static int at91rm9200_init(void);
105 static int at91rm9200_quit(void);
107 static struct bitbang_interface at91rm9200_bitbang
= {
108 .read
= at91rm9200_read
,
109 .write
= at91rm9200_write
,
113 static bb_value_t
at91rm9200_read(void)
115 return (pio_base
[device
->TDO_PIO
+ PIO_PDSR
] & device
->TDO_MASK
) ? BB_HIGH
: BB_LOW
;
118 static int at91rm9200_write(int tck
, int tms
, int tdi
)
121 pio_base
[device
->TCK_PIO
+ PIO_SODR
] = device
->TCK_MASK
;
123 pio_base
[device
->TCK_PIO
+ PIO_CODR
] = device
->TCK_MASK
;
126 pio_base
[device
->TMS_PIO
+ PIO_SODR
] = device
->TMS_MASK
;
128 pio_base
[device
->TMS_PIO
+ PIO_CODR
] = device
->TMS_MASK
;
131 pio_base
[device
->TDI_PIO
+ PIO_SODR
] = device
->TDI_MASK
;
133 pio_base
[device
->TDI_PIO
+ PIO_CODR
] = device
->TDI_MASK
;
138 /* (1) assert or (0) deassert reset lines */
139 static int at91rm9200_reset(int trst
, int srst
)
142 pio_base
[device
->TRST_PIO
+ PIO_SODR
] = device
->TRST_MASK
;
144 pio_base
[device
->TRST_PIO
+ PIO_CODR
] = device
->TRST_MASK
;
147 pio_base
[device
->SRST_PIO
+ PIO_SODR
] = device
->SRST_MASK
;
149 pio_base
[device
->SRST_PIO
+ PIO_CODR
] = device
->SRST_MASK
;
154 COMMAND_HANDLER(at91rm9200_handle_device_command
)
157 return ERROR_COMMAND_SYNTAX_ERROR
;
159 /* only if the device name wasn't overwritten by cmdline */
160 if (!at91rm9200_device
) {
161 at91rm9200_device
= malloc(strlen(CMD_ARGV
[0]) + sizeof(char));
162 if (!at91rm9200_device
) {
163 LOG_ERROR("Out of memory");
166 strcpy(at91rm9200_device
, CMD_ARGV
[0]);
172 static const struct command_registration at91rm9200_command_handlers
[] = {
174 .name
= "at91rm9200_device",
175 .handler
= &at91rm9200_handle_device_command
,
176 .mode
= COMMAND_CONFIG
,
177 .help
= "Set at91rm9200 device [default \"rea_ecr\"]",
180 COMMAND_REGISTRATION_DONE
183 static struct jtag_interface at91rm9200_interface
= {
184 .execute_queue
= bitbang_execute_queue
,
187 struct adapter_driver at91rm9200_adapter_driver
= {
188 .name
= "at91rm9200",
189 .transports
= jtag_only
,
190 .commands
= at91rm9200_command_handlers
,
192 .init
= at91rm9200_init
,
193 .quit
= at91rm9200_quit
,
194 .reset
= at91rm9200_reset
,
196 .jtag_ops
= &at91rm9200_interface
,
199 static int at91rm9200_init(void)
201 const struct device_t
*cur_device
;
203 cur_device
= devices
;
205 if (!at91rm9200_device
|| at91rm9200_device
[0] == 0) {
206 at91rm9200_device
= "rea_ecr";
207 LOG_WARNING("No at91rm9200 device specified, using default 'rea_ecr'");
210 while (cur_device
->name
) {
211 if (strcmp(cur_device
->name
, at91rm9200_device
) == 0) {
219 LOG_ERROR("No matching device found for %s", at91rm9200_device
);
220 return ERROR_JTAG_INIT_FAILED
;
223 bitbang_interface
= &at91rm9200_bitbang
;
225 dev_mem_fd
= open("/dev/mem", O_RDWR
| O_SYNC
);
226 if (dev_mem_fd
< 0) {
227 LOG_ERROR("open: %s", strerror(errno
));
228 return ERROR_JTAG_INIT_FAILED
;
231 sys_controller
= mmap(NULL
, 4096, PROT_READ
| PROT_WRITE
,
232 MAP_SHARED
, dev_mem_fd
, AT91C_BASE_SYS
);
233 if (sys_controller
== MAP_FAILED
) {
234 LOG_ERROR("mmap: %s", strerror(errno
));
236 return ERROR_JTAG_INIT_FAILED
;
238 pio_base
= (uint32_t *)sys_controller
+ 0x100;
241 * Configure TDO as an input, and TDI, TCK, TMS, TRST, SRST
242 * as outputs. Drive TDI and TCK low, and TMS/TRST/SRST high.
244 pio_base
[device
->TDI_PIO
+ PIO_CODR
] = device
->TDI_MASK
;
245 pio_base
[device
->TDI_PIO
+ PIO_OER
] = device
->TDI_MASK
;
246 pio_base
[device
->TDI_PIO
+ PIO_PER
] = device
->TDI_MASK
;
247 pio_base
[device
->TCK_PIO
+ PIO_CODR
] = device
->TCK_MASK
;
248 pio_base
[device
->TCK_PIO
+ PIO_OER
] = device
->TCK_MASK
;
249 pio_base
[device
->TCK_PIO
+ PIO_PER
] = device
->TCK_MASK
;
250 pio_base
[device
->TMS_PIO
+ PIO_SODR
] = device
->TMS_MASK
;
251 pio_base
[device
->TMS_PIO
+ PIO_OER
] = device
->TMS_MASK
;
252 pio_base
[device
->TMS_PIO
+ PIO_PER
] = device
->TMS_MASK
;
253 pio_base
[device
->TRST_PIO
+ PIO_SODR
] = device
->TRST_MASK
;
254 pio_base
[device
->TRST_PIO
+ PIO_OER
] = device
->TRST_MASK
;
255 pio_base
[device
->TRST_PIO
+ PIO_PER
] = device
->TRST_MASK
;
256 pio_base
[device
->SRST_PIO
+ PIO_SODR
] = device
->SRST_MASK
;
257 pio_base
[device
->SRST_PIO
+ PIO_OER
] = device
->SRST_MASK
;
258 pio_base
[device
->SRST_PIO
+ PIO_PER
] = device
->SRST_MASK
;
259 pio_base
[device
->TDO_PIO
+ PIO_ODR
] = device
->TDO_MASK
;
260 pio_base
[device
->TDO_PIO
+ PIO_PPUER
] = device
->TDO_MASK
;
261 pio_base
[device
->TDO_PIO
+ PIO_PER
] = device
->TDO_MASK
;
266 static 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)