# HG changeset patch # User Michael Spacefalcon # Date 1372020641 0 # Node ID d98137625c0d53c32827b7e008d8c14d38304ba8 # Parent 278052b6afdae5aff056aeb4255af72b7a96f190 fc-loadtool flash: total_size logic implemented diff -r 278052b6afda -r d98137625c0d loadtools/Makefile --- a/loadtools/Makefile Sun Jun 23 20:13:59 2013 +0000 +++ b/loadtools/Makefile Sun Jun 23 20:50:41 2013 +0000 @@ -9,7 +9,7 @@ IRAM_OBJS= defpath.o hexdecode.o hwparam.o hwparamstubs.o romload.o \ sercomm.o sertool.o srecreader.o ttypassthru.o -LOADTOOL_OBJS= crc32tab.o defpath.o hexdecode.o hwparam.o labaud.o \ +LOADTOOL_OBJS= crc32tab.o defpath.o flutil.o hexdecode.o hwparam.o labaud.o \ ltdispatch.o ltdump.o ltexit.o ltflash.o ltmain.o ltpassthru.o \ ltscript.o romload.o sercomm.o srecreader.o tpinterf.o \ tpinterf2.o diff -r 278052b6afda -r d98137625c0d loadtools/flutil.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loadtools/flutil.c Sun Jun 23 20:50:41 2013 +0000 @@ -0,0 +1,34 @@ +/* + * Miscellaneous utility functions for flash support + */ + +#include +#include +#include +#include +#include "flash.h" + +extern struct flash_bank_info flash_bank_info[2]; + +compute_flash_totsize_nsecs(bank) +{ + struct flash_bank_info *bi; + struct flash_region_desc *reg; + + bi = flash_bank_info + bank; + for (reg = bi->bank_desc->regions; reg->nsectors; reg++) { + bi->nsectors += reg->nsectors; + bi->total_size += reg->sector_size * reg->nsectors; + } +} + +/* the following function is used to verify that total_size is a power of 2 */ +count_ones(word) + uint32_t word; +{ + int count; + + for (count = 0; word; word >>= 1) + count += word & 1; + return count; +} diff -r 278052b6afda -r d98137625c0d loadtools/ltflash.c --- a/loadtools/ltflash.c Sun Jun 23 20:13:59 2013 +0000 +++ b/loadtools/ltflash.c Sun Jun 23 20:50:41 2013 +0000 @@ -54,6 +54,7 @@ char *cp, *np, *ep; struct flash_device_desc *tp; int bank; + struct flash_bank_info *bi; if (selected_flash_device) { fprintf(stderr, "%s line %d: duplicate flash setting\n", @@ -93,7 +94,8 @@ ; if (*cp) *cp++ = '\0'; - flash_bank_info[bank].base_addr = strtoul(np, &ep, 16); + bi = flash_bank_info + bank; + bi->base_addr = strtoul(np, &ep, 16); if (*ep) { fprintf(stderr, "%s line %d: syntax error (base addr expected after flash device type)\n", @@ -101,9 +103,21 @@ exit(1); } /* the rest comes from the flash device type */ - flash_bank_info[bank].bank_desc = - selected_flash_device->bank_desc + bank; - /* TODO: call function to init total_size and nsectors */ + bi->bank_desc = selected_flash_device->bank_desc + bank; + compute_flash_totsize_nsecs(bank); + if (count_ones(bi->total_size) != 1) { + fprintf(stderr, +"fc-loadtool internal bug: flash bank %d size for %s is not a power of 2\n", + bank, selected_flash_device->name); + exit(1); + } + if (bi->base_addr & (bi->total_size - 1)) { + fprintf(stderr, +"%s line %d: flash bank %d base addr is not aligned to the bank size (0x%lx)\n", + filename_for_errs, lineno_for_errs, bank, + (u_long) bi->total_size); + exit(1); + } } while (isspace(*cp)) cp++;