From 8f951babce52e0f0ac13aed446eb030e8d20d7a2 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Fri, 19 Apr 2024 12:10:04 +0100 Subject: [PATCH 1/4] Move static variables to PDATA --- src/ch341a.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/ch341a.c b/src/ch341a.c index 42f4d9f50..5159ed4ff 100644 --- a/src/ch341a.c +++ b/src/ch341a.c @@ -49,8 +49,6 @@ #include #ifdef USE_LIBUSB_1_0 -static libusb_context *ctx = NULL; - static int libusb_to_errno(int result) { switch (result) { case LIBUSB_SUCCESS: @@ -96,6 +94,9 @@ static int libusb_to_errno(int result) { struct pdata { libusb_device_handle *usbhandle; int sckfreq_hz; + + libusb_context *ctx; + int USB_init; // Used in ch341a_open() }; #define PDATA(pgm) ((struct pdata *)(pgm->cookie)) @@ -204,13 +205,12 @@ static int ch341a_open(PROGRAMMER *pgm, const char *port) { int pid, vid, j, r; int errorCode = USB_ERROR_NOTFOUND; libusb_device_handle *handle = NULL; - static int didUsbInit = 0; pmsg_trace("ch341a_open(\"%s\")\n", port); - if(!didUsbInit) { - didUsbInit = 1; - libusb_init(&ctx); + if(!PDATA(pgm)->USB_init) { + PDATA(pgm)->USB_init = 1; + libusb_init(&PDATA(pgm)->ctx); } if(usbpid) { @@ -223,7 +223,7 @@ static int ch341a_open(PROGRAMMER *pgm, const char *port) { vid = pgm->usbvid? pgm->usbvid: CH341A_VID; libusb_device **dev_list; - int dev_list_len = libusb_get_device_list(ctx, &dev_list); + int dev_list_len = libusb_get_device_list(PDATA(pgm)->ctx, &dev_list); for(j = 0; j < dev_list_len; ++j) { libusb_device *dev = dev_list[j]; @@ -252,7 +252,7 @@ static int ch341a_open(PROGRAMMER *pgm, const char *port) { if((r = libusb_claim_interface(PDATA(pgm)->usbhandle, 0))) { pmsg_error("libusb_claim_interface failed, return value %d (%s)\n", r, libusb_error_name(r)); libusb_close(PDATA(pgm)->usbhandle); - libusb_exit(ctx); + libusb_exit(PDATA(pgm)->ctx); return -1; } return 0; @@ -272,7 +272,7 @@ static void ch341a_close(PROGRAMMER *pgm) { libusb_release_interface(PDATA(pgm)->usbhandle, 0); libusb_close(PDATA(pgm)->usbhandle); } - libusb_exit(ctx); + libusb_exit(PDATA(pgm)->ctx); } From ec5dabcfb071f0c565f069fd3a0fb2564635c4f1 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Fri, 19 Apr 2024 12:12:09 +0100 Subject: [PATCH 2/4] Utilise magic memory tree interface for ch341a.c --- src/avrdude.h | 1 + src/ch341a.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/avrdude.h b/src/avrdude.h index c679a6546..6b777d30a 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/ch341a.c b/src/ch341a.c index 5159ed4ff..8d0403dac 100644 --- a/src/ch341a.c +++ b/src/ch341a.c @@ -429,11 +429,11 @@ static int ch341a_spi_program_enable(const PROGRAMMER *pgm, const AVRPART *p) { // Interface management static void ch341a_setup(PROGRAMMER *pgm) { - pgm->cookie = cfg_malloc(__func__, sizeof(struct pdata)); + pgm->cookie = mmt_malloc(sizeof(struct pdata)); } static void ch341a_teardown(PROGRAMMER *pgm) { - free(pgm->cookie); + mmt_free(pgm->cookie); } // Dummy functions From 54130a72f5d8cbe766fbbf384afa7f9d7d053c35 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Fri, 19 Apr 2024 12:17:53 +0100 Subject: [PATCH 3/4] Update CH341A programmer description --- src/ch341a.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch341a.c b/src/ch341a.c index 8d0403dac..8ec04f1c1 100644 --- a/src/ch341a.c +++ b/src/ch341a.c @@ -487,4 +487,4 @@ void ch341a_initpgm(PROGRAMMER * pgm) { } #endif // !defined(HAVE_LIBUSB_1_0) -const char ch341a_desc[] = "Driver for \"ch341a\"-type programmers"; +const char ch341a_desc[] = "Programmer chip CH341A (AVR must have minimum F_CPU of 6.8 MHz)"; From 9bbbe39f4f2cf69fd6eba16acf0c076f852d06bb Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Mon, 22 Apr 2024 15:47:51 +0100 Subject: [PATCH 4/4] Render double teardown() harmless in ch341a --- src/ch341a.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ch341a.c b/src/ch341a.c index 8ec04f1c1..60bf9395d 100644 --- a/src/ch341a.c +++ b/src/ch341a.c @@ -434,6 +434,7 @@ static void ch341a_setup(PROGRAMMER *pgm) { static void ch341a_teardown(PROGRAMMER *pgm) { mmt_free(pgm->cookie); + pgm->cookie = NULL; } // Dummy functions