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
This commit is contained in:
parent
b50ce8fabd
commit
e95114a18d
112
avr.c
112
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; i<wsize; i++) {
|
||||
/* eeprom or low byte of flash */
|
||||
data = m->buf[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);
|
||||
}
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
|
||||
/* $Id$ */
|
||||
|
||||
%token K_OP
|
||||
%token K_READ
|
||||
%token K_WRITE
|
||||
%token K_READ_LO
|
||||
|
|
1
lexer.l
1
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; }
|
||||
|
|
10
term.c
10
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 <addr> <byte1> "
|
||||
fprintf(stderr, "Usage: write <memtype> <addr> <byte1> "
|
||||
"<byte2> ... byteN>\n");
|
||||
return -1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue