+/*
+ * (C) Copyright 2014 Leo C. <erbl259-lmu@yahoo.de>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
#include "common.h"
#include <string.h>
#include <stdlib.h>
#include "xmalloc.h"
#include "crc.h"
#include "command.h"
-
#include "env.h"
#define DELIM "\0"
const FLASH char default_env[] = {
- "bootdelay=" "3" DELIM
- "bootcmd=" "reset; loadf; go ${startaddr}" DELIM
- "baudrate=" "115200" DELIM
- "startaddr=" "0" DELIM
+ ENV_BAUDRATE "=" "115200" DELIM
+ ENV_BOOTDELAY "=" "3" DELIM
+ ENV_BOOTCMD "=" "reset; loadf; go ${startaddr}" DELIM
+ ENV_PATH_CPM3SYS "=" CONFIG_PATH_CPM3SYS DELIM
+ ENV_PINALIAS "=" "0:PG5,1:PG4,2:PB4,3:PB5,4:PB6,5:PB7,"
+ "6:PG3,7:PG2,8:PG1,9:PG0,10:PE7" DELIM
+ ENV_STARTADDRESS "=" "0" DELIM
DELIM
};
+
/* EEPROM storage */
typedef struct environment_s {
uint16_t crc; /* CRC16 over data bytes */
}
+static const FLASH char *comp_key;
+
static
int comp_env_items(const void *m1, const void *m2)
{
env_item_t *ep1 = (env_item_t *) m1;
env_item_t *ep2 = (env_item_t *) m2;
- return strcmp(ep1->envvar, ep2->envvar);
+ if (ep1 == NULL)
+ return - strcmp_P(ep2->envvar, comp_key);
+ else
+ return strcmp(ep1->envvar, ep2->envvar);
}
env_item_t *envlist_search(const MEMX char *name)
{
- env_item_t e;
-
- e.envvar = (char *) name;
-
#ifdef __MEMX
- char buf[CONFIG_SYS_ENV_NAMELEN+1];
-
if (__builtin_avr_flash_segment(name) != -1) {
- char *p = buf;
- while ((*p++ = *name++) != '\0')
- ;
- e.envvar = buf;
+ comp_key = name;
+ return bsearch(0, env_list, entrycount,
+ sizeof(env_item_t), comp_env_items);
+ } else {
+
+ env_item_t e;
+ e.envvar = (char *) name;
+
+ return bsearch(&e, env_list, entrycount,
+ sizeof(env_item_t), comp_env_items);
}
-#endif /* __MEMX */
+#else
+ env_item_t e;
+ e.envvar = (char *) name;
return bsearch(&e, env_list, entrycount,
sizeof(env_item_t), comp_env_items);
+#endif /* __MEMX */
}
}
static
-int envlist_delete(const char *name)
+int envlist_delete(const MEMX char *name)
{
- env_item_t e;
-
- e.envvar = (char *) name;
-
- env_item_t *ep = bsearch(&e, env_list, entrycount,
- sizeof(env_item_t), comp_env_items);
+ env_item_t *ep = envlist_search(name);
if (ep != NULL)
return env_item_delete(ep);
env_item_t e, *ep;
(void) flag;
- debug("Initial value for argc=%d\n", argc);
name = argv[1];
value = argv[2];
* @return 0 if ok, 1 on error
*/
static
-int setenv(const char *varname, const char *varvalue)
+int setenv(const MEMX char *varname, const char *varvalue)
{
- const char * const argv[3] = { NULL, varname, varvalue };
+ int rc;
+
+#ifdef __MEMX
+ char *tmpname = NULL;
+ if (__builtin_avr_flash_segment(varname) != -1) {
+ tmpname = malloc(strlen_P(varname)+1);
+ if (tmpname == NULL) {
+ printf_P(PSTR("setenv: Out of Memory!\n"));
+ return 1;
+ }
+ strcpy_P(tmpname, varname);
+ } else
+ tmpname = (char *) varname;
+#endif
+
+ const char * const argv[3] = { NULL, tmpname, varvalue };
int argc = 3;
if (varvalue == NULL || varvalue[0] == '\0')
--argc;
- return (int) _do_env_set(0, argc, (char * const *)argv);
+ rc = (int) _do_env_set(0, argc, (char * const *)argv);
+
+#ifdef __MEMX
+ free(tmpname);
+#endif
+ return rc;
}
/**