Fix VCC assertion.

Make the BUFF pin a mask like VCC to allow multiple pins to be
asserted at the same time (STK200 has two buffer enable lines).

Add the STK200 programmer.

Fix EEPROM address line selection for several parts.


git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@109 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
bsd 2001-12-29 21:37:20 +00:00
parent 70f90c8f6b
commit 2a4402b055
5 changed files with 86 additions and 38 deletions

13
avr.c
View File

@ -786,7 +786,7 @@ int avr_signature(int fd, AVRPART * p)
*/ */
void avr_powerup(int fd) void avr_powerup(int fd)
{ {
ppi_set(fd, PPIDATA, PPI_AVR_VCC); /* power up */ ppi_set(fd, PPIDATA, pgm->pinno[PPI_AVR_VCC]); /* power up */
usleep(100000); usleep(100000);
} }
@ -796,7 +796,7 @@ void avr_powerup(int fd)
*/ */
void avr_powerdown(int fd) void avr_powerdown(int fd)
{ {
ppi_clr(fd, PPIDATA, PPI_AVR_VCC); /* power down */ ppi_clr(fd, PPIDATA, pgm->pinno[PPI_AVR_VCC]); /* power down */
} }
@ -809,9 +809,12 @@ int avr_initialize(int fd, AVRPART * p)
int tries; int tries;
avr_powerup(fd); avr_powerup(fd);
usleep(20000);
ppi_setpin(fd, pgm->pinno[PIN_AVR_SCK], 0); ppi_setpin(fd, pgm->pinno[PIN_AVR_SCK], 0);
ppi_setpin(fd, pgm->pinno[PIN_AVR_RESET], 0); ppi_setpin(fd, pgm->pinno[PIN_AVR_RESET], 0);
usleep(20000);
ppi_pulsepin(fd, pgm->pinno[PIN_AVR_RESET]); ppi_pulsepin(fd, pgm->pinno[PIN_AVR_RESET]);
usleep(20000); /* 20 ms XXX should be a per-chip parameter */ usleep(20000); /* 20 ms XXX should be a per-chip parameter */
@ -831,16 +834,16 @@ int avr_initialize(int fd, AVRPART * p)
tries = 0; tries = 0;
do { do {
rc = avr_program_enable(fd, p); rc = avr_program_enable(fd, p);
if (rc == 0) if ((rc == 0)||(rc == -1))
break; break;
ppi_pulsepin(fd, pgm->pinno[PIN_AVR_SCK]); ppi_pulsepin(fd, pgm->pinno[PIN_AVR_SCK]);
tries++; tries++;
} while (tries < 32); } while (tries < 65);
/* /*
* can't sync with the device, maybe it's not attached? * can't sync with the device, maybe it's not attached?
*/ */
if (tries == 32) { if (rc) {
fprintf(stderr, "%s: AVR device not responding\n", progname); fprintf(stderr, "%s: AVR device not responding\n", progname);
return -1; return -1;
} }

View File

@ -107,6 +107,16 @@ programmer
miso = 10; miso = 10;
; ;
programmer
id = "stk200";
desc = "STK200";
buff = 4, 5;
sck = 6;
mosi = 7;
reset = 9;
miso = 10;
;
programmer programmer
id = "dt006"; id = "dt006";
desc = "Dontronics DT006"; desc = "Dontronics DT006";
@ -148,11 +158,11 @@ part
max_write_delay = 20000; max_write_delay = 20000;
readback_p1 = 0x00; readback_p1 = 0x00;
readback_p2 = 0xff; readback_p2 = 0xff;
read = "1 0 1 0 0 0 0 0 x x x x x x x x", read = "1 0 1 0 0 0 0 0 x x x x x x x x",
"x x a a a a a a o o o o o o o o"; "x x a5 a4 a3 a2 a1 a0 o o o o o o o o";
write = "1 1 0 0 0 0 0 0 x x x x x x x x", write = "1 1 0 0 0 0 0 0 x x x x x x x x",
"x x a a a a a a i i i i i i i i"; "x x a5 a4 a3 a2 a1 a0 i i i i i i i i";
; ;
memory "flash" memory "flash"
size = 1024; size = 1024;
@ -204,11 +214,11 @@ part
max_write_delay = 20000; max_write_delay = 20000;
readback_p1 = 0x80; readback_p1 = 0x80;
readback_p2 = 0x7f; readback_p2 = 0x7f;
read = "1 0 1 0 0 0 0 0 x x x x x x x x", read = "1 0 1 0 0 0 0 0 x x x x x x x x",
"x a a a a a a a o o o o o o o o"; "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o";
write = "1 1 0 0 0 0 0 0 x x x x x x x x", write = "1 1 0 0 0 0 0 0 x x x x x x x x",
"x a a a a a a a i i i i i i i i"; "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i";
; ;
memory "flash" memory "flash"
size = 2048; size = 2048;
@ -265,11 +275,11 @@ part
max_write_delay = 20000; max_write_delay = 20000;
readback_p1 = 0x00; readback_p1 = 0x00;
readback_p2 = 0xff; readback_p2 = 0xff;
read = "1 0 1 0 0 0 0 0 x x x x x x x x", read = "1 0 1 0 0 0 0 0 x x x x x x x x",
"x a a a a a a a o o o o o o o o"; "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o";
write = "1 1 0 0 0 0 0 0 x x x x x x x x", write = "1 1 0 0 0 0 0 0 x x x x x x x x",
"x a a a a a a a i i i i i i i i"; "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i";
; ;
memory "flash" memory "flash"
size = 2048; size = 2048;
@ -377,11 +387,11 @@ part
max_write_delay = 20000; max_write_delay = 20000;
readback_p1 = 0x00; readback_p1 = 0x00;
readback_p2 = 0xff; readback_p2 = 0xff;
read = "1 0 1 0 0 0 0 0 x x x x x x x x", read = " 1 0 1 0 0 0 0 0 x x x x x x x x",
"a a a a a a a a o o o o o o o o"; "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o";
write = "1 1 0 0 0 0 0 0 x x x x x x x x", write = " 1 1 0 0 0 0 0 0 x x x x x x x x",
"a a a a a a a a i i i i i i i i"; "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i";
; ;
memory "flash" memory "flash"
size = 4096; size = 4096;
@ -433,11 +443,11 @@ part
max_write_delay = 20000; max_write_delay = 20000;
readback_p1 = 0x80; readback_p1 = 0x80;
readback_p2 = 0x7f; readback_p2 = 0x7f;
read = "1 0 1 0 0 0 0 0 x x x x x x x a8", read = " 1 0 1 0 0 0 0 0 x x x x x x x a8",
"a a a a a a a a o o o o o o o o"; "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o";
write = "1 1 0 0 0 0 0 0 x x x x x x x a8", write = " 1 1 0 0 0 0 0 0 x x x x x x x a8",
"a a a a a a a a i i i i i i i i"; "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i";
; ;
memory "flash" memory "flash"
size = 8192; size = 8192;
@ -489,11 +499,11 @@ part
max_write_delay = 20000; max_write_delay = 20000;
readback_p1 = 0x00; readback_p1 = 0x00;
readback_p2 = 0xff; readback_p2 = 0xff;
read = "1 0 1 0 0 0 0 0 x x x x x x x a8", read = " 1 0 1 0 0 0 0 0 x x x x x x x a8",
"a a a a a a a a o o o o o o o o"; "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o";
write = "1 1 0 0 0 0 0 0 x x x x x x x a8", write = " 1 1 0 0 0 0 0 0 x x x x x x x a8",
"a a a a a a a a i i i i i i i i"; "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i";
; ;
memory "flash" memory "flash"
size = 8192; size = 8192;

View File

@ -235,11 +235,35 @@ prog_parm :
} }
} | } |
K_BUFF TKN_EQUAL num_list {
{
TOKEN * t;
int pin;
current_prog->pinno[PPI_AVR_BUFF] = 0;
while (lsize(number_list)) {
t = lrmv_n(number_list, 1);
pin = t->value.number;
if ((pin < 2) || (pin > 9)) {
fprintf(stderr,
"%s: error at line %d of %s: BUFF must be one or more "
"pins from the range 2-9\n",
progname, lineno, infile);
exit(1);
}
current_prog->pinno[PPI_AVR_BUFF] |= (1 << (pin-2));
free_token(t);
}
}
} |
K_RESET TKN_EQUAL TKN_NUMBER { assign_pin(PIN_AVR_RESET, $3); } | K_RESET TKN_EQUAL TKN_NUMBER { assign_pin(PIN_AVR_RESET, $3); } |
K_SCK TKN_EQUAL TKN_NUMBER { assign_pin(PIN_AVR_SCK, $3); } | K_SCK TKN_EQUAL TKN_NUMBER { assign_pin(PIN_AVR_SCK, $3); } |
K_MOSI TKN_EQUAL TKN_NUMBER { assign_pin(PIN_AVR_MOSI, $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_MISO TKN_EQUAL TKN_NUMBER { assign_pin(PIN_AVR_MISO, $3); } |
K_BUFF TKN_EQUAL TKN_NUMBER { assign_pin(PIN_AVR_BUFF, $3); } |
K_ERRLED TKN_EQUAL TKN_NUMBER { assign_pin(PIN_LED_ERR, $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_RDYLED TKN_EQUAL TKN_NUMBER { assign_pin(PIN_LED_RDY, $3); } |
K_PGMLED TKN_EQUAL TKN_NUMBER { assign_pin(PIN_LED_PGM, $3); } | K_PGMLED TKN_EQUAL TKN_NUMBER { assign_pin(PIN_LED_PGM, $3); } |

25
main.c
View File

@ -328,21 +328,30 @@ char * vccpins_str(unsigned int pmask)
void pinconfig_display(char * p) void pinconfig_display(char * p)
{ {
char vccpins[64]; char vccpins[64];
char buffpins[64];
if (pgm->pinno[PPI_AVR_VCC]) { if (pgm->pinno[PPI_AVR_VCC]) {
snprintf(vccpins, sizeof(vccpins), " = pins %s", snprintf(vccpins, sizeof(vccpins), " = pins %s",
vccpins_str(pgm->pinno[PPI_AVR_VCC])); vccpins_str(pgm->pinno[PPI_AVR_VCC]));
} }
else { else {
vccpins[0] = 0; strcpy(vccpins, " (not used)");
}
if (pgm->pinno[PPI_AVR_BUFF]) {
snprintf(buffpins, sizeof(buffpins), " = pins %s",
vccpins_str(pgm->pinno[PPI_AVR_BUFF]));
}
else {
strcpy(buffpins, " (not used)");
} }
fprintf(stderr, "%sProgrammer Pin Configuration: %s (%s)\n", p, fprintf(stderr, "%sProgrammer Pin Configuration: %s (%s)\n", p,
(char *)ldata(lfirst(pgm->id)), pgm->desc); (char *)ldata(lfirst(pgm->id)), pgm->desc);
fprintf(stderr, fprintf(stderr,
"%s VCC = 0x%02x %s\n" "%s VCC = 0x%02x%s\n"
"%s BUFF = %d\n" "%s BUFF = 0x%02x%s\n"
"%s RESET = %d\n" "%s RESET = %d\n"
"%s SCK = %d\n" "%s SCK = %d\n"
"%s MOSI = %d\n" "%s MOSI = %d\n"
@ -352,7 +361,7 @@ void pinconfig_display(char * p)
"%s PGM LED = %d\n" "%s PGM LED = %d\n"
"%s VFY LED = %d\n", "%s VFY LED = %d\n",
p, pgm->pinno[PPI_AVR_VCC], vccpins, p, pgm->pinno[PPI_AVR_VCC], vccpins,
p, pgm->pinno[PIN_AVR_BUFF], p, pgm->pinno[PPI_AVR_BUFF], buffpins,
p, pgm->pinno[PIN_AVR_RESET], p, pgm->pinno[PIN_AVR_RESET],
p, pgm->pinno[PIN_AVR_SCK], p, pgm->pinno[PIN_AVR_SCK],
p, pgm->pinno[PIN_AVR_MOSI], p, pgm->pinno[PIN_AVR_MOSI],
@ -523,7 +532,7 @@ int main(int argc, char * argv [])
for (i=0; i<N_PINS; i++) for (i=0; i<N_PINS; i++)
pgm->pinno[i] = 0; pgm->pinno[i] = 0;
pgm->pinno[PPI_AVR_VCC] = 0x0f; /* ppi pins 2-5, data reg bits 0-3 */ pgm->pinno[PPI_AVR_VCC] = 0x0f; /* ppi pins 2-5, data reg bits 0-3 */
pgm->pinno[PIN_AVR_BUFF] = 0; pgm->pinno[PPI_AVR_BUFF] = 0;
pgm->pinno[PIN_AVR_RESET] = 7; pgm->pinno[PIN_AVR_RESET] = 7;
pgm->pinno[PIN_AVR_SCK] = 8; pgm->pinno[PIN_AVR_SCK] = 8;
pgm->pinno[PIN_AVR_MOSI] = 9; pgm->pinno[PIN_AVR_MOSI] = 9;
@ -804,7 +813,8 @@ int main(int argc, char * argv [])
/* /*
* enable the 74367 buffer, if connected; this signal is active low * enable the 74367 buffer, if connected; this signal is active low
*/ */
ppi_setpin(fd, pgm->pinno[PIN_AVR_BUFF], 0); /*ppi_setpin(fd, pgm->pinno[PIN_AVR_BUFF], 0);*/
ppi_clr(fd, PPIDATA, pgm->pinno[PPI_AVR_BUFF]);
/* /*
* initialize the chip in preperation for accepting commands * initialize the chip in preperation for accepting commands
@ -1025,7 +1035,8 @@ int main(int argc, char * argv [])
/* /*
* disable the 74367 buffer, if connected; this signal is active low * disable the 74367 buffer, if connected; this signal is active low
*/ */
ppi_setpin(fd, pgm->pinno[PIN_AVR_BUFF], 1); /* ppi_setpin(fd, pgm->pinno[PIN_AVR_BUFF], 1); */
ppi_set(fd, PPIDATA, pgm->pinno[PPI_AVR_BUFF]);
LED_OFF(fd, pgm->pinno[PIN_LED_RDY]); LED_OFF(fd, pgm->pinno[PIN_LED_RDY]);

View File

@ -34,7 +34,7 @@
enum { enum {
PPI_AVR_VCC=1, PPI_AVR_VCC=1,
PIN_AVR_BUFF, PPI_AVR_BUFF,
PIN_AVR_RESET, PIN_AVR_RESET,
PIN_AVR_SCK, PIN_AVR_SCK,
PIN_AVR_MOSI, PIN_AVR_MOSI,