--- avrdude.conf.in.orig Tue Aug 2 21:41:12 2005 +++ avrdude.conf.in Tue Aug 2 22:13:58 2005 @@ -445,7 +445,7 @@ id = "ponyser"; desc = "serial port banging, design ponyprog serial"; type = serbb; - reset = 10; + reset = ~3; sck = 6; mosi = 4; miso = 7; @@ -471,7 +471,7 @@ id = "dasa3"; desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; type = serbb; - reset = 11; + reset = ~4; sck = 6; mosi = 3; miso = 7; --- config_gram.y.orig Mon Aug 1 22:26:47 2005 +++ config_gram.y Tue Aug 2 22:22:49 2005 @@ -50,7 +50,7 @@ int yylex(void); int yyerror(char * errmsg); -static int assign_pin(int pinno, TOKEN * v); +static int assign_pin(int pinno, TOKEN * v, int invert); static int which_opcode(TOKEN * opcode); static int parse_cmdbits(OPCODE * op); @@ -161,6 +161,7 @@ %token TKN_COMMA %token TKN_EQUAL %token TKN_SEMI +%token TKN_TILDE %token TKN_NUMBER %token TKN_STRING %token TKN_ID @@ -426,15 +427,26 @@ } | K_RESET TKN_EQUAL TKN_NUMBER { free_token($1); - assign_pin(PIN_AVR_RESET, $3); } | + assign_pin(PIN_AVR_RESET, $3, 0); } | K_SCK TKN_EQUAL TKN_NUMBER { free_token($1); - assign_pin(PIN_AVR_SCK, $3); } | - K_MOSI TKN_EQUAL TKN_NUMBER { assign_pin(PIN_AVR_MOSI, $3); } | - K_MISO TKN_EQUAL TKN_NUMBER { assign_pin(PIN_AVR_MISO, $3); } | - K_ERRLED TKN_EQUAL TKN_NUMBER { assign_pin(PIN_LED_ERR, $3); } | - K_RDYLED TKN_EQUAL TKN_NUMBER { assign_pin(PIN_LED_RDY, $3); } | - K_PGMLED TKN_EQUAL TKN_NUMBER { assign_pin(PIN_LED_PGM, $3); } | - K_VFYLED TKN_EQUAL TKN_NUMBER { assign_pin(PIN_LED_VFY, $3); } + assign_pin(PIN_AVR_SCK, $3, 0); } | + K_MOSI TKN_EQUAL TKN_NUMBER { assign_pin(PIN_AVR_MOSI, $3, 0); } | + K_MISO TKN_EQUAL TKN_NUMBER { assign_pin(PIN_AVR_MISO, $3, 0); } | + K_ERRLED TKN_EQUAL TKN_NUMBER { assign_pin(PIN_LED_ERR, $3, 0); } | + K_RDYLED TKN_EQUAL TKN_NUMBER { assign_pin(PIN_LED_RDY, $3, 0); } | + K_PGMLED TKN_EQUAL TKN_NUMBER { assign_pin(PIN_LED_PGM, $3, 0); } | + K_VFYLED TKN_EQUAL TKN_NUMBER { assign_pin(PIN_LED_VFY, $3, 0); } | + + K_RESET TKN_EQUAL TKN_TILDE TKN_NUMBER { free_token($1); + assign_pin(PIN_AVR_RESET, $4, 1); } | + K_SCK TKN_EQUAL TKN_TILDE TKN_NUMBER { free_token($1); + assign_pin(PIN_AVR_SCK, $4, 1); } | + K_MOSI TKN_EQUAL TKN_TILDE TKN_NUMBER { assign_pin(PIN_AVR_MOSI, $4, 1); } | + K_MISO TKN_EQUAL TKN_TILDE TKN_NUMBER { assign_pin(PIN_AVR_MISO, $4, 1); } | + K_ERRLED TKN_EQUAL TKN_TILDE TKN_NUMBER { assign_pin(PIN_LED_ERR, $4, 1); } | + K_RDYLED TKN_EQUAL TKN_TILDE TKN_NUMBER { assign_pin(PIN_LED_RDY, $4, 1); } | + K_PGMLED TKN_EQUAL TKN_TILDE TKN_NUMBER { assign_pin(PIN_LED_PGM, $4, 1); } | + K_VFYLED TKN_EQUAL TKN_TILDE TKN_NUMBER { assign_pin(PIN_LED_VFY, $4, 1); } ; @@ -862,7 +874,7 @@ #endif -static int assign_pin(int pinno, TOKEN * v) +static int assign_pin(int pinno, TOKEN * v, int invert) { int value; @@ -875,6 +887,8 @@ progname, lineno, infile); exit(1); } + if (invert) + value |= PIN_INVERSE; current_prog->pinno[pinno] = value; --- lexer.l.orig Tue Aug 2 22:08:06 2005 +++ lexer.l Tue Aug 2 22:08:23 2005 @@ -213,6 +213,7 @@ "," { yylval = NULL; pyytext(); return TKN_COMMA; } "=" { yylval = NULL; pyytext(); return TKN_EQUAL; } ";" { yylval = NULL; pyytext(); return TKN_SEMI; } +"~" { yylval = NULL; pyytext(); return TKN_TILDE; } "\n" { lineno++; } [ \r\t]+ /* ignore whitespace */ --- par.c.orig Mon Aug 1 22:26:48 2005 +++ par.c Tue Aug 2 22:17:57 2005 @@ -79,6 +79,8 @@ int par_setpin(int fd, int pin, int value) { + pin &= PIN_MASK; + if (pin < 1 || pin > 17) return -1; @@ -104,6 +106,8 @@ { int value; + pin &= PIN_MASK; + if (pin < 1 || pin > 17) return -1; @@ -144,6 +148,8 @@ int par_getpinmask(int pin) { + pin &= PIN_MASK; + if (pin < 1 || pin > 17) return -1; --- pindefs.h.orig Tue May 3 14:21:32 2005 +++ pindefs.h Tue Aug 2 22:12:06 2005 @@ -35,6 +35,8 @@ PIN_LED_VFY, N_PINS }; +#define PIN_INVERSE 0x80 /* flag for inverted pin in serbb */ +#define PIN_MASK 0x7f #define LED_ON(fd,pin) ppi_setpin(fd,pin,0) #define LED_OFF(fd,pin) ppi_setpin(fd,pin,1) --- serbb_posix.c.orig Tue Aug 2 21:36:21 2005 +++ serbb_posix.c Tue Aug 2 22:16:25 2005 @@ -69,14 +69,14 @@ { unsigned int ctl; - if ( pin < 1 || pin > 14 ) - return; - - if ( pin>7 ) + if (pin & PIN_INVERSE) { value = !value; - pin -= 7; - } + pin &= PIN_MASK; + } + + if ( pin < 1 || pin > 7 ) + return; pin--; @@ -109,16 +109,16 @@ unsigned int ctl; unsigned char invert; - if ( pin < 1 || pin > 14 ) - return(-1); - - if ( pin>7 ) + if (pin & PIN_INVERSE) { invert = 1; - pin -= 7; + pin &= PIN_MASK; } else invert = 0; + if ( pin < 1 || pin > 7 ) + return(-1); + pin --; switch ( pin ) @@ -153,7 +153,7 @@ int serbb_highpulsepin(int fd, int pin) { - if (pin < 1 || pin > 13) + if (pin < 1 || pin > 7) return -1; serbb_setpin(fd, pin, 1); --- serbb_win32.c.orig Tue Aug 2 21:36:25 2005 +++ serbb_win32.c Tue Aug 2 22:15:26 2005 @@ -56,7 +56,7 @@ 6 rts -> 7 cts <- - Pin # above 7 means negated (pin - 7). + Negative pin # means negated value. */ void serbb_setpin(int fd, int pin, int value) @@ -66,15 +66,15 @@ DWORD dwFunc; const char *name; - if (pin < 1 || pin > 14) - return; - - if (pin > 7) + if (pin & PIN_INVERSE) { value = !value; - pin -= 7; + pin &= PIN_MASK; } + if (pin < 1 || pin > 7) + return; + pin--; switch (pin) @@ -137,16 +137,16 @@ const char *name; DWORD modemstate; - if (pin < 1 || pin > 14) - return -1; - - if (pin > 7) + if (pin & PIN_INVERSE) { invert = 1; - pin -= 7; + pin &= PIN_MASK; } else invert = 0; + if (pin < 1 || pin > 7) + return -1; + pin --; if (pin == 0 /* cd */ || pin == 4 /* dsr */ || pin == 6 /* cts */) @@ -226,7 +226,7 @@ int serbb_highpulsepin(int fd, int pin) { - if (pin < 1 || pin > 13) + if (pin < 1 || pin > 7) return -1; serbb_setpin(fd, pin, 1);