Build before installing

Zephyr Dev Environment using Codespaces

Mike Szczys

golioth.io

What if you could build Zephyr apps without any setup?

Mike Szczys

https://chaos.social/@szczys

  • Firmware Engineer at Golioth
  • 15 years of firmware experience
  • Previously: Editor in Chief of Hackaday

Golioth is an IoT Cloud Company

  • We make it easy to connect MCUs to the internet

  • Device Management

    • OTA, fleet settings, RPC, remote logging
  • Data Routing

    • Time-series and stateful data
    • Cloud integrations with numerous cloud platforms and database hosts
    • REST API, Webhook, Websockets

Challenge:

  • Our device SDK functions as a Zephyr module

  • For a potential user to validate Golioth, they need to be able to build Zephyr applications

What if you could build Zephyr apps without any setup?

How we can use Codespaces

  • Free monthly Zephyr training

  • Enable prospective customers to build code samples without waiting

Built on Development Containers

  • Open standard easily added to repo

  • Can be run locally (and easily) via VS Code

Codespaces Demo:

Building a Zephyr app within 90 seconds during free Golioth Zephyr trainning

(Try it yourself: https://github.com/golioth/zephyr-training)

Demo: Big Green 'Code'Button

GitHub repos that have devcontainers have a Codespaces tab

Demo: VS Code in a Browser

You get the VS Code with a complete build environment

Demo: Cloud != USB

Binaries must be downloaded and flashed locally

Dev Containers

Docker + JSON Config

Adding a Dev Container

  • Required: .devcontainer subdirectory
  • Required: devcontainer.json
  • Optional: helper files (we'll get to that)

devcontainer.json

The entirety of what was shown in the demo

Choose Docker image and mounts

  • Debian-based image with bare minimum of Zephyr toolchain
  • Optional:
    • Set a mount point for the parent repository
    • Set default path for the workspace

Call Script to Complete Build

Perform the repo-setup steps

This is a manifest repository, so west update pulls in all dependencies (like the Zephyr tree).

Customize VS Code Itself

Install extensions and configure settings

Solving for binary download

Custom west command used to rename binaries

  • "West Extension" included in this repo
  • west download finds correct binary, renames and timestamps, moves to a Download folder for easy location
  • Local flashing tools used to program device after binary download

Pre-builds

Speed up the creation process

A prebuild means the configuration step is already done.

 

You won't have to wait for west update to clone all repos each time you start a new instance.

Running Dev Containers Locally

VS Code Knows!

VS Code recognizes the devcontainer and prompts:

  • To install the dev container extension
  • To build the container
  • To reopen container on subsequent loads

Devcontainers in VS Code

What to know

  • You must have Docker preinstalled

  • Wait for download and build the first time

  • Containers continue to run after you exit VS Code

Hacking: Can I use west flash?

  • Windows: No

  • Mac: No

  • Linux: Yes*

*if you don't mind running in priviledged mode

USB: devcontainer.json

  • Connect USB to the container
  • Give the container privileges to access the ports

USB: add flashing tools

  • Better option: add these tools to the container image

Adding SEGGER/Nordic tools to container

USB: not ready for Codespaces

What about WebUSB?

  • WebUSB is a promising option, but...
    • Not currently supported in Codespaces
    • Only supported by Chrome Browser

Dev Containers

What are they good for?

  • Online Zephyr training using CodeSpaces

  • Allow protential customers to build sample code

  • Deliver version controlled build environments to target specific sdk-ng toolchains

Thank you!

Try Golioth: golioth.io

References:

  • Try Codespaces: https://github.com/golioth/zephyr-training/
  • Free Zephyr training: https://golioth.io/training-signup
  • Development Containers: https://containers.dev/
  • Codespaces: https://github.com/features/codespaces

 

Mike Szczys

mike@golioth.io

chaos.social/@szczys