avrdude-dev
[Top][All Lists]
Advanced

[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;
}






reply via email to

[Prev in Thread] Current Thread [Next in Thread]