The first tagged emOS: an Echo Dot Gen 2 running EchoMuse with no Amazon
userspace at all — no Android init, no system_server, no mediaserver, no audio
HAL. It keeps the device's own MediaTek 3.18 kernel and pairs it with our own
PID 1, busybox, and bionic and tinyalsa mounted read-only from the device's
own /system.
A complete voice turn runs on it: wake word scored on-device, Home Assistant
pipeline, spoken answer — along with WiFi, the 9-channel mic array, hardware
AEC, the BLE proxy, buttons, ambient light, jack detect and the LED ring.
Cold boot to on-the-network is about 32 seconds.
What this release contains, and what it does not
The init binary, and nothing else. A bootable emOS image contains the
device's own kernel and device trees, so shipping one would mean
redistributing Amazon's code. The image is assembled on your side, from the
boot partition you read off your own device — emos/build.sh does it, and so
does the EchoMuse provisioning wizard, which is what this asset exists to
feed.
aarch64, statically linked. Both properties are asserted by the release
itself, because both are silent when wrong and fatal on the device.
Status
Bench-proven, not field-proven. One device, two days. A tag is not a claim
that this is finished — it is here so the provisioning wizard can fetch the
init rather than asking you to build one.
Read emos/README.md before installing, and in particular:
- The wizard has not been through a full run on hardware. Its last two
steps, which watch the first boot and configure WiFi over the USB console,
have never talked to a real device. - An Echo on emOS cannot be re-provisioned by the wizard. emOS has no adbd,
so the first step cannot see it. Going back is manual: TWRP, wipe cache,
wipe data, sideload a FireOS image — which erases the device. - Keep the boot image the wizard hands you. It restores the device in about
ten seconds and leaves /data untouched.
Try it on a spare Echo, not on one you rely on.
What's Changed
- Give the ring to the link state, and stand the buttons down without one by @wilbowes in #415
- Serialise firmware updates across the controller, not per device by @wilbowes in #412
- Move BLE advertisements off the control plane, negotiated on the ack by @wilbowes in #413
- Arbitrate a barge-in, so only one Echo answers it by @wilbowes in #414
- Quiet aiohttp.access logging to WARNING by default by @DennisGaida in #376
- Record the day: the OTA queue, the link-state ring, and what the stall is not by @wilbowes in #418
- Reconcile all three device payloads on connect by @wilbowes in #419
- Bump actions/download-artifact from 7 to 8 in the actions group across 1 directory by @dependabot[bot] in #291
- Take the safe half of the dependency bumps, and hold numpy for #224 by @wilbowes in #420
- Refuse to install the firmware a device is already running by @wilbowes in #422
- Early Access 2.23.0-ea.1 by @wilbowes in #424
- Drive the whole jack routing, in both directions and at startup by @wilbowes in #425
- Bring up the codec's DAPM routes, and two device fixes behind them by @wilbowes in #426
- Report which userspace the device booted, and stop debloating emOS by @wilbowes in #427
- Move the base OS onto the register message, where its consumer can see it by @wilbowes in #428
- Stop a shell waiter releasing the holder's lock, and fail a transfer fast by @wilbowes in #429
- The controller tells the device what time it is by @wilbowes in #430
- Stop the ambient light sensor flooding the only crash channel we have by @wilbowes in #431
- Don't wait 120s for an Android service that emOS will never have by @wilbowes in #432
- emOS 0.1: an Echo Dot that runs EchoMuse with no Amazon userspace by @wilbowes in #434
- Put a password in front of the emOS USB console: the controller half by @wilbowes in #435
- Provision emOS from TWRP, without ever installing Magisk by @wilbowes in #436
- Early Access 2.23.0-ea.4 by @wilbowes in #437
Full Changelog: v2.14.0...emos-v0.1