summaryrefslogtreecommitdiff
path: root/application/boottable
diff options
context:
space:
mode:
authorJoachim Naulet2008-10-23 17:00:54 +0200
committerJoachim Naulet2008-10-23 17:00:54 +0200
commit33d1d0edfb03bc496f9af2d983840c8b8114d69b (patch)
tree230b6ee227a9a11edc2f91c5124de73f5ab2b1f9 /application/boottable
parentcf4776537aa63e70307a32df7ff8e66564a1f11d (diff)
Added boottable
Diffstat (limited to 'application/boottable')
-rw-r--r--application/boottable/Makefile10
-rw-r--r--application/boottable/bt.c12
-rwxr-xr-x[-rw-r--r--]application/boottable/commands.c0
-rwxr-xr-xapplication/boottable/commands_linux.c21
-rw-r--r--application/boottable/image_table_linux.c1013
5 files changed, 440 insertions, 616 deletions
diff --git a/application/boottable/Makefile b/application/boottable/Makefile
index b3d7aefd52..67607f4ffe 100644
--- a/application/boottable/Makefile
+++ b/application/boottable/Makefile
@@ -2,7 +2,7 @@
# Makefile
# Generate the BT tools for boot table management
-LIB=boottable.a
+LIB=libbt.a
BT=bt
OBJ=commands_linux.o posix_crc.o image_table_linux.o mtd_part.o
@@ -14,17 +14,17 @@ LINUX_DIR=$(TOPDIR)/linux-2.6.10
CC=arm-uclinux-gcc
AR=arm-uclinux-ar
-INCLUDE=-I$(TOPDIR)/include -I$(TOPDIR)/include/plc-drv -I$(LINUX_DIR)/include/mtd -I$(APP_DIR)/mib -I$(APP_DIR)/spidlib/inc -I.
+INCLUDE=-I$(TOPDIR)/include -I$(TOPDIR)/include/plc-drv -I$(LINUX_DIR)/include/mtd -I$(APP_DIR)/mib -I$(APP_DIR)/spidlib/inc
CFLAGS=$(DEFINES) $(INCLUDE) -c -msoft-float -march=armv5 -mtune=arm926ejs -mapcs-32 -fomit-frame-pointer -Os -DINLINE=inline -D__LINUX__ -DDEVICENB=1
LDFLAGS= -msoft-float -march=armv5 -Wl,-elf2flt='-z -s 16k'
-all: $(LIB) #$(BT)
+all: $(LIB) $(BT)
$(BT): $(LIB) $(BT).o
- $(CC) -o $@ $(BT).o $(LDFLAGS) $(LIB) -lpthread $(APP_DIR)/mib/mib.a -lpthread
+ $(CC) -o $@ $(BT).o $(LDFLAGS) -lbt -lpthread ../mib/mib.a
$(LIB): $(OBJ)
- $(AR) -rcs $@ $(OBJ)
+ $(AR) -r $@ $(OBJ)
%.o:%.c
$(CC) $(CFLAGS) -o $@ $<
diff --git a/application/boottable/bt.c b/application/boottable/bt.c
index f572b6b6e3..b84fb4cac2 100644
--- a/application/boottable/bt.c
+++ b/application/boottable/bt.c
@@ -31,27 +31,27 @@ int main(int argc, char **argv)
bt_init(1,NULL);
if (!strcmp(argv[1],"images")) {
- boottable_images(argc,argv);
+ images(argc,argv);
goto OK;
}
if (!strcmp(argv[1],"rename")) {
- boottable_bootrename(argc-1,&argv[1]);
+ bootrename(argc-1,&argv[1]);
goto OK;
}
if (!strcmp(argv[1],"erase")) {
- boottable_erase(argv[1]);
+ erase(argc-1,&argv[1]);
goto OK;
}
if (!strcmp(argv[1],"select")) {
- boottable_bootSelect(argc-1,&argv[1]);
+ bootSelect(argc-1,&argv[1]);
goto OK;
}
if (!strcmp(argv[1],"setup")) {
- boottable_setup(argc-1,&argv[1]);
+ setup(argc-1,&argv[1]);
goto OK;
}
if (!strcmp(argv[1],"create")) {
- boottable_create(argc-1,&argv[1]);
+ create(argc-1,&argv[1]);
goto OK;
}
printf("Invalid parameter :\n");
diff --git a/application/boottable/commands.c b/application/boottable/commands.c
index 4b67ecf359..4b67ecf359 100644..100755
--- a/application/boottable/commands.c
+++ b/application/boottable/commands.c
diff --git a/application/boottable/commands_linux.c b/application/boottable/commands_linux.c
index 60b4d614e2..de0a773c96 100755
--- a/application/boottable/commands_linux.c
+++ b/application/boottable/commands_linux.c
@@ -304,7 +304,7 @@ int check_image_name(const char *name)
p = name;
len = strlen(name);
- if (!isalpha(*p) && !isdigit(*p))
+ if (!isalpha(*p))
return 0;
p++;
while (result && p<name+len)
@@ -360,7 +360,7 @@ const char *format_string(int compressed, image_format_t format)
int boottable_images(char releaseName[10][32])
{
const char *image_name;
- int nbRelease = 1;
+ int nbRelease = 0;
memset(releaseName,0,sizeof(releaseName));
@@ -387,19 +387,8 @@ int boottable_images(char releaseName[10][32])
while (image_name)
{
if (strcmp(image_name,"MIB")!=0 && strcmp(image_name,"ffs")!=0) {
- if ( 0 != strcmp(image_name, get_selected_name()) )
- {
- strcpy(releaseName[nbRelease],image_name);
- nbRelease++;
- }
- else
- {
- // Correction of bug 47 (workaround to handle this case without modifying the MIB):
- // write the active image name in first position,
- // in order that the network manager can retrieve the active image
- // among several images which have the same tag.
- strcpy(releaseName[0], image_name);
- }
+ strcpy(releaseName[nbRelease],image_name);
+ nbRelease++;
}
image_name = next_entry(image_name);
}
@@ -517,7 +506,7 @@ int boottable_create(char* ftpIp, uint16_t ftpPort, char* login, char* passwd, c
}
if (!check_image_name(name))
- printf("Error: invalid image name \"%s\". Image name must be [a-zA-Z0-9][a-zA-Z0-9-_.]*.\n",name);
+ printf("Error: invalid image name \"%s\". Image name must be [a-zA-Z][a-zA-Z0-9-_.]*.\n",name);
else if (get_entry(name,&image_desc,&v)>=0)
printf("Error: name \"%s\" already used.\n",name);
else
diff --git a/application/boottable/image_table_linux.c b/application/boottable/image_table_linux.c
index fe53a714e1..b7a9d2283c 100644
--- a/application/boottable/image_table_linux.c
+++ b/application/boottable/image_table_linux.c
@@ -34,782 +34,617 @@ DATE | AUTHOR | Version | Description
typedef struct
{
- char name[ENTRY_NAME_LEN];
- image_desc_t image_desc;
- int selected;
+ char name[ENTRY_NAME_LEN];
+ image_desc_t image_desc;
+ int selected;
} entry_t;
typedef struct
{
- char magic0[MAGIC_LEN];
- entry_t entries[MAX_ENTRIES];
- char magic1[MAGIC_LEN];
- uint32_t crc;
+ char magic0[MAGIC_LEN];
+ entry_t entries[MAX_ENTRIES];
+ char magic1[MAGIC_LEN];
+ uint32_t crc;
} entry_table_t;
-typedef struct
-{
- entry_table_t entry;
- int fd;
-} context_table_t;
-
-//static int entry_table_part = -1;
-//static entry_table_t entry_table;
+static int entry_table_part = -1;
+static entry_table_t entry_table;
static int entry_table_setup = 0;
static char error_string[512];
static caddr_t av_flash_base;
static size_t av_flash_size;
/* internal */
-static int load_table(context_table_t *table)
+static entry_table_t *backup_table(void)
{
- //Load Btable
- if ((table->fd=mtd_part_open("btable"))!=ERROR)
- {
- caddr_t address;
- size_t size;
- address = (caddr_t)(mtd_part_size(table->fd)-sizeof(entry_table_t));
- size = sizeof(entry_table_t);
-
- mtd_part_get_area(table->fd, &address, &size);
- mtd_part_read(table->fd,address,(uint8_t*)&table->entry,sizeof(entry_table_t));
- return 0;
- }
- return -1;
-}
+ entry_table_t *result;
-static int store_table(context_table_t *table, int really_store)
-{
- int mtd_part_result;
- caddr_t address;
- int result = 0;
- size_t size;
- entry_table_t tmp_table;
+ result = (entry_table_t *)malloc(sizeof(entry_table_t));
+ memcpy(result,(char*)&entry_table,sizeof(entry_table_t));
- if(really_store)
- {
- address = (caddr_t)(mtd_part_size(table->fd) - sizeof(entry_table_t));
- size = sizeof(entry_table_t);
-
- /* Put the crc */
- table->entry.crc = posix_crc((caddr_t)&table->entry, (caddr_t)&table->entry.crc - (caddr_t)&table->entry);
-
- if((mtd_part_result = mtd_part_get_area(table->fd, &address, &size)) >= 0){
- if((mtd_part_result = mtd_part_unlock_blocks(table->fd, address, size)) >= 0){
- if((mtd_part_result = mtd_part_erase_blocks(table->fd, address, size)) >= 0){
- if((mtd_part_result = mtd_part_write(table->fd, address, (uint8_t*)&table->entry, sizeof(entry_table_t))) >= 0)
- mtd_part_lock_blocks(table->fd, address, size);
- }
- }
- }
-
- if(mtd_part_result < 0){
- sprintf(error_string, "Flash error");
- result = FLASH_ERR;
- }else{
- mtd_part_read(table->fd, address, (uint8_t*)&tmp_table, sizeof(entry_table_t));
- if(!!memcmp(&tmp_table, &table->entry, sizeof(entry_table_t))){
- sprintf(error_string, "Flash error: invalid data written");
- result = FLASH_ERR;
- }
- }
- }
- mtd_part_close(table->fd);
- return result;
+ return result;
}
-static int find_index_by_addr(caddr_t address, entry_table_t *entry_table)
+static int store_table(entry_table_t *table)
{
- int result;
- caddr_t max_addr;
- int i;
+ int mtd_part_result;
+ caddr_t address;
+ size_t size;
+ int result = 0;
+
+ address = (caddr_t)(mtd_part_size(entry_table_part)-sizeof(entry_table_t));
+ size = sizeof(entry_table_t);
+
+ // put the crc
+ table->crc = posix_crc((caddr_t)table,(caddr_t)&table->crc-(caddr_t)table);
+
+ if ((mtd_part_result=mtd_part_get_area(entry_table_part, &address, &size))>=0)
+ {
+ if ((mtd_part_result=mtd_part_unlock_blocks(entry_table_part, address, size))>=0)
+ {
+ if ((mtd_part_result=mtd_part_erase_blocks(entry_table_part, address, size))>=0)
+ {
+ if ((mtd_part_result=mtd_part_write(entry_table_part, address, (uint8_t*)table, sizeof(entry_table_t)))>=0)
+ mtd_part_lock_blocks(entry_table_part, address, size);
+ }
+ }
+ }
+
+ if (mtd_part_result<0)
+ {
+ sprintf(error_string,"Flash error");
+ result = FLASH_ERR;
+ }
+ else
+ {
+ mtd_part_read(entry_table_part,address,(uint8_t*)&entry_table,sizeof(entry_table_t));
+ if (memcmp(&entry_table, table, sizeof(entry_table_t)))
+ {
+ sprintf(error_string,"Flash error: invalid data written");
+ result = FLASH_ERR;
+ }
+ }
+
+ free(table);
+ return result;
+}
- result = -1;
- max_addr = (caddr_t)0xFFFFFFFF;
- if(entry_table)
- {
- for (i=0; i<MAX_ENTRIES; i++)
- {
- if (entry_table->entries[i].name[0]!='\0' &&
- entry_table->entries[i].image_desc.storage_address>=address &&
- entry_table->entries[i].image_desc.storage_address<max_addr)
- {
- result = i;
- max_addr = entry_table->entries[i].image_desc.storage_address;
- }
- }
- }
- return result;
+static int find_index_by_addr(caddr_t address)
+{
+ int result;
+ caddr_t max_addr;
+ int i;
+
+ result = -1;
+ max_addr = (caddr_t)0xFFFFFFFF;
+ for (i=0; i<MAX_ENTRIES; i++)
+ {
+ if (entry_table.entries[i].name[0]!='\0' &&
+ entry_table.entries[i].image_desc.storage_address>=address &&
+ entry_table.entries[i].image_desc.storage_address<max_addr)
+ {
+ result = i;
+ max_addr = entry_table.entries[i].image_desc.storage_address;
+ }
+ }
+ return result;
}
-static int find_index_by_name(const char *name, entry_table_t *entry_table)
+static int find_index_by_name(const char *name)
{
- int result;
+ int result;
- result = 0;
- while (result<MAX_ENTRIES && strcmp(entry_table->entries[result].name,name))
- result++;
+ result = 0;
+ while (result<MAX_ENTRIES && strcmp(entry_table.entries[result].name,name))
+ result++;
- if (result<MAX_ENTRIES)
- return result;
- else
- return -1;
+ if (result<MAX_ENTRIES)
+ return result;
+ else
+ return -1;
}
-static int find_selected_index(entry_table_t *entry_table)
+static int find_selected_index(void)
{
- int result;
-
- result = 0;
- while (result<MAX_ENTRIES &&
- (entry_table->entries[result].name[0]=='\0' ||
- !entry_table->entries[result].selected))
- result++;
-
- if (result<MAX_ENTRIES)
- return result;
- else
- return -1;
-}
+ int result;
-static int image_overlaps(caddr_t address, size_t size, entry_table_t *entry_table)
-{
- int result = 0;
- int i = 0;
+ result = 0;
+ while (result<MAX_ENTRIES &&
+ (entry_table.entries[result].name[0]=='\0' ||
+ !entry_table.entries[result].selected))
+ result++;
- while (!result && i<MAX_ENTRIES)
- {
- result = (entry_table->entries[i].name[0]!='\0') &&
- overlap(address,size,entry_table->entries[i].image_desc.storage_address,
- entry_table->entries[i].image_desc.size);
- i++;
- }
+ if (result<MAX_ENTRIES)
return result;
+ else
+ return -1;
}
-int find_free_area(caddr_t *address, size_t size, entry_table_t *entry_table)
+static int image_overlaps(caddr_t address, size_t size)
{
- int Mindex;
- int result;
- caddr_t next_image_address;
- size_t next_image_size;
- int images_part;
+ int result = 0;
+ int i = 0;
- result = 0;
- *address = available_flash_base();
-
- if ((images_part=mtd_part_open("images")))
+ while (!result && i<MAX_ENTRIES)
{
- while ((Mindex=find_index_by_addr(*address, entry_table))>=0 && !result)
- {
- // get block-rounded address
- // adjust with available_flash_base() to get offset within partition
- next_image_address = entry_table->entries[Mindex].image_desc.storage_address-(size_t)available_flash_base();
- next_image_size = entry_table->entries[Mindex].image_desc.size;
- mtd_part_get_area(images_part, &next_image_address, &next_image_size);
- // adjust back with available_flash_base() to get physical address
- next_image_address+=(size_t)available_flash_base();
- // does address+size fit in the free block before the image?
- if (*address+size<=next_image_address)
- result = 1;
- else
- *address = next_image_address+next_image_size;
- }
- mtd_part_close(images_part);
+ result = (entry_table.entries[i].name[0]!='\0') &&
+ overlap(address,size,entry_table.entries[i].image_desc.storage_address,
+ entry_table.entries[i].image_desc.size);
+ i++;
}
+ return result;
+}
- result = result || *address+size<=available_flash_base()+available_flash_size();
-
- return result;
+int find_free_area(caddr_t *address, size_t size)
+{
+ int index;
+ int result;
+ caddr_t next_image_address;
+ size_t next_image_size;
+ int images_part;
+
+ result = 0;
+ *address = available_flash_base();
+
+ if (images_part=mtd_part_open("images"))
+ {
+ while ((index=find_index_by_addr(*address))>=0 && !result)
+ {
+ // get block-rounded address
+ // adjust with available_flash_base() to get offset within partition
+ next_image_address = entry_table.entries[index].image_desc.storage_address-(size_t)available_flash_base();
+ next_image_size = entry_table.entries[index].image_desc.size;
+ mtd_part_get_area(images_part, &next_image_address, &next_image_size);
+ // adjust back with available_flash_base() to get physical address
+ next_image_address+=(size_t)available_flash_base();
+ // does address+size fit in the free block before the image?
+ if (*address+size<=next_image_address)
+ result = 1;
+ else
+ *address = next_image_address+next_image_size;
+ }
+ mtd_part_close(images_part);
+ }
+
+ result = result || *address+size<=available_flash_base()+available_flash_size();
+
+ return result;
}
/* exported */
int image_table_init(void)
{
- caddr_t address;
- int entry_table_part;
- entry_table_t entry_table;
- size_t size;
- uint32_t crc;
- int part;
-
- if ((part=mtd_part_open("images"))!=ERROR)
- {
- av_flash_base = (caddr_t)FLASH_BASE+mtd_part_offset(part);
- av_flash_size = mtd_part_size(part);
- mtd_part_close(part);
- }
-
- if ((entry_table_part=mtd_part_open("btable"))!=ERROR)
- {
- address = (caddr_t)(mtd_part_size(entry_table_part)-sizeof(entry_table_t));
-
- size = sizeof(entry_table_t);
-
- mtd_part_get_area(entry_table_part, &address, &size);
-
- mtd_part_read(entry_table_part,address,(uint8_t*)&entry_table,sizeof(entry_table_t));
-
- crc = posix_crc((caddr_t)&entry_table,(caddr_t)&entry_table.crc-(caddr_t)&entry_table);
-
- if (strncmp(entry_table.magic0,MAGIC_KEY,MAGIC_LEN) || strncmp(entry_table.magic1,MAGIC_KEY,MAGIC_LEN) ||
- crc!=entry_table.crc)
- {
- entry_table_setup = 0;
- sprintf(error_string,"Table not set-up or corrupted");
- mtd_part_close(entry_table_part);
- return TABLE_NOT_SET_UP;
- }
- else
- {
- entry_table_setup = 1;
- mtd_part_close(entry_table_part);
- return 0;
- }
- }
- else
- {
- entry_table_setup = 0;
- sprintf(error_string,"Table not set-up or corrupted");
- return TABLE_NOT_SET_UP;
- }
+ caddr_t address;
+ size_t size;
+ uint32_t crc;
+ int part;
+
+ if ((part=mtd_part_open("images"))!=ERROR)
+ {
+ av_flash_base = (caddr_t)FLASH_BASE+mtd_part_offset(part);
+ av_flash_size = mtd_part_size(part);
+ mtd_part_close(part);
+ }
+
+ if ((entry_table_part=mtd_part_open("btable"))!=ERROR)
+ {
+ address = (caddr_t)(mtd_part_size(entry_table_part)-sizeof(entry_table_t));
+
+ size = sizeof(entry_table_t);
+
+ mtd_part_get_area(entry_table_part, &address, &size);
+
+ mtd_part_read(entry_table_part,address,(uint8_t*)&entry_table,sizeof(entry_table_t));
+
+ crc = posix_crc((caddr_t)&entry_table,(caddr_t)&entry_table.crc-(caddr_t)&entry_table);
+
+ if (strncmp(entry_table.magic0,MAGIC_KEY,MAGIC_LEN) || strncmp(entry_table.magic1,MAGIC_KEY,MAGIC_LEN) ||
+ crc!=entry_table.crc)
+ {
+ entry_table_setup = 0;
+ sprintf(error_string,"Table not set-up or corrupted");
+ return TABLE_NOT_SET_UP;
+ }
+ else
+ {
+ entry_table_setup = 1;
+ return 0;
+ }
+ }
+ else
+ {
+ entry_table_setup = 0;
+ sprintf(error_string,"Table not set-up or corrupted");
+ return TABLE_NOT_SET_UP;
+ }
}
caddr_t available_flash_base(void)
{
- return av_flash_base;
+ return av_flash_base;
}
size_t available_flash_size(void)
{
- return av_flash_size;
+ return av_flash_size;
}
int table_is_setup(void)
{
- return entry_table_setup;
+ return entry_table_setup;
}
int setup_table(void)
{
- context_table_t ctx;
- int result;
- int i;
-
- //Load Btable and copy to ctx
- if(load_table(&ctx))
- {
- sprintf(error_string,"Error opening btable");
- return 0;
- }
-
- //Setup Btable
- strncpy(ctx.entry.magic0,MAGIC_KEY,MAGIC_LEN);
- strncpy(ctx.entry.magic1,MAGIC_KEY,MAGIC_LEN);
- for(i=0; i<MAX_ENTRIES; i++)
- memset(ctx.entry.entries[i].name,0,ENTRY_NAME_LEN);
-
- //Store Btable
- if ((result=store_table(&ctx, 1))>=0)
- entry_table_setup = 1;
-
- return result;
+ entry_table_t *tmp_table;
+ int result;
+ int i;
+
+ tmp_table = backup_table();
+ strncpy(tmp_table->magic0,MAGIC_KEY,MAGIC_LEN);
+ strncpy(tmp_table->magic1,MAGIC_KEY,MAGIC_LEN);
+ for(i=0; i<MAX_ENTRIES; i++)
+ memset(tmp_table->entries[i].name,0,ENTRY_NAME_LEN);
+
+ if ((result=store_table(tmp_table))>=0)
+ entry_table_setup = 1;
+
+ return result;
}
int add_entry(const char *name, image_desc_t *image_desc)
{
- int i;
- char real_name[ENTRY_NAME_LEN];
- int oldindex;
- context_table_t ctx;
- int result;
+ int i;
+ char real_name[ENTRY_NAME_LEN];
+ int oldindex;
+ entry_table_t *tmp_table;
+ int result;
- if ((result=test_add_entry(name,image_desc))<0)
- return result;
+ if ((result=test_add_entry(name,image_desc))<0)
+ return result;
- /* bzero(real_name,ENTRY_NAME_LEN);*/
- memset(real_name,0,ENTRY_NAME_LEN);
- strncpy(real_name,name,ENTRY_NAME_LEN-1);
-
- //Load Btable and copy to ctx
- if(load_table(&ctx))
- {
- sprintf(error_string,"Error opening btable");
- return 0;
- }
+ /* bzero(real_name,ENTRY_NAME_LEN);*/
+ memset(real_name,0,ENTRY_NAME_LEN);
+ strncpy(real_name,name,ENTRY_NAME_LEN-1);
- i = 0;
- while(i<MAX_ENTRIES && strcmp(ctx.entry.entries[i].name,""))
- i++;
+ i = 0;
+ while(i<MAX_ENTRIES && strcmp(entry_table.entries[i].name,""))
+ i++;
- if (i<MAX_ENTRIES)
+ if (i<MAX_ENTRIES)
{
- oldindex = find_selected_index(&ctx.entry);
-
- strcpy(ctx.entry.entries[i].name,real_name);
- ctx.entry.entries[i].image_desc = *image_desc;
- if (oldindex>=0)
- ctx.entry.entries[oldindex].selected = 0;
- ctx.entry.entries[i].selected = 1;
- return store_table(&ctx, 1);
- }
- else
+ oldindex = find_selected_index();
+
+ tmp_table = backup_table();
+ strcpy(tmp_table->entries[i].name,real_name);
+ tmp_table->entries[i].image_desc = *image_desc;
+ if (oldindex>=0)
+ tmp_table->entries[oldindex].selected = 0;
+ tmp_table->entries[i].selected = 1;
+ return store_table(tmp_table);
+ }
+ else
{
- sprintf(error_string,"Image table full");
- store_table(&ctx, 0);
- return TABLE_FULL;
+ sprintf(error_string,"Image table full");
+ return TABLE_FULL;
}
}
int test_add_entry(const char *name, image_desc_t *image_desc)
{
- int i;
- context_table_t ctx;
- char real_name[ENTRY_NAME_LEN];
- caddr_t erase_address;
- size_t erase_size;
- int images_part;
-
- //Btable not setup return
- if (!entry_table_setup)
- {
- sprintf(error_string,"Table not set-up or corrupted");
- return TABLE_NOT_SET_UP;
- }
-
- //Load Btable and copy to ctx
- if(load_table(&ctx))
+ int i;
+ char real_name[ENTRY_NAME_LEN];
+ caddr_t erase_address;
+ size_t erase_size;
+ int images_part;
+
+ if (!entry_table_setup)
{
- sprintf(error_string,"Error opening btable");
- return 0;
+ sprintf(error_string,"Table not set-up or corrupted");
+ return TABLE_NOT_SET_UP;
}
- /* bzero(real_name,ENTRY_NAME_LEN);*/
- memset(real_name,0,ENTRY_NAME_LEN);
- strncpy(real_name,name,ENTRY_NAME_LEN-1);
+ /* bzero(real_name,ENTRY_NAME_LEN);*/
+ memset(real_name,0,ENTRY_NAME_LEN);
+ strncpy(real_name,name,ENTRY_NAME_LEN-1);
- if (!strcmp(real_name,""))
+ if (!strcmp(real_name,""))
{
- sprintf(error_string,"Unknown image name");
- store_table(&ctx, 0);
- return UNKNOWN_IMAGE_NAME;
+ sprintf(error_string,"Unknown image name");
+ return UNKNOWN_IMAGE_NAME;
}
- else if (find_index_by_name(real_name, &ctx.entry)>=0)
+ else if (find_index_by_name(real_name)>=0)
{
- sprintf(error_string,"Image name \"%s\" already used",real_name);
- store_table(&ctx, 0);
- return IMAGE_NAME_ALREADY_USED;
+ sprintf(error_string,"Image name \"%s\" already used",real_name);
+ return IMAGE_NAME_ALREADY_USED;
}
- if (image_desc->storage_address==0)
- {
- if (!find_free_area(&image_desc->storage_address,image_desc->size, &ctx.entry))
- {
- sprintf(error_string,"No free area of size %lu",(unsigned long)image_desc->size);
- store_table(&ctx, 0);
- return UNAVAILABLE_FLASH_AREA;
- }
- }
-
- if (image_desc->storage_address<available_flash_base() ||
- image_desc->storage_address+image_desc->size-1>available_flash_base()+available_flash_size()-1)
- {
- sprintf(error_string,"Invalid flash area: 0x%.8lx-0x%.8lx",
- (unsigned long)image_desc->storage_address,(unsigned long)image_desc->storage_address+image_desc->size-1);
- store_table(&ctx, 0);
- return INVALID_FLASH_AREA;
- }
+ if (image_desc->storage_address==0)
+ {
+ if (!find_free_area(&image_desc->storage_address,image_desc->size))
+ {
+ sprintf(error_string,"No free area of size %lu",image_desc->size);
+ return UNAVAILABLE_FLASH_AREA;
+ }
+ }
- erase_address = image_desc->storage_address-(size_t)available_flash_base();
- erase_size = image_desc->size;
- if ((images_part=mtd_part_open("images")))
+ if (image_desc->storage_address<available_flash_base() ||
+ image_desc->storage_address+image_desc->size-1>available_flash_base()+available_flash_size()-1)
{
- mtd_part_get_area(images_part, &erase_address, &erase_size);
- erase_address += (size_t)available_flash_base();
- if (image_overlaps(erase_address, erase_size, &ctx.entry))
- {
- sprintf(error_string,"Flash block area 0x%.8lx-0x%.8lx overlaps with existing images",
- (unsigned long)image_desc->storage_address,(unsigned long)image_desc->storage_address+image_desc->size-1);
- store_table(&ctx, 0);
- return UNAVAILABLE_FLASH_AREA;
- }
- mtd_part_close(images_part);
+ sprintf(error_string,"Invalid flash area: 0x%.8lx-0x%.8lx",
+ (unsigned long)image_desc->storage_address,(unsigned long)image_desc->storage_address+image_desc->size-1);
+ return INVALID_FLASH_AREA;
}
- i = 0;
- while(i<MAX_ENTRIES && strcmp(ctx.entry.entries[i].name,""))
- i++;
+ erase_address = image_desc->storage_address-(size_t)available_flash_base();
+ erase_size = image_desc->size;
+ if (images_part=mtd_part_open("images"))
+ {
+ mtd_part_get_area(images_part, &erase_address, &erase_size);
+ erase_address += (size_t)available_flash_base();
+ if (image_overlaps(erase_address, erase_size))
+ {
+ sprintf(error_string,"Flash block area 0x%.8lx-0x%.8lx overlaps with existing images",
+ (unsigned long)image_desc->storage_address,(unsigned long)image_desc->storage_address+image_desc->size-1);
+ return UNAVAILABLE_FLASH_AREA;
+ }
+ mtd_part_close(images_part);
+ }
- //Store Btable
- store_table(&ctx, 1);
+ i = 0;
+ while(i<MAX_ENTRIES && strcmp(entry_table.entries[i].name,""))
+ i++;
- if (i<MAX_ENTRIES)
- return 0;
- else
+ if (i<MAX_ENTRIES)
+ return 0;
+ else
{
- sprintf(error_string,"Image table full");
- return TABLE_FULL;
+ sprintf(error_string,"Image table full");
+ return TABLE_FULL;
}
}
-#define IT_SZ 3
int rename_entry(const char *oldName, const char *newName)
{
- int idx;
- context_table_t ctx;
- char name[ENTRY_NAME_LEN];
- char temp[ENTRY_NAME_LEN];
- int iteration=0;
+ int index;
+ entry_table_t *tmp_table;
- strncpy(name,newName,ENTRY_NAME_LEN - IT_SZ);
-
- //Btable not setup return
- if (!entry_table_setup)
+ if (!entry_table_setup)
{
- sprintf(error_string,"Table not set-up or corrupted");
- return TABLE_NOT_SET_UP;
+ sprintf(error_string,"Table not set-up or corrupted");
+ return TABLE_NOT_SET_UP;
}
- //Load Btable and copy to ctx
- if(load_table(&ctx))
+ if ((index = find_index_by_name(newName))>=0) {
+ sprintf(error_string,"Image name already exist");
+ return UNKNOWN_IMAGE_NAME;
+ }
+ if ((index = find_index_by_name(oldName))>=0)
{
- sprintf(error_string,"Error opening btable");
- return 0;
- }
-
- //Find entry name
- while ((idx = find_index_by_name(name, &ctx.entry))>=0) {
- sprintf(temp,"-%d",iteration++);
- strncpy(name,newName,ENTRY_NAME_LEN - IT_SZ);
- strncat(name,temp,IT_SZ);
+ tmp_table = backup_table();
+ strcpy(tmp_table->entries[index].name,newName);
+ return store_table(tmp_table);
}
- //Rename it
- if ((idx = find_index_by_name(oldName, &ctx.entry))>=0)
+ else
{
- strncpy(ctx.entry.entries[idx].name,name,ENTRY_NAME_LEN-1);
- //Store Btable
- return store_table(&ctx, 1);
- }
- else
- {
- sprintf(error_string,"Unknown image name");
- //Close Btable
- store_table(&ctx, 0);
- return UNKNOWN_IMAGE_NAME;
+ sprintf(error_string,"Unknown image name");
+ return UNKNOWN_IMAGE_NAME;
}
}
int update_entry(const char *name, image_desc_t *image_desc)
{
- int Mindex;
- context_table_t ctx;
-
- //Btable not setup return
- if (!entry_table_setup)
- {
- sprintf(error_string,"Table not set-up or corrupted");
- return TABLE_NOT_SET_UP;
- }
+ int index;
+ entry_table_t *tmp_table;
- //Load Btable and copy to ctx
- if(load_table(&ctx))
+ if (!entry_table_setup)
{
- sprintf(error_string,"Error opening btable");
- return 0;
+ sprintf(error_string,"Table not set-up or corrupted");
+ return TABLE_NOT_SET_UP;
}
- //Update entry
- if ((Mindex = find_index_by_name(name, &ctx.entry))>=0)
+ if ((index = find_index_by_name(name))>=0)
{
- ctx.entry.entries[Mindex].image_desc = *image_desc;
- //Store Btable
- return store_table(&ctx, 1);
+ tmp_table = backup_table();
+ tmp_table->entries[index].image_desc = *image_desc;
+ return store_table(tmp_table);
}
- else
+ else
{
- sprintf(error_string,"Unknown image name");
- //Close Btable
- store_table(&ctx, 0);
- return UNKNOWN_IMAGE_NAME;
+ sprintf(error_string,"Unknown image name");
+ return UNKNOWN_IMAGE_NAME;
}
}
int remove_entry(const char *name)
{
- int Mindex;
- int done;
- context_table_t ctx;
-
- //Btable not setup return
- if (!entry_table_setup)
- {
- sprintf(error_string,"Table not set-up or corrupted");
- return TABLE_NOT_SET_UP;
- }
-
- //Load Btable and copy to ctx
- if(load_table(&ctx))
- {
- sprintf(error_string,"Error opening btable");
- return 0;
- }
-
- //Remove entry
- if ((Mindex = find_index_by_name(name, &ctx.entry))>=0)
- {
- memset(ctx.entry.entries[Mindex].name,0,ENTRY_NAME_LEN);
- if (ctx.entry.entries[Mindex].selected)
- {
- ctx.entry.entries[Mindex].selected = 0;
- for(Mindex=0,done=0;Mindex<MAX_ENTRIES && !done;Mindex++) {
- if ((ctx.entry.entries[Mindex].name[0]!='\0') &&
- (strcmp(ctx.entry.entries[Mindex].name,"ffs")!=0)) {
- ctx.entry.entries[Mindex].selected = 1;
- done=1;
- }
- }
- }
- //Store Btable
- return store_table(&ctx, 1);
- }
- else
- {
- sprintf(error_string,"Unknown image name");
- //Close Btable
- store_table(&ctx, 0);
- return UNKNOWN_IMAGE_NAME;
+ int index;
+ entry_table_t *tmp_table;
+ int done;
+
+ if (!entry_table_setup)
+ {
+ sprintf(error_string,"Table not set-up or corrupted");
+ return TABLE_NOT_SET_UP;
+ }
+
+ if ((index = find_index_by_name(name))>=0)
+ {
+ tmp_table = backup_table();
+ memset(tmp_table->entries[index].name,0,ENTRY_NAME_LEN);
+ if (tmp_table->entries[index].selected)
+ {
+ tmp_table->entries[index].selected = 0;
+ for(index=0,done=0;index<MAX_ENTRIES && !done;index++) {
+ if ((tmp_table->entries[index].name[0]!='\0') &&
+ (strcmp(tmp_table->entries[index].name,"ffs")!=0)) {
+ tmp_table->entries[index].selected = 1;
+ done=1;
+ }
+ }
+ }
+ return store_table(tmp_table);
+ }
+ else
+ {
+ sprintf(error_string,"Unknown image name");
+ return UNKNOWN_IMAGE_NAME;
}
}
int remove_all_entries()
{
- int i;
- context_table_t ctx;
-
- //Btable not setup return
- if (!entry_table_setup)
- {
- sprintf(error_string,"Table not set-up or corrupted");
- return TABLE_NOT_SET_UP;
- }
+ int i;
+ entry_table_t *tmp_table;
- //Load Btable and copy to ctx
- if(load_table(&ctx))
+ if (!entry_table_setup)
{
- sprintf(error_string,"Error opening btable");
- return 0;
+ sprintf(error_string,"Table not set-up or corrupted");
+ return TABLE_NOT_SET_UP;
}
- //Remove all entries
- for(i=0;i<MAX_ENTRIES;i++)
- {
- if (!ctx.entry.entries[i].selected)
- memset(ctx.entry.entries[i].name,0,ENTRY_NAME_LEN);
- }
-
- //Store Btable
- return store_table(&ctx, 1);
+ tmp_table = backup_table();
+ for(i=0;i<MAX_ENTRIES;i++)
+ {
+ if (!tmp_table->entries[i].selected)
+ memset(tmp_table->entries[i].name,0,ENTRY_NAME_LEN);
+ }
+ return store_table(tmp_table);
}
int get_running_entry_name(char* name)
{
- int Mindex;
- context_table_t ctx;
+ int index;
- //Btable not setup return
- if (!entry_table_setup)
- return TABLE_NOT_SET_UP;
-
- //Load Btable and copy to ctx
- if(load_table(&ctx))
- {
- sprintf(error_string,"Error opening btable");
- return 0;
- }
- //Close Btable
- store_table(&ctx, 0);
+ if (!entry_table_setup)
+ return TABLE_NOT_SET_UP;
#if 0
- for (index=0;index<MAX_ENTRIES;index++) {
- if (entry_table.entries[index].image_desc.isRunning) {
- strcpy(name, entry_table.entries[index].name);
- return 0;
- }
- }
+ for (index=0;index<MAX_ENTRIES;index++) {
+ if (entry_table.entries[index].image_desc.isRunning) {
+ strcpy(name, entry_table.entries[index].name);
+ return 0;
+ }
+ }
#endif
- if ((Mindex = find_index_by_name("active", &ctx.entry))>=0) {
- strcpy(name,"active");
- return 0;
- }
- return 1;
+ if ((index = find_index_by_name("active"))>=0) {
+ strcpy(name,"active");
+ return 0;
+ }
+ return 1;
}
int get_entry(const char *name, image_desc_t *image_desc, int *selected)
{
- int Mindex;
- context_table_t ctx;
-
- //Btable not setup return
- if (!entry_table_setup)
- {
- sprintf(error_string,"Table not set-up or corrupted");
- return TABLE_NOT_SET_UP;
- }
+ int index;
- //Load Btable and copy to ctx
- if(load_table(&ctx))
+ if (!entry_table_setup)
{
- sprintf(error_string,"Error opening btable");
- return 0;
+ sprintf(error_string,"Table not set-up or corrupted");
+ return TABLE_NOT_SET_UP;
}
- //Close Btable
- store_table(&ctx, 0);
- //Get entry
- if ((Mindex = find_index_by_name(name, &ctx.entry))>=0)
+ if ((index = find_index_by_name(name))>=0)
{
- *image_desc = ctx.entry.entries[Mindex].image_desc;
- *selected = ctx.entry.entries[Mindex].selected;
- return 0;
+ *image_desc = entry_table.entries[index].image_desc;
+ *selected = entry_table.entries[index].selected;
+ return 0;
}
- else
+ else
{
- sprintf(error_string,"Unknown image name");
- return UNKNOWN_IMAGE_NAME;
+ sprintf(error_string,"Unknown image name");
+ return UNKNOWN_IMAGE_NAME;
}
}
int select_entry(const char *name)
{
- int Mindex;
- int oldindex;
- context_table_t ctx;
+ int index;
+ int oldindex;
+ entry_table_t *tmp_table;
- //Btable not setup return
- if (!entry_table_setup)
+ if (!entry_table_setup)
{
- sprintf(error_string,"Table not set-up or corrupted");
- return TABLE_NOT_SET_UP;
+ sprintf(error_string,"Table not set-up or corrupted");
+ return TABLE_NOT_SET_UP;
}
- //Load Btable and copy to ctx
- if(load_table(&ctx))
+ if ((index = find_index_by_name(name))>=0)
{
- sprintf(error_string,"Error opening btable");
- return 0;
- }
-
- //Select entry
- if ((Mindex = find_index_by_name(name, &ctx.entry))>=0)
+ if (entry_table.entries[index].selected)
+ return 0;
+ else
+ {
+ tmp_table = backup_table();
+ if ((oldindex=find_selected_index())>=0)
+ tmp_table->entries[oldindex].selected = 0;
+ tmp_table->entries[index].selected = 1;
+ return store_table(tmp_table);
+ }
+ }
+ else
{
- if (ctx.entry.entries[Mindex].selected)
- return 0;
- else
- {
- if ((oldindex=find_selected_index(&ctx.entry))>=0)
- ctx.entry.entries[oldindex].selected = 0;
- ctx.entry.entries[Mindex].selected = 1;
- //Store changes in Btable
- return store_table(&ctx, 1);
- }
- }
- else
- {
- sprintf(error_string,"Unknown image name");
- //Close Btable
- store_table(&ctx, 0);
- return UNKNOWN_IMAGE_NAME;
+ sprintf(error_string,"Unknown image name");
+ return UNKNOWN_IMAGE_NAME;
}
}
-char global_name[ENTRY_NAME_LEN];
-
const char *get_selected_name(void)
{
- int Mindex;
- context_table_t ctx;
-
- //Btable not setup return
- if (!entry_table_setup)
- {
- sprintf(error_string,"Table not set-up or corrupted");
- return NULL;
- }
+ int index;
- //Load Btable and copy to ctx
- if(load_table(&ctx))
+ if (!entry_table_setup)
{
- sprintf(error_string,"Error opening btable");
- return NULL;
+ sprintf(error_string,"Table not set-up or corrupted");
+ return NULL;
}
- //Close Btable
- store_table(&ctx, 0);
- //Get selected name
- if ((Mindex=find_selected_index(&ctx.entry))>=0) {
- strncpy(global_name, ctx.entry.entries[Mindex].name, ENTRY_NAME_LEN);
- return global_name;
- }
- else
+ if ((index=find_selected_index())>=0)
+ return entry_table.entries[index].name;
+ else
{
- sprintf(error_string,"Image table error");
- return NULL;
+ sprintf(error_string,"Image table error");
+ return NULL;
}
}
-char global_next_name[ENTRY_NAME_LEN];
-
const char *next_entry(const char *name)
{
- int Mindex;
- caddr_t next_addr;
- context_table_t ctx;
-
- //Btable not setup return
- if (!entry_table_setup)
- {
- sprintf(error_string,"Table not set-up or corrupted");
- return NULL;
- }
+ int index;
+ caddr_t next_addr;
- //Load Btable and copy to ctx
- if(load_table(&ctx))
+ if (!entry_table_setup)
{
- sprintf(error_string,"Error opening btable");
- return NULL;
+ sprintf(error_string,"Table not set-up or corrupted");
+ return NULL;
}
- //Close Btable
- store_table(&ctx, 0);
- //Find next entry
- if (name==NULL)
- Mindex = find_index_by_addr(0, &ctx.entry);
- else
+ if (name==NULL)
+ index = find_index_by_addr(0);
+ else
{
- if ((Mindex = find_index_by_name(name, &ctx.entry))>=0)
- {
- next_addr = (caddr_t)ctx.entry.entries[Mindex].image_desc.storage_address+
- ctx.entry.entries[Mindex].image_desc.size;
- Mindex = find_index_by_addr(next_addr, &ctx.entry);
- }
+ if ((index = find_index_by_name(name))>=0)
+ {
+ next_addr = (caddr_t)entry_table.entries[index].image_desc.storage_address+
+ entry_table.entries[index].image_desc.size;
+ index = find_index_by_addr(next_addr);
+ }
}
- if (Mindex>=0) {
- strncpy(global_next_name, ctx.entry.entries[Mindex].name, ENTRY_NAME_LEN);
- return global_next_name;
- }
- else
+ if (index>=0)
+ return entry_table.entries[index].name;
+ else
{
- sprintf(error_string,"No more images");
- return NULL;
+ sprintf(error_string,"No more images");
+ return NULL;
}
}
const char *image_table_error(void)
{
- return error_string;
+ return error_string;
}