fw_env.h 5.04 KB
Newer Older
1
/*
2
 * (C) Copyright 2002-2008
3 4
 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 *
5
 * SPDX-License-Identifier:	GPL-2.0+
6 7
 */

8 9 10
#include <aes.h>
#include <stdint.h>

11
/* Pull in the current config to define the default environment */
12 13
#include <linux/kconfig.h>

14 15 16 17 18 19 20 21
#ifndef __ASSEMBLY__
#define __ASSEMBLY__ /* get only #defines from config.h */
#include <config.h>
#undef	__ASSEMBLY__
#else
#include <config.h>
#endif

wdenk's avatar
wdenk committed
22
/*
Frans Meulenbroeks's avatar
Frans Meulenbroeks committed
23 24
 * To build the utility with the static configuration
 * comment out the next line.
25
 * See included "fw_env.config" sample file
26 27
 * for notes on configuration.
 */
28
#define CONFIG_FILE     "/etc/fw_env.config"
29

30
#ifndef CONFIG_FILE
31 32 33
#define HAVE_REDUND /* For systems with 2 env sectors */
#define DEVICE1_NAME      "/dev/mtd1"
#define DEVICE2_NAME      "/dev/mtd2"
34
#define DEVICE1_OFFSET    0x0000
35
#define ENV1_SIZE         0x4000
36 37
#define DEVICE1_ESIZE     0x4000
#define DEVICE1_ENVSECTORS     2
38
#define DEVICE2_OFFSET    0x0000
39
#define ENV2_SIZE         0x4000
40 41
#define DEVICE2_ESIZE     0x4000
#define DEVICE2_ENVSECTORS     2
42
#endif
43

44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#ifndef CONFIG_BAUDRATE
#define CONFIG_BAUDRATE		115200
#endif

#ifndef CONFIG_BOOTDELAY
#define CONFIG_BOOTDELAY	5	/* autoboot after 5 seconds	*/
#endif

#ifndef CONFIG_BOOTCOMMAND
#define CONFIG_BOOTCOMMAND							\
	"bootp; "								\
	"setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} "	\
	"ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; "	\
	"bootm"
#endif

60
struct env_opts {
61 62 63 64
#ifdef CONFIG_FILE
	char *config_file;
#endif
	int aes_flag; /* Is AES encryption used? */
65
	uint8_t aes_key[AES_KEY_LENGTH];
66
	char *lockname;
67
};
68

69 70
int parse_aes_key(char *key, uint8_t *bin_key);

71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
/**
 * fw_printenv() - print one or several environment variables
 *
 * @argc: number of variables names to be printed, prints all if 0
 * @argv: array of variable names to be printed, if argc != 0
 * @value_only: do not repeat the variable name, print the bare value,
 *          only one variable allowed with this option, argc must be 1
 * @opts: encryption key, configuration file, defaults are used if NULL
 *
 * Description:
 *  Uses fw_env_open, fw_getenv
 *
 * Return:
 *  0 on success, -1 on failure (modifies errno)
 */
86
int fw_printenv(int argc, char *argv[], int value_only, struct env_opts *opts);
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105

/**
 * fw_setenv() - adds or removes one variable to the environment
 *
 * @argc: number of strings in argv, argv[0] is variable name,
 *          argc==1 means erase variable, argc > 1 means add a variable
 * @argv: argv[0] is variable name, argv[1..argc-1] are concatenated separated
 *           by single blank and set as the new value of the variable
 * @opts: how to retrieve environment from flash, defaults are used if NULL
 *
 * Description:
 *  Uses fw_env_open, fw_env_write, fw_env_close
 *
 * Return:
 *  0 on success, -1 on failure (modifies errno)
 *
 * ERRORS:
 *  EROFS - some variables ("ethaddr", "serial#") cannot be modified
 */
106
int fw_setenv(int argc, char *argv[], struct env_opts *opts);
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142

/**
 * fw_parse_script() - adds or removes multiple variables with a batch script
 *
 * @fname: batch script file name
 * @opts: encryption key, configuration file, defaults are used if NULL
 *
 * Description:
 *  Uses fw_env_open, fw_env_write, fw_env_close
 *
 * Return:
 *  0 success, -1 on failure (modifies errno)
 *
 * Script Syntax:
 *
 *  key [ [space]+ value]
 *
 *  lines starting with '#' treated as comment
 *
 *  A variable without value will be deleted. Any number of spaces are allowed
 *  between key and value. The value starts with the first non-space character
 *  and ends with newline. No comments allowed on these lines.  Spaces inside
 *  the value are preserved verbatim.
 *
 * Script Example:
 *
 *  netdev         eth0
 *
 *  kernel_addr    400000
 *
 *  foo            spaces           are copied verbatim
 *
 *  # delete variable bar
 *
 *  bar
 */
143
int fw_parse_script(char *fname, struct env_opts *opts);
144 145 146 147 148 149 150 151 152 153


/**
 * fw_env_open() - read enviroment from flash into RAM cache
 *
 * @opts: encryption key, configuration file, defaults are used if NULL
 *
 * Return:
 *  0 on success, -1 on failure (modifies errno)
 */
154
int fw_env_open(struct env_opts *opts);
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179

/**
 * fw_getenv() - lookup variable in the RAM cache
 *
 * @name: variable to be searched
 * Return:
 *  pointer to start of value, NULL if not found
 */
char *fw_getenv(char *name);

/**
 * fw_env_write() - modify a variable held in the RAM cache
 *
 * @name: variable
 * @value: delete variable if NULL, otherwise create or overwrite the variable
 *
 * This is called in sequence to update the environment in RAM without updating
 * the copy in flash after each set
 *
 * Return:
 *  0 on success, -1 on failure (modifies errno)
 *
 * ERRORS:
 *  EROFS - some variables ("ethaddr", "serial#") cannot be modified
 */
180
int fw_env_write(char *name, char *value);
181 182 183 184 185 186 187 188 189

/**
 * fw_env_close - write the environment from RAM cache back to flash
 *
 * @opts: encryption key, configuration file, defaults are used if NULL
 *
 * Return:
 *  0 on success, -1 on failure (modifies errno)
 */
190
int fw_env_close(struct env_opts *opts);
191

192
unsigned long crc32(unsigned long, const unsigned char *, unsigned);