Index: pindefs.c =================================================================== --- pindefs.c (Revision 0) +++ pindefs.c (Arbeitskopie) @@ -0,0 +1,98 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000-2004 Brian S. Dean + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* $Id: pindefs.h 1132 2013-01-09 19:23:30Z rliebscher $ */ + +#include +#include +#include +#include "pindefs.h" +#include "pgm.h" + +void pin_set_value(struct pindef_t * const pindef, const int pin, const bool inverse){ + + pindef->mask[pin/PIN_FIELD_ELEMENT_SIZE] |= 1 << (pin % PIN_FIELD_ELEMENT_SIZE); + if (inverse) + pindef->inverse[pin/PIN_FIELD_ELEMENT_SIZE] |= (1 << (pin % PIN_FIELD_ELEMENT_SIZE)); + else + pindef->inverse[pin/PIN_FIELD_ELEMENT_SIZE] &= ~(1 << (pin % PIN_FIELD_ELEMENT_SIZE)); +} + +void pin_clear_all(struct pindef_t * const pindef){ + memset(pindef,0,sizeof(struct pindef_t)); +} + +/* Convert new pin definition to old pin number */ +static void pin_fill_old_pinno(const struct pindef_t * const pindef, unsigned int * const pinno){ + bool found = false; + int i; + for (i=0;imask[i/PIN_FIELD_ELEMENT_SIZE] & (1 << (i % PIN_FIELD_ELEMENT_SIZE))){ + if(found){ + fprintf(stderr,"Multiple pins found\n"); //TODO + exit(1); + } + found = true; + *pinno = i; + if (pindef->inverse[i/PIN_FIELD_ELEMENT_SIZE] & (1 << (i % PIN_FIELD_ELEMENT_SIZE))){ + *pinno |= PIN_INVERSE; + } + } + } +} + +/* Convert new pin definition to old pinlist, does not support mixed inverted/non-inverted pin */ +static void pin_fill_old_pinlist(const struct pindef_t * const pindef, unsigned int * const pinno){ + int i; + + for (i=0;imask[i] & ~PIN_MASK) != 0){ + fprintf(stderr,"Pins of higher index than max field size for old pinno found\n"); + exit(1); + } + if (pindef->mask[i] == pindef->inverse[i]) { /* all set bits in mask are set in inverse */ + *pinno = pindef->mask[i]; + *pinno |= PIN_INVERSE; + } else if (pindef->mask[i] == ((~pindef->inverse[i]) & pindef->mask[i])) { /* all set bits in mask are cleared in inverse */ + *pinno = pindef->mask[i]; + } else { + fprintf(stderr,"pins have different polarity set\n"); + exit(1); + } + } else if (pindef->mask[i] != 0){ + fprintf(stderr,"Pins have higher number than fit in old format\n"); + exit(1); + } + } +} + +void 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])); + +} \ Kein Zeilenumbruch am Ende der Datei Index: pindefs.h =================================================================== --- pindefs.h (Revision 1144) +++ pindefs.h (Arbeitskopie) @@ -23,6 +23,17 @@ #include +/* lets try to select at least 32 bits */ +#ifdef HAVE_SDTINT_H +#include +typedef uint32_t pinmask_t; +#else +typedef unsigned long pinmask_t; +#endif + +#include + + enum { PPI_AVR_VCC=1, PPI_AVR_BUFF, @@ -36,9 +47,32 @@ PIN_LED_VFY, N_PINS }; + #define PIN_MASK (UINT_MAX>>1) #define PIN_INVERSE (~(PIN_MASK)) /* flag for inverted pin in serbb */ -#define PIN_MIN 1 /* smallest allowed pin number */ +#define PIN_MIN 0 /* smallest allowed pin number */ +#define PIN_MAX 31 /* largest allowed pin number */ + +#ifdef HAVE_LINUX_GPIO +/* Embedded systems might have a lot more gpio than only 0-31 */ +#undef PIN_MAX #define PIN_MAX 255 /* largest allowed pin number */ +#endif +#define PIN_FIELD_ELEMENT_SIZE (sizeof(pinmask_t) * 8) +#define PIN_FIELD_SIZE ((PIN_MAX + PIN_FIELD_ELEMENT_SIZE)/PIN_FIELD_ELEMENT_SIZE) + +struct pindef_t { + pinmask_t mask[PIN_FIELD_SIZE]; + pinmask_t inverse[PIN_FIELD_SIZE]; +}; + +void pin_set_value(struct pindef_t * const pindef, const int pin, const bool inverse); + +void pin_clear_all(struct pindef_t * const pindef); + +struct programmer_t; /* forward declaration */ +void pgm_fill_old_pins(struct programmer_t * const pgm); + #endif + Index: serbb_win32.c =================================================================== --- serbb_win32.c (Revision 1144) +++ serbb_win32.c (Arbeitskopie) @@ -350,6 +350,8 @@ { strcpy(pgm->type, "SERBB"); + pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed + pgm->rdy_led = bitbang_rdy_led; pgm->err_led = bitbang_err_led; pgm->pgm_led = bitbang_pgm_led; Index: Makefile.am =================================================================== --- Makefile.am (Revision 1144) +++ Makefile.am (Arbeitskopie) @@ -138,6 +138,7 @@ pgm_type.h \ pickit2.c \ pickit2.h \ + pindefs.c \ pindefs.h \ ppi.c \ ppi.h \ Index: buspirate.c =================================================================== --- buspirate.c (Revision 1144) +++ buspirate.c (Arbeitskopie) @@ -1283,6 +1283,8 @@ { strcpy(pgm->type, "BusPirate_BB"); + pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed + pgm->display = buspirate_dummy_6; /* BusPirate itself related methods */ Index: par.c =================================================================== --- par.c (Revision 1144) +++ par.c (Arbeitskopie) @@ -359,6 +359,8 @@ { strcpy(pgm->type, "PPI"); + pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed + pgm->exit_vcc = EXIT_VCC_UNSPEC; pgm->exit_reset = EXIT_RESET_UNSPEC; pgm->exit_datahigh = EXIT_DATAHIGH_UNSPEC; Index: config_gram.y =================================================================== --- config_gram.y (Revision 1144) +++ config_gram.y (Arbeitskopie) @@ -288,6 +288,8 @@ pgm_free(existing_prog); } PUSH(programmers, current_prog); +// pgm_fill_old_pins(current_prog); // TODO to be removed if old pin data no longer needed +// pgm_display_generic(current_prog, id); current_prog = NULL; } ; @@ -538,7 +540,7 @@ | TKN_TILDE TKN_NUMBER { assign_pin(pin_name, $2, 1); } | - /* empty */ { current_prog->pinno[pin_name] = 0; } + /* empty */ { pin_clear_all(&(current_prog->pin[pin_name])); } ; pin_list: @@ -548,9 +550,7 @@ | TKN_TILDE TKN_LEFT_PAREN num_list TKN_RIGHT_PAREN { assign_pin_list(1); } | - /* empty */ { - current_prog->pinno[pin_name] = 0; - } + /* empty */ { pin_clear_all(&(current_prog->pin[pin_name])); } ; prog_parm_pins: @@ -1353,10 +1353,8 @@ progname, lineno, infile, PIN_MIN, PIN_MAX); exit(1); } - if (invert) - value |= PIN_INVERSE; - current_prog->pinno[pinno] = value; + pin_set_value(&(current_prog->pin[pinno]), value, invert); return 0; } @@ -1370,9 +1368,15 @@ while (lsize(number_list)) { t = lrmv_n(number_list, 1); pin = t->value.number; - current_prog->pinno[pin_name] |= (1 << pin); - if (invert) - current_prog->pinno[pin_name] |= PIN_INVERSE; + if ((pin < PIN_MIN) || (pin > PIN_MAX)) { + fprintf(stderr, + "%s: error at line %d of %s: pin must be in the " + "range %d-%d\n", + progname, lineno, infile, PIN_MIN, PIN_MAX); + exit(1); + /* TODO clear list and free tokens if no exit is done */ + } + pin_set_value(&(current_prog->pin[pin_name]), pin, invert); free_token(t); } Index: ft245r.c =================================================================== --- ft245r.c (Revision 1144) +++ ft245r.c (Arbeitskopie) @@ -806,6 +806,8 @@ void ft245r_initpgm(PROGRAMMER * pgm) { strcpy(pgm->type, "ftdi_syncbb"); + pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed + /* * mandatory functions */ Index: avrftdi.c =================================================================== --- avrftdi.c (Revision 1144) +++ avrftdi.c (Arbeitskopie) @@ -1259,6 +1259,8 @@ strcpy(pgm->type, "avrftdi"); + pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed + /* * mandatory functions */ Index: serbb_posix.c =================================================================== --- serbb_posix.c (Revision 1144) +++ serbb_posix.c (Arbeitskopie) @@ -289,6 +289,8 @@ { strcpy(pgm->type, "SERBB"); + pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed + pgm->rdy_led = bitbang_rdy_led; pgm->err_led = bitbang_err_led; pgm->pgm_led = bitbang_pgm_led; Index: pgm.c =================================================================== --- pgm.c (Revision 1144) +++ pgm.c (Arbeitskopie) @@ -220,17 +220,17 @@ if ((pmask & PIN_MASK) == 0) return " (not used)"; - buf[0] = ' '; + buf[0] = (pmask & PIN_INVERSE)?'~':' '; buf[1] = 0; + if (pmask & PIN_INVERSE) strcat(buf, "("); for (pin = 0; pin <= 17; pin++) { if (pmask & (1 << pin)) { sprintf(b2, "%d", pin); if (buf[1] != 0) - strcat(buf, ","); strcat(buf, b2); } } - + if (pmask & PIN_INVERSE) strcat(buf, ")"); return buf; } Index: pgm.h =================================================================== --- pgm.h (Revision 1144) +++ pgm.h (Arbeitskopie) @@ -68,6 +68,7 @@ char port[PGM_PORTLEN]; void (*initpgm)(struct programmer_t * pgm); unsigned int pinno[N_PINS]; + struct pindef_t pin[N_PINS]; exit_vcc_t exit_vcc; exit_reset_t exit_reset; exit_datahigh_t exit_datahigh;