From e17b667523208580b517a8317854ca00d7df61e4 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Tue, 6 Jun 2023 10:28:05 +0100 Subject: [PATCH 1/4] Add debug messages for dryrun programmer --- src/dryrun.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/dryrun.c b/src/dryrun.c index 2dc05645..df5bd78e 100644 --- a/src/dryrun.c +++ b/src/dryrun.c @@ -54,6 +54,7 @@ typedef struct { // Read expected signature bytes from part description static int dryrun_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *sigmem) { + pmsg_debug("%s()\n", __func__); // Signature byte reads are always 3 bytes if(sigmem->size < 3) { pmsg_error("memory size too small for sig byte read\n"); @@ -69,6 +70,7 @@ static int dryrun_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *p, const static int dryrun_chip_erase(const PROGRAMMER *pgm, const AVRPART *punused) { AVRMEM *flm; + pmsg_debug("%s()\n", __func__); if(!dry.dp) Return("no dryrun device? Raise an issue at https://github.com/avrdudes/avrdude/issues"); if(!(flm = avr_locate_mem(dry.dp, "flash"))) @@ -84,6 +86,7 @@ static int dryrun_chip_erase(const PROGRAMMER *pgm, const AVRPART *punused) { // For now pretend all is hunky-dory static int dryrun_cmd(const PROGRAMMER *pgm, const unsigned char *cmd, unsigned char *res) { + pmsg_debug("%s(0x%02x 0x%02x 0x%02x 0x%02x)\n", __func__, cmd[0], cmd[1], cmd[2], cmd[3]); // FIXME: do we need to emulate some more commands? For now it's only the STK universal CE if(cmd[0] == (Subc_STK_UNIVERSAL_LEXT>>24) || (cmd[0] == (Subc_STK_UNIVERSAL_CE>>24) && cmd[1] == (uint8_t)(Subc_STK_UNIVERSAL_CE>>16))) { @@ -100,11 +103,15 @@ static int dryrun_cmd(const PROGRAMMER *pgm, const unsigned char *cmd, unsigned static int dryrun_program_enable(const PROGRAMMER *pgm, const AVRPART *p_unused) { + pmsg_debug("%s()\n", __func__); + return 0; } static void dryrun_enable(PROGRAMMER *pgm, const AVRPART *p) { + pmsg_debug("%s()\n", __func__); + if(!dry.dp) { unsigned char inifuses[10]; // For fuses, which is made up from fuse0, fuse1, ... AVRMEM *fusesm = NULL; @@ -148,6 +155,8 @@ static void dryrun_enable(PROGRAMMER *pgm, const AVRPART *p) { // Initialise the AVR device and prepare it to accept commands static int dryrun_initialize(const PROGRAMMER *pgm, const AVRPART *p) { + pmsg_debug("%s()\n", __func__); + /* * Normally one would select appropriate programming mechanisms here, * but for dryrun ignore discrepancies... @@ -167,6 +176,7 @@ static int dryrun_initialize(const PROGRAMMER *pgm, const AVRPART *p) { static void dryrun_disable(const PROGRAMMER *pgm) { + pmsg_debug("%s()\n", __func__); if(dry.dp) { // Deallocate dryrun part avr_free_part(dry.dp); dry.dp = NULL; @@ -177,11 +187,14 @@ static void dryrun_disable(const PROGRAMMER *pgm) { static int dryrun_open(PROGRAMMER *pgm, const char *port) { + pmsg_debug("%s(%s)\n", __func__, port? port: "NULL"); + return 0; } static void dryrun_close(PROGRAMMER *pgm) { + pmsg_debug("%s()\n", __func__); } @@ -195,6 +208,7 @@ static void *memand(void *dest, const void *src, size_t n) { static int dryrun_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m, unsigned int page_size, unsigned int addr, unsigned int n_bytes) { + pmsg_debug("%s(%s, %u, 0x%04x, %u)\n", __func__, m->desc, page_size, addr, n_bytes); if(!dry.dp) Return("no dryrun device? Raise an issue at https://github.com/avrdudes/avrdude/issues"); @@ -234,6 +248,7 @@ static int dryrun_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const AVR static int dryrun_paged_load(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m, unsigned int page_size, unsigned int addr, unsigned int n_bytes) { + pmsg_debug("%s(%s, %u, 0x%04x, %u)\n", __func__, m->desc, page_size, addr, n_bytes); if(!dry.dp) Return("no dryrun device? Raise an issue at https://github.com/avrdudes/avrdude/issues"); @@ -275,6 +290,7 @@ int dryrun_write_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m, AVRMEM *dmem, *dfuse; + pmsg_debug("%s(%s, 0x%04lx, 0x%02x)\n", __func__, m->desc, addr, data); if(!dry.dp) Return("no dryrun device? Raise an issue at https://github.com/avrdudes/avrdude/issues"); if(!(dmem = avr_locate_mem(dry.dp, m->desc))) @@ -319,6 +335,7 @@ int dryrun_read_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m, AVRMEM *dmem; + pmsg_debug("%s(%s, 0x%04lx)\n", __func__, m->desc, addr); if(!dry.dp) Return("no dryrun device? Raise an issue at https://github.com/avrdudes/avrdude/issues"); if(!(dmem = avr_locate_mem(dry.dp, m->desc))) @@ -351,12 +368,14 @@ static void dryrun_display(const PROGRAMMER *pgm, const char *p_unused) { static void dryrun_setup(PROGRAMMER *pgm) { + pmsg_debug("%s()\n", __func__); // Allocate dry pgm->cookie = cfg_malloc(__func__, sizeof(dryrun_t)); } static void dryrun_teardown(PROGRAMMER *pgm) { + pmsg_debug("%s()\n", __func__); free(pgm->cookie); pgm->cookie = NULL; } @@ -365,6 +384,8 @@ static void dryrun_teardown(PROGRAMMER *pgm) { const char dryrun_desc[] = "Dryrun programmer for testing avrdude"; void dryrun_initpgm(PROGRAMMER *pgm) { + pmsg_debug("%s()\n", __func__); + strcpy(pgm->type, "Dryrun"); pgm->read_sig_bytes = dryrun_read_sig_bytes; From 9e53968afd37e14267d7d7ece67b23f8ef99c34c Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Tue, 6 Jun 2023 12:40:34 +0100 Subject: [PATCH 2/4] Show -c programmer name for dryrun_display() --- src/dryrun.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dryrun.c b/src/dryrun.c index df5bd78e..774c5215 100644 --- a/src/dryrun.c +++ b/src/dryrun.c @@ -362,7 +362,7 @@ static int dryrun_term_keep_alive(const PROGRAMMER *pgm, const AVRPART *p_unused static void dryrun_display(const PROGRAMMER *pgm, const char *p_unused) { - imsg_info("Dryrun programmer for %s\n", dry.dp? dry.dp->desc: "???"); + imsg_info("Dryrun programmer for %s\n", dry.dp? dry.dp->desc: partdesc? partdesc: "???"); return; } From eb312ce2e6b42497961e1b19cea631ea341edbee Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Tue, 6 Jun 2023 13:29:01 +0100 Subject: [PATCH 3/4] Add debug messages for some dryrun_...() return values --- src/dryrun.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/dryrun.c b/src/dryrun.c index 774c5215..b9cb635a 100644 --- a/src/dryrun.c +++ b/src/dryrun.c @@ -54,14 +54,13 @@ typedef struct { // Read expected signature bytes from part description static int dryrun_read_sig_bytes(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *sigmem) { - pmsg_debug("%s()\n", __func__); + pmsg_debug("%s()", __func__); // Signature byte reads are always 3 bytes - if(sigmem->size < 3) { - pmsg_error("memory size too small for sig byte read\n"); - return -1; - } + if(sigmem->size < 3) + Return("memory size too small for %s()", __func__); memcpy(sigmem->buf, p->signature, 3); + msg_debug(" returns 0x%02x%02x%02x\n", sigmem->buf[0], sigmem->buf[1], sigmem->buf[2]); return 3; } @@ -86,19 +85,20 @@ static int dryrun_chip_erase(const PROGRAMMER *pgm, const AVRPART *punused) { // For now pretend all is hunky-dory static int dryrun_cmd(const PROGRAMMER *pgm, const unsigned char *cmd, unsigned char *res) { + int ret = 0; + pmsg_debug("%s(0x%02x 0x%02x 0x%02x 0x%02x)\n", __func__, cmd[0], cmd[1], cmd[2], cmd[3]); // FIXME: do we need to emulate some more commands? For now it's only the STK universal CE if(cmd[0] == (Subc_STK_UNIVERSAL_LEXT>>24) || (cmd[0] == (Subc_STK_UNIVERSAL_CE>>24) && cmd[1] == (uint8_t)(Subc_STK_UNIVERSAL_CE>>16))) { - memcpy(res, cmd+1, 3); - return dryrun_chip_erase(pgm, NULL); + ret = dryrun_chip_erase(pgm, NULL); } // Pretend call happened and all is good, returning 0xff each time memcpy(res, cmd+1, 3); res[3] = 0xff; - return 0; + return ret; } @@ -335,7 +335,7 @@ int dryrun_read_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m, AVRMEM *dmem; - pmsg_debug("%s(%s, 0x%04lx)\n", __func__, m->desc, addr); + pmsg_debug("%s(%s, 0x%04lx)", __func__, m->desc, addr); if(!dry.dp) Return("no dryrun device? Raise an issue at https://github.com/avrdudes/avrdude/issues"); if(!(dmem = avr_locate_mem(dry.dp, m->desc))) @@ -352,6 +352,7 @@ int dryrun_read_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m, *value = dmem->buf[addr]; + msg_debug(" returns 0x%02x\n", *value); return 0; } From 0044688f730efd52efa7af89d313dd190ad7b56d Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Tue, 6 Jun 2023 13:42:21 +0100 Subject: [PATCH 4/4] Add dryrun_..._led() functions to dryrun programmer --- src/dryrun.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/dryrun.c b/src/dryrun.c index b9cb635a..ee50eadd 100644 --- a/src/dryrun.c +++ b/src/dryrun.c @@ -362,6 +362,31 @@ static int dryrun_term_keep_alive(const PROGRAMMER *pgm, const AVRPART *p_unused } +static int dryrun_rdy_led(const PROGRAMMER *pgm, int value) { + pmsg_debug("%s(%d)\n", __func__, value); + + return 0; +} + +static int dryrun_err_led(const PROGRAMMER *pgm, int value) { + pmsg_debug("%s(%d)\n", __func__, value); + + return 0; +} + +static int dryrun_pgm_led(const PROGRAMMER *pgm, int value) { + pmsg_debug("%s(%d)\n", __func__, value); + + return 0; +} + +static int dryrun_vfy_led(const PROGRAMMER *pgm, int value) { + pmsg_debug("%s(%d)\n", __func__, value); + + return 0; +} + + static void dryrun_display(const PROGRAMMER *pgm, const char *p_unused) { imsg_info("Dryrun programmer for %s\n", dry.dp? dry.dp->desc: partdesc? partdesc: "???"); return; @@ -392,6 +417,10 @@ void dryrun_initpgm(PROGRAMMER *pgm) { pgm->read_sig_bytes = dryrun_read_sig_bytes; // Mandatory functions + pgm->rdy_led = dryrun_rdy_led; + pgm->err_led = dryrun_err_led; + pgm->pgm_led = dryrun_pgm_led; + pgm->vfy_led = dryrun_vfy_led; pgm->initialize = dryrun_initialize; pgm->display = dryrun_display; pgm->enable = dryrun_enable;