/* * NVRAM variable manipulation * * Copyright 2007, Broadcom Corporation * Copyright 2009, OpenWrt.org * All Rights Reserved. * * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. * */ #ifndef _nvram_h_ #define _nvram_h_ #include #include #include #include #include #include #include #include #include #include #include "sdinitvals.h" struct nvram_header { uint32_t magic; uint32_t len; uint32_t crc_ver_init; /* 0:7 crc, 8:15 ver, 16:31 sdram_init */ uint32_t config_refresh; /* 0:15 sdram_config, 16:31 sdram_refresh */ uint32_t config_ncdl; /* ncdl values for memc */ } __attribute__((__packed__)); struct nvram_tuple { char *name; char *value; struct nvram_tuple *next; }; struct nvram_handle { int fd; char *mmap; unsigned int length; unsigned int offset; struct nvram_tuple *nvram_hash[257]; struct nvram_tuple *nvram_dead; }; typedef struct nvram_handle nvram_handle_t; typedef struct nvram_header nvram_header_t; typedef struct nvram_tuple nvram_tuple_t; /* Get nvram header. */ nvram_header_t * nvram_header(nvram_handle_t *h); /* Set the value of an NVRAM variable */ int nvram_set(nvram_handle_t *h, const char *name, const char *value); /* Get the value of an NVRAM variable. */ char * nvram_get(nvram_handle_t *h, const char *name); /* Unset the value of an NVRAM variable. */ int nvram_unset(nvram_handle_t *h, const char *name); /* Get all NVRAM variables. */ nvram_tuple_t * nvram_getall(nvram_handle_t *h); /* Regenerate NVRAM. */ int nvram_commit(nvram_handle_t *h); /* Open NVRAM and obtain a handle. */ nvram_handle_t * nvram_open(const char *file, int rdonly); /* Close NVRAM and free memory. */ int nvram_close(nvram_handle_t *h); /* Get the value of an NVRAM variable in a safe way, use "" instead of NULL. */ #define nvram_safe_get(h, name) (nvram_get(h, name) ? : "") /* Computes a crc8 over the input data. */ uint8_t hndcrc8 (uint8_t * pdata, uint32_t nbytes, uint8_t crc); /* Returns the crc value of the nvram. */ uint8_t nvram_calc_crc(nvram_header_t * nvh); /* Determine NVRAM device node. */ char * nvram_find_mtd(void); /* Copy NVRAM contents to staging file. */ int nvram_to_staging(void); /* Copy staging file to NVRAM device. */ int staging_to_nvram(void); /* Check NVRAM staging file. */ char * nvram_find_staging(void); /* Staging file for NVRAM */ #define NVRAM_STAGING "/tmp/.nvram" #define NVRAM_RO 1 #define NVRAM_RW 0 /* Helper macros */ #define NVRAM_ARRAYSIZE(a) sizeof(a)/sizeof(a[0]) #define NVRAM_ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y)) /* NVRAM constants */ #define NVRAM_MIN_SPACE 0x8000 #define NVRAM_MAGIC 0x48534C46 /* 'FLSH' */ #define NVRAM_VERSION 1 #define NVRAM_CRC_START_POSITION 9 /* magic, len, crc8 to be skipped */ #endif /* _nvram_h_ */ plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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
143
144