Set pin number or pin list rather than adding them
Pin definitions in config_gram.y fail to clear existing pin definitions when setting them for the second time, eg, through inheritance, For example, programmer parent "ft2232h" id = "tigard"; reset = 5; # BD5 (GPIOL1) ; would add pin 5 to the existing pin 3 for reset from the partent programmer rather than overwriting the reset pin. This commit clears any pre-existing pin definition first before assigning the new pin number or pin list (for vcc or buff).
This commit is contained in:
parent
c44d0e9c73
commit
5eddc33864
|
@ -44,6 +44,7 @@ int yylex(void);
|
|||
int yyerror(char * errmsg, ...);
|
||||
int yywarning(char * errmsg, ...);
|
||||
|
||||
static int clear_pin(int pinfunc);
|
||||
static int assign_pin(int pinfunc, TOKEN *v, int invert);
|
||||
static int assign_pin_list(int invert);
|
||||
static int which_opcode(TOKEN * opcode);
|
||||
|
@ -650,16 +651,16 @@ pin_list:
|
|||
;
|
||||
|
||||
prog_parm_pins:
|
||||
K_VCC TKN_EQUAL {pin_name = PPI_AVR_VCC; } pin_list |
|
||||
K_BUFF TKN_EQUAL {pin_name = PPI_AVR_BUFF; } pin_list |
|
||||
K_RESET TKN_EQUAL {pin_name = PIN_AVR_RESET;} pin_number { free_token($1); } |
|
||||
K_SCK TKN_EQUAL {pin_name = PIN_AVR_SCK; } pin_number { free_token($1); } |
|
||||
K_SDO TKN_EQUAL {pin_name = PIN_AVR_SDO; } pin_number |
|
||||
K_SDI TKN_EQUAL {pin_name = PIN_AVR_SDI; } pin_number |
|
||||
K_ERRLED TKN_EQUAL {pin_name = PIN_LED_ERR; } pin_number |
|
||||
K_RDYLED TKN_EQUAL {pin_name = PIN_LED_RDY; } pin_number |
|
||||
K_PGMLED TKN_EQUAL {pin_name = PIN_LED_PGM; } pin_number |
|
||||
K_VFYLED TKN_EQUAL {pin_name = PIN_LED_VFY; } pin_number
|
||||
K_VCC TKN_EQUAL {pin_name = PPI_AVR_VCC; clear_pin(pin_name); } pin_list |
|
||||
K_BUFF TKN_EQUAL {pin_name = PPI_AVR_BUFF; clear_pin(pin_name); } pin_list |
|
||||
K_RESET TKN_EQUAL {pin_name = PIN_AVR_RESET; clear_pin(pin_name);} pin_number { free_token($1); } |
|
||||
K_SCK TKN_EQUAL {pin_name = PIN_AVR_SCK; clear_pin(pin_name); } pin_number { free_token($1); } |
|
||||
K_SDO TKN_EQUAL {pin_name = PIN_AVR_SDO; clear_pin(pin_name); } pin_number |
|
||||
K_SDI TKN_EQUAL {pin_name = PIN_AVR_SDI; clear_pin(pin_name); } pin_number |
|
||||
K_ERRLED TKN_EQUAL {pin_name = PIN_LED_ERR; clear_pin(pin_name); } pin_number |
|
||||
K_RDYLED TKN_EQUAL {pin_name = PIN_LED_RDY; clear_pin(pin_name); } pin_number |
|
||||
K_PGMLED TKN_EQUAL {pin_name = PIN_LED_PGM; clear_pin(pin_name); } pin_number |
|
||||
K_VFYLED TKN_EQUAL {pin_name = PIN_LED_VFY; clear_pin(pin_name); } pin_number
|
||||
;
|
||||
|
||||
opcode :
|
||||
|
@ -1545,6 +1546,17 @@ static char * vtypestr(int type)
|
|||
#endif
|
||||
|
||||
|
||||
static int clear_pin(int pinfunc) {
|
||||
if(pinfunc < 0 || pinfunc >= N_PINS) {
|
||||
yyerror("pin function must be in the range [0, %d]", N_PINS-1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pin_clear_all(&(current_prog->pin[pinfunc]));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int assign_pin(int pinfunc, TOKEN *v, int invert) {
|
||||
if(pinfunc < 0 || pinfunc >= N_PINS) {
|
||||
yyerror("pin function must be in the range [0, %d]", N_PINS-1);
|
||||
|
|
Loading…
Reference in New Issue