uboot/common/env_dataflash.c
<<
>>
Prefs
   1/*
   2 * LowLevel function for DataFlash environment support
   3 * Author : Gilles Gastaldi (Atmel)
   4 *
   5 * SPDX-License-Identifier:     GPL-2.0+
   6 */
   7#include <common.h>
   8#include <command.h>
   9#include <environment.h>
  10#include <linux/stddef.h>
  11#include <dataflash.h>
  12#include <search.h>
  13#include <errno.h>
  14
  15DECLARE_GLOBAL_DATA_PTR;
  16
  17env_t *env_ptr;
  18
  19char *env_name_spec = "dataflash";
  20
  21uchar env_get_char_spec(int index)
  22{
  23        uchar c;
  24
  25        read_dataflash(CONFIG_ENV_ADDR + index + offsetof(env_t, data),
  26                        1, (char *)&c);
  27        return c;
  28}
  29
  30void env_relocate_spec(void)
  31{
  32        ulong crc, new = 0;
  33        unsigned off;
  34        char buf[CONFIG_ENV_SIZE];
  35
  36        /* Read old CRC */
  37        read_dataflash(CONFIG_ENV_ADDR + offsetof(env_t, crc),
  38                       sizeof(ulong), (char *)&crc);
  39
  40        /* Read whole environment */
  41        read_dataflash(CONFIG_ENV_ADDR, CONFIG_ENV_SIZE, buf);
  42
  43        /* Calculate the CRC */
  44        off = offsetof(env_t, data);
  45        new = crc32(new, (unsigned char *)(buf + off), ENV_SIZE);
  46
  47        if (crc == new)
  48                env_import(buf, 1);
  49        else
  50                set_default_env("!bad CRC");
  51}
  52
  53#ifdef CONFIG_ENV_OFFSET_REDUND
  54#error No support for redundant environment on dataflash yet!
  55#endif
  56
  57int saveenv(void)
  58{
  59        env_t   env_new;
  60        ssize_t len;
  61        char    *res;
  62
  63        res = (char *)&env_new.data;
  64        len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
  65        if (len < 0) {
  66                error("Cannot export environment: errno = %d\n", errno);
  67                return 1;
  68        }
  69        env_new.crc = crc32(0, env_new.data, ENV_SIZE);
  70
  71        return write_dataflash(CONFIG_ENV_ADDR,
  72                                (unsigned long)&env_new,
  73                                CONFIG_ENV_SIZE);
  74}
  75
  76/*
  77 * Initialize environment use
  78 *
  79 * We are still running from ROM, so data use is limited.
  80 * Use a (moderately small) buffer on the stack
  81 */
  82int env_init(void)
  83{
  84        /* use default */
  85        gd->env_addr = (ulong)&default_environment[0];
  86        gd->env_valid = 1;
  87
  88        return 0;
  89}
  90