1c609719bSwdenk /* 2c609719bSwdenk * (C) Copyright 2002 3c609719bSwdenk * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4c609719bSwdenk * 5c609719bSwdenk * See file CREDITS for list of people who contributed to this 6c609719bSwdenk * project. 7c609719bSwdenk * 8c609719bSwdenk * This program is free software; you can redistribute it and/or 9c609719bSwdenk * modify it under the terms of the GNU General Public License as 10c609719bSwdenk * published by the Free Software Foundation; either version 2 of 11c609719bSwdenk * the License, or (at your option) any later version. 12c609719bSwdenk * 13c609719bSwdenk * This program is distributed in the hope that it will be useful, 14c609719bSwdenk * but WITHOUT ANY WARRANTY; without even the implied warranty of 15c609719bSwdenk * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16c609719bSwdenk * GNU General Public License for more details. 17c609719bSwdenk * 18c609719bSwdenk * You should have received a copy of the GNU General Public License 19c609719bSwdenk * along with this program; if not, write to the Free Software 20c609719bSwdenk * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21c609719bSwdenk * MA 02111-1307 USA 22c609719bSwdenk */ 23c609719bSwdenk 24c609719bSwdenk #ifndef _ENVIRONMENT_H_ 256f403badSIgor Grinberg #define _ENVIRONMENT_H_ 26c609719bSwdenk 27c609719bSwdenk /************************************************************************** 28c609719bSwdenk * 29c609719bSwdenk * The "environment" is stored as a list of '\0' terminated 30c609719bSwdenk * "name=value" strings. The end of the list is marked by a double 31c609719bSwdenk * '\0'. New entries are always added at the end. Deleting an entry 32c609719bSwdenk * shifts the remaining entries to the front. Replacing an entry is a 33c609719bSwdenk * combination of deleting the old value and adding the new one. 34c609719bSwdenk * 35c609719bSwdenk * The environment is preceeded by a 32 bit CRC over the data part. 36c609719bSwdenk * 37c609719bSwdenk ************************************************************************** 38c609719bSwdenk */ 39c609719bSwdenk 405a1aceb0SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_ENV_IS_IN_FLASH) 410e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef CONFIG_ENV_ADDR 426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD # define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET) 43c609719bSwdenk # endif 440e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef CONFIG_ENV_OFFSET 456d0f6bcfSJean-Christophe PLAGNIOL-VILLARD # define CONFIG_ENV_OFFSET (CONFIG_ENV_ADDR - CONFIG_SYS_FLASH_BASE) 46c609719bSwdenk # endif 470e8d1586SJean-Christophe PLAGNIOL-VILLARD # if !defined(CONFIG_ENV_ADDR_REDUND) && defined(CONFIG_ENV_OFFSET_REDUND) 48507651d6SIgor Grinberg # define CONFIG_ENV_ADDR_REDUND \ 49507651d6SIgor Grinberg (CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET_REDUND) 50c609719bSwdenk # endif 510e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_SECT_SIZE) || defined(CONFIG_ENV_SIZE) 520e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef CONFIG_ENV_SECT_SIZE 530e8d1586SJean-Christophe PLAGNIOL-VILLARD # define CONFIG_ENV_SECT_SIZE CONFIG_ENV_SIZE 54500545ccSwdenk # endif 550e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef CONFIG_ENV_SIZE 560e8d1586SJean-Christophe PLAGNIOL-VILLARD # define CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE 57c609719bSwdenk # endif 58500545ccSwdenk # else 590e8d1586SJean-Christophe PLAGNIOL-VILLARD # error "Both CONFIG_ENV_SECT_SIZE and CONFIG_ENV_SIZE undefined" 60500545ccSwdenk # endif 610e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_ADDR_REDUND) && !defined(CONFIG_ENV_SIZE_REDUND) 620e8d1586SJean-Christophe PLAGNIOL-VILLARD # define CONFIG_ENV_SIZE_REDUND CONFIG_ENV_SIZE 63c609719bSwdenk # endif 646d0f6bcfSJean-Christophe PLAGNIOL-VILLARD # if (CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) && \ 65507651d6SIgor Grinberg (CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <= \ 66507651d6SIgor Grinberg (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN) 676f403badSIgor Grinberg # define ENV_IS_EMBEDDED 68c609719bSwdenk # endif 690e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_ADDR_REDUND) || defined(CONFIG_ENV_OFFSET_REDUND) 706f403badSIgor Grinberg # define CONFIG_SYS_REDUNDAND_ENVIRONMENT 71c609719bSwdenk # endif 720a9e4e77SMike Frysinger # ifdef CONFIG_ENV_IS_EMBEDDED 730a9e4e77SMike Frysinger # error "do not define CONFIG_ENV_IS_EMBEDDED in your board config" 740a9e4e77SMike Frysinger # error "it is calculated automatically for you" 750a9e4e77SMike Frysinger # endif 765a1aceb0SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_ENV_IS_IN_FLASH */ 77c609719bSwdenk 78*5707df77SBo Shen #if defined(CONFIG_ENV_IS_IN_MMC) 79*5707df77SBo Shen # ifdef CONFIG_ENV_OFFSET_REDUND 80*5707df77SBo Shen # define CONFIG_SYS_REDUNDAND_ENVIRONMENT 81*5707df77SBo Shen # endif 82*5707df77SBo Shen #endif 83*5707df77SBo Shen 8451bfee19SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_ENV_IS_IN_NAND) 85c9f7351bSBen Gardiner # if defined(CONFIG_ENV_OFFSET_OOB) 86c9f7351bSBen Gardiner # ifdef CONFIG_ENV_OFFSET_REDUND 87c9f7351bSBen Gardiner # error "CONFIG_ENV_OFFSET_REDUND is not supported when CONFIG_ENV_OFFSET_OOB" 88c9f7351bSBen Gardiner # error "is set" 89c9f7351bSBen Gardiner # endif 90c9f7351bSBen Gardiner extern unsigned long nand_env_oob_offset; 91c9f7351bSBen Gardiner # define CONFIG_ENV_OFFSET nand_env_oob_offset 92c9f7351bSBen Gardiner # else 930e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef CONFIG_ENV_OFFSET 940e8d1586SJean-Christophe PLAGNIOL-VILLARD # error "Need to define CONFIG_ENV_OFFSET when using CONFIG_ENV_IS_IN_NAND" 95e443c944SMarkus Klotzbuecher # endif 960e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifdef CONFIG_ENV_OFFSET_REDUND 976d0f6bcfSJean-Christophe PLAGNIOL-VILLARD # define CONFIG_SYS_REDUNDAND_ENVIRONMENT 98e443c944SMarkus Klotzbuecher # endif 99c9f7351bSBen Gardiner # endif /* CONFIG_ENV_OFFSET_OOB */ 100c9f7351bSBen Gardiner # ifndef CONFIG_ENV_SIZE 101c9f7351bSBen Gardiner # error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_NAND" 102c9f7351bSBen Gardiner # endif 10351bfee19SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_ENV_IS_IN_NAND */ 104e443c944SMarkus Klotzbuecher 1052b74433fSJoe Hershberger #if defined(CONFIG_ENV_IS_IN_UBI) 1062b74433fSJoe Hershberger # ifndef CONFIG_ENV_UBI_PART 1072b74433fSJoe Hershberger # error "Need to define CONFIG_ENV_UBI_PART when using CONFIG_ENV_IS_IN_UBI" 1082b74433fSJoe Hershberger # endif 1092b74433fSJoe Hershberger # ifndef CONFIG_ENV_UBI_VOLUME 1102b74433fSJoe Hershberger # error "Need to define CONFIG_ENV_UBI_VOLUME when using CONFIG_ENV_IS_IN_UBI" 1112b74433fSJoe Hershberger # endif 112785881f7SJoe Hershberger # if defined(CONFIG_ENV_UBI_VOLUME_REDUND) 113785881f7SJoe Hershberger # define CONFIG_SYS_REDUNDAND_ENVIRONMENT 114785881f7SJoe Hershberger # endif 1152b74433fSJoe Hershberger # ifndef CONFIG_ENV_SIZE 1162b74433fSJoe Hershberger # error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_UBI" 1172b74433fSJoe Hershberger # endif 1182b74433fSJoe Hershberger # ifndef CONFIG_CMD_UBI 1192b74433fSJoe Hershberger # error "Need to define CONFIG_CMD_UBI when using CONFIG_ENV_IS_IN_UBI" 1202b74433fSJoe Hershberger # endif 1212b74433fSJoe Hershberger #endif /* CONFIG_ENV_IS_IN_UBI */ 1222b74433fSJoe Hershberger 1230a9e4e77SMike Frysinger /* Embedded env is only supported for some flash types */ 1240a9e4e77SMike Frysinger #ifdef CONFIG_ENV_IS_EMBEDDED 1250a9e4e77SMike Frysinger # if !defined(CONFIG_ENV_IS_IN_FLASH) && \ 1260a9e4e77SMike Frysinger !defined(CONFIG_ENV_IS_IN_NAND) && \ 127efb06339SYoshihiro Shimoda !defined(CONFIG_ENV_IS_IN_ONENAND) && \ 128efb06339SYoshihiro Shimoda !defined(CONFIG_ENV_IS_IN_SPI_FLASH) 1290a9e4e77SMike Frysinger # error "CONFIG_ENV_IS_EMBEDDED not supported for your flash type" 1300a9e4e77SMike Frysinger # endif 1310a9e4e77SMike Frysinger #endif 1320a9e4e77SMike Frysinger 1330a9e4e77SMike Frysinger /* 1340a9e4e77SMike Frysinger * For the flash types where embedded env is supported, but it cannot be 1350a9e4e77SMike Frysinger * calculated automatically (i.e. NAND), take the board opt-in. 1360a9e4e77SMike Frysinger */ 1370a9e4e77SMike Frysinger #if defined(CONFIG_ENV_IS_EMBEDDED) && !defined(ENV_IS_EMBEDDED) 1386f403badSIgor Grinberg # define ENV_IS_EMBEDDED 1390a9e4e77SMike Frysinger #endif 1400a9e4e77SMike Frysinger 1410a9e4e77SMike Frysinger /* The build system likes to know if the env is embedded */ 1420a9e4e77SMike Frysinger #ifdef DO_DEPS_ONLY 1430a9e4e77SMike Frysinger # ifdef ENV_IS_EMBEDDED 14433a6b9e9SWolfgang Denk # ifndef CONFIG_ENV_IS_EMBEDDED 1450a9e4e77SMike Frysinger # define CONFIG_ENV_IS_EMBEDDED 1460a9e4e77SMike Frysinger # endif 1470a9e4e77SMike Frysinger # endif 14833a6b9e9SWolfgang Denk #endif 1490a9e4e77SMike Frysinger 15037566090SMike Frysinger #include "compiler.h" 151c609719bSwdenk 1526d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT 15389cdab78SMike Frysinger # define ENV_HEADER_SIZE (sizeof(uint32_t) + 1) 154b218ccb5SWolfgang Denk 155b218ccb5SWolfgang Denk # define ACTIVE_FLAG 1 156b218ccb5SWolfgang Denk # define OBSOLETE_FLAG 0 157c609719bSwdenk #else 15889cdab78SMike Frysinger # define ENV_HEADER_SIZE (sizeof(uint32_t)) 159c609719bSwdenk #endif 160c609719bSwdenk 161d09b1787SIgor Grinberg #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) 162d09b1787SIgor Grinberg extern char *env_name_spec; 163d09b1787SIgor Grinberg #endif 164c609719bSwdenk 1650e8d1586SJean-Christophe PLAGNIOL-VILLARD #define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE) 166c609719bSwdenk 167c609719bSwdenk typedef struct environment_s { 16889cdab78SMike Frysinger uint32_t crc; /* CRC32 over data bytes */ 1696d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT 170c609719bSwdenk unsigned char flags; /* active/obsolete flags */ 171c609719bSwdenk #endif 172c609719bSwdenk unsigned char data[ENV_SIZE]; /* Environment data */ 173c609719bSwdenk } env_t; 174c609719bSwdenk 175994bc671SIgor Grinberg #ifdef ENV_IS_EMBEDDED 176994bc671SIgor Grinberg extern env_t environment; 177994bc671SIgor Grinberg #endif /* ENV_IS_EMBEDDED */ 178994bc671SIgor Grinberg 179d1459f0fSIgor Grinberg extern const unsigned char default_environment[]; 18027aafe98SIgor Grinberg extern env_t *env_ptr; 18127aafe98SIgor Grinberg 18227aafe98SIgor Grinberg extern void env_relocate_spec(void); 18327aafe98SIgor Grinberg extern unsigned char env_get_char_spec(int); 18427aafe98SIgor Grinberg 18527aafe98SIgor Grinberg #if defined(CONFIG_NEEDS_MANUAL_RELOC) 18627aafe98SIgor Grinberg extern void env_reloc(void); 18727aafe98SIgor Grinberg #endif 188d1459f0fSIgor Grinberg 1892eb1573fSMike Frysinger #ifndef DO_DEPS_ONLY 1902eb1573fSMike Frysinger 191170ab110SJoe Hershberger #include <env_attr.h> 192170ab110SJoe Hershberger #include <env_callback.h> 1932598090bSJoe Hershberger #include <env_flags.h> 1942eb1573fSMike Frysinger #include <search.h> 1952eb1573fSMike Frysinger 1962eb1573fSMike Frysinger extern struct hsearch_data env_htab; 1972eb1573fSMike Frysinger 198b502611bSJoakim Tjernlund /* Function that returns a character from the environment */ 199b502611bSJoakim Tjernlund unsigned char env_get_char(int); 200a8409f4fSWolfgang Denk 201a8409f4fSWolfgang Denk /* Function that returns a pointer to a value from the environment */ 202147c7169SMike Frysinger const unsigned char *env_get_addr(int); 203a8409f4fSWolfgang Denk unsigned char env_get_char_memory(int index); 204a8409f4fSWolfgang Denk 205a8409f4fSWolfgang Denk /* Function that updates CRC of the enironment */ 206a8409f4fSWolfgang Denk void env_crc_update(void); 207a8409f4fSWolfgang Denk 208267541f7SJoe Hershberger /* Look up the variable from the default environment */ 209267541f7SJoe Hershberger char *getenv_default(const char *name); 210267541f7SJoe Hershberger 2115bb12dbdSHarald Welte /* [re]set to the default environment */ 212ea882bafSWolfgang Denk void set_default_env(const char *s); 213ea882bafSWolfgang Denk 214b64b7c3dSGerlando Falauto /* [re]set individual variables to their value in the default environment */ 215b64b7c3dSGerlando Falauto int set_default_vars(int nvars, char * const vars[]); 216b64b7c3dSGerlando Falauto 217ea882bafSWolfgang Denk /* Import from binary representation into hash table */ 218ea882bafSWolfgang Denk int env_import(const char *buf, int check); 2195bb12dbdSHarald Welte 220507651d6SIgor Grinberg #endif /* DO_DEPS_ONLY */ 2212eb1573fSMike Frysinger 222c609719bSwdenk #endif /* _ENVIRONMENT_H_ */ 223