README.md

# 树莓派 A+, B,  B+

这是树莓派A+, B,  B+的Nerves基本配置。
![树莓派A+ 图](assets/images/raspberry-pi-model-a-plus.png)
它也可以与树莓派 Zero一起工作,但通常情况下`Larsen_System_RPI0`更可取,因为它配置了USB端口以便可以连接计算机。
这对于打开和调试Pi Zero非常方便。如果您想在 "host" 模式下使用树莓派 Zero的USB端口(例如,连接USB闪存驱动器或其他外围设备),那么这个存储库可以工作,并且可能更合适。
这不是树莓pi 2和3的配置。
## 使用

最常见的使用Nerves的方法是使用`mix
nerves.new` 创建一个项目,导出`MIX_TARGET=rpi`。
更多信息请参阅[入门指南](https://hexdocs.pm/nerves/getting-started.html#creating-a-new-nerves-app)。

如果设备需要对系统进行自定义修改,
请复制此存储库并按[创建自定义系统](https://hexdocs.pm/nerves/systems.html#customizing-your-own-nerves-system)中所描述的进行更新

如果你对Nerves不熟悉,请浏览
[nerves_init_gadget](https://github.com/nerves-project/nerves_init_gadget)
来创建第一个项目。它将帮助您开始一些基础工作, 如建立网络、初始化可写应用程序数据分区以及启用基于ssh的固件更新。
使用有线以太网接口“Eth0”和DHCP是最容易的。

## 支持的USB WiFi设备

The base image includes drivers and firmware for Ralink RT53xx
(`rt2800usb` driver) and RealTek RTL8712U (`r8712u` driver) devices.

We are still working out which subset of all possible WiFi dongles to
support in our images. At some point, we may have the option to support
all dongles and selectively install modules at packaging time, but until
then, these drivers and their associated firmware blobs add significantly
to Nerves release images.

If you are unsure what driver your WiFi dongle requires, run Raspbian and
configure WiFi for your device. At a shell prompt, run `lsmod` to see which
drivers are loaded.  Running `dmesg` may also give a clue. When using `dmesg`,
reinsert the USB dongle to generate new log messages if you don't see them.


基本图像包括Ralink RT53xx(`RT2800USB`驱动程序)和Realtek RTL8712U(`R8712U`驱动程序)设备的驱动程序和固件。
我们仍在研究在我们的镜像中支持的所有可能WiFi加密狗。在某些情况下,我们可以选择支持所有软件狗,并在打包时有选择地安装模块,但在此之前,这些驱动程序及其相关的固件blob会显著增加Nerves镜像。
如果您不确定WiFi加密狗需要什么驱动程序,请运行Raspbian并为您的设备配置WiFi。在shell提示下,运行`lsmod`查看加载了哪些驱动程序。运行`dmesg`也可以提供线索。使用`dmesg`时,如果看不到,请重新插入USB加密狗以生成新的日志消息。

## 音频

树莓PI有很多音频输出选项。该系统支持HDMI和立体声音频插孔输出,The Linux ALSA 驱动程序用于音频
输出。

试一试,运行:

```elixir
:os.cmd('espeak -ven+f5 -k5 -w /tmp/out.wav Hello')
:os.cmd('aplay -q /tmp/out.wav')
```

一般的树莓PI的音频文件适用于Nerves。
例如,强制将音频输出到HDMI端口,运行:

```elixir
:os.cmd('amixer cset numid=3 2')
```

将最后一个`amixer`参数更改为`1` 输出到立体声。

## 配置设备

该系统支持将配置信息存储在文件系统之外的key-value存储区中。配置是可选的步骤,如果缺少,则使用合理的默认值。

配置信息可以使用Nerves.Runtime KV存储的
[`Nerves.Runtime.KV.get/1`](https://hexdocs.pm/nerves_runtime/Nerves.Runtime.KV.html#get/1)函数。

本系统使用的关键字为:

关键字                    | 例如     | 描述
:--------------------- | :---------------- | :----------
`nerves_serial_number` | `"12345678"`      | 默认情况下,此字符串用于创建单一主机名和Erlang节点的名称。如果未设置,它默认为树莓PI的设备ID的一部分。

正常的程序是在制造前或部署前设置这些键,然后将它们单独保存。

例如,要在运行的设备上提供序列号,请运行以下内容并重新启动:

```elixir
iex> cmd("fw_setenv nerves_serial_number 12345678")
```

该系统支持离线设置序列号。为此需在烧录固件时设置
`NERVES_SERIAL_NUMBER`环境变量。如果使用`fwup`编写MicroSD卡,则命令行为:

```sh
sudo NERVES_SERIAL_NUMBER=12345678 fwup path_to_firmware.fw
```

序列号被存储在MICROSD卡上,所以如果MICROSD卡被替换,序列号将需要被重新编写。这些数字存储在U-boot环境块中。
 这是一个与应用程序分区分离的特殊区域,因此重新格式化应用程序分区不会丢失序列号或存储在此块中的任何其他数据。

可以通过设置环境变量`NERVES_PROVISIONING=/path/to/provisioning.conf`来覆盖默认的provisioning.conf文件位置用来提供其他键值对。
默认的provisioning.conf用来设置`nerves_serial_number`,如果重写此文件的位置,则需要您将自己负责设置。

## Linux内核与RPI固件/用户空间

在这里使用的`nerves_system_br` 版本和Linux内核版本之间有微妙的耦合。
 `nerves_system_br` 提供了安装的 `rpi-userland`和`rpi-firmware`版本。
 我更喜欢将它们与Linux内核相匹配,以避免任何问题发生。
不幸的是,这些都没有被树莓PI基金会标记,所以要么尝试匹配Raspbian中的内容,要么采用具有相似提交时间的版本库。