# Nerves.InitGadget

This project adds a basic level of setup for Nerves devices with USB gadget mode
interfaces like the Raspberry Pi Zero. Here are some features:

* Automatically sets up link local networking on the USB interface. No DHCP or
  static IP setup needed on the host laptop
* Sets up mDNS to respond to lookups for `nerves.local`
* Pulls in the `nerves_runtime` initialization for things like mounting and
  fixing the application filesystem
* Starts `nerves_firmware_ssh` so that push firmware updates work
* If used with [bootloader](,
  crashes in your application's initialization won't break firmware updates

While you'll probably want to create your own device initialization project at
some point, this project serves as a great starting point especially if you're
new to Nerves.

## Installation

This project works best with
[bootloader](, so add both it and
`bootloader` to your dependencies in `mix.exs`:

def deps do
    {:bootloader, "~> 0.1"},
    {:nerves_init_gadget, "~> 0.1"}

Bootloader requires a plugin to the
[distillery]( configuration, so add it
to your `rel/config.exs` (replace `:your_app`):

release :your_app do
  plugin Bootloader.Plugin

Now add the following configuration to your `config/config.exs` (replace

# Boot the bootloader first and have it start our app.
config :bootloader,
  init: [:nerves_init_gadget],
  app: :your_app

The final configuration is item is to set up authorized keys for pushing
firmware updates to the device. This is documented in more detail at
Basically the device will need to know the `ssh` public keys for all of the
users that are allowed to update the firmware. Copy the contents of the
``, etc.  files from your `~/.ssh` directory here like this:

config :nerves_firmware_ssh,
  authorized_keys: [
    "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDBCdMwNo0xOE86il0DB2Tq4RCv07XvnV7W1uQBlOOE0ZZVjxmTIOiu8XcSLy0mHj11qX5pQH3Th6Jmyqdj",
    "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCaf37TM8GfNKcoDjoewa6021zln4GvmOiXqW6SRpF61uNWZXurPte1u8frrJX1P/hGxCL7YN3cV6eZqRiF"

That's it! Run `mix deps.get` and `mix firmware` like usual and copy the new
image to your device.

## Using

Give your device a few seconds to boot and initialize the virtual Ethernet
interface going through the USB cable. On your computer, run `ping` to see that
it's working:

$ ping nerves.local

To update firmware from now on, just run the following:

$ MIX_TARGET=rpi0 mix firmware.push nerves.local

Change `MIX_TARGET` to whatever you're using to build the firmware.  Assuming
everything completes successfully, the device will reboot with the new firmware.

If you have a password-protected ssh private key, `mix firmware.push` currently
isn't able to prompt for the password like commandline `ssh`. See
[nerves_firmware_ssh]( for the
`` script which uses commandline `ssh` and doesn't have this issue.