mirror of
https://github.com/mariusgreuel/avrdude.git
synced 2025-12-16 18:44:17 +00:00
Mega-commit to bring in memory tagging.
Each memory image byte is now tagged as it's being read from a file. Only bytes read from a file will be written or verified (modulo page granularity requirements). git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@1007 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
75
jtagmkII.c
75
jtagmkII.c
@@ -136,7 +136,8 @@ static int jtagmkII_setparm(PROGRAMMER * pgm, unsigned char parm,
|
||||
unsigned char * value);
|
||||
static void jtagmkII_print_parms1(PROGRAMMER * pgm, const char * p);
|
||||
static int jtagmkII_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
int page_size, int n_bytes);
|
||||
unsigned int page_size,
|
||||
unsigned int addr, unsigned int n_bytes);
|
||||
|
||||
// AVR32
|
||||
#define ERROR_SAB 0xFFFFFFFF
|
||||
@@ -154,14 +155,16 @@ static int jtagmkII_avr32_reset(PROGRAMMER * pgm, unsigned char val,
|
||||
unsigned char ret1, unsigned char ret2);
|
||||
static int jtagmkII_smc_init32(PROGRAMMER * pgm);
|
||||
static int jtagmkII_paged_write32(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
int page_size, int n_bytes);
|
||||
unsigned int page_size,
|
||||
unsigned int addr, unsigned int n_bytes);
|
||||
static int jtagmkII_flash_lock32(PROGRAMMER * pgm, unsigned char lock,
|
||||
unsigned int page);
|
||||
static int jtagmkII_flash_erase32(PROGRAMMER * pgm, unsigned int page);
|
||||
static int jtagmkII_flash_write_page32(PROGRAMMER * pgm, unsigned int page);
|
||||
static int jtagmkII_flash_clear_pagebuffer32(PROGRAMMER * pgm);
|
||||
static int jtagmkII_paged_load32(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
int page_size, int n_bytes);
|
||||
unsigned int page_size,
|
||||
unsigned int addr, unsigned int n_bytes);
|
||||
|
||||
void jtagmkII_setup(PROGRAMMER * pgm)
|
||||
{
|
||||
@@ -1750,9 +1753,11 @@ void jtagmkII_close(PROGRAMMER * pgm)
|
||||
}
|
||||
|
||||
static int jtagmkII_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
int page_size, int n_bytes)
|
||||
unsigned int page_size,
|
||||
unsigned int addr, unsigned int n_bytes)
|
||||
{
|
||||
int addr, block_size;
|
||||
unsigned int block_size;
|
||||
unsigned int maxaddr = addr + n_bytes;
|
||||
unsigned char *cmd;
|
||||
unsigned char *resp;
|
||||
unsigned char par[4];
|
||||
@@ -1792,9 +1797,8 @@ static int jtagmkII_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
* jtagmkII_paged_write() to EEPROM attempted while in
|
||||
* DW mode. Use jtagmkII_write_byte() instead.
|
||||
*/
|
||||
for (addr = 0; addr < n_bytes; addr++) {
|
||||
for (; addr < maxaddr; addr++) {
|
||||
status = jtagmkII_write_byte(pgm, p, m, addr, m->buf[addr]);
|
||||
report_progress(addr, n_bytes, NULL);
|
||||
if (status < 0) {
|
||||
free(cmd);
|
||||
return -1;
|
||||
@@ -1808,11 +1812,9 @@ static int jtagmkII_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
page_size = PDATA(pgm)->eeprom_pagesize;
|
||||
}
|
||||
serial_recv_timeout = 100;
|
||||
for (addr = 0; addr < n_bytes; addr += page_size) {
|
||||
report_progress(addr, n_bytes,NULL);
|
||||
|
||||
if ((n_bytes-addr) < page_size)
|
||||
block_size = n_bytes - addr;
|
||||
for (; addr < maxaddr; addr += page_size) {
|
||||
if ((maxaddr - addr) < page_size)
|
||||
block_size = maxaddr - addr;
|
||||
else
|
||||
block_size = page_size;
|
||||
if (verbose >= 3)
|
||||
@@ -1888,9 +1890,11 @@ static int jtagmkII_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
}
|
||||
|
||||
static int jtagmkII_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
int page_size, int n_bytes)
|
||||
unsigned int page_size,
|
||||
unsigned int addr, unsigned int n_bytes)
|
||||
{
|
||||
int addr, block_size;
|
||||
unsigned int block_size;
|
||||
unsigned int maxaddr = addr + n_bytes;
|
||||
unsigned char cmd[10];
|
||||
unsigned char *resp;
|
||||
int status, tries;
|
||||
@@ -1917,11 +1921,9 @@ static int jtagmkII_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
cmd[1] = MTYPE_USERSIG;
|
||||
}
|
||||
serial_recv_timeout = 100;
|
||||
for (addr = 0; addr < n_bytes; addr += page_size) {
|
||||
report_progress(addr, n_bytes,NULL);
|
||||
|
||||
if ((n_bytes-addr) < page_size)
|
||||
block_size = n_bytes - addr;
|
||||
for (; addr < maxaddr; addr += page_size) {
|
||||
if ((maxaddr - addr) < page_size)
|
||||
block_size = maxaddr - addr;
|
||||
else
|
||||
block_size = page_size;
|
||||
if (verbose >= 3)
|
||||
@@ -3233,9 +3235,11 @@ static void jtagmkII_close32(PROGRAMMER * pgm)
|
||||
}
|
||||
|
||||
static int jtagmkII_paged_load32(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
int page_size, int n_bytes)
|
||||
unsigned int page_size,
|
||||
unsigned int addr, unsigned int n_bytes)
|
||||
{
|
||||
unsigned int addr, block_size;
|
||||
unsigned int block_size;
|
||||
unsigned int maxaddr = addr + n_bytes;
|
||||
unsigned char cmd[7];
|
||||
unsigned char *resp;
|
||||
int lineno, status;
|
||||
@@ -3274,11 +3278,8 @@ static int jtagmkII_paged_load32(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
cmd[1] = 0x40;
|
||||
cmd[2] = 0x05;
|
||||
|
||||
addr = 0;
|
||||
for (addr = 0; addr < n_bytes; addr += block_size) {
|
||||
report_progress(addr, n_bytes, NULL);
|
||||
|
||||
block_size = ((n_bytes-addr) < pgm->page_size) ? (n_bytes - addr) : pgm->page_size;
|
||||
for (; addr < maxaddr; addr += block_size) {
|
||||
block_size = ((maxaddr-addr) < pgm->page_size) ? (maxaddr - addr) : pgm->page_size;
|
||||
if (verbose >= 3)
|
||||
fprintf(stderr, "%s: jtagmkII_paged_load32(): "
|
||||
"block_size at addr %d is %d\n",
|
||||
@@ -3326,14 +3327,16 @@ static int jtagmkII_paged_load32(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
}
|
||||
|
||||
static int jtagmkII_paged_write32(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
int page_size, int n_bytes)
|
||||
unsigned int page_size,
|
||||
unsigned int addr, unsigned int n_bytes)
|
||||
{
|
||||
unsigned int addr, block_size;
|
||||
unsigned int block_size;
|
||||
unsigned char *cmd=NULL;
|
||||
unsigned char *resp;
|
||||
int lineno, status, pages, pageNum, blocks;
|
||||
int lineno, status, pages, sPageNum, pageNum, blocks;
|
||||
unsigned long val=0;
|
||||
unsigned long otimeout = serial_recv_timeout;
|
||||
unsigned int maxaddr = addr + n_bytes;
|
||||
|
||||
serial_recv_timeout = 256;
|
||||
|
||||
@@ -3343,7 +3346,8 @@ static int jtagmkII_paged_write32(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
if(status != 0) {lineno = __LINE__; goto eRR;}
|
||||
p->flags |= AVRPART_WRITE;
|
||||
|
||||
pages = (n_bytes-1)/page_size + 1;
|
||||
pages = (n_bytes - addr - 1)/page_size + 1;
|
||||
sPageNum = addr/page_size;
|
||||
//fprintf(stderr, "\n pageSize=%d bytes=%d pages=%d m->offset=0x%x pgm->page_size %d\n",
|
||||
// page_size, n_bytes, pages, m->offset, pgm->page_size);
|
||||
|
||||
@@ -3361,13 +3365,13 @@ static int jtagmkII_paged_write32(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
}
|
||||
|
||||
// First unlock the pages
|
||||
for(pageNum=0; pageNum < pages; ++pageNum) {
|
||||
for(pageNum=sPageNum; pageNum < pages; ++pageNum) {
|
||||
status =jtagmkII_flash_lock32(pgm, 0, pageNum);
|
||||
if(status < 0) {lineno = __LINE__; goto eRR;}
|
||||
}
|
||||
|
||||
// Then erase them (guess could do this in the same loop above?)
|
||||
for(pageNum=0; pageNum < pages; ++pageNum) {
|
||||
for(pageNum=sPageNum; pageNum < pages; ++pageNum) {
|
||||
status =jtagmkII_flash_erase32(pgm, pageNum);
|
||||
if(status < 0) {lineno = __LINE__; goto eRR;}
|
||||
}
|
||||
@@ -3376,16 +3380,13 @@ static int jtagmkII_paged_write32(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||
u32_to_b4r(&cmd[1], 0x40000000); // who knows
|
||||
cmd[5] = 0x5;
|
||||
|
||||
addr = 0;
|
||||
for(pageNum=0; pageNum < pages; ++pageNum) {
|
||||
|
||||
report_progress(addr, n_bytes, NULL);
|
||||
for(pageNum=sPageNum; pageNum < pages; ++pageNum) {
|
||||
|
||||
status = jtagmkII_flash_clear_pagebuffer32(pgm);
|
||||
if(status != 0) {lineno = __LINE__; goto eRR;}
|
||||
|
||||
for(blocks=0; blocks<2; ++blocks) {
|
||||
block_size = ((n_bytes-addr) < pgm->page_size) ? (n_bytes - addr) : pgm->page_size;
|
||||
block_size = ((maxaddr-addr) < pgm->page_size) ? (maxaddr - addr) : pgm->page_size;
|
||||
if (verbose >= 3)
|
||||
fprintf(stderr, "%s: jtagmkII_paged_write32(): "
|
||||
"block_size at addr %d is %d\n",
|
||||
|
||||
Reference in New Issue
Block a user