From e95114a18dfa68b2d1a8d6a9f84b6fc3191c4430 Mon Sep 17 00:00:00 2001 From: "Brian S. Dean" Date: Wed, 21 Nov 2001 18:54:11 +0000 Subject: [PATCH] In interactive mode, reset the address and length if we start dumping a memory type different than the previous one. git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@103 81a1dc3b-b13d-400b-aceb-764788c761c2 --- avr.c | 112 +++++++++++++++++++++++++++++--------------------- config_gram.y | 1 - lexer.l | 1 - term.c | 10 ++++- 4 files changed, 75 insertions(+), 49 deletions(-) diff --git a/avr.c b/avr.c index 7de9cdcc..70d86f33 100644 --- a/avr.c +++ b/avr.c @@ -174,32 +174,6 @@ AVRMEM * avr_locate_mem(AVRPART * p, char * desc) -/* - * transmit and receive a bit of data to/from the AVR device - */ -int avr_txrx_bit(int fd, int bit) -{ - int r; - - /* - * read the result bit (it is either valid from a previous clock - * pulse or it is ignored in the current context) - */ - r = ppi_getpin(fd, pgm->pinno[PIN_AVR_MISO]); - - /* set the data input line as desired */ - ppi_setpin(fd, pgm->pinno[PIN_AVR_MOSI], bit); - - /* - * pulse the clock line, clocking in the MOSI data, and clocking out - * the next result bit - */ - ppi_pulsepin(fd, pgm->pinno[PIN_AVR_SCK]); - - return r; -} - - /* * transmit and receive a byte of data to/from the AVR device */ @@ -211,7 +185,22 @@ unsigned char avr_txrx(int fd, unsigned char byte) rbyte = 0; for (i=0; i<8; i++) { b = (byte >> (7-i)) & 0x01; - r = avr_txrx_bit(fd, b); + + /* + * read the result bit (it is either valid from a previous clock + * pulse or it is ignored in the current context) + */ + r = ppi_getpin(fd, pgm->pinno[PIN_AVR_MISO]); + + /* set the data input line as desired */ + ppi_setpin(fd, pgm->pinno[PIN_AVR_MOSI], b); + + /* + * pulse the clock line, clocking in the MOSI data, and clocking out + * the next result bit + */ + ppi_pulsepin(fd, pgm->pinno[PIN_AVR_SCK]); + rbyte = rbyte | (r << (7-i)); } @@ -245,6 +234,11 @@ int avr_cmd(int fd, unsigned char cmd[4], unsigned char res[4]) } +/* + * avr_set_bits() + * + * Set instruction bits in the specified command based on the opcode. + */ int avr_set_bits(OPCODE * op, unsigned char * cmd) { int i, j, bit; @@ -266,6 +260,12 @@ int avr_set_bits(OPCODE * op, unsigned char * cmd) } +/* + * avr_set_addr() + * + * Set address bits in the specified command based on the opcode, and + * the address. + */ int avr_set_addr(OPCODE * op, unsigned char * cmd, unsigned long addr) { int i, j, bit; @@ -289,6 +289,12 @@ int avr_set_addr(OPCODE * op, unsigned char * cmd, unsigned long addr) } +/* + * avr_set_input() + * + * Set input data bits in the specified command based on the opcode, + * and the data byte. + */ int avr_set_input(OPCODE * op, unsigned char * cmd, unsigned char data) { int i, j, bit; @@ -312,7 +318,13 @@ int avr_set_input(OPCODE * op, unsigned char * cmd, unsigned char data) } -int avr_get_output(OPCODE * op, unsigned char * cmd, unsigned char * data) +/* + * avr_get_output() + * + * Retreive output data bits from the command results based on the + * opcode data. + */ +int avr_get_output(OPCODE * op, unsigned char * res, unsigned char * data) { int i, j, bit; unsigned char value; @@ -323,7 +335,7 @@ int avr_get_output(OPCODE * op, unsigned char * cmd, unsigned char * data) j = 3 - i / 8; bit = i % 8; mask = 1 << bit; - value = ((cmd[j] & mask) >> bit) & 0x01; + value = ((res[j] & mask) >> bit) & 0x01; value = value << op->bit[i].bitno; if (value) *data = *data | value; @@ -350,6 +362,9 @@ int avr_read_byte(int fd, AVRPART * p, AVRMEM * mem, unsigned long addr, LED_ON(fd, pgm->pinno[PIN_LED_PGM]); LED_OFF(fd, pgm->pinno[PIN_LED_ERR]); + /* + * figure out what opcode to use + */ if (mem->op[AVR_OP_READ_LO]) { if (addr & 0x00000001) readop = mem->op[AVR_OP_READ_HI]; @@ -389,7 +404,7 @@ int avr_read_byte(int fd, AVRPART * p, AVRMEM * mem, unsigned long addr, * corresponding buffer of the avrpart pointed to by 'p'. If size = * 0, read the entire contents, otherwise, read 'size' bytes. * - * Return the number of bytes read, or -1 if an error occurs. + * Return the number of bytes read, or < 0 if an error occurs. */ int avr_read(int fd, AVRPART * p, char * memtype, int size, int verbose) { @@ -430,11 +445,8 @@ int avr_read(int fd, AVRPART * p, char * memtype, int size, int verbose) } - - - /* - * write a byte of data to the indicated memory region + * write a page data at the specified address */ int avr_write_page(int fd, AVRPART * p, AVRMEM * mem, unsigned long addr) @@ -451,6 +463,10 @@ int avr_write_page(int fd, AVRPART * p, AVRMEM * mem, return -1; } + /* + * if this memory is word-addressable, adjust the address + * accordingly + */ if (mem->op[AVR_OP_LOADPAGE_LO]) addr = addr / 2; @@ -475,7 +491,7 @@ int avr_write_page(int fd, AVRPART * p, AVRMEM * mem, /* - * write a byte of data to the indicated memory region + * write a byte of data at the specified address */ int avr_write_byte(int fd, AVRPART * p, AVRMEM * mem, unsigned long addr, unsigned char data) @@ -601,11 +617,11 @@ int avr_write_byte(int fd, AVRPART * p, AVRMEM * mem, /* - * Write the whole memory region (flash or eeprom, specified by - * 'memtype') from the corresponding buffer of the avrpart pointed to - * by 'p'. Write up to 'size' bytes from the buffer. Data is only - * written if the new data value is different from the existing data - * value. Data beyond 'size' bytes is not affected. + * Write the whole memory region of the specified memory from the + * corresponding buffer of the avrpart pointed to by 'p'. Write up to + * 'size' bytes from the buffer. Data is only written if the new data + * value is different from the existing data value. Data beyond + * 'size' bytes is not affected. * * Return the number of bytes written, or -1 if an error occurs. */ @@ -625,7 +641,6 @@ int avr_write(int fd, AVRPART * p, char * memtype, int size, int verbose) return -1; } - LED_OFF(fd, pgm->pinno[PIN_LED_ERR]); werror = 0; @@ -643,7 +658,6 @@ int avr_write(int fd, AVRPART * p, char * memtype, int size, int verbose) } for (i=0; ibuf[i]; if (verbose) { if (i % 16 == 0) @@ -658,6 +672,10 @@ int avr_write(int fd, AVRPART * p, char * memtype, int size, int verbose) } if (m->paged) { + /* + * check to see if it is time to flush the page with a page + * write + */ if (((i % m->page_size) == m->page_size-1) || (i == wsize-1)) { rc = avr_write_page(fd, p, m, i); @@ -792,7 +810,6 @@ int avr_initialize(int fd, AVRPART * p) avr_powerup(fd); - ppi_setpin(fd, pgm->pinno[PIN_AVR_SCK], 0); ppi_setpin(fd, pgm->pinno[PIN_AVR_RESET], 0); ppi_pulsepin(fd, pgm->pinno[PIN_AVR_RESET]); @@ -833,7 +850,10 @@ int avr_initialize(int fd, AVRPART * p) } - +/* + * Allocate and initialize memory buffers for each of the device's + * defined memory regions. + */ int avr_initmem(AVRPART * p) { LNODEID ln; @@ -918,8 +938,8 @@ void avr_mem_display(char * prefix, FILE * f, AVRMEM * m, int type) { if (m == NULL) { fprintf(f, - "%sMem Page Polled\n" - "%sType Paged Size Size #Pages MinW MaxW ReadBack\n" + "%s Page Polled\n" + "%sMemory Type Paged Size Size #Pages MinW MaxW ReadBack\n" "%s----------- ------ ------ ---- ------ ----- ----- ---------\n", prefix, prefix, prefix); } diff --git a/config_gram.y b/config_gram.y index 4e930a3e..62f3fb8d 100644 --- a/config_gram.y +++ b/config_gram.y @@ -29,7 +29,6 @@ /* $Id$ */ -%token K_OP %token K_READ %token K_WRITE %token K_READ_LO diff --git a/lexer.l b/lexer.l index ffcd4bd5..989a885e 100644 --- a/lexer.l +++ b/lexer.l @@ -152,7 +152,6 @@ size { yylval=NULL; return K_SIZE; } vcc { yylval=NULL; return K_VCC; } vfyled { yylval=NULL; return K_VFYLED; } -op { yylval=NULL; return K_OP; } read { yylval=new_token(K_READ); return K_READ; } write { yylval=new_token(K_WRITE); return K_WRITE; } read_lo { yylval=new_token(K_READ_LO); return K_READ_LO; } diff --git a/term.c b/term.c index c99de90d..74d2c6a4 100644 --- a/term.c +++ b/term.c @@ -206,6 +206,7 @@ int hexdump_buf(FILE * f, int startaddr, unsigned char * buf, int len) int cmd_dump(int fd, struct avrpart * p, int argc, char * argv[]) { + static char prevmem[128] = {0}; char * e; unsigned char * buf; int maxsize; @@ -223,6 +224,13 @@ int cmd_dump(int fd, struct avrpart * p, int argc, char * argv[]) memtype = argv[1]; + if (strncmp(prevmem, memtype, strlen(memtype)) != 0) { + addr = 0; + len = 64; + strncpy(prevmem, memtype, sizeof(prevmem)-1); + prevmem[sizeof(prevmem)-1] = 0; + } + mem = avr_locate_mem(p, memtype); if (mem == NULL) { fprintf(stderr, "\"%s\" memory type not defined for part \"%s\"\n", @@ -298,7 +306,7 @@ int cmd_write(int fd, struct avrpart * p, int argc, char * argv[]) AVRMEM * mem; if (argc < 4) { - fprintf(stderr, "Usage: write flash|eeprom|fuse " + fprintf(stderr, "Usage: write " " ... byteN>\n"); return -1; }