diff --git a/ChangeLog b/ChangeLog index d468d569..5e9c473c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,32 @@ +2014-05-16 Joerg Wunsch + + * avr910.c: Replace all occurences of exit() in potential library + functions by appropriate return values + * avrftdi.c: (Dito.) + * bitbang.c: (Dito.) + * bitbang.h: (Dito.) + * buspirate.c: (Dito.) + * butterfly.c: (Dito.) + * config.c: (Dito.) + * flip2.c: (Dito.) + * ft245r.c: (Dito.) + * jtagmkI.c: (Dito.) + * jtagmkII.c: (Dito.) + * linuxgpio.c: (Dito.) + * main.c: (Dito.) + * par.c: (Dito.) + * pgm.c: (Dito.) + * pickit2.c: (Dito.) + * pindefs.c: (Dito.) + * pindefs.h: (Dito.) + * ser_avrdoper.c: (Dito.) + * ser_posix.c: (Dito.) + * ser_win32.c: (Dito.) + * serbb_posix.c: (Dito.) + * serbb_win32.c: (Dito.) + * stk500.c: (Dito.) + * stk500v2.c: (Dito.) + 2014-05-07 Rene Liebscher bug #42310: New part description for AT90PWM216 diff --git a/avr910.c b/avr910.c index b6e258c2..be725360 100644 --- a/avr910.c +++ b/avr910.c @@ -89,7 +89,7 @@ static int avr910_recv(PROGRAMMER * pgm, char * buf, size_t len) fprintf(stderr, "%s: avr910_recv(): programmer is not responding\n", progname); - exit(1); + return 1; } return 0; } @@ -101,7 +101,7 @@ static int avr910_drain(PROGRAMMER * pgm, int display) } -static void avr910_vfy_cmd_sent(PROGRAMMER * pgm, char * errmsg) +static int avr910_vfy_cmd_sent(PROGRAMMER * pgm, char * errmsg) { char c; @@ -109,8 +109,9 @@ static void avr910_vfy_cmd_sent(PROGRAMMER * pgm, char * errmsg) if (c != '\r') { fprintf(stderr, "%s: error: programmer did not respond to command: %s\n", progname, errmsg); - exit(1); + return 1; } + return 0; } @@ -120,7 +121,8 @@ static void avr910_vfy_cmd_sent(PROGRAMMER * pgm, char * errmsg) static int avr910_chip_erase(PROGRAMMER * pgm, AVRPART * p) { avr910_send(pgm, "e", 1); - avr910_vfy_cmd_sent(pgm, "chip erase"); + if (avr910_vfy_cmd_sent(pgm, "chip erase") < 0) + return -1; /* * avr910 firmware may not delay long enough @@ -131,17 +133,17 @@ static int avr910_chip_erase(PROGRAMMER * pgm, AVRPART * p) } -static void avr910_enter_prog_mode(PROGRAMMER * pgm) +static int avr910_enter_prog_mode(PROGRAMMER * pgm) { avr910_send(pgm, "P", 1); - avr910_vfy_cmd_sent(pgm, "enter prog mode"); + return avr910_vfy_cmd_sent(pgm, "enter prog mode"); } -static void avr910_leave_prog_mode(PROGRAMMER * pgm) +static int avr910_leave_prog_mode(PROGRAMMER * pgm) { avr910_send(pgm, "L", 1); - avr910_vfy_cmd_sent(pgm, "leave prog mode"); + return avr910_vfy_cmd_sent(pgm, "leave prog mode"); } @@ -251,7 +253,7 @@ static int avr910_initialize(PROGRAMMER * pgm, AVRPART * p) "%s: %s: selected device is not supported by programmer: %s\n", progname, ovsigck? "warning": "error", p->id); if (!ovsigck) - exit(1); + return -1; } /* If the user forced the selection, use the first device type that is supported by the programmer. */ diff --git a/avrftdi.c b/avrftdi.c index 8db292eb..ed319361 100644 --- a/avrftdi.c +++ b/avrftdi.c @@ -1210,7 +1210,7 @@ avrftdi_setup(PROGRAMMER * pgm) if(!pdata->ftdic) { log_err("Error allocating memory.\n"); - exit(-ENOMEM); + exit(1); } E_VOID(ftdi_init(pdata->ftdic), pdata->ftdic); diff --git a/bitbang.c b/bitbang.c index a8855ca2..d059702c 100644 --- a/bitbang.c +++ b/bitbang.c @@ -40,6 +40,7 @@ #include "par.h" #include "serbb.h" #include "tpi.h" +#include "bitbang.h" static int delay_decrement; @@ -140,7 +141,7 @@ static void bitbang_calibrate_delay(void) * usleep()'s granularity is usually like 1 ms or 10 ms, so it's not * really suitable for short delays in bit-bang algorithms. */ -void bitbang_delay(int us) +void bitbang_delay(unsigned int us) { #if defined(WIN32NATIVE) LARGE_INTEGER countNow, countEnd; @@ -156,7 +157,7 @@ void bitbang_delay(int us) else /* no performance counters -- run normal uncalibrated delay */ { #endif /* WIN32NATIVE */ - volatile int del = us * delay_decrement; + volatile unsigned int del = us * delay_decrement; while (del > 0) del--; @@ -630,30 +631,36 @@ int bitbang_initialize(PROGRAMMER * pgm, AVRPART * p) return 0; } -static void verify_pin_assigned(PROGRAMMER * pgm, int pin, char * desc) +static int verify_pin_assigned(PROGRAMMER * pgm, int pin, char * desc) { if (pgm->pinno[pin] == 0) { fprintf(stderr, "%s: error: no pin has been assigned for %s\n", progname, desc); - exit(1); + return -1; } + return 0; } /* * Verify all prerequisites for a bit-bang programmer are present. */ -void bitbang_check_prerequisites(PROGRAMMER *pgm) +int bitbang_check_prerequisites(PROGRAMMER *pgm) { - verify_pin_assigned(pgm, PIN_AVR_RESET, "AVR RESET"); - verify_pin_assigned(pgm, PIN_AVR_SCK, "AVR SCK"); - verify_pin_assigned(pgm, PIN_AVR_MISO, "AVR MISO"); - verify_pin_assigned(pgm, PIN_AVR_MOSI, "AVR MOSI"); + if (verify_pin_assigned(pgm, PIN_AVR_RESET, "AVR RESET") < 0) + return -1; + if (verify_pin_assigned(pgm, PIN_AVR_SCK, "AVR SCK") < 0) + return -1; + if (verify_pin_assigned(pgm, PIN_AVR_MISO, "AVR MISO") < 0) + return -1; + if (verify_pin_assigned(pgm, PIN_AVR_MOSI, "AVR MOSI") < 0) + return -1; if (pgm->cmd == NULL) { fprintf(stderr, "%s: error: no cmd() method defined for bitbang programmer\n", progname); - exit(1); + return -1; } + return 0; } diff --git a/bitbang.h b/bitbang.h index 5ce0d9f6..300f52fd 100644 --- a/bitbang.h +++ b/bitbang.h @@ -31,7 +31,7 @@ int bitbang_getpin(int fd, int pin); int bitbang_highpulsepin(int fd, int pin); void bitbang_delay(unsigned int us); -void bitbang_check_prerequisites(PROGRAMMER *pgm); +int bitbang_check_prerequisites(PROGRAMMER *pgm); int bitbang_rdy_led (PROGRAMMER * pgm, int value); int bitbang_err_led (PROGRAMMER * pgm, int value); diff --git a/buspirate.c b/buspirate.c index f1ff6b50..a65cf334 100644 --- a/buspirate.c +++ b/buspirate.c @@ -145,7 +145,7 @@ static int buspirate_expect_bin(struct programmer_t *pgm, char *recv_buf = alloca(expect_len); if (!pgm->flag & BP_FLAG_IN_BINMODE) { fprintf(stderr, "BusPirate: Internal error: buspirate_send_bin() called from ascii mode"); - exit(1); + return -1; } buspirate_send_bin(pgm, send_data, send_len); @@ -170,7 +170,7 @@ static int buspirate_getc(struct programmer_t *pgm) if (pgm->flag & BP_FLAG_IN_BINMODE) { fprintf(stderr, "BusPirate: Internal error: buspirate_getc() called from binmode"); - exit(1); + return EOF; } rc = serial_recv(&pgm->fd, &ch, 1); @@ -220,13 +220,13 @@ static char *buspirate_readline_noexit(struct programmer_t *pgm, char *buf, size static char *buspirate_readline(struct programmer_t *pgm, char *buf, size_t len) { char *ret; - + ret = buspirate_readline_noexit(pgm, buf, len); if (! ret) { fprintf(stderr, "%s: buspirate_readline(): programmer is not responding\n", progname); - exit(1); + return NULL; } return ret; } @@ -239,7 +239,7 @@ static int buspirate_send(struct programmer_t *pgm, char *str) if (pgm->flag & BP_FLAG_IN_BINMODE) { fprintf(stderr, "BusPirate: Internal error: buspirate_send() called from binmode"); - exit(1); + return -1; } rc = serial_send(&pgm->fd, (unsigned char *)str, strlen(str)); @@ -466,7 +466,7 @@ static void buspirate_reset_from_binmode(struct programmer_t *pgm) if (pgm->flag & BP_FLAG_IN_BINMODE) { fprintf(stderr, "BusPirate reset failed. You may need to powercycle it.\n"); - exit(1); + return; } if (verbose) @@ -574,14 +574,17 @@ static int buspirate_start_mode_bin(struct programmer_t *pgm) /* 0b0100wxyz - Configure peripherals w=power, x=pull-ups/aux2, y=AUX, z=CS * we want power (0x48) and all reset pins high. */ PDATA(pgm)->current_peripherals_config = 0x48 | PDATA(pgm)->reset; - buspirate_expect_bin_byte(pgm, PDATA(pgm)->current_peripherals_config, 0x01); + if (buspirate_expect_bin_byte(pgm, PDATA(pgm)->current_peripherals_config, 0x01) < 0) + return -1; usleep(50000); // sleep for 50ms after power up /* 01100xxx - Set speed */ - buspirate_expect_bin_byte(pgm, 0x60 | PDATA(pgm)->spifreq, 0x01); + if (buspirate_expect_bin_byte(pgm, 0x60 | PDATA(pgm)->spifreq, 0x01) < 0) + return -1; /* Submode config */ - buspirate_expect_bin_byte(pgm, submode->config, 0x01); + if (buspirate_expect_bin_byte(pgm, submode->config, 0x01) < 0) + return -1; /* AVR Extended Commands - test for existence */ if (pgm->flag & BP_FLAG_NOPAGEDREAD) { @@ -589,7 +592,10 @@ static int buspirate_start_mode_bin(struct programmer_t *pgm) fprintf(stderr, "%s: Paged flash read disabled.\n", progname); pgm->paged_load = NULL; } else { - if (buspirate_expect_bin_byte(pgm, 0x06, 0x01)) { + int rv = buspirate_expect_bin_byte(pgm, 0x06, 0x01); + if (rv < 0) + return -1; + if (rv) { strncpy(buf, "\x1\x0\x0", 3); buspirate_send_bin(pgm, buf, 1); buspirate_recv_bin(pgm, buf, 3); @@ -666,7 +672,7 @@ static void buspirate_enable(struct programmer_t *pgm) /* Ensure configuration is self-consistant: */ if (buspirate_verifyconfig(pgm)<0) - exit(1); + return; /* XXX should handle error */ /* Attempt to start binary SPI mode unless explicitly told otherwise: */ if (!buspirate_uses_ascii(pgm)) { @@ -692,14 +698,14 @@ static void buspirate_enable(struct programmer_t *pgm) rc = buspirate_send_bin(pgm, reset_str, strlen(reset_str)); if (rc) { fprintf(stderr, "BusPirate is not responding. Serial port error: %d\n", rc); - exit(1); + return; } while(1) { rcvd = buspirate_readline_noexit(pgm, NULL, 0); if (! rcvd) { fprintf(stderr, "%s: Fatal: Programmer is not responding.\n", progname); - exit(1); + return; } if (strncmp(rcvd, "Are you sure?", 13) == 0) { buspirate_send_bin(pgm, accept_str, strlen(accept_str)); @@ -720,7 +726,7 @@ static void buspirate_enable(struct programmer_t *pgm) fprintf(stderr, "BusPirate: using ASCII mode\n"); if (buspirate_start_spi_mode_ascii(pgm) < 0) { fprintf(stderr, "%s: Failed to start ascii SPI mode\n", progname); - exit(1); + return; } } } @@ -797,7 +803,10 @@ static int buspirate_cmd_bin(struct programmer_t *pgm, { /* 0001xxxx - Bulk transfer, send/read 1-16 bytes (0=1byte!) * we are sending 4 bytes -> 0x13 */ - if (!buspirate_expect_bin_byte(pgm, 0x13, 0x01)) + int rv = buspirate_expect_bin_byte(pgm, 0x13, 0x01); + if (rv < 0) + return -1; + if (rv == 0) return -1; buspirate_send_bin(pgm, (char *)cmd, 4); @@ -1013,7 +1022,7 @@ static int buspirate_paged_write(struct programmer_t *pgm, fprintf(stderr, "BusPirate: Fatal error: Write Then Read did not succeed.\n"); pgm->pgm_led(pgm, OFF); pgm->err_led(pgm, ON); - exit(1); + return -1; } /* Unset programming LED: */ @@ -1034,7 +1043,8 @@ static int buspirate_program_enable(struct programmer_t *pgm, AVRPART * p) if (pgm->flag & BP_FLAG_IN_BINMODE) { /* Clear configured reset pin(s): CS and/or AUX and/or AUX2 */ PDATA(pgm)->current_peripherals_config &= ~PDATA(pgm)->reset; - buspirate_expect_bin_byte(pgm, PDATA(pgm)->current_peripherals_config, 0x01); + if (buspirate_expect_bin_byte(pgm, PDATA(pgm)->current_peripherals_config, 0x01) < 0) + return -1; } else buspirate_expect(pgm, "{\n", "CS ENABLED", 1); @@ -1138,7 +1148,8 @@ static void buspirate_bb_enable(struct programmer_t *pgm) { char buf[20] = { '\0' }; - bitbang_check_prerequisites(pgm); + if (bitbang_check_prerequisites(pgm) < 0) + return; /* XXX should treat as error */ fprintf(stderr, "Attempting to initiate BusPirate bitbang binary mode...\n"); @@ -1157,7 +1168,7 @@ static void buspirate_bb_enable(struct programmer_t *pgm) if (sscanf(buf, "BBIO%d", &PDATA(pgm)->binmode_version) != 1) { fprintf(stderr, "Binary mode not confirmed: '%s'\n", buf); buspirate_reset_from_binmode(pgm); - exit(1); + return; } fprintf(stderr, "BusPirate binmode version: %d\n", PDATA(pgm)->binmode_version); diff --git a/butterfly.c b/butterfly.c index 68f26a62..3d4d6d37 100644 --- a/butterfly.c +++ b/butterfly.c @@ -92,7 +92,7 @@ static int butterfly_recv(PROGRAMMER * pgm, char * buf, size_t len) fprintf(stderr, "%s: butterfly_recv(): programmer is not responding\n", progname); - exit(1); + return -1; } return 0; } @@ -104,7 +104,7 @@ static int butterfly_drain(PROGRAMMER * pgm, int display) } -static void butterfly_vfy_cmd_sent(PROGRAMMER * pgm, char * errmsg) +static int butterfly_vfy_cmd_sent(PROGRAMMER * pgm, char * errmsg) { char c; @@ -112,8 +112,9 @@ static void butterfly_vfy_cmd_sent(PROGRAMMER * pgm, char * errmsg) if (c != '\r') { fprintf(stderr, "%s: error: programmer did not respond to command: %s\n", progname, errmsg); - exit(1); + return -1; } + return 0; } @@ -155,7 +156,8 @@ static int butterfly_vfy_led(PROGRAMMER * pgm, int value) static int butterfly_chip_erase(PROGRAMMER * pgm, AVRPART * p) { butterfly_send(pgm, "e", 1); - butterfly_vfy_cmd_sent(pgm, "chip erase"); + if (butterfly_vfy_cmd_sent(pgm, "chip erase") < 0) + return -1; return 0; } @@ -248,7 +250,7 @@ static int butterfly_initialize(PROGRAMMER * pgm, AVRPART * p) if ( c != 'M' && c != '?') { fprintf(stderr, "\nConnection FAILED."); - exit(1); + return -1; } else { @@ -317,7 +319,7 @@ static int butterfly_initialize(PROGRAMMER * pgm, AVRPART * p) fprintf(stderr, "%s: error: buffered memory access not supported. Maybe it isn't\n"\ "a butterfly/AVR109 but a AVR910 device?\n", progname); - exit(1); + return -1; }; butterfly_recv(pgm, &c, 1); PDATA(pgm)->buffersize = (unsigned int)(unsigned char)c<<8; @@ -355,7 +357,8 @@ static int butterfly_initialize(PROGRAMMER * pgm, AVRPART * p) buf[1] = devtype_1st; butterfly_send(pgm, buf, 2); - butterfly_vfy_cmd_sent(pgm, "select device"); + if (butterfly_vfy_cmd_sent(pgm, "select device") < 0) + return -1; if (verbose) fprintf(stderr, @@ -490,7 +493,8 @@ static int butterfly_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, return -1; butterfly_send(pgm, cmd, size); - butterfly_vfy_cmd_sent(pgm, "write byte"); + if (butterfly_vfy_cmd_sent(pgm, "write byte") < 0) + return -1; return 0; } @@ -619,7 +623,8 @@ static int butterfly_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, #if 0 usleep(1000000); butterfly_send(pgm, "y", 1); - butterfly_vfy_cmd_sent(pgm, "clear LED"); + if (butterfly_vfy_cmd_sent(pgm, "clear LED") < 0) + return -1; #endif cmd = malloc(4+blocksize); @@ -636,7 +641,8 @@ static int butterfly_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, cmd[2] = blocksize & 0xff; butterfly_send(pgm, cmd, 4+blocksize); - butterfly_vfy_cmd_sent(pgm, "write block"); + if (butterfly_vfy_cmd_sent(pgm, "write block") < 0) + return -1; addr += blocksize; } /* while */ diff --git a/config.c b/config.c index a63d5456..961eab1d 100644 --- a/config.c +++ b/config.c @@ -87,13 +87,6 @@ int yywrap() } -int yyerror(char * errmsg) -{ - fprintf(stderr, "%s: %s at %s:%d\n", progname, errmsg, infile, lineno); - exit(1); -} - - TOKEN * new_token(int primary) { TOKEN * tkn; @@ -184,7 +177,6 @@ TOKEN * hexnumber(char * text) if ((e == text) || (*e != 0)) { fprintf(stderr, "error at %s:%d: can't scan hex number \"%s\"\n", infile, lineno, text); - exit(1); } #if DEBUG diff --git a/flip2.c b/flip2.c index 8ce293ad..0e72c2b5 100644 --- a/flip2.c +++ b/flip2.c @@ -830,7 +830,7 @@ int flip2_write_max1k(struct dfu_dev *dfu, if (size > 0x400) { fprintf(stderr, "%s: Error: Write block too large (%hu > 1024)\n", progname, size); - exit(1); + return -1; } /* There are some special padding requirements for writes. The first packet diff --git a/ft245r.c b/ft245r.c index 5a85d7e5..4874afc7 100644 --- a/ft245r.c +++ b/ft245r.c @@ -171,7 +171,6 @@ static void add_to_buf (unsigned char c) { if (nh == tail) { fprintf (stderr, "buffer overflow. Cannot happen!\n"); - //exit (1); } buffer[head] = c; head = nh; diff --git a/jtagmkI.c b/jtagmkI.c index a68affc4..2ff423bc 100644 --- a/jtagmkI.c +++ b/jtagmkI.c @@ -218,7 +218,7 @@ static int jtagmkI_send(PROGRAMMER * pgm, unsigned char * data, size_t len) fprintf(stderr, "%s: jtagmkI_send(): failed to send command to serial port\n", progname); - exit(1); + return -1; } free(buf); @@ -226,18 +226,19 @@ static int jtagmkI_send(PROGRAMMER * pgm, unsigned char * data, size_t len) return 0; } -static void jtagmkI_recv(PROGRAMMER * pgm, unsigned char * buf, size_t len) +static int jtagmkI_recv(PROGRAMMER * pgm, unsigned char * buf, size_t len) { if (serial_recv(&pgm->fd, buf, len) != 0) { fprintf(stderr, "\n%s: jtagmkI_recv(): failed to send command to serial port\n", progname); - exit(1); + return -1; } if (verbose >= 3) { putc('\n', stderr); jtagmkI_prmsg(pgm, buf, len); } + return 0; } @@ -345,7 +346,8 @@ static int jtagmkI_getsync(PROGRAMMER * pgm) buf[0] = CMD_GET_SIGNON; jtagmkI_send(pgm, buf, 1); - jtagmkI_recv(pgm, resp, 9); + if (jtagmkI_recv(pgm, resp, 9) < 0) + return -1; if (verbose >= 2) { resp[8] = '\0'; fprintf(stderr, "got %s\n", resp + 1); @@ -366,7 +368,8 @@ static int jtagmkI_chip_erase(PROGRAMMER * pgm, AVRPART * p) fprintf(stderr, "%s: jtagmkI_chip_erase(): Sending chip erase command: ", progname); jtagmkI_send(pgm, buf, 1); - jtagmkI_recv(pgm, resp, 2); + if (jtagmkI_recv(pgm, resp, 2) < 0) + return -1; if (resp[0] != RESP_OK) { if (verbose >= 2) putc('\n', stderr); @@ -416,7 +419,8 @@ static void jtagmkI_set_devdescr(PROGRAMMER * pgm, AVRPART * p) progname); jtagmkI_send(pgm, (unsigned char *)&sendbuf, sizeof(sendbuf)); - jtagmkI_recv(pgm, resp, 2); + if (jtagmkI_recv(pgm, resp, 2) < 0) + return; if (resp[0] != RESP_OK) { if (verbose >= 2) putc('\n', stderr); @@ -443,7 +447,8 @@ static int jtagmkI_reset(PROGRAMMER * pgm) progname); jtagmkI_send(pgm, buf, 1); - jtagmkI_recv(pgm, resp, 2); + if (jtagmkI_recv(pgm, resp, 2) < 0) + return -1; if (resp[0] != RESP_OK) { if (verbose >= 2) putc('\n', stderr); @@ -480,7 +485,8 @@ static int jtagmkI_program_enable(PROGRAMMER * pgm) progname); jtagmkI_send(pgm, buf, 1); - jtagmkI_recv(pgm, resp, 2); + if (jtagmkI_recv(pgm, resp, 2) < 0) + return -1; if (resp[0] != RESP_OK) { if (verbose >= 2) putc('\n', stderr); @@ -514,7 +520,8 @@ static int jtagmkI_program_disable(PROGRAMMER * pgm) progname); jtagmkI_send(pgm, buf, 1); - jtagmkI_recv(pgm, resp, 2); + if (jtagmkI_recv(pgm, resp, 2) < 0) + return -1; if (resp[0] != RESP_OK) { if (verbose >= 2) putc('\n', stderr); @@ -588,7 +595,8 @@ static int jtagmkI_initialize(PROGRAMMER * pgm, AVRPART * p) cmd[0] = CMD_STOP; jtagmkI_send(pgm, cmd, 1); - jtagmkI_recv(pgm, resp, 5); + if (jtagmkI_recv(pgm, resp, 5) < 0) + return -1; if (resp[0] != RESP_OK) { if (verbose >= 2) putc('\n', stderr); @@ -822,7 +830,8 @@ static int jtagmkI_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, /* First part, send the write command. */ jtagmkI_send(pgm, cmd, 6); - jtagmkI_recv(pgm, resp, 1); + if (jtagmkI_recv(pgm, resp, 1) < 0) + return -1; if (resp[0] != RESP_OK) { if (verbose >= 2) putc('\n', stderr); @@ -851,7 +860,8 @@ static int jtagmkI_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, /* Second, send the data command. */ jtagmkI_send(pgm, datacmd, send_size + 1); - jtagmkI_recv(pgm, resp, 2); + if (jtagmkI_recv(pgm, resp, 2) < 0) + return -1; if (resp[1] != RESP_OK) { if (verbose >= 2) putc('\n', stderr); @@ -944,7 +954,8 @@ static int jtagmkI_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, progname); jtagmkI_send(pgm, cmd, 6); - jtagmkI_recv(pgm, resp, read_size + 3); + if (jtagmkI_recv(pgm, resp, read_size + 3) < 0) + return -1; if (resp[read_size + 3 - 1] != RESP_OK) { if (verbose >= 2) @@ -1060,7 +1071,8 @@ static int jtagmkI_read_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, } jtagmkI_send(pgm, cmd, 6); - jtagmkI_recv(pgm, resp, respsize); + if (jtagmkI_recv(pgm, resp, respsize) < 0) + return -1; if (resp[respsize - 1] != RESP_OK) { if (verbose >= 2) @@ -1069,7 +1081,7 @@ static int jtagmkI_read_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, "%s: jtagmkI_read_byte(): " "timeout/error communicating with programmer (resp %c)\n", progname, resp[respsize - 1]); - exit(1); + return -1; } else { if (verbose == 2) fprintf(stderr, "OK\n"); @@ -1146,7 +1158,8 @@ static int jtagmkI_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, } /* First part, send the write command. */ jtagmkI_send(pgm, cmd, 6); - jtagmkI_recv(pgm, resp, 1); + if (jtagmkI_recv(pgm, resp, 1) < 0) + return -1; if (resp[0] != RESP_OK) { if (verbose >= 2) putc('\n', stderr); @@ -1176,7 +1189,8 @@ static int jtagmkI_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, datacmd[1] = writedata; } jtagmkI_send(pgm, datacmd, len); - jtagmkI_recv(pgm, resp, 1); + if (jtagmkI_recv(pgm, resp, 1) < 0) + return -1; if (resp[0] != RESP_OK) { if (verbose >= 2) putc('\n', stderr); @@ -1242,7 +1256,8 @@ static int jtagmkI_getparm(PROGRAMMER * pgm, unsigned char parm, progname, parm); jtagmkI_send(pgm, buf, 2); - jtagmkI_recv(pgm, resp, 3); + if (jtagmkI_recv(pgm, resp, 3) < 0) + return -1; if (resp[0] != RESP_OK) { if (verbose >= 2) putc('\n', stderr); @@ -1288,7 +1303,8 @@ static int jtagmkI_setparm(PROGRAMMER * pgm, unsigned char parm, "Sending set parameter command (parm 0x%02x): ", progname, parm); jtagmkI_send(pgm, buf, 3); - jtagmkI_recv(pgm, resp, 2); + if (jtagmkI_recv(pgm, resp, 2) < 0) + return -1; if (resp[0] != RESP_OK) { if (verbose >= 2) putc('\n', stderr); diff --git a/jtagmkII.c b/jtagmkII.c index e7f4d3b1..c641e8a0 100644 --- a/jtagmkII.c +++ b/jtagmkII.c @@ -449,7 +449,7 @@ int jtagmkII_send(PROGRAMMER * pgm, unsigned char * data, size_t len) fprintf(stderr, "%s: jtagmkII_send(): failed to send command to serial port\n", progname); - exit(1); + return -1; } free(buf); diff --git a/linuxgpio.c b/linuxgpio.c index a02bc34c..5138713b 100644 --- a/linuxgpio.c +++ b/linuxgpio.c @@ -247,7 +247,8 @@ static int linuxgpio_open(PROGRAMMER *pgm, char *port) { int r, i, pin; - bitbang_check_prerequisites(pgm); + if (bitbang_check_prerequisites(pgm) < 0 + return -1; for (i=0; ifd); if (pgm->fd.ifd < 0) { fprintf(stderr, "%s: failed to open parallel port \"%s\"\n\n", progname, port); - exit(1); + return -1; } /* diff --git a/pgm.c b/pgm.c index 897917a6..bf3a9fbe 100644 --- a/pgm.c +++ b/pgm.c @@ -41,7 +41,7 @@ static int pgm_default_open (struct programmer_t *pgm, char * name) { fprintf (stderr, "\n%s: Fatal error: Programmer does not support open()", progname); - exit(1); + return -1; } static int pgm_default_led (struct programmer_t * pgm, int value) diff --git a/pickit2.c b/pickit2.c index 1221f350..a9836695 100644 --- a/pickit2.c +++ b/pickit2.c @@ -196,7 +196,7 @@ static int pickit2_open(PROGRAMMER * pgm, char * port) fprintf(stderr, "%s: error: could not find PICkit2 with vid=0x%x pid=0x%x\n", progname, PICKIT2_VID, PICKIT2_PID); - exit(1); + return -1; } else { @@ -218,7 +218,7 @@ static int pickit2_open(PROGRAMMER * pgm, char * port) fprintf(stderr, "%s: error: could not find PICkit2 with vid=0x%x pid=0x%x\n", progname, PICKIT2_VID, PICKIT2_PID); - exit(1); + return -1; } #endif @@ -1340,8 +1340,6 @@ static int pickit2_nousb_open (struct programmer_t *pgm, char * name) { "%s: error: no usb support. Please compile again with libusb installed.\n", #endif progname); - - exit(1); } void pickit2_initpgm (PROGRAMMER * pgm) diff --git a/pindefs.c b/pindefs.c index 71f0898d..157fe158 100644 --- a/pindefs.c +++ b/pindefs.c @@ -57,14 +57,14 @@ void pin_clear_all(struct pindef_t * const pindef) { * @param[in] pindef new pin definition structure * @param[out] pinno old pin definition integer */ -static void pin_fill_old_pinno(const struct pindef_t * const pindef, unsigned int * const pinno) { +static int pin_fill_old_pinno(const struct pindef_t * const pindef, unsigned int * const pinno) { bool found = false; int i; for(i = 0; i < PIN_MAX; i++) { if(pindef->mask[i / PIN_FIELD_ELEMENT_SIZE] & (1 << (i % PIN_FIELD_ELEMENT_SIZE))) { if(found) { fprintf(stderr, "Multiple pins found\n"); //TODO - exit(1); + return -1; } found = true; *pinno = i; @@ -73,6 +73,7 @@ static void pin_fill_old_pinno(const struct pindef_t * const pindef, unsigned in } } } + return 0; } /** @@ -81,14 +82,14 @@ static void pin_fill_old_pinno(const struct pindef_t * const pindef, unsigned in * @param[in] pindef new pin definition structure * @param[out] pinno old pin definition integer */ -static void pin_fill_old_pinlist(const struct pindef_t * const pindef, unsigned int * const pinno) { +static int pin_fill_old_pinlist(const struct pindef_t * const pindef, unsigned int * const pinno) { int i; for(i = 0; i < PIN_FIELD_SIZE; i++) { if(i == 0) { if((pindef->mask[i] & ~PIN_MASK) != 0) { fprintf(stderr, "Pins of higher index than max field size for old pinno found\n"); - exit(1); + return -1; } if (pindef->mask[i] == 0) { /* this pin function is not using any pins */ @@ -100,13 +101,14 @@ static void pin_fill_old_pinlist(const struct pindef_t * const pindef, unsigned *pinno = pindef->mask[i]; } else { fprintf(stderr, "pins have different polarity set\n"); - exit(1); + return -1; } } else if(pindef->mask[i] != 0) { fprintf(stderr, "Pins have higher number than fit in old format\n"); - exit(1); + return -1; } } + return 0; } @@ -115,19 +117,30 @@ static void pin_fill_old_pinlist(const struct pindef_t * const pindef, unsigned * * @param[inout] pgm programmer whose pins shall be converted. */ -void pgm_fill_old_pins(struct programmer_t * const pgm) { +int pgm_fill_old_pins(struct programmer_t * const pgm) { - pin_fill_old_pinlist(&(pgm->pin[PPI_AVR_VCC]), &(pgm->pinno[PPI_AVR_VCC])); - pin_fill_old_pinlist(&(pgm->pin[PPI_AVR_BUFF]), &(pgm->pinno[PPI_AVR_BUFF])); - pin_fill_old_pinno(&(pgm->pin[PIN_AVR_RESET]), &(pgm->pinno[PIN_AVR_RESET])); - pin_fill_old_pinno(&(pgm->pin[PIN_AVR_SCK]), &(pgm->pinno[PIN_AVR_SCK])); - pin_fill_old_pinno(&(pgm->pin[PIN_AVR_MOSI]), &(pgm->pinno[PIN_AVR_MOSI])); - pin_fill_old_pinno(&(pgm->pin[PIN_AVR_MISO]), &(pgm->pinno[PIN_AVR_MISO])); - pin_fill_old_pinno(&(pgm->pin[PIN_LED_ERR]), &(pgm->pinno[PIN_LED_ERR])); - pin_fill_old_pinno(&(pgm->pin[PIN_LED_RDY]), &(pgm->pinno[PIN_LED_RDY])); - pin_fill_old_pinno(&(pgm->pin[PIN_LED_PGM]), &(pgm->pinno[PIN_LED_PGM])); - pin_fill_old_pinno(&(pgm->pin[PIN_LED_VFY]), &(pgm->pinno[PIN_LED_VFY])); + if (pin_fill_old_pinlist(&(pgm->pin[PPI_AVR_VCC]), &(pgm->pinno[PPI_AVR_VCC])) < 0) + return -1; + if (pin_fill_old_pinlist(&(pgm->pin[PPI_AVR_BUFF]), &(pgm->pinno[PPI_AVR_BUFF])) < 0) + return -1; + if (pin_fill_old_pinno(&(pgm->pin[PIN_AVR_RESET]), &(pgm->pinno[PIN_AVR_RESET])) < 0) + return -1; + if (pin_fill_old_pinno(&(pgm->pin[PIN_AVR_SCK]), &(pgm->pinno[PIN_AVR_SCK])) < 0) + return -1; + if (pin_fill_old_pinno(&(pgm->pin[PIN_AVR_MOSI]), &(pgm->pinno[PIN_AVR_MOSI])) < 0) + return -1; + if (pin_fill_old_pinno(&(pgm->pin[PIN_AVR_MISO]), &(pgm->pinno[PIN_AVR_MISO])) < 0) + return -1; + if (pin_fill_old_pinno(&(pgm->pin[PIN_LED_ERR]), &(pgm->pinno[PIN_LED_ERR])) < 0) + return -1; + if (pin_fill_old_pinno(&(pgm->pin[PIN_LED_RDY]), &(pgm->pinno[PIN_LED_RDY])) < 0) + return -1; + if (pin_fill_old_pinno(&(pgm->pin[PIN_LED_PGM]), &(pgm->pinno[PIN_LED_PGM])) < 0) + return -1; + if (pin_fill_old_pinno(&(pgm->pin[PIN_LED_VFY]), &(pgm->pinno[PIN_LED_VFY])) < 0) + return -1; + return 0; } /** diff --git a/pindefs.h b/pindefs.h index a227b681..8e1421cd 100644 --- a/pindefs.h +++ b/pindefs.h @@ -148,7 +148,7 @@ struct programmer_t; /* forward declaration */ * * @param[inout] pgm programmer whose pins shall be converted. */ -void pgm_fill_old_pins(struct programmer_t * const pgm); +int pgm_fill_old_pins(struct programmer_t * const pgm); /** * This function checks all pin of pgm against the constraints given in the checklist. diff --git a/ser_avrdoper.c b/ser_avrdoper.c index 9aa4e133..d061d693 100644 --- a/ser_avrdoper.c +++ b/ser_avrdoper.c @@ -519,8 +519,7 @@ static int avrdoper_open(char *port, union pinfo pinfo, union filedescriptor *fd rval = usbOpenDevice(fdp, USB_VENDOR_ID, vname, USB_PRODUCT_ID, devname, 1); if(rval != 0){ fprintf(stderr, "%s: avrdoper_open(): %s\n", progname, usbErrorText(rval)); - exit(1); - //return -1; + return -1; } return 0; } @@ -563,7 +562,7 @@ static int avrdoper_send(union filedescriptor *fdp, unsigned char *buf, size_t b reportDataSizes[lenIndex] + 2); if(rval != 0){ fprintf(stderr, "%s: avrdoper_send(): %s\n", progname, usbErrorText(rval)); - exit(1); + return -1; } buflen -= thisLen; buf += thisLen; @@ -573,7 +572,7 @@ static int avrdoper_send(union filedescriptor *fdp, unsigned char *buf, size_t b /* ------------------------------------------------------------------------- */ -static void avrdoperFillBuffer(union filedescriptor *fdp) +static int avrdoperFillBuffer(union filedescriptor *fdp) { int bytesPending = reportDataSizes[1]; /* guess how much data is buffered in device */ @@ -589,7 +588,7 @@ static void avrdoperFillBuffer(union filedescriptor *fdp) (char *)buffer, &len); if(usbErr != 0){ fprintf(stderr, "%s: avrdoperFillBuffer(): %s\n", progname, usbErrorText(usbErr)); - exit(1); + return -1; } if(verbose > 3) fprintf(stderr, "Received %d bytes data chunk of total %d\n", len - 2, buffer[1]); @@ -601,11 +600,12 @@ static void avrdoperFillBuffer(union filedescriptor *fdp) fprintf(stderr, "%s: avrdoperFillBuffer(): internal error: buffer overflow\n", progname); - exit(1); + return -1; } memcpy(avrdoperRxBuffer + avrdoperRxLength, buffer + 2, len); avrdoperRxLength += len; } + return 0; } static int avrdoper_recv(union filedescriptor *fdp, unsigned char *buf, size_t buflen) @@ -616,7 +616,8 @@ static int avrdoper_recv(union filedescriptor *fdp, unsigned char *buf, size_t b while(remaining > 0){ int len, available = avrdoperRxLength - avrdoperRxPosition; if(available <= 0){ /* buffer is empty */ - avrdoperFillBuffer(fdp); + if (avrdoperFillBuffer(fdp) < 0) + return -1; continue; } len = remaining < available ? remaining : available; @@ -635,7 +636,8 @@ static int avrdoper_recv(union filedescriptor *fdp, unsigned char *buf, size_t b static int avrdoper_drain(union filedescriptor *fdp, int display) { do{ - avrdoperFillBuffer(fdp); + if (avrdoperFillBuffer(fdp) < 0) + return -1; }while(avrdoperRxLength > 0); return 0; } diff --git a/ser_posix.c b/ser_posix.c index 5797e0e5..fd244076 100644 --- a/ser_posix.c +++ b/ser_posix.c @@ -347,7 +347,7 @@ static int ser_send(union filedescriptor *fd, unsigned char * buf, size_t buflen if (rc < 0) { fprintf(stderr, "%s: ser_send(): write error: %s\n", progname, strerror(errno)); - exit(1); + return -1; } p += rc; len -= rc; @@ -393,7 +393,7 @@ static int ser_recv(union filedescriptor *fd, unsigned char * buf, size_t buflen else { fprintf(stderr, "%s: ser_recv(): select(): %s\n", progname, strerror(errno)); - exit(1); + return -1; } } @@ -401,7 +401,7 @@ static int ser_recv(union filedescriptor *fd, unsigned char * buf, size_t buflen if (rc < 0) { fprintf(stderr, "%s: ser_recv(): read error: %s\n", progname, strerror(errno)); - exit(1); + return -1; } p += rc; len += rc; @@ -468,7 +468,7 @@ static int ser_drain(union filedescriptor *fd, int display) else { fprintf(stderr, "%s: ser_drain(): select(): %s\n", progname, strerror(errno)); - exit(1); + return -1; } } @@ -476,7 +476,7 @@ static int ser_drain(union filedescriptor *fd, int display) if (rc < 0) { fprintf(stderr, "%s: ser_drain(): read error: %s\n", progname, strerror(errno)); - exit(1); + return -1; } if (display) { fprintf(stderr, "%02x ", buf); diff --git a/ser_win32.c b/ser_win32.c index 7ecb20be..bf986e1a 100644 --- a/ser_win32.c +++ b/ser_win32.c @@ -236,7 +236,7 @@ static int ser_send(union filedescriptor *fd, unsigned char * buf, size_t buflen if (hComPort == INVALID_HANDLE_VALUE) { fprintf(stderr, "%s: ser_send(): port not open\n", progname); - exit(1); + return -1; } if (!len) @@ -266,13 +266,13 @@ static int ser_send(union filedescriptor *fd, unsigned char * buf, size_t buflen if (!WriteFile (hComPort, buf, buflen, &written, NULL)) { fprintf(stderr, "%s: ser_send(): write error: %s\n", progname, "sorry no info avail"); // TODO - exit(1); + return -1; } if (written != buflen) { fprintf(stderr, "%s: ser_send(): size/send mismatch\n", progname); - exit(1); + return -1; } return 0; @@ -290,7 +290,7 @@ static int ser_recv(union filedescriptor *fd, unsigned char * buf, size_t buflen if (hComPort == INVALID_HANDLE_VALUE) { fprintf(stderr, "%s: ser_read(): port not open\n", progname); - exit(1); + return -1; } serial_w32SetTimeOut(hComPort, serial_recv_timeout); @@ -310,7 +310,7 @@ static int ser_recv(union filedescriptor *fd, unsigned char * buf, size_t buflen fprintf(stderr, "%s: ser_recv(): read error: %s\n", progname, (char*)lpMsgBuf); LocalFree( lpMsgBuf ); - exit(1); + return -1; } /* time out detected */ @@ -359,7 +359,7 @@ static int ser_drain(union filedescriptor *fd, int display) if (hComPort == INVALID_HANDLE_VALUE) { fprintf(stderr, "%s: ser_drain(): port not open\n", progname); - exit(1); + return -1; } serial_w32SetTimeOut(hComPort,250); @@ -385,7 +385,7 @@ static int ser_drain(union filedescriptor *fd, int display) fprintf(stderr, "%s: ser_drain(): read error: %s\n", progname, (char*)lpMsgBuf); LocalFree( lpMsgBuf ); - exit(1); + return -1; } if (read) { // data avail diff --git a/serbb_posix.c b/serbb_posix.c index 6d5b0c84..30e6c210 100644 --- a/serbb_posix.c +++ b/serbb_posix.c @@ -225,7 +225,8 @@ static int serbb_open(PROGRAMMER *pgm, char *port) int flags; int r; - bitbang_check_prerequisites(pgm); + if (bitbang_check_prerequisites(pgm) < 0) + return -1; /* adapted from uisp code */ diff --git a/serbb_win32.c b/serbb_win32.c index 2289c66b..54f1d407 100644 --- a/serbb_win32.c +++ b/serbb_win32.c @@ -124,7 +124,7 @@ static int serbb_setpin(PROGRAMMER * pgm, int pinfunc, int value) progname, (char *)lpMsgBuf); CloseHandle(hComPort); LocalFree(lpMsgBuf); - exit(1); + return -1; } if (pgm->ispdelay > 1) @@ -171,7 +171,7 @@ static int serbb_getpin(PROGRAMMER * pgm, int pinfunc) progname, (char *)lpMsgBuf); CloseHandle(hComPort); LocalFree(lpMsgBuf); - exit(1); + return -1; } if (verbose > 4) fprintf(stderr, @@ -271,7 +271,8 @@ static int serbb_open(PROGRAMMER *pgm, char *port) LPVOID lpMsgBuf; HANDLE hComPort = INVALID_HANDLE_VALUE; - bitbang_check_prerequisites(pgm); + if (bitbang_check_prerequisites(pgm) < 0 + return -1; hComPort = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); diff --git a/stk500.c b/stk500.c index 1266d41f..1ac1f7d0 100644 --- a/stk500.c +++ b/stk500.c @@ -154,23 +154,23 @@ static int stk500_cmd(PROGRAMMER * pgm, const unsigned char *cmd, stk500_send(pgm, buf, 6); if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] != Resp_STK_INSYNC) { fprintf(stderr, "%s: stk500_cmd(): programmer is out of sync\n", progname); - exit(1); + return -1; } res[0] = cmd[1]; res[1] = cmd[2]; res[2] = cmd[3]; if (stk500_recv(pgm, &res[3], 1) < 0) - exit(1); + return -1; if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] != Resp_STK_OK) { fprintf(stderr, "%s: stk500_cmd(): protocol error\n", progname); - exit(1); + return -1; } return 0; @@ -231,7 +231,7 @@ static int stk500_program_enable(PROGRAMMER * pgm, AVRPART * p) stk500_send(pgm, buf, 2); if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_NOSYNC) { if (tries > 33) { fprintf(stderr, "%s: stk500_program_enable(): can't get into sync\n", @@ -251,7 +251,7 @@ static int stk500_program_enable(PROGRAMMER * pgm, AVRPART * p) } if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_OK) { return 0; } @@ -298,7 +298,7 @@ static int stk500_set_extended_parms(PROGRAMMER * pgm, int n, stk500_send(pgm, buf, i+1); if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_NOSYNC) { if (tries > 33) { fprintf(stderr, "%s: stk500_set_extended_parms(): can't get into sync\n", @@ -318,7 +318,7 @@ static int stk500_set_extended_parms(PROGRAMMER * pgm, int n, } if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_OK) { return 0; } @@ -370,7 +370,7 @@ static int mib510_isp(PROGRAMMER * pgm, unsigned char cmd) stk500_send(pgm, buf, 9); if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_NOSYNC) { if (tries > 33) { fprintf(stderr, "%s: mib510_isp(): can't get into sync\n", @@ -390,7 +390,7 @@ static int mib510_isp(PROGRAMMER * pgm, unsigned char cmd) } if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_OK) { return 0; } @@ -542,7 +542,7 @@ static int stk500_initialize(PROGRAMMER * pgm, AVRPART * p) stk500_send(pgm, buf, 22); if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_NOSYNC) { fprintf(stderr, "%s: stk500_initialize(): programmer not in sync, resp=0x%02x\n", @@ -562,7 +562,7 @@ static int stk500_initialize(PROGRAMMER * pgm, AVRPART * p) } if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] != Resp_STK_OK) { fprintf(stderr, "%s: stk500_initialize(): (b) protocol error, " @@ -606,7 +606,7 @@ static int stk500_initialize(PROGRAMMER * pgm, AVRPART * p) rc = stk500_set_extended_parms(pgm, n_extparms+1, buf); if (rc) { fprintf(stderr, "%s: stk500_initialize(): failed\n", progname); - exit(1); + return -1; } } @@ -628,7 +628,7 @@ static void stk500_disable(PROGRAMMER * pgm) stk500_send(pgm, buf, 2); if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return; if (buf[0] == Resp_STK_NOSYNC) { if (tries > 33) { fprintf(stderr, "%s: stk500_disable(): can't get into sync\n", @@ -648,7 +648,7 @@ static void stk500_disable(PROGRAMMER * pgm) } if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return; if (buf[0] == Resp_STK_OK) { return; } @@ -740,7 +740,7 @@ static int stk500_loadaddr(PROGRAMMER * pgm, AVRMEM * mem, unsigned int addr) stk500_send(pgm, buf, 4); if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_NOSYNC) { if (tries > 33) { fprintf(stderr, "%s: stk500_loadaddr(): can't get into sync\n", @@ -760,7 +760,7 @@ static int stk500_loadaddr(PROGRAMMER * pgm, AVRMEM * mem, unsigned int addr) } if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_OK) { return 0; } @@ -839,7 +839,7 @@ static int stk500_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, stk500_send( pgm, buf, i); if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_NOSYNC) { if (tries > 33) { fprintf(stderr, "\n%s: stk500_paged_write(): can't get into sync\n", @@ -859,7 +859,7 @@ static int stk500_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, } if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] != Resp_STK_OK) { fprintf(stderr, "\n%s: stk500_paged_write(): (a) protocol error, " @@ -922,7 +922,7 @@ static int stk500_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, stk500_send(pgm, buf, 5); if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_NOSYNC) { if (tries > 33) { fprintf(stderr, "\n%s: stk500_paged_load(): can't get into sync\n", @@ -942,10 +942,10 @@ static int stk500_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, } if (stk500_recv(pgm, &m->buf[addr], block_size) < 0) - exit(1); + return -1; if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if(strcmp(ldata(lfirst(pgm->id)), "mib510") == 0) { if (buf[0] != Resp_STK_INSYNC) { @@ -1118,7 +1118,7 @@ static int stk500_getparm(PROGRAMMER * pgm, unsigned parm, unsigned * value) stk500_send(pgm, buf, 3); if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_NOSYNC) { if (tries > 33) { fprintf(stderr, "\n%s: stk500_getparm(): can't get into sync\n", @@ -1138,11 +1138,11 @@ static int stk500_getparm(PROGRAMMER * pgm, unsigned parm, unsigned * value) } if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; v = buf[0]; if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_FAILED) { fprintf(stderr, "\n%s: stk500_getparm(): parameter 0x%02x failed\n", @@ -1178,7 +1178,7 @@ static int stk500_setparm(PROGRAMMER * pgm, unsigned parm, unsigned value) stk500_send(pgm, buf, 4); if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_NOSYNC) { if (tries > 33) { fprintf(stderr, "\n%s: stk500_setparm(): can't get into sync\n", @@ -1198,13 +1198,13 @@ static int stk500_setparm(PROGRAMMER * pgm, unsigned parm, unsigned value) } if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_OK) return 0; parm = buf[0]; /* if not STK_OK, we've been echoed parm here */ if (stk500_recv(pgm, buf, 1) < 0) - exit(1); + return -1; if (buf[0] == Resp_STK_FAILED) { fprintf(stderr, "\n%s: stk500_setparm(): parameter 0x%02x failed\n", @@ -1310,7 +1310,7 @@ static void stk500_setup(PROGRAMMER * pgm) fprintf(stderr, "%s: stk500_setup(): Out of memory allocating private data\n", progname); - exit(1); + return; } memset(pgm->cookie, 0, sizeof(struct pdata)); PDATA(pgm)->ext_addr_byte = 0xff; /* Ensures it is programmed before diff --git a/stk500v2.c b/stk500v2.c index a37960b1..23210c02 100644 --- a/stk500v2.c +++ b/stk500v2.c @@ -393,7 +393,7 @@ static int stk500v2_send_mk2(PROGRAMMER * pgm, unsigned char * data, size_t len) { if (serial_send(&pgm->fd, data, len) != 0) { fprintf(stderr,"%s: stk500_send_mk2(): failed to send command to serial port\n",progname); - exit(1); + return -1; } return 0; @@ -518,7 +518,7 @@ static int stk500v2_send(PROGRAMMER * pgm, unsigned char * data, size_t len) if (serial_send(&pgm->fd, buf, len+6) != 0) { fprintf(stderr,"%s: stk500_send(): failed to send command to serial port\n",progname); - exit(1); + return -1; } return 0; @@ -1562,7 +1562,6 @@ static void stk500hv_disable(PROGRAMMER * pgm, enum hvmode mode) "%s: stk500hv_disable(): " "failed to leave programming mode\n", progname); - exit(1); } return; @@ -2086,7 +2085,10 @@ static int stk500hv_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, */ buf[3] = 0x80 | 0x40; if (pagesize > 2) { - buf[3] |= stk500v2_mode_for_pagesize(pagesize); + unsigned int rv = stk500v2_mode_for_pagesize(pagesize); + if (rv == 0) + return -1; + buf[3] |= rv; buf[3] |= 0x01; } buf[4] = mem->delay; @@ -2441,7 +2443,10 @@ static int stk500hv_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, */ commandbuf[3] = 0x80 | 0x40; if (page_size > 2) { - commandbuf[3] |= stk500v2_mode_for_pagesize(page_size); + unsigned int rv = stk500v2_mode_for_pagesize(page_size); + if (rv == 0) + return -1; + commandbuf[3] |= rv; commandbuf[3] |= 0x01; } commandbuf[4] = m->delay; @@ -2867,7 +2872,7 @@ static unsigned int stk500v2_mode_for_pagesize(unsigned int pagesize) fprintf(stderr, "%s: stk500v2_mode_for_pagesize(): invalid pagesize: %u\n", progname, pagesize); - exit(1); + return 0; } /*