[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[avrdude-dev] Re:First release of stk500v2 patch
From: |
Martin Thomas |
Subject: |
[avrdude-dev] Re:First release of stk500v2 patch |
Date: |
Mon, 14 Feb 2005 20:17:06 +0100 |
Date: Sat, 12 Feb 2005 19:37:56 -0800
From: Erik Walthinsen <address@hidden>
Subject: [avrdude-dev] First release of stk500v2 patch
All basic operations succeed except for paged-mode readback, which for
some reason I haven't tracked down yet returns the first page correctly
...
This may help:
static int stk500_2_loadaddr(PROGRAMMER * pgm, unsigned long addr)
{
unsigned char buf[16];
buf[0] = CMD_LOAD_ADDRESS;
buf[1] = (unsigned char) ((addr >> 24) & 0xff);
buf[2] = (unsigned char) ((addr >> 16) & 0xff);
buf[3] = (unsigned char) ((addr >> 8) & 0xff);
buf[4] = (unsigned char) (addr & 0xff);
stk500_2_SendMessage(pgm, buf, 5);
if ( stk500_2_ReceiveMessage(pgm, 0, buf, 2) != 0 ) {
fprintf(stderr, "%s: stk500_2_loadaddr(): can't get into sync\n",
progname);
return -1;
}
if ( (buf[0] != CMD_LOAD_ADDRESS) ||
(buf[1] != STATUS_CMD_OK) ) {
fprintf(stderr, "%s: stk500_2_loadaddr(): failed (0x%02x 0x%02x)\n",
progname, buf[0], buf[1] );
return -1;
}
/*fprintf(stderr, "%s: stk500_2_loadaddr(): success\n",
progname );*/
return 0;
}
static int stk500_2_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
int page_size, int n_bytes)
{
unsigned char buf[1024];
unsigned char flash, stkCommand, cmd1;
unsigned char cfgcmd[4];
int i;
unsigned long addr;
int a_div;
unsigned int n;
int block_size;
if (strcmp(m->desc, "flash") == 0) {
flash = 1;
stkCommand = CMD_READ_FLASH_ISP;
}
else if (strcmp(m->desc, "eeprom") == 0) {
flash = 0;
stkCommand = CMD_READ_EEPROM_ISP;
}
else {
return -2;
}
if ((m->op[AVR_OP_LOADPAGE_LO]) || (m->op[AVR_OP_READ_LO]))
a_div = 2;
else
a_div = 1;
if (n_bytes > m->size) {
n_bytes = m->size;
n = m->size;
}
else {
if ((n_bytes % page_size) != 0) {
n = n_bytes + page_size - (n_bytes % page_size);
}
else {
n = n_bytes;
}
}
// read program memory low
if ( m->op[AVR_OP_READ_LO] == NULL) {
fprintf(stderr, "\nAVR_OP_LOADPAGE_LO not defined for part \"%s\"\n",
p->desc);
return -1;
}
memset(cfgcmd, 0, sizeof(cfgcmd));
avr_set_bits(m->op[AVR_OP_READ_LO], cfgcmd);
cmd1 = cfgcmd[0];
for (addr = 0; addr < n; addr += page_size) {
report_progress (addr, n_bytes, NULL);
if (addr + page_size > n_bytes) {
block_size = n_bytes % page_size;
}
else {
block_size = page_size;
}
stk500_2_loadaddr(pgm, addr/a_div); // TODO: stk500_2 has auto-incr.
buf[0] = stkCommand;
buf[1] = (block_size >> 8) & 0xff;
buf[2] = block_size & 0xff;
buf[3] = 0x20; // cmd1;
stk500_2_SendMessage(pgm, buf, 4);
if ( stk500_2_ReceiveMessage(pgm, 0, buf, 1024) != 0 ) {
fprintf(stderr, "%s: stk500_2_paged_load(): can't get into sync\n",
progname);
return -1;
}
if ( buf[0] != stkCommand ) {
fprintf(stderr, "%s: stk500_2_paged_load(): unexpeced answer\n",
progname);
return -1;
}
if ( ( buf[1] == STATUS_CMD_FAILED) ) {
fprintf(stderr, "%s: stk500_2_paged_load(): command failed %x\n",
progname, buf[1]);
return -1;
}
for (i=0; i<block_size; i++) {
m->buf[addr+i] = buf[2+i];
}
} // end for-loop addr
return n_bytes;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [avrdude-dev] Re:First release of stk500v2 patch,
Martin Thomas <=