From b2160da1925bc13ecb25019e64814137cc049467 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Sun, 21 Apr 2024 21:21:58 +0100 Subject: [PATCH 1/4] Move static variable to PDATA --- src/pickit2.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/pickit2.c b/src/pickit2.c index 5caf07f3..f484fe36 100644 --- a/src/pickit2.c +++ b/src/pickit2.c @@ -95,7 +95,7 @@ static const char *usb_strerror() return ""; } #else -static int usb_open_device(struct usb_dev_handle **dev, int vid, int pid); +static int usb_open_device(PROGRAMMER *pgm, struct usb_dev_handle **dev, int vid, int pid); //#define INVALID_HANDLE_VALUE NULL #define USB_ERROR_NONE 0 #define USB_ERROR_ACCESS 1 @@ -119,7 +119,8 @@ struct pdata #ifdef WIN32 HANDLE usb_handle, write_event, read_event; #else - struct usb_dev_handle *usb_handle; // LIBUSB STUFF + struct usb_dev_handle *usb_handle; // LIBUSB STUFF + int USB_init; // Used in usb_open_device() #endif uint8_t clock_period; // SPI clock period in us int transaction_timeout; // usb trans timeout in ms @@ -204,8 +205,7 @@ static int pickit2_open(PROGRAMMER *pgm, const char *port) { pgm->desc = cache_string(cbuf); } #else - if (usb_open_device(&(PDATA(pgm)->usb_handle), PICKIT2_VID, PICKIT2_PID) < 0) - { + if(usb_open_device(pgm, &(PDATA(pgm)->usb_handle), PICKIT2_VID, PICKIT2_PID) < 0) { /* no PICkit2 found */ pmsg_error("cannot find PICkit2 with vid=0x%x pid=0x%x\n", PICKIT2_VID, PICKIT2_PID); return -1; @@ -1080,17 +1080,14 @@ static int pickit2_read_report(const PROGRAMMER *pgm, unsigned char report[65]) #else // WIN32 /* taken (modified) from avrdude usbasp.c */ -static int usb_open_device(struct usb_dev_handle **device, int vendor, int product) -{ +static int usb_open_device(PROGRAMMER *pgm, struct usb_dev_handle **device, int vendor, int product) { struct usb_bus *bus; struct usb_device *dev; usb_dev_handle *handle = NULL; int errorCode = USB_ERROR_NOTFOUND; - static int didUsbInit = 0; - if (!didUsbInit) - { - didUsbInit = 1; + if(!PDATA(pgm)->USB_init) { + PDATA(pgm)->USB_init = 1; usb_init(); } usb_find_busses(); From 4f5d54e527f9bc7e60b99aa5412092f7eef637a0 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Sun, 21 Apr 2024 23:15:38 +0100 Subject: [PATCH 2/4] Utilise magic memory tree interface for pickit2.c --- src/avrdude.h | 1 + src/pickit2.c | 28 ++++++++++------------------ 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/avrdude.h b/src/avrdude.h index c679a654..6b777d30 100644 --- a/src/avrdude.h +++ b/src/avrdude.h @@ -44,6 +44,7 @@ extern const char *pgmid; // Programmer -c string #define mmt_strdup(s) cfg_strdup(__func__, s) #define mmt_malloc(n) cfg_malloc(__func__, n) #define mmt_realloc(p, n) cfg_realloc(__func__, p, n) +#define mmt_free(p) free(p) int avrdude_message2(FILE *fp, int lno, const char *file, const char *func, int msgmode, int msglvl, const char *format, ...); diff --git a/src/pickit2.c b/src/pickit2.c index f484fe36..aa7526af 100644 --- a/src/pickit2.c +++ b/src/pickit2.c @@ -161,22 +161,14 @@ struct pdata #define SCR_SPI 0xC3 #define SCR_SPI_LIT_2(v) 0xC7,(v) -static void pickit2_setup(PROGRAMMER * pgm) -{ - if ((pgm->cookie = malloc(sizeof(struct pdata))) == 0) - { - pmsg_error("out of memory allocating private data\n"); - exit(1); - } - memset(pgm->cookie, 0, sizeof(struct pdata)); - - PDATA(pgm)->transaction_timeout = 1500; // default value, may be overridden with -x timeout=ms - PDATA(pgm)->clock_period = 10; // default value, may be overridden with -x clockrate=us or -B or -i +static void pickit2_setup(PROGRAMMER *pgm) { + pgm->cookie = mmt_malloc(sizeof(struct pdata)); + PDATA(pgm)->transaction_timeout = 1500; // Can be changed with -x timeout=ms + PDATA(pgm)->clock_period = 10; // Can be changed with -x clockrate=us or -B or -i } -static void pickit2_teardown(PROGRAMMER * pgm) -{ - free(pgm->cookie); +static void pickit2_teardown(PROGRAMMER *pgm) { + mmt_free(pgm->cookie); } static int pickit2_open(PROGRAMMER *pgm, const char *port) { @@ -193,7 +185,7 @@ static int pickit2_open(PROGRAMMER *pgm, const char *port) { { // Get the device description while we're at it and overlay it on pgm->desc short wbuf[80-1]; - char *cbuf = cfg_malloc("pickit2_open()", sizeof wbuf/sizeof*wbuf + (pgm->desc? strlen(pgm->desc): 0) + 2); + char *cbuf = mmt_malloc(sizeof wbuf/sizeof*wbuf + (pgm->desc? strlen(pgm->desc): 0) + 2); HidD_GetProductString(PDATA(pgm)->usb_handle, wbuf, sizeof wbuf/sizeof*wbuf); if(pgm->desc && *pgm->desc) @@ -203,6 +195,7 @@ static int pickit2_open(PROGRAMMER *pgm, const char *port) { for(size_t i = 0; i < sizeof wbuf/sizeof*wbuf && wbuf[i]; i++) cbuf[i] = (char) wbuf[i]; // TODO what about little/big endian??? pgm->desc = cache_string(cbuf); + mmt_free(cbuf); } #else if(usb_open_device(pgm, &(PDATA(pgm)->usb_handle), PICKIT2_VID, PICKIT2_PID) < 0) { @@ -893,7 +886,7 @@ static HANDLE open_hid(unsigned short vid, unsigned short pid) //Allocate memory for the hDevInfo structure, using the returned Length. - detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length); + detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA) mmt_malloc(Length); //Set cbSize in the detailData structure. @@ -989,7 +982,7 @@ static HANDLE open_hid(unsigned short vid, unsigned short pid) //Free the memory used by the detailData structure (no longer needed). - free(detailData); + mmt_free(detailData); } //if (Result != 0) @@ -1289,4 +1282,3 @@ void pickit2_initpgm(PROGRAMMER *pgm) { #endif /* defined(HAVE_LIBUSB) || defined(WIN32) */ const char pickit2_desc[] = "Microchip's PICkit2 Programmer"; - From fcc978da69fcba2eed7dad2e18c81f31d8057eb7 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Mon, 22 Apr 2024 15:17:45 +0100 Subject: [PATCH 3/4] return LIBAVRDUDE_EXIT instead of exit(0) --- src/libavrdude.h | 1 + src/pickit2.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libavrdude.h b/src/libavrdude.h index 453b22a0..60cf4ebf 100644 --- a/src/libavrdude.h +++ b/src/libavrdude.h @@ -59,6 +59,7 @@ typedef uint32_t pinmask_t; #define LIBAVRDUDE_NOTSUPPORTED (-2) // operation not supported #define LIBAVRDUDE_SOFTFAIL (-3) // returned, eg, by avr_signature() if caller // might proceed with chip erase +#define LIBAVRDUDE_EXIT (-4) // End all operations in this session /* formerly lists.h */ diff --git a/src/pickit2.c b/src/pickit2.c index aa7526af..70344ea8 100644 --- a/src/pickit2.c +++ b/src/pickit2.c @@ -1190,7 +1190,7 @@ static int pickit2_parseextparams(const PROGRAMMER *pgm, const LISTID extparms) msg_error(" -xclockrate= Set the SPI clocking rate in [Hz]\n"); msg_error(" -xtimeout= Set the timeout for USB read/write to [ms]\n"); msg_error(" -xhelp Show this help menu and exit\n"); - exit(0); + return LIBAVRDUDE_EXIT;; } pmsg_error("invalid extended parameter '%s'\n", extended_param); From 20c5bd4608ae8ce78b1f8341f7042b8b3155b0ea Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Mon, 22 Apr 2024 15:47:53 +0100 Subject: [PATCH 4/4] Render double teardown() harmless in pickit2 --- src/pickit2.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pickit2.c b/src/pickit2.c index 70344ea8..836a11f9 100644 --- a/src/pickit2.c +++ b/src/pickit2.c @@ -169,6 +169,7 @@ static void pickit2_setup(PROGRAMMER *pgm) { static void pickit2_teardown(PROGRAMMER *pgm) { mmt_free(pgm->cookie); + pgm->cookie = NULL; } static int pickit2_open(PROGRAMMER *pgm, const char *port) {