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