Merge "Changed windcharger "lf" command to load rootfs.sqsh"
diff --git a/common/Makefile b/common/Makefile
index b5cce85..df50354 100755
--- a/common/Makefile
+++ b/common/Makefile
@@ -33,6 +33,7 @@
COBJS = main.o circbuf.o \
cmd_boot.o cmd_bootm.o \
cmd_cache.o cmd_console.o \
+ cmd_sysvar.o \
cmd_date.o cmd_dcr.o cmd_display.o cmd_doc.o \
cmd_eeprom.o \
cmd_flash.o \
@@ -47,11 +48,12 @@
exports.o \
hush.o lcd.o lists.o \
memsize.o miiphybb.o miiphyutil.o \
- serial.o crc16.o
+ serial.o crc16.o sysvar.o
else
COBJS = main.o ACEX1K.o altera.o bedbug.o circbuf.o \
cmd_ace.o cmd_autoscript.o \
cmd_bdinfo.o cmd_bedbug.o cmd_bmp.o cmd_boot.o cmd_bootm.o \
+ cmd_sysvar.o \
cmd_cache.o cmd_console.o \
cmd_date.o cmd_dcr.o cmd_diag.o cmd_display.o cmd_doc.o cmd_dtt.o \
cmd_eeprom.o cmd_elf.o cmd_ext2.o \
@@ -73,7 +75,7 @@
memsize.o miiphybb.o miiphyutil.o \
s_record.o serial.o soft_i2c.o soft_spi.o spartan2.o spartan3.o \
usb.o usb_kbd.o usb_storage.o \
- virtex2.o xilinx.o crc16.o xyzModem.o
+ virtex2.o xilinx.o crc16.o xyzModem.o sysvar.o
endif
ifndef BOOT_FROM_NAND
diff --git a/common/cmd_sysvar.c b/common/cmd_sysvar.c
index ea0a477..da083cf 100644
--- a/common/cmd_sysvar.c
+++ b/common/cmd_sysvar.c
@@ -1,38 +1,33 @@
-/* Copyright 2012 Google Inc. All Rights Reserved.
- * Author: weixiaofeng@google.com (Xiaofeng Wei)
+/* Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Note: flash_erase usage in here sends start and end as the same address.
+ * This is because the size of each sysvar env is a single erase-block (64k).
+ * The flash_erase function includes the addresses under the "last" param as
+ * part of the erase section, meaning inclusion of 0x8 as an address will erase
+ * 0x8 up to 0x9 (64k). 0x9 cannot be included as the end address because it is
+ * not in a sector boundary.
*/
+#include <sysvar.h>
-#include <common.h>
-#include <spi_flash.h>
#include <asm/io.h>
+#include <common.h>
+#include <config.h>
+#include <command.h>
+#include <flash.h>
-#include "sysvar.h"
+// Some bit twiddling for erasing the correct sector on Atheros flash. This
+// only erases multiples of 64kb.
+#define __SYSVAR_ERASE_SECTOR(x) (((x) >> 16) & 0xff)
-#define PAGE_SIZE 256
-#define SYSVAR_VALUE 256
-
-#define SYSVAR_RO_MEM 0x00000100
-#define SYSVAR_RW_MEM SYSVAR_RO_MEM + SYSVAR_BLOCK_SIZE
-
-struct spi_flash *sf_dev = NULL;
+// Board-based implementation supplies pointer to flash info.
+extern flash_info_t flash_info[];
struct sysvar_buf ro_buf;
struct sysvar_buf rw_buf;
-static const long sysvar_offset[SYSVAR_SPI_BLOCK] = {
+
+const long sysvar_offset[SYSVAR_SPI_BLOCK] = {
SYSVAR_RW_OFFSET0, SYSVAR_RW_OFFSET1, SYSVAR_RO_OFFSET0, SYSVAR_RO_OFFSET1
};
-static int data_recovery(struct sysvar_buf *buf, int idx);
-static int data_load(struct sysvar_buf *buf, int idx);
-static int data_save(struct sysvar_buf *buf, int *idx);
-
-static int open_sf(bool load);
-static void close_sf(void);
-
-static int loadvar(void);
-static int savevar(struct sysvar_buf *buf, int idx);
-static int getvar(char *name, char *value, int len);
-static int setvar(struct sysvar_buf *buf, int idx, char *name, char *value);
-
/*
* print_msg - print the message string
*/
@@ -60,29 +55,21 @@
/*
* data_recovery - system variables recovering routine
*/
-static int data_recovery(struct sysvar_buf *buf, int idx) {
- int i, j, ret;
+int data_recovery(struct sysvar_buf *buf, int idx) {
+ int i, j, ret, sector;
/* load the system variables */
printf("SV: Recovering data");
for (i = idx, j = idx + 1; i < idx + 2; i++, j--) {
/* read the data from SPI flash */
- if (spi_flash_read(sf_dev, sysvar_offset[i], buf->data_len, buf->data))
+ if (read_buff(flash_info, buf->data, sysvar_offset[i], buf->data_len))
continue;
/* check crc32 and wc32 (write count) */
if (check_var(buf, SYSVAR_LOAD_MODE) == SYSVAR_SUCCESS) {
-#ifdef CONFIG_SPI_FLASH_PROTECTION
- printf("SV: Unprotecting flash\n");
- ret = spi_flash_protect(sf_dev, 0);
- if (ret) {
- printf("## Error: failed to unprotect flash\n");
- goto recovery_err;
- }
-#endif
-
/* erase SPI flash */
- ret = spi_flash_erase(sf_dev, sysvar_offset[j], buf->data_len);
+ sector = __SYSVAR_ERASE_SECTOR(sysvar_offset[j]);
+ ret = flash_erase(flash_info, sector, sector);
if (ret) {
print_err("erase", j);
goto recovery_err;
@@ -93,21 +80,14 @@
goto recovery_err;
/* write system variables(RW) to SPI flash */
- ret = spi_flash_write(sf_dev, sysvar_offset[j],
- buf->data_len, buf->data);
+ ret = write_buff(flash_info, buf->data, sysvar_offset[j] + CFG_FLASH_BASE,
+ buf->data_len);
printf("\n");
if (ret) {
print_err("write", j);
goto recovery_err;
}
-#ifdef CONFIG_SPI_FLASH_PROTECTION
- printf("SV: Protecting flash\n");
- ret = spi_flash_protect(sf_dev, 1);
- if (ret)
- printf("## Error: failed to protect flash\n");
-#endif
-
buf->loaded = true;
print_msg("Data recovery was completed", SYSVAR_MESSAGE);
return 0;
@@ -116,16 +96,14 @@
recovery_err:
clear_buf(buf);
-
printf("\n");
- print_err("recovery", idx);
return 0;
}
/*
* data_load - load the data from SPI flash to data buffer
*/
-static int data_load(struct sysvar_buf *buf, int idx) {
+int data_load(struct sysvar_buf *buf, int idx) {
int i, j;
/* load the system variables */
@@ -133,8 +111,9 @@
buf->failed[j] = false;
/* read the data from SPI flash */
- if (spi_flash_read(sf_dev, sysvar_offset[i], buf->data_len, buf->data))
+ if (read_buff(flash_info, buf->data, sysvar_offset[i], buf->data_len)) {
buf->failed[j] = true;
+ }
/* check crc32 and wc32 (write count) */
if (check_var(buf, SYSVAR_LOAD_MODE))
@@ -150,24 +129,16 @@
/*
* data_save - save the data from data buffer to SPI flash
*/
-static int data_save(struct sysvar_buf *buf, int *idx) {
- int i, j, ret;
-
-#ifdef CONFIG_SPI_FLASH_PROTECTION
- printf("SV: Unprotecting flash\n");
- ret = spi_flash_protect(sf_dev, 0);
- if (ret) {
- printf("## Error: failed to unprotect flash\n");
- return 1;
- }
-#endif
+int data_save(struct sysvar_buf *buf, int *idx) {
+ int i, j, ret, sector;
/* save the system variables */
for (j = 0; j < 2; j++) {
i = idx[j];
printf("SV: Erasing SPI flash 0x%08lx - 0x%08lx\n",
sysvar_offset[i], sysvar_offset[i] + buf->data_len);
- ret = spi_flash_erase(sf_dev, sysvar_offset[i], buf->data_len);
+ sector = __SYSVAR_ERASE_SECTOR(sysvar_offset[i]);
+ ret = flash_erase(flash_info, sector, sector);
if (ret) {
print_err("erase", i);
return 1;
@@ -181,129 +152,29 @@
/* write system variables to SPI flash */
printf("SV: Writing to SPI flash");
- ret = spi_flash_write(sf_dev, sysvar_offset[i], buf->data_len, buf->data);
+ ret = write_buff(flash_info, buf->data, sysvar_offset[i] + CFG_FLASH_BASE,
+ buf->data_len);
printf("\n");
if (ret) {
print_err("write", i);
return 1;
}
}
-
-#ifdef CONFIG_SPI_FLASH_PROTECTION
- printf("SV: Protecting flash\n");
- ret = spi_flash_protect(sf_dev, 1);
- if (ret) {
- printf("## Error: failed to protect flash\n");
- return 1;
- }
-#endif
-
return 0;
}
/*
- * open_sf - open SPI flash and read the data to buffer
+ * sf_loadvar - load the data from SPI flash to data buffer
*/
-static int open_sf(bool load) {
- /* check SPI flash */
- if (sf_dev != NULL)
- return 0;
-
- memset(&rw_buf, 0, sizeof(rw_buf));
- memset(&ro_buf, 0, sizeof(ro_buf));
-
- /* probe SPI flash */
- sf_dev = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
- CONFIG_ENV_SPI_MAX_HZ, SPI_MODE_3);
- if (sf_dev == NULL) {
- print_err("failed to initialize SPI flash", SYSVAR_MESSAGE);
+int sf_loadvar(void) {
+ if (data_load(&rw_buf, SYSVAR_RW_BUF)) {
return 1;
}
- /* allocate data buffers */
- rw_buf.data = (uchar *)map_physmem(SYSVAR_RW_MEM,
- SYSVAR_BLOCK_SIZE, MAP_WRBACK);
- ro_buf.data = (uchar *)map_physmem(SYSVAR_RO_MEM,
- SYSVAR_BLOCK_SIZE, MAP_WRBACK);
- if (!rw_buf.data || !ro_buf.data) {
- print_err("failed to map physical memory", SYSVAR_MESSAGE);
- goto open_err;
- }
-
- /* allocate data lists */
- rw_buf.list = (struct sysvar_list *)malloc(sizeof(struct sysvar_list));
- ro_buf.list = (struct sysvar_list *)malloc(sizeof(struct sysvar_list));
- if (!rw_buf.list || !ro_buf.list) {
- print_err("failed to allocate data list", SYSVAR_MESSAGE);
- goto open_err;
- }
-
- rw_buf.data_len = SYSVAR_BLOCK_SIZE;
- rw_buf.total_len = SYSVAR_BLOCK_SIZE - SYSVAR_HEAD;
- rw_buf.free_len = rw_buf.total_len;
- rw_buf.readonly = false;
-
- strncpy(rw_buf.list->name, "rw", SYSVAR_NAME);
- rw_buf.list->value = NULL;
- rw_buf.list->len = SYSVAR_NAME + 2;
- rw_buf.list->next = NULL;
-
- ro_buf.data_len = SYSVAR_BLOCK_SIZE;
- ro_buf.total_len = SYSVAR_BLOCK_SIZE - SYSVAR_HEAD;
- ro_buf.free_len = ro_buf.total_len;
- ro_buf.readonly = true;
-
- strncpy(rw_buf.list->name, "ro", SYSVAR_NAME);
- ro_buf.list->value = NULL;
- ro_buf.list->len = SYSVAR_NAME + 2;
- ro_buf.list->next = NULL;
-
- /* load data from SPI flash to data buffer */
- if (load) {
- if (loadvar())
- goto open_err;
- }
- return 0;
-
-open_err:
- close_sf();
- return 1;
-}
-
-/*
- * close_sf - close SPI flash and release the data buffer
- */
-static void close_sf(void) {
- /* release data lists */
- if (rw_buf.list != NULL) {
- clear_var(&rw_buf);
- free(rw_buf.list);
- }
- if (ro_buf.list != NULL) {
- clear_var(&ro_buf);
- free(ro_buf.list);
- }
-
- /* release data buffers */
- if (rw_buf.data != NULL)
- unmap_physmem(rw_buf.data, rw_buf.data_len);
- if (ro_buf.data != NULL)
- unmap_physmem(ro_buf.data, ro_buf.data_len);
-
- sf_dev = NULL;
-}
-
-/*
- * loadvar - load the data from SPI flash to data buffer
- */
-static int loadvar(void) {
- if (data_load(&rw_buf, SYSVAR_RW_BUF))
- return 1;
-
/* move the data from data buffer to data list */
- if (load_var(&rw_buf))
+ if (load_var(&rw_buf)) {
return 1;
-
+ }
rw_buf.loaded = true;
print_msg("loaded", SYSVAR_RW_BUF);
@@ -320,14 +191,11 @@
}
/*
- * savevar - save the data from data buffer to SPI flash
+ * sf_savevar - save the data from data buffer to SPI flash
*/
-static int savevar(struct sysvar_buf *buf, int idx) {
+int sf_savevar(struct sysvar_buf *buf, int idx) {
int save_idx[2];
- if (open_sf(true))
- return 1;
-
/* move the data from data list to data buffer */
if (save_var(buf))
return 1;
@@ -358,14 +226,11 @@
}
/*
- * getvar - get or print the system variable from data list
+ * sf_getvar - get or print the system variable from data list
*/
-static int getvar(char *name, char *value, int len) {
+int sf_getvar(char *name, char *value, int len) {
struct sysvar_list *var = NULL;
- if (open_sf(true))
- return 1;
-
if (name == NULL) {
/* print all system variables(RO) */
print_var(&ro_buf);
@@ -385,7 +250,7 @@
goto get_data;
/* system variable not found */
- printf("## Error: '%s' not found\n", name);
+ printf("## SYSVAR: '%s' not found\n", name);
return 1;
get_data:
@@ -393,15 +258,12 @@
}
/*
- * setvar - add or delete the system variable in data list
+ * sf_setvar - add or delete the system variable in data list
*/
-static int setvar(struct sysvar_buf *buf, int idx, char *name, char *value) {
+int sf_setvar(struct sysvar_buf *buf, int idx, char *name, char *value) {
struct sysvar_list *var = NULL;
int ret = 0;
- if (open_sf(true))
- return 1;
-
if (name != NULL) {
if (idx < SYSVAR_RO_BUF) {
/* read only variable? */
@@ -459,59 +321,53 @@
}
/*
- * do_loadvar - load system variables from SPI flash
+ * do_flloadvar - load system variables from SPI flash
*
- * loadvar command:
- * loadvar - load system variables from persistent storage
+ * sf_loadvar command:
+ * sf_loadvar - load system variables from persistent storage
*/
-static int do_loadvar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {
- if (open_sf(false))
- return 1;
-
+int do_flloadvar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {
/* load system variables from SPI flash */
- return loadvar();
+ return sf_loadvar();
}
U_BOOT_CMD(
- loadvar, 1, 0, do_loadvar,
- "load system variables",
- "\n - load system variables from SPI flash\n"
+ loadvar, 1, 0, do_flloadvar,
+ "loadvar - load system variables\n",
+ " - load system variables from SPI flash\n"
);
/*
- * do_savevar - save system variables(RW) to SPI flash
+ * do_flsavevar - save system variables(RW) to SPI flash
*
- * savevar command:
- * savevar - save system variables(RW) to SPI flash
+ * sf_savevar command:
+ * sf_savevar - save system variables(RW) to SPI flash
*/
-static int do_savevar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+int do_flsavevar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
/* save system variables(RW) */
- return savevar(&rw_buf, SYSVAR_RW_BUF);
+ return sf_savevar(&rw_buf, SYSVAR_RW_BUF);
}
U_BOOT_CMD(
- savevar, 1, 0, do_savevar,
- "save system variables(RW)",
- "\n - save system variables(RW) to SPI flash\n"
+ savevar, 1, 0, do_flsavevar,
+ "savevar - save system variables(RW)\n",
+ " - save system variables(RW) to SPI flash\n"
);
/*
- * do_printvar - print system variables
+ * do_flprintvar - print system variables
*
* printvar command:
* printvar name - print system variable with name
* printvar - print all system variables
*/
-static int do_printvar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {
+int do_flprintvar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {
char value[SYSVAR_VALUE];
- if (open_sf(true))
- return 1;
-
if (argv[1] == NULL) {
/* print all system variables */
- getvar(NULL, NULL, 0);
+ sf_getvar(NULL, NULL, 0);
printf("\nSV: System Variables(RO): %d/%d bytes\n",
ro_buf.used_len, ro_buf.total_len);
@@ -519,8 +375,11 @@
rw_buf.used_len, rw_buf.total_len);
} else {
/* get a system variable */
- if (getvar(argv[1], value, SYSVAR_VALUE) == 0) {
- printf("%s=%s\n", argv[1], value);
+ if (sf_getvar(argv[1], value, SYSVAR_VALUE) == 0) {
+ printf("%s=", argv[1]);
+ /* puts value in case CONFIG_SYS_PBSIZE < SYSVAR_VALUE */
+ puts(value);
+ putc('\n');
printf("\nSV: System Variable: %d bytes\n",
(int)(SYSVAR_NAME + 2 + strlen(value)));
}
@@ -529,41 +388,41 @@
}
U_BOOT_CMD(
- printvar, 2, 0, do_printvar,
- "print system variables",
- "\n - print values of all system variables\n"
+ printvar, 2, 0, do_flprintvar,
+ "printvar - print system variables\n",
+ " - print values of all system variables\n"
"printvar name ...\n"
" - print value of system variable 'name'\n"
);
/*
- * do_setvar - add or delete system variables(RW)
+ * do_flsetvar - add or delete system variables(RW)
*
- * setvar command:
- * setvar name value - add system variable with name:value
- * setvar name - delete system variable with name
- * setvar - delete all system variables
+ * sf_setvar command:
+ * sf_setvar name value - add system variable with name:value
+ * sf_setvar name - delete system variable with name
+ * sf_setvar - delete all system variables
*/
-static int do_setvar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {
+int do_flsetvar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {
int ret = 0;
if (argc == 3) {
/* add a system variable(RW) */
- ret = setvar(&rw_buf, SYSVAR_RW_BUF, argv[1], argv[2]);
+ ret = sf_setvar(&rw_buf, SYSVAR_RW_BUF, argv[1], argv[2]);
} else if (argc == 2) {
/* delete a system variable(RW) */
- ret = setvar(&rw_buf, SYSVAR_RW_BUF, argv[1], NULL);
+ ret = sf_setvar(&rw_buf, SYSVAR_RW_BUF, argv[1], NULL);
} else {
/* delete all system variables(RW) */
- ret = setvar(&rw_buf, SYSVAR_RW_BUF, NULL, NULL);
+ ret = sf_setvar(&rw_buf, SYSVAR_RW_BUF, NULL, NULL);
}
return ret;
}
U_BOOT_CMD(
- setvar, 3, 0, do_setvar,
- "set system variables(RW)",
- "name value ...\n"
+ setvar, 3, 0, do_flsetvar,
+ "setvar - set system variables(RW)\n",
+ "setvar name value ...\n"
" - set system variable(RW) 'name' to 'value ...'\n"
"setvar name\n"
" - delete system variable(RW) 'name'\n"
@@ -574,13 +433,10 @@
/*
* sysvar_dump - dump the data buffer in binary/ascii format
*/
-static void sysvar_dump(struct sysvar_buf *buf, int idx, bool load) {
+void sysvar_dump(struct sysvar_buf *buf, int idx, bool load) {
extern char console_buffer[];
int start = 0;
- if (open_sf(load))
- return 1;
-
printf("System Variables(%s):\n", (idx < SYSVAR_RO_BUF) ? "RW" : "RO");
printf("offset : 0x%08lx\n", sysvar_offset[idx]);
printf("size : %d bytes\n", buf->data_len);
@@ -619,12 +475,9 @@
/*
* sysvar_io - SPI flash IO operations
*/
-static int sysvar_io(int argc, char *argv[]) {
+int sysvar_io(int argc, char *argv[]) {
struct sysvar_buf *buf;
- int i, idx, ret = 0;
-
- if (open_sf(false))
- return 1;
+ int i, idx, sector, ret = 0;
if (strcmp(argv[1], "0") == 0) {
idx = 0;
@@ -649,17 +502,17 @@
buf->data[i] = i;
/* write the data buffer to spi_flash */
- ret = spi_flash_write(sf_dev, sysvar_offset[idx],
- buf->data_len, buf->data);
+ ret = write_buff(flash_info, buf->data, sysvar_offset[idx] + CFG_FLASH_BASE,
+ buf->data_len);
printf("\n");
} else if (strcmp(argv[0], "erase") == 0) {
/* erase spi_flash */
- ret = spi_flash_erase(sf_dev, sysvar_offset[idx], buf->data_len);
+ sector = __SYSVAR_ERASE_SECTOR(sysvar_offset[idx]);
+ ret = flash_erase(flash_info, sector, sector);
}
if (ret == 0) {
- ret = spi_flash_read(sf_dev, sysvar_offset[idx],
- buf->data_len, buf->data);
+ ret = read_buff(flash_info, buf->data, sysvar_offset[idx], buf->data_len);
if (ret == 0)
sysvar_dump(buf, idx, false);
}
@@ -674,22 +527,22 @@
}
/*
- * do_sysvar - system variable debug functions
+ * do_flsysvar - system variable debug functions
*/
-static int do_sysvar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {
+int do_flsysvar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {
if (argc < 2)
goto usage;
if (strcmp(argv[1], "set") == 0) {
if (argc == 4) {
/* add a system variable(RO) */
- return setvar(&ro_buf, SYSVAR_RO_BUF, argv[2], argv[3]);
+ return sf_setvar(&ro_buf, SYSVAR_RO_BUF, argv[2], argv[3]);
} else if (argc == 3) {
/* delete a system variable(RO) */
- return setvar(&ro_buf, SYSVAR_RO_BUF, argv[2], NULL);
+ return sf_setvar(&ro_buf, SYSVAR_RO_BUF, argv[2], NULL);
} else if (argc == 2) {
/* delete all system variables(RO) */
- return setvar(&ro_buf, SYSVAR_RO_BUF, NULL, NULL);
+ return sf_setvar(&ro_buf, SYSVAR_RO_BUF, NULL, NULL);
} else {
goto usage;
}
@@ -697,7 +550,7 @@
if (strcmp(argv[1], "save") == 0 && argc == 2) {
/* save system variables(RO) */
- return savevar(&ro_buf, SYSVAR_RO_BUF);
+ return sf_savevar(&ro_buf, SYSVAR_RO_BUF);
}
if (strcmp(argv[1], "dump") == 0 && argc == 3) {
@@ -719,13 +572,13 @@
return sysvar_io(argc - 1, argv + 1);
usage:
- cmd_usage(cmdtp);
+ printf("Usage:\n%s\n", cmdtp->usage);
return 1;
}
U_BOOT_CMD(
- sysvar, 4, 0, do_sysvar,
- "system variable debug functions",
+ sysvar, 4, 0, do_flsysvar,
+ "sysvar - system variable debug functions\n",
"set name value\n"
" - set system variable(RO) 'name' to 'value ...'\n"
"sysvar set name\n"
@@ -744,3 +597,56 @@
" - erase data on SPI flash 0|1|2|3\n"
);
+/*
+ * sysvar_buf_init - Initializes a sysvar_buf struct.
+ */
+static int sysvar_buf_init(struct sysvar_buf *buf, bool is_ro) {
+ if (buf == NULL) {
+ return SYSVAR_PARAM_ERR;
+ }
+ memset(buf, 0, sizeof(*buf));
+ buf->list = (struct sysvar_list *)malloc(sizeof(struct sysvar_list));
+ if (buf->list == NULL) {
+ printf("list allocation ");
+ return SYSVAR_MEMORY_ERR;
+ }
+ buf->data = (uchar *) map_physmem(is_ro ? SYSVAR_RO_MEM : SYSVAR_RW_MEM);
+ if (buf->data == NULL) {
+ printf("data allocation ");
+ free(buf->list);
+ return SYSVAR_MEMORY_ERR;
+ }
+
+ buf->data_len = SYSVAR_BLOCK_SIZE;
+ buf->total_len = SYSVAR_BLOCK_SIZE - SYSVAR_HEAD;
+ buf->free_len = buf->total_len;
+ buf->readonly = is_ro;
+
+ strncpy(buf->list->name, is_ro ? "ro" : "rw", SYSVAR_NAME);
+ buf->list->value = NULL;
+ buf->list->len = SYSVAR_NAME + 2;
+ buf->list->next = NULL;
+ buf->loaded = false;
+ return SYSVAR_SUCCESS;
+}
+
+static void sysvar_env_init(struct sysvar_buf *buf) {
+ struct sysvar_list *curr = buf->list->next;
+ while (curr != NULL) {
+ setenv(curr->name, curr->value);
+ curr = curr->next;
+ }
+}
+
+int sysvar_init(void) {
+ printf("sysvar_init. . .\n");
+ if (sysvar_buf_init(&rw_buf, false) || sysvar_buf_init(&ro_buf, true) ||
+ sf_loadvar()) {
+ printf("init failure!\n");
+ return SYSVAR_MEMORY_ERR;
+ }
+ sysvar_env_init(&rw_buf);
+ sysvar_env_init(&ro_buf);
+ printf("init success!\n");
+ return SYSVAR_SUCCESS;
+}
diff --git a/common/main.c b/common/main.c
index e8d3a4f..6696f31 100755
--- a/common/main.c
+++ b/common/main.c
@@ -28,6 +28,7 @@
#include <common.h>
#include <watchdog.h>
#include <command.h>
+
#ifdef CONFIG_MODEM_SUPPORT
#include <malloc.h> /* for free() prototype */
#endif
@@ -52,7 +53,6 @@
extern int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
-
#define MAX_DELAY_STOP_STR 32
static char * delete_char (char *buffer, char *p, int *colp, int *np, int plen);
@@ -423,6 +423,8 @@
// debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>");
+ sysvar_init();
+
if (bootdelay >= 0 && s && !abortboot (bootdelay)) {
# ifdef CONFIG_AUTOBOOT_KEYED
int prev = disable_ctrlc(1); /* disable Control C checking */
@@ -461,7 +463,6 @@
video_banner();
}
#endif
-
/*
* Main Loop for Monitor Command Processing
*/
diff --git a/common/sysvar.c b/common/sysvar.c
index 55cd162..b77b5ac 100644
--- a/common/sysvar.c
+++ b/common/sysvar.c
@@ -2,7 +2,8 @@
* Author: weixiaofeng@google.com (Xiaofeng Wei)
*/
-#include "sysvar.h"
+#include <sysvar.h>
+#include <common.h>
static const unsigned long crc_table[256] = {
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
@@ -103,7 +104,8 @@
/*
* sysvar_copy - copy data from/to the data buffer
*/
-static void sysvar_copy(char *dst, char *src, int len, char end) {
+static void sysvar_copy(unsigned char *dst, unsigned char *src, int len,
+ unsigned char end) {
int i;
if (end == SYSVAR_STR_TO_BUF) {
@@ -188,11 +190,13 @@
/* system variable: name(32) + len(2) + value ... */
for (i = 0; i < buf->total_len && ret == SYSVAR_SUCCESS; i += len) {
- if (buf->data[i] == 0xff)
+ if (buf->data[i] == 0xff) {
break;
+ }
/* name of system variable */
- sysvar_copy(name, (char *)&buf->data[i], SYSVAR_NAME, SYSVAR_BUF_TO_STR);
+ sysvar_copy((unsigned char *)name, &buf->data[i], SYSVAR_NAME,
+ SYSVAR_BUF_TO_STR);
i += SYSVAR_NAME;
/* length of system variable */
@@ -206,7 +210,7 @@
i += 2;
/* copy system variable */
- sysvar_copy(value, (char *)&buf->data[i], len, SYSVAR_BUF_TO_STR);
+ sysvar_copy((unsigned char *)value, &buf->data[i], len, SYSVAR_BUF_TO_STR);
/* add system variable to data list */
ret = set_var(buf, name, value);
@@ -228,8 +232,8 @@
for (i = 0; i < buf->total_len && curr != NULL; i += len) {
/* name of system variable */
- sysvar_copy((char *)&buf->data[i], curr->name,
- SYSVAR_NAME, SYSVAR_STR_TO_BUF);
+ sysvar_copy(&buf->data[i], (unsigned char *)curr->name, SYSVAR_NAME,
+ SYSVAR_STR_TO_BUF);
i += SYSVAR_NAME;
/* length of system variable */
@@ -242,7 +246,8 @@
i += 2;
/* copy system variable */
- sysvar_copy((char *)&buf->data[i], curr->value, len, SYSVAR_STR_TO_BUF);
+ sysvar_copy(&buf->data[i], (unsigned char *)curr->value, len,
+ SYSVAR_STR_TO_BUF);
curr = curr->next;
}
@@ -316,7 +321,6 @@
*/
int delete_var(struct sysvar_buf *buf, struct sysvar_list *var) {
struct sysvar_list *curr = buf->list->next;
-
/* last system variable? */
if (curr == var) {
buf->list->next = var->next;
@@ -350,7 +354,6 @@
struct sysvar_list *curr = buf->list->next;
struct sysvar_list *var;
int ret = SYSVAR_SUCCESS;
-
while (curr != NULL && ret == SYSVAR_SUCCESS) {
/* store next position of variable */
var = curr->next;
@@ -419,7 +422,7 @@
while (curr != NULL) {
/* print variable name */
- printf("%s(%s)=%s\n", curr->name,
+ printf("%s\t%s\t%s\n", curr->name,
buf->readonly ? "RO" : "RW", curr->value);
curr = curr->next;
}
diff --git a/include/common.h b/include/common.h
index 390b2bc..b445c57 100755
--- a/include/common.h
+++ b/include/common.h
@@ -211,6 +211,9 @@
extern ulong load_addr; /* Default Load Address */
+/* common/cmd_sysvar.c */
+int sysvar_init(void);
+
/* common/cmd_nvedit.c */
int env_init (void);
void env_relocate (void);
diff --git a/include/sysvar.h b/include/sysvar.h
index 4e73b1f..855a101 100644
--- a/include/sysvar.h
+++ b/include/sysvar.h
@@ -6,7 +6,6 @@
#define _SYSVAR_H_
#define SYSVAR_UBOOT
-
#ifndef SYSVAR_UBOOT
#include <stdio.h>
#include <stdlib.h>
@@ -29,10 +28,10 @@
#define SYSVAR_BLOCK_SIZE 0x00010000 /* size of system variables (64K) */
#define SYSVAR_SPI_BLOCK 4 /* number of SPI flash blocks */
-#define SYSVAR_RW_OFFSET0 0x00100000 /* location of system variables(RW) */
-#define SYSVAR_RW_OFFSET1 0x00120000 /* location of system variables(RW backup) */
-#define SYSVAR_RO_OFFSET0 0x00140000 /* location of system variables(RO) */
-#define SYSVAR_RO_OFFSET1 0x00160000 /* location of system variables(RO backup) */
+#define SYSVAR_RW_OFFSET0 0x00060000 /* location of system variables(RW) */
+#define SYSVAR_RW_OFFSET1 0x00080000 /* location of system variables(RW backup) */
+#define SYSVAR_RO_OFFSET0 0x000A0000 /* location of system variables(RO) */
+#define SYSVAR_RO_OFFSET1 0x000C0000 /* location of system variables(RO backup) */
#define SYSVAR_MTD_DEVICE 4 /* number of MTD devices */
#define SYSVAR_RW_NAME0 "/dev/mtd2" /* MTD device of system variables(RW) */
@@ -68,6 +67,13 @@
#define SYSVAR_CRC_ERR -12
#define SYSVAR_READONLY_ERR -13
#define SYSVAR_EXISTED_ERR -14
+#define SYSVAR_DEBUG_ERR -15
+
+#define PAGE_SIZE 256
+#define SYSVAR_VALUE 2048
+
+#define SYSVAR_RO_MEM 0x00000100
+#define SYSVAR_RW_MEM SYSVAR_RO_MEM + SYSVAR_BLOCK_SIZE
struct sysvar_list {
char name[SYSVAR_NAME + 1]; /* name of system variable */