README.md

# UBootEnv

[![CircleCI](https://circleci.com/gh/nerves-project/uboot_env.svg?style=svg)](https://circleci.com/gh/nerves-project/uboot_env)
[![Hex version](https://img.shields.io/hexpm/v/uboot_env.svg "Hex version")](https://hex.pm/packages/uboot_env)

This library lets you read and write [U-Boot](https://www.denx.de/wiki/U-Boot)
environment blocks from Elixir. U-Boot environment blocks are simple key-value
stores used by the U-Boot bootloader and applications that need to communicate
with it. Nerves uses U-Boot environment blocks to store settings related to the
device and running firmware. Nerves uses the format even for boards (like the
Raspberry Pis) that don't use the U-Boot bootloader.

This library has the following features:

* Create, read, and write to U-Boot environment blocks in pure Elixir with OTP
  21 and later
* Load environment block configurations from `/etc/fw_env.config`
* Redundant and non-redundant environment block support

This library does not support U-Boot environment blocks stored in raw NAND Flash
or big-endian blocks.

## Installation

Install by adding `uboot_env` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:uboot_env, "~> 1.0"}
  ]
end
```

## Using

Here's an example of reading the environment:

```elixir
iex> UBootEnv.read()
{:ok,
 %{
   "fdt_addr" => "0x83000000",
   "stdout" => "serial",
   ...
 }
}
```

To change the environment, update the map returned by `UBootEnv.read/0` and call
`UBootEnv.write/1`. If you're used to using `fw_setenv`, note that
`UBootEnv.write/1` writes the map that you give it whereas `fw_setenv` merges
the key value pairs with the current environment.

```elixir
iex> {:ok kv} = UBootEnv.read()
iex> new_kv = Map.put(kv, "hello", "world")
iex> UBootEnv.write(new_kv)
:ok
```

`UBootEnv.read/0` and `UBootEnv.write/1` do not perform any locking of the data
they write. If you have multiple processes updating the U-Boot environment
block, you'll have to synchronize access to it.

## License

This code is Apache 2 licensed.