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        int ret;
  61
  62        ret = env_export(&env_new);
  63        if (ret)
  64                return ret;
  65
  66        return write_dataflash(CONFIG_ENV_ADDR,
  67                                (unsigned long)&env_new,
  68                                CONFIG_ENV_SIZE);
  69}
  70
  71/*
  72 * Initialize environment use
  73 *
  74 * We are still running from ROM, so data use is limited.
  75 * Use a (moderately small) buffer on the stack
  76 */
  77int env_init(void)
  78{
  79        /* use default */
  80        gd->env_addr = (ulong)&default_environment[0];
  81        gd->env_valid = 1;
  82
  83        return 0;
  84}
  85