A Nerves system for the original Microsoft Surface RT (2012, NVIDIA Tegra 3).
Status: Nerves runs from the internal eMMC and boots through GRUB, with A/B firmware updates over Wi-Fi (
mix upload) that fall back if new firmware doesn't validate. All four CPU cores and the 1 MB L2 cache are on. The console is on the built-in screen, with the Touch/Type Cover or a USB keyboard. The touchscreen (multitouch), speakers, battery status and USB storage work. As far as we know, nobody has run Nerves on a Surface RT before.
| Item | Details |
|---|---|
| SoC | NVIDIA Tegra 3 (T30), 4× Cortex-A9 (ARMv7-A, NEON) |
| RAM | 2 GB |
| Storage | 32/64 GB internal eMMC, microSD slot |
| Wi-Fi/BT | Marvell 88W8797 (SDIO, Linux driver mwifiex_sdio) |
| USB | 1× USB 2.0 Type-A, host only (no gadget/OTG) |
| Input | Touchscreen (Atmel maXTouch, HID over I2C), Touch/Type Cover |
| Firmware | UEFI with Secure Boot locked on (must be jailbroken) |
This targets the Surface RT only. The Surface 2 uses a Tegra 4 and boots Linux differently.
- Jailbreak the Surface, so it boots unsigned code: see JAILBREAK.md.
- Install Nerves on the eMMC, then update it with
mix upload: see INSTALLING.md.
The system is on Hex.
Add it to a Nerves project's mix.exs with a target named surface_rt:
{:nerves_system_surface_rt, "~> 0.2.2", runtime: false, targets: :surface_rt}Releases have a prebuilt system artifact, so mix firmware doesn't need to
build the system. Without one it's built from source, as below.
nerves_surface_rt_hello
is an example app.
The system uses nerves_system_br 1.35.2, which builds Erlang/OTP 29.1.2
for the target. The host's OTP major version must match, so this repo pins
Erlang 29.1.2 and Elixir 1.20.4-otp-29 in .tool-versions.
Don't go below OTP 29.1.1 on the target. Its SSH daemon (ssh 6.0.5)
rejects subsystem requests that follow an env request, and macOS's ssh
sends LANG and LC_* by default, so mix upload and sftp fail with
"subsystem request failed on channel 0".
mix archive.install hex nerves_bootstrap
mix deps.get
mix compile # on macOS, Buildroot runs in Docker (Docker must be running)If your shell doesn't switch versions automatically, prefix the commands
with mise exec -- (or the asdf equivalent).
Nerves writes the Buildroot output to build.log in this directory. Don't
redirect mix compile to that same file, or the two outputs overwrite
each other. The built system ends up in
~/.nerves/artifacts/nerves_system_surface_rt-portable-<version>/.
- PORTING.md: how the system is put together (kernel, bootloader, partitions), with Nerves porting references
- PLAN.md: what's done and what's next
- dts/README.md: the Surface RT device tree and its changes for mainline Linux
- CHANGELOG.md
This project follows the REUSE specification.
REUSE.toml maps each file to its license, and the license texts are in
LICENSES/. Like the official Nerves systems:
| Files | License |
|---|---|
linux/ (kernel config fragment and kernel patches) |
GPL-2.0-only |
Config.in, nerves_defconfig, post-build.sh, post-createfs.sh (Buildroot derived) |
GPL-2.0-or-later |
fwup.conf, fwup-ops.conf, fwup_include/, grub.cfg, rootfs_overlay/, mix.exs and other small config files |
CC0-1.0 |
README.md, INSTALLING.md, JAILBREAK.md, PLAN.md, PORTING.md, dts/README.md |
CC-BY-4.0 |
The device tree comes from the Open Surface RT community kernel and keeps its upstream SPDX headers.