1 // SPDX-License-Identifier: GPL-2.0-or-later
3 /***************************************************************************
4 * Copyright (C) 2009 by Simon Qian *
5 * SimonQian@SimonQian.com *
6 ***************************************************************************/
13 #include <target/avrt.h>
15 /* AVR_JTAG_Instructions */
16 #define AVR_JTAG_INS_LEN 4
17 /* Public Instructions: */
18 #define AVR_JTAG_INS_EXTEST 0x00
19 #define AVR_JTAG_INS_IDCODE 0x01
20 #define AVR_JTAG_INS_SAMPLE_PRELOAD 0x02
21 #define AVR_JTAG_INS_BYPASS 0x0F
22 /* AVR Specified Public Instructions: */
23 #define AVR_JTAG_INS_AVR_RESET 0x0C
24 #define AVR_JTAG_INS_PROG_ENABLE 0x04
25 #define AVR_JTAG_INS_PROG_COMMANDS 0x05
26 #define AVR_JTAG_INS_PROG_PAGELOAD 0x06
27 #define AVR_JTAG_INS_PROG_PAGEREAD 0x07
30 #define AVR_JTAG_REG_BYPASS_LEN 1
31 #define AVR_JTAG_REG_DEVICEID_LEN 32
33 #define AVR_JTAG_REG_RESET_LEN 1
34 #define AVR_JTAG_REG_JTAGID_LEN 32
35 #define AVR_JTAG_REG_PROGRAMMING_ENABLE_LEN 16
36 #define AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN 15
37 #define AVR_JTAG_REG_FLASH_DATA_BYTE_LEN 16
48 struct avrf_flash_bank
{
53 static const struct avrf_type avft_chips_info
[] = {
54 /* name, chip_id, flash_page_size, flash_page_num,
55 * eeprom_page_size, eeprom_page_num
57 {"atmega128", 0x9702, 256, 512, 8, 512},
58 {"atmega128rfa1", 0xa701, 128, 512, 8, 512},
59 {"atmega256rfr2", 0xa802, 256, 1024, 8, 1024},
60 {"at90can128", 0x9781, 256, 512, 8, 512},
61 {"at90usb128", 0x9782, 256, 512, 8, 512},
62 {"atmega164p", 0x940a, 128, 128, 4, 128},
63 {"atmega324p", 0x9508, 128, 256, 4, 256},
64 {"atmega324pa", 0x9511, 128, 256, 4, 256},
65 {"atmega644p", 0x960a, 256, 256, 8, 256},
66 {"atmega1284p", 0x9705, 256, 512, 8, 512},
67 {"atmega32u4", 0x9587, 128, 256, 4, 256},
70 /* avr program functions */
71 static int avr_jtag_reset(struct avr_common
*avr
, uint32_t reset
)
73 avr_jtag_sendinstr(avr
->jtag_info
.tap
, NULL
, AVR_JTAG_INS_AVR_RESET
);
74 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, reset
, AVR_JTAG_REG_RESET_LEN
);
79 static int avr_jtag_read_jtagid(struct avr_common
*avr
, uint32_t *id
)
81 avr_jtag_sendinstr(avr
->jtag_info
.tap
, NULL
, AVR_JTAG_INS_IDCODE
);
82 avr_jtag_senddat(avr
->jtag_info
.tap
, id
, 0, AVR_JTAG_REG_JTAGID_LEN
);
87 static int avr_jtagprg_enterprogmode(struct avr_common
*avr
)
89 avr_jtag_reset(avr
, 1);
91 avr_jtag_sendinstr(avr
->jtag_info
.tap
, NULL
, AVR_JTAG_INS_PROG_ENABLE
);
92 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0xA370, AVR_JTAG_REG_PROGRAMMING_ENABLE_LEN
);
97 static int avr_jtagprg_leaveprogmode(struct avr_common
*avr
)
99 avr_jtag_sendinstr(avr
->jtag_info
.tap
, NULL
, AVR_JTAG_INS_PROG_COMMANDS
);
100 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0x2300, AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
101 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0x3300, AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
103 avr_jtag_sendinstr(avr
->jtag_info
.tap
, NULL
, AVR_JTAG_INS_PROG_ENABLE
);
104 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0, AVR_JTAG_REG_PROGRAMMING_ENABLE_LEN
);
106 avr_jtag_reset(avr
, 0);
111 static int avr_jtagprg_chiperase(struct avr_common
*avr
)
115 avr_jtag_sendinstr(avr
->jtag_info
.tap
, NULL
, AVR_JTAG_INS_PROG_COMMANDS
);
116 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0x2380, AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
117 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0x3180, AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
118 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0x3380, AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
119 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0x3380, AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
123 avr_jtag_senddat(avr
->jtag_info
.tap
,
126 AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
127 if (mcu_execute_queue() != ERROR_OK
)
129 LOG_DEBUG("poll_value = 0x%04" PRIx32
"", poll_value
);
130 } while (!(poll_value
& 0x0200));
135 static int avr_jtagprg_writeflashpage(struct avr_common
*avr
,
136 const bool ext_addressing
,
137 const uint8_t *page_buf
,
144 avr_jtag_sendinstr(avr
->jtag_info
.tap
, NULL
, AVR_JTAG_INS_PROG_COMMANDS
);
145 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0x2310, AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
147 /* load extended high byte */
149 avr_jtag_senddat(avr
->jtag_info
.tap
,
151 0x0b00 | ((addr
>> 17) & 0xFF),
152 AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
154 /* load addr high byte */
155 avr_jtag_senddat(avr
->jtag_info
.tap
,
157 0x0700 | ((addr
>> 9) & 0xFF),
158 AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
160 /* load addr low byte */
161 avr_jtag_senddat(avr
->jtag_info
.tap
,
163 0x0300 | ((addr
>> 1) & 0xFF),
164 AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
166 avr_jtag_sendinstr(avr
->jtag_info
.tap
, NULL
, AVR_JTAG_INS_PROG_PAGELOAD
);
168 for (uint32_t i
= 0; i
< page_size
; i
++) {
170 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, page_buf
[i
], 8);
172 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0xFF, 8);
175 avr_jtag_sendinstr(avr
->jtag_info
.tap
, NULL
, AVR_JTAG_INS_PROG_COMMANDS
);
177 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0x3700, AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
178 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0x3500, AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
179 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0x3700, AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
180 avr_jtag_senddat(avr
->jtag_info
.tap
, NULL
, 0x3700, AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
184 avr_jtag_senddat(avr
->jtag_info
.tap
,
187 AVR_JTAG_REG_PROGRAMMING_COMMAND_LEN
);
188 if (mcu_execute_queue() != ERROR_OK
)
190 LOG_DEBUG("poll_value = 0x%04" PRIx32
"", poll_value
);
191 } while (!(poll_value
& 0x0200));
196 FLASH_BANK_COMMAND_HANDLER(avrf_flash_bank_command
)
198 struct avrf_flash_bank
*avrf_info
;
201 return ERROR_COMMAND_SYNTAX_ERROR
;
203 avrf_info
= malloc(sizeof(struct avrf_flash_bank
));
204 bank
->driver_priv
= avrf_info
;
206 avrf_info
->probed
= false;
211 static int avrf_erase(struct flash_bank
*bank
, unsigned int first
,
214 struct target
*target
= bank
->target
;
215 struct avr_common
*avr
= target
->arch_info
;
218 LOG_DEBUG("%s", __func__
);
220 if (target
->state
!= TARGET_HALTED
) {
221 LOG_ERROR("Target not halted");
222 return ERROR_TARGET_NOT_HALTED
;
225 status
= avr_jtagprg_enterprogmode(avr
);
226 if (status
!= ERROR_OK
)
229 status
= avr_jtagprg_chiperase(avr
);
230 if (status
!= ERROR_OK
)
233 return avr_jtagprg_leaveprogmode(avr
);
236 static int avrf_write(struct flash_bank
*bank
, const uint8_t *buffer
, uint32_t offset
, uint32_t count
)
238 struct target
*target
= bank
->target
;
239 struct avr_common
*avr
= target
->arch_info
;
240 uint32_t cur_size
, cur_buffer_size
, page_size
;
243 if (bank
->target
->state
!= TARGET_HALTED
) {
244 LOG_ERROR("Target not halted");
245 return ERROR_TARGET_NOT_HALTED
;
248 page_size
= bank
->sectors
[0].size
;
249 if ((offset
% page_size
) != 0) {
250 LOG_WARNING("offset 0x%" PRIx32
" breaks required %" PRIu32
"-byte alignment",
253 return ERROR_FLASH_DST_BREAKS_ALIGNMENT
;
256 LOG_DEBUG("offset is 0x%08" PRIx32
"", offset
);
257 LOG_DEBUG("count is %" PRIu32
"", count
);
259 if (avr_jtagprg_enterprogmode(avr
) != ERROR_OK
)
262 if (bank
->size
> 0x20000)
263 ext_addressing
= true;
265 ext_addressing
= false;
269 if (count
> page_size
)
270 cur_buffer_size
= page_size
;
272 cur_buffer_size
= count
;
273 avr_jtagprg_writeflashpage(avr
,
279 count
-= cur_buffer_size
;
280 cur_size
+= cur_buffer_size
;
285 return avr_jtagprg_leaveprogmode(avr
);
288 #define EXTRACT_MFG(X) (((X) & 0xffe) >> 1)
289 #define EXTRACT_PART(X) (((X) & 0xffff000) >> 12)
290 #define EXTRACT_VER(X) (((X) & 0xf0000000) >> 28)
292 static int avrf_probe(struct flash_bank
*bank
)
294 struct target
*target
= bank
->target
;
295 struct avrf_flash_bank
*avrf_info
= bank
->driver_priv
;
296 struct avr_common
*avr
= target
->arch_info
;
297 const struct avrf_type
*avr_info
= NULL
;
300 if (bank
->target
->state
!= TARGET_HALTED
) {
301 LOG_ERROR("Target not halted");
302 return ERROR_TARGET_NOT_HALTED
;
305 avrf_info
->probed
= false;
307 avr_jtag_read_jtagid(avr
, &device_id
);
308 if (mcu_execute_queue() != ERROR_OK
)
311 LOG_INFO("device id = 0x%08" PRIx32
"", device_id
);
312 if (EXTRACT_MFG(device_id
) != 0x1F)
313 LOG_ERROR("0x%" PRIx32
" is invalid Manufacturer for avr, 0x%X is expected",
314 EXTRACT_MFG(device_id
),
317 for (size_t i
= 0; i
< ARRAY_SIZE(avft_chips_info
); i
++) {
318 if (avft_chips_info
[i
].chip_id
== EXTRACT_PART(device_id
)) {
319 avr_info
= &avft_chips_info
[i
];
320 LOG_INFO("target device is %s", avr_info
->name
);
329 bank
->base
= 0x00000000;
330 bank
->size
= (avr_info
->flash_page_size
* avr_info
->flash_page_num
);
331 bank
->num_sectors
= avr_info
->flash_page_num
;
332 bank
->sectors
= malloc(sizeof(struct flash_sector
) * avr_info
->flash_page_num
);
334 for (int i
= 0; i
< avr_info
->flash_page_num
; i
++) {
335 bank
->sectors
[i
].offset
= i
* avr_info
->flash_page_size
;
336 bank
->sectors
[i
].size
= avr_info
->flash_page_size
;
337 bank
->sectors
[i
].is_erased
= -1;
338 bank
->sectors
[i
].is_protected
= -1;
341 avrf_info
->probed
= true;
344 /* chip not supported */
345 LOG_ERROR("0x%" PRIx32
" is not support for avr", EXTRACT_PART(device_id
));
347 avrf_info
->probed
= true;
352 static int avrf_auto_probe(struct flash_bank
*bank
)
354 struct avrf_flash_bank
*avrf_info
= bank
->driver_priv
;
355 if (avrf_info
->probed
)
357 return avrf_probe(bank
);
360 static int avrf_info(struct flash_bank
*bank
, struct command_invocation
*cmd
)
362 struct target
*target
= bank
->target
;
363 struct avr_common
*avr
= target
->arch_info
;
364 const struct avrf_type
*avr_info
= NULL
;
367 if (bank
->target
->state
!= TARGET_HALTED
) {
368 LOG_ERROR("Target not halted");
369 return ERROR_TARGET_NOT_HALTED
;
372 avr_jtag_read_jtagid(avr
, &device_id
);
373 if (mcu_execute_queue() != ERROR_OK
)
376 LOG_INFO("device id = 0x%08" PRIx32
"", device_id
);
377 if (EXTRACT_MFG(device_id
) != 0x1F)
378 LOG_ERROR("0x%" PRIx32
" is invalid Manufacturer for avr, 0x%X is expected",
379 EXTRACT_MFG(device_id
),
382 for (size_t i
= 0; i
< ARRAY_SIZE(avft_chips_info
); i
++) {
383 if (avft_chips_info
[i
].chip_id
== EXTRACT_PART(device_id
)) {
384 avr_info
= &avft_chips_info
[i
];
385 LOG_INFO("target device is %s", avr_info
->name
);
393 command_print_sameline(cmd
, "%s - Rev: 0x%" PRIx32
"", avr_info
->name
,
394 EXTRACT_VER(device_id
));
397 /* chip not supported */
398 command_print_sameline(cmd
, "Cannot identify target as a avr\n");
399 return ERROR_FLASH_OPERATION_FAILED
;
403 static int avrf_mass_erase(struct flash_bank
*bank
)
405 struct target
*target
= bank
->target
;
406 struct avr_common
*avr
= target
->arch_info
;
408 if (target
->state
!= TARGET_HALTED
) {
409 LOG_ERROR("Target not halted");
410 return ERROR_TARGET_NOT_HALTED
;
413 if ((avr_jtagprg_enterprogmode(avr
) != ERROR_OK
)
414 || (avr_jtagprg_chiperase(avr
) != ERROR_OK
)
415 || (avr_jtagprg_leaveprogmode(avr
) != ERROR_OK
))
421 COMMAND_HANDLER(avrf_handle_mass_erase_command
)
424 return ERROR_COMMAND_SYNTAX_ERROR
;
426 struct flash_bank
*bank
;
427 int retval
= CALL_COMMAND_HANDLER(flash_command_get_bank
, 0, &bank
);
428 if (retval
!= ERROR_OK
)
431 if (avrf_mass_erase(bank
) == ERROR_OK
)
432 command_print(CMD
, "avr mass erase complete");
434 command_print(CMD
, "avr mass erase failed");
436 LOG_DEBUG("%s", __func__
);
440 static const struct command_registration avrf_exec_command_handlers
[] = {
442 .name
= "mass_erase",
444 .handler
= avrf_handle_mass_erase_command
,
445 .mode
= COMMAND_EXEC
,
446 .help
= "erase entire device",
448 COMMAND_REGISTRATION_DONE
450 static const struct command_registration avrf_command_handlers
[] = {
454 .help
= "AVR flash command group",
456 .chain
= avrf_exec_command_handlers
,
458 COMMAND_REGISTRATION_DONE
461 const struct flash_driver avr_flash
= {
463 .commands
= avrf_command_handlers
,
464 .flash_bank_command
= avrf_flash_bank_command
,
467 .read
= default_flash_read
,
469 .auto_probe
= avrf_auto_probe
,
470 .erase_check
= default_flash_blank_check
,
472 .free_driver_priv
= default_flash_free_driver_priv
,
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)