The STK500 can perform paged read/write operations even on standard

"non-paged" parts.  Take advantage of that and use the faster internal
routines of the STK500 for those parts as well.


git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@162 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
bsd
2002-12-01 15:05:56 +00:00
parent b3cc1535b6
commit e722fbc587
5 changed files with 124 additions and 89 deletions

View File

@@ -737,7 +737,8 @@ static int loadaddr(PROGRAMMER * pgm, uint16_t addr)
}
int stk500_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, int n_bytes)
int stk500_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
int page_size, int n_bytes)
{
unsigned char buf[16];
int memtype;
@@ -747,9 +748,6 @@ int stk500_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, int n_bytes)
int tries;
unsigned int n;
if (!m->paged)
return -1;
if (strcmp(m->desc, "flash") == 0) {
memtype = 'F';
}
@@ -760,7 +758,7 @@ int stk500_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, int n_bytes)
return -2;
}
if (m->op[AVR_OP_LOADPAGE_LO])
if ((m->op[AVR_OP_LOADPAGE_LO]) || (m->op[AVR_OP_READ_LO]))
a_div = 2;
else
a_div = 1;
@@ -770,26 +768,26 @@ int stk500_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, int n_bytes)
n = m->size;
}
else {
if ((n_bytes % m->page_size) != 0) {
n = n_bytes + m->page_size - (n_bytes % m->page_size);
if ((n_bytes % page_size) != 0) {
n = n_bytes + page_size - (n_bytes % page_size);
}
else {
n = n_bytes;
}
}
for (addr = 0; addr < n; addr += m->page_size) {
for (addr = 0; addr < n; addr += page_size) {
fprintf(stderr, "\r \r%6u", addr);
tries = 0;
retry:
tries++;
loadaddr(pgm, addr/a_div);
buf[0] = Cmnd_STK_PROG_PAGE;
buf[1] = (m->page_size >> 8) & 0xff;
buf[2] = m->page_size & 0xff;
buf[1] = (page_size >> 8) & 0xff;
buf[2] = page_size & 0xff;
buf[3] = memtype;
send(pgm, buf, 4);
for (i=0; i<m->page_size; i++) {
for (i=0; i<page_size; i++) {
buf[0] = m->buf[addr + i];
send(pgm, buf, 1);
}
@@ -830,7 +828,8 @@ int stk500_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, int n_bytes)
}
int stk500_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, int n_bytes)
int stk500_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
int page_size, int n_bytes)
{
unsigned char buf[16];
int memtype;
@@ -839,9 +838,6 @@ int stk500_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, int n_bytes)
int tries;
unsigned int n;
if (!m->paged)
return -1;
if (strcmp(m->desc, "flash") == 0) {
memtype = 'F';
}
@@ -852,7 +848,7 @@ int stk500_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, int n_bytes)
return -2;
}
if (m->op[AVR_OP_LOADPAGE_LO])
if ((m->op[AVR_OP_LOADPAGE_LO]) || (m->op[AVR_OP_READ_LO]))
a_div = 2;
else
a_div = 1;
@@ -862,23 +858,26 @@ int stk500_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, int n_bytes)
n = m->size;
}
else {
if ((n_bytes % m->page_size) != 0) {
n = n_bytes + m->page_size - (n_bytes % m->page_size);
if ((n_bytes % page_size) != 0) {
n = n_bytes + page_size - (n_bytes % page_size);
}
else {
n = n_bytes;
}
}
for (addr = 0; addr < n; addr += m->page_size) {
fprintf(stderr, "%s: stk500_paged_load(): n=%d, a_div=%d\n",
progname, n, a_div);
for (addr = 0; addr < n; addr += page_size) {
fprintf(stderr, "\r \r%6u", addr);
tries = 0;
retry:
tries++;
loadaddr(pgm, addr/a_div);
buf[0] = Cmnd_STK_READ_PAGE;
buf[1] = (m->page_size >> 8) & 0xff;
buf[2] = m->page_size & 0xff;
buf[1] = (page_size >> 8) & 0xff;
buf[2] = page_size & 0xff;
buf[3] = memtype;
buf[4] = Sync_CRC_EOP;
send(pgm, buf, 5);
@@ -901,7 +900,7 @@ int stk500_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, int n_bytes)
return -4;
}
recv(pgm, &m->buf[addr], m->page_size);
recv(pgm, &m->buf[addr], page_size);
recv(pgm, buf, 1);
if (buf[0] != Resp_STK_OK) {
@@ -1020,6 +1019,7 @@ void stk500_initpgm(PROGRAMMER * pgm)
*/
pgm->paged_write = stk500_paged_write;
pgm->paged_load = stk500_paged_load;
pgm->page_size = 256;
}