From: Nathael Pajani Date: Mon, 21 May 2012 22:43:57 +0000 (+0200) Subject: check was not meant for check of flash, but for check of user code. X-Git-Tag: v1.0~12 X-Git-Url: http://git.techno-innov.fr/?a=commitdiff_plain;h=d0eb7f000a4c9c39de88fb65c5db2c2d932f15ed;p=soft%2Ftools%2Flpctools check was not meant for check of flash, but for check of user code. corrected and implemented --- diff --git a/prog_commands.c b/prog_commands.c index 3d46705..80b8724 100644 --- a/prog_commands.c +++ b/prog_commands.c @@ -172,7 +172,7 @@ static unsigned int calc_write_size(unsigned int sector_size, unsigned int ram_b return write_size; } -int flash_target(struct part_desc* part, char* filename, int check) +int flash_target(struct part_desc* part, char* filename, int calc_user_code) { int ret = 0; char* data = NULL; @@ -181,6 +181,8 @@ int flash_target(struct part_desc* part, char* filename, int check) unsigned int write_size = 0; unsigned int sector_size = (part->flash_size / part->flash_nb_sectors); uint32_t ram_addr = (part->ram_base + part->ram_buff_offset); + uint32_t* v = NULL; /* Used for checksum computing */ + uint32_t cksum = 0; /** Sanity checks *********************************/ /* RAM buffer address within RAM */ @@ -216,6 +218,18 @@ int flash_target(struct part_desc* part, char* filename, int check) } /* Fill unused buffer with 0's so we can flash blocks of data of "write_size" */ memset(&data[size], 0, (part->flash_size - size)); + /* And check checksum of first 7 vectors if asked, according to section 21.3.3 of + * LPC11xx user's manual (UM10398) */ + v = (uint32_t *)data; + cksum = 0 - v[0] - v[1] - v[2] - v[3] - v[4] - v[5] - v[6]; + if (calc_user_code == 1) { + v[7] = cksum; + } else if (cksum != v[7]) { + printf("Checksum is 0x%08x, should be 0x%08x\n", cksum, v[7]); + free(data); + return -5; + } + printf("Checksum check OK\n"); blocks = (size / write_size) + ((size % write_size) ? 1 : 0); /* Gonna write out of flash ? */ @@ -258,12 +272,6 @@ int flash_target(struct part_desc* part, char* filename, int check) } } - /* And check if asked */ - if (check == 1) { - free(data); - return 0; - } - free(data); return ret; }