Create new pin definition data structures to support 0-based pin numbers, and mixed inverse/non-inverse pin lists.

* avrftdi.c,buspirate.c,linuxgpio.c,par.c,serbb_*.c: added function call 
          to fill old pinno entries from new pin definitions.
	* pindefs.[hc]: added data struct and helper functions for new pin definitions
	* avrdude.conf.in: pins in entries using ftdi_syncbb are now 0-based
	* config_gram.y: allow combinations of inverted and non-inverted pins in pin lists
	* ft245r.c: reworked to work directly with the new pin definitions,
          pins are now 0-based, inverse pins are supported, buff is supported
	* pgm.[ch]: added new pin definitions field to programmer structure, 
          adapted pin display functions

git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@1160 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
rliebscher
2013-05-03 22:35:00 +00:00
parent a2ab9c6039
commit 22158cd03a
16 changed files with 436 additions and 174 deletions

View File

@@ -288,6 +288,8 @@ prog_def :
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;
}
;
@@ -533,24 +535,35 @@ prog_parm_usb:
}
;
pin_number:
pin_number_non_empty:
TKN_NUMBER { assign_pin(pin_name, $1, 0); }
|
TKN_TILDE TKN_NUMBER { assign_pin(pin_name, $2, 1); }
|
/* empty */ { current_prog->pinno[pin_name] = 0; }
;
pin_list:
num_list { assign_pin_list(0); }
pin_number:
pin_number_non_empty
|
TKN_TILDE TKN_NUMBER { assign_pin(pin_name, $2, 1); }
/* empty */ { pin_clear_all(&(current_prog->pin[pin_name])); }
;
pin_list_element:
pin_number_non_empty
|
TKN_TILDE TKN_LEFT_PAREN num_list TKN_RIGHT_PAREN { assign_pin_list(1); }
;
pin_list_non_empty:
pin_list_element
|
/* empty */ {
current_prog->pinno[pin_name] = 0;
}
pin_list_non_empty TKN_COMMA pin_list_element
;
pin_list:
pin_list_non_empty
|
/* empty */ { pin_clear_all(&(current_prog->pin[pin_name])); }
;
prog_parm_pins:
@@ -1353,10 +1366,8 @@ static int assign_pin(int pinno, TOKEN * v, int invert)
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 +1381,15 @@ static int assign_pin_list(int invert)
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);
}