README.md

# Sunxi

Sunxi is an Elixir package that provides bindings to the `sunxi-tools` C
library. It allows for interaction with Allwinner devices connected via USB in
FEL mode. The package vendors the `sunxi-tools` source code and compiles it as
part of the Elixir build process.

## Vendoring

This project vendors the `sunxi-tools` source code (git commit hash
`7540cb235691be94ac5ef0181a73dd929949fc4e`) from the
[linux-sunxi/sunxi-tools](https://github.com/linux-sunxi/sunxi-tools)
repository.

## Dependencies

The `sunxi-tools` library requires several development libraries to be installed
on the host system.

On macOS, these can be installed with the following command:

```bash
brew install libusb dtc zlib pkg-config
```

On Ubuntu or Debian, these can be installed with the following command:

```bash
sudo apt-get install libusb-1.0-0-dev libfdt-dev zlib1g-dev pkg-config
```

For Windows, WSL may be required to use this package.

## Usage

The `Sunxi.FEL` module provides functions to interact with devices in FEL mode.

To list connected Allwinner devices:

```elixir
iex> Sunxi.FEL.list_devices()
{:ok,
 [
   %{
     device: "026",
     bus: "020",
     model: "R528",
     sid: "93407200:7c004814:0102a04c:5c5b1cd8"
   }
 ]}
```

To read and write memory when a device is connected:

```elixir
iex> address = 0x20000

iex> Sunxi.FEL.write_memory(address, <<0x01, 0x02, 0x03, 0x04>>)
:ok

iex> Sunxi.FEL.read_memory(address, 4)
{:ok, <<1, 2, 3, 4>>}
```

To load and execute bootloaders (for U-Boot, if the U-Boot and SPL file are
packaged together into one file, it will properly load both at the same time):

```elixir
Sunxi.FEL.execute_spl("path/to/spl.bin")
Sunxi.FEL.execute_uboot("path/to/u-boot.bin")
```

If no devices are connected, you get an error:

```elixir
iex> Sunxi.FEL.write_memory(address, <<0x01, 0x02, 0x03, 0x04>>)
{:error, :no_device_connected}
```

Other errors will be strings.