From 8a807b8a53aeb424ffef9361520de2cdf477db85 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Fri, 10 May 2024 14:27:15 +0100 Subject: [PATCH] Move static variables into PDATA in serbb_win32.c --- src/serbb_win32.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/serbb_win32.c b/src/serbb_win32.c index 4722f611..d779bd62 100644 --- a/src/serbb_win32.c +++ b/src/serbb_win32.c @@ -40,8 +40,12 @@ #include "bitbang.h" #include "serbb.h" -/* cached status lines */ -static int dtr, rts, txd; +struct pdata { + int dtr, rts, txd; // Cached status lines +}; + +// Use private programmer data as if they were a global structure my +#define my (*(struct pdata *)(pgm->cookie)) #define W32SERBUFSIZE 1024 @@ -85,13 +89,13 @@ static int serbb_setpin(const PROGRAMMER *pgm, int pinfunc, int value) { case 3: /* txd */ dwFunc = value? SETBREAK: CLRBREAK; name = value? "SETBREAK": "CLRBREAK"; - txd = value; + my.txd = value; break; case 4: /* dtr */ dwFunc = value? SETDTR: CLRDTR; name = value? "SETDTR": "CLRDTR"; - dtr = value; + my.dtr = value; break; case 7: /* rts */ @@ -191,15 +195,15 @@ static int serbb_getpin(const PROGRAMMER *pgm, int pinfunc) { switch (pin) { case 3: /* txd */ - rv = txd; + rv = my.txd; name = "TXD"; break; case 4: /* dtr */ - rv = dtr; + rv = my.dtr; name = "DTR"; break; case 7: /* rts */ - rv = rts; + rv = my.rts; name = "RTS"; break; default: @@ -303,7 +307,7 @@ static int serbb_open(PROGRAMMER *pgm, const char *port) { pgm->fd.pfd = (void *)hComPort; - dtr = rts = txd = 0; + my.dtr = my.rts = my.txd = 0; return 0; } @@ -320,6 +324,15 @@ static void serbb_close(PROGRAMMER *pgm) { hComPort = INVALID_HANDLE_VALUE; } +static void serbb_setup(PROGRAMMER *pgm) { + pgm->cookie = mmt_malloc(sizeof(struct pdata)); +} + +static void serbb_teardown(PROGRAMMER *pgm) { + mmt_free(pgm->cookie); + pgm->cookie = NULL; +} + const char serbb_desc[] = "Serial port bitbanging"; void serbb_initpgm(PROGRAMMER *pgm) { @@ -327,6 +340,8 @@ void serbb_initpgm(PROGRAMMER *pgm) { pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed + pgm->setup = serbb_setup; + pgm->teardown = serbb_teardown; pgm->rdy_led = bitbang_rdy_led; pgm->err_led = bitbang_err_led; pgm->pgm_led = bitbang_pgm_led;