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