uboot/include/environment.h
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2002
   3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   4 *
   5 * SPDX-License-Identifier:     GPL-2.0+
   6 */
   7
   8#ifndef _ENVIRONMENT_H_
   9#define _ENVIRONMENT_H_
  10
  11/**************************************************************************
  12 *
  13 * The "environment" is stored as a list of '\0' terminated
  14 * "name=value" strings. The end of the list is marked by a double
  15 * '\0'. New entries are always added at the end. Deleting an entry
  16 * shifts the remaining entries to the front. Replacing an entry is a
  17 * combination of deleting the old value and adding the new one.
  18 *
  19 * The environment is preceded by a 32 bit CRC over the data part.
  20 *
  21 *************************************************************************/
  22
  23#if defined(CONFIG_ENV_IS_IN_FLASH)
  24# ifndef        CONFIG_ENV_ADDR
  25#  define       CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
  26# endif
  27# ifndef        CONFIG_ENV_OFFSET
  28#  define       CONFIG_ENV_OFFSET (CONFIG_ENV_ADDR - CONFIG_SYS_FLASH_BASE)
  29# endif
  30# if !defined(CONFIG_ENV_ADDR_REDUND) && defined(CONFIG_ENV_OFFSET_REDUND)
  31#  define       CONFIG_ENV_ADDR_REDUND  \
  32                (CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET_REDUND)
  33# endif
  34# if defined(CONFIG_ENV_SECT_SIZE) || defined(CONFIG_ENV_SIZE)
  35#  ifndef       CONFIG_ENV_SECT_SIZE
  36#   define      CONFIG_ENV_SECT_SIZE    CONFIG_ENV_SIZE
  37#  endif
  38#  ifndef       CONFIG_ENV_SIZE
  39#   define      CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE
  40#  endif
  41# else
  42#  error "Both CONFIG_ENV_SECT_SIZE and CONFIG_ENV_SIZE undefined"
  43# endif
  44# if defined(CONFIG_ENV_ADDR_REDUND) && !defined(CONFIG_ENV_SIZE_REDUND)
  45#  define CONFIG_ENV_SIZE_REDUND        CONFIG_ENV_SIZE
  46# endif
  47# if    (CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) &&         \
  48        (CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <=                  \
  49        (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
  50#  define ENV_IS_EMBEDDED
  51# endif
  52# if defined(CONFIG_ENV_ADDR_REDUND) || defined(CONFIG_ENV_OFFSET_REDUND)
  53#  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
  54# endif
  55# ifdef CONFIG_ENV_IS_EMBEDDED
  56#  error "do not define CONFIG_ENV_IS_EMBEDDED in your board config"
  57#  error "it is calculated automatically for you"
  58# endif
  59#endif  /* CONFIG_ENV_IS_IN_FLASH */
  60
  61#if defined(CONFIG_ENV_IS_IN_MMC)
  62# ifdef CONFIG_ENV_OFFSET_REDUND
  63#  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
  64# endif
  65#endif
  66
  67#if defined(CONFIG_ENV_IS_IN_NAND)
  68# if defined(CONFIG_ENV_OFFSET_OOB)
  69#  ifdef CONFIG_ENV_OFFSET_REDUND
  70#   error "CONFIG_ENV_OFFSET_REDUND is not supported when CONFIG_ENV_OFFSET_OOB"
  71#   error "is set"
  72#  endif
  73extern unsigned long nand_env_oob_offset;
  74#  define CONFIG_ENV_OFFSET nand_env_oob_offset
  75# else
  76#  ifndef CONFIG_ENV_OFFSET
  77#   error "Need to define CONFIG_ENV_OFFSET when using CONFIG_ENV_IS_IN_NAND"
  78#  endif
  79#  ifdef CONFIG_ENV_OFFSET_REDUND
  80#   define CONFIG_SYS_REDUNDAND_ENVIRONMENT
  81#  endif
  82# endif /* CONFIG_ENV_OFFSET_OOB */
  83# ifndef CONFIG_ENV_SIZE
  84#  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_NAND"
  85# endif
  86#endif /* CONFIG_ENV_IS_IN_NAND */
  87
  88#if defined(CONFIG_ENV_IS_IN_UBI)
  89# ifndef CONFIG_ENV_UBI_PART
  90#  error "Need to define CONFIG_ENV_UBI_PART when using CONFIG_ENV_IS_IN_UBI"
  91# endif
  92# ifndef CONFIG_ENV_UBI_VOLUME
  93#  error "Need to define CONFIG_ENV_UBI_VOLUME when using CONFIG_ENV_IS_IN_UBI"
  94# endif
  95# if defined(CONFIG_ENV_UBI_VOLUME_REDUND)
  96#  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
  97# endif
  98# ifndef CONFIG_ENV_SIZE
  99#  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_UBI"
 100# endif
 101# ifndef CONFIG_CMD_UBI
 102#  error "Need to define CONFIG_CMD_UBI when using CONFIG_ENV_IS_IN_UBI"
 103# endif
 104#endif /* CONFIG_ENV_IS_IN_UBI */
 105
 106/* Embedded env is only supported for some flash types */
 107#ifdef CONFIG_ENV_IS_EMBEDDED
 108# if    !defined(CONFIG_ENV_IS_IN_FLASH)        && \
 109        !defined(CONFIG_ENV_IS_IN_NAND)         && \
 110        !defined(CONFIG_ENV_IS_IN_ONENAND)      && \
 111        !defined(CONFIG_ENV_IS_IN_SPI_FLASH)
 112#  error "CONFIG_ENV_IS_EMBEDDED not supported for your flash type"
 113# endif
 114#endif
 115
 116/*
 117 * For the flash types where embedded env is supported, but it cannot be
 118 * calculated automatically (i.e. NAND), take the board opt-in.
 119 */
 120#if defined(CONFIG_ENV_IS_EMBEDDED) && !defined(ENV_IS_EMBEDDED)
 121# define ENV_IS_EMBEDDED
 122#endif
 123
 124/* The build system likes to know if the env is embedded */
 125#ifdef DO_DEPS_ONLY
 126# ifdef ENV_IS_EMBEDDED
 127#  ifndef CONFIG_ENV_IS_EMBEDDED
 128#   define CONFIG_ENV_IS_EMBEDDED
 129#  endif
 130# endif
 131#endif
 132
 133#include "compiler.h"
 134
 135#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
 136# define ENV_HEADER_SIZE        (sizeof(uint32_t) + 1)
 137
 138# define ACTIVE_FLAG   1
 139# define OBSOLETE_FLAG 0
 140#else
 141# define ENV_HEADER_SIZE        (sizeof(uint32_t))
 142#endif
 143
 144#if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
 145extern char *env_name_spec;
 146#endif
 147
 148#ifdef CONFIG_ENV_AES
 149/* Make sure the payload is multiple of AES block size */
 150#define ENV_SIZE ((CONFIG_ENV_SIZE - ENV_HEADER_SIZE) & ~(16 - 1))
 151#else
 152#define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
 153#endif
 154
 155typedef struct environment_s {
 156        uint32_t        crc;            /* CRC32 over data bytes        */
 157#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
 158        unsigned char   flags;          /* active/obsolete flags        */
 159#endif
 160        unsigned char   data[ENV_SIZE]; /* Environment data             */
 161} env_t
 162#ifdef CONFIG_ENV_AES
 163/* Make sure the env is aligned to block size. */
 164__attribute__((aligned(16)))
 165#endif
 166;
 167
 168#ifdef ENV_IS_EMBEDDED
 169extern env_t environment;
 170#endif /* ENV_IS_EMBEDDED */
 171
 172extern const unsigned char default_environment[];
 173extern env_t *env_ptr;
 174
 175extern void env_relocate_spec(void);
 176extern unsigned char env_get_char_spec(int);
 177
 178#if defined(CONFIG_NEEDS_MANUAL_RELOC)
 179extern void env_reloc(void);
 180#endif
 181
 182#ifdef CONFIG_ENV_IS_IN_MMC
 183#include <mmc.h>
 184
 185extern int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
 186# ifdef CONFIG_SYS_MMC_ENV_PART
 187extern uint mmc_get_env_part(struct mmc *mmc);
 188# endif
 189#endif
 190
 191#ifndef DO_DEPS_ONLY
 192
 193#include <env_attr.h>
 194#include <env_callback.h>
 195#include <env_flags.h>
 196#include <search.h>
 197
 198extern struct hsearch_data env_htab;
 199
 200/* Function that returns a character from the environment */
 201unsigned char env_get_char(int);
 202
 203/* Function that returns a pointer to a value from the environment */
 204const unsigned char *env_get_addr(int);
 205unsigned char env_get_char_memory(int index);
 206
 207/* Function that updates CRC of the enironment */
 208void env_crc_update(void);
 209
 210/* Look up the variable from the default environment */
 211char *getenv_default(const char *name);
 212
 213/* [re]set to the default environment */
 214void set_default_env(const char *s);
 215
 216/* [re]set individual variables to their value in the default environment */
 217int set_default_vars(int nvars, char * const vars[]);
 218
 219/* Import from binary representation into hash table */
 220int env_import(const char *buf, int check);
 221
 222/* Export from hash table into binary representation */
 223int env_export(env_t *env_out);
 224
 225#endif /* DO_DEPS_ONLY */
 226
 227#endif /* _ENVIRONMENT_H_ */
 228