Skip to main content

README.md

# dts-buddy
  Research on a device tree source buddy to help people compile & load DTBOs at runtime in Elixir

  DtsBuddy is meant to provide utilities to handle runtime loading of
  device tree overlays, while reducing the ceremony required by the
  configfs interface.

  ## Requirements

  Nerves systems must be compiled with those options for this to work :

      BR2_PACKAGE_DTC=y
      BR2_PACKAGE_DTC_PROGRAMS=y
      CONFIG_OF_CONFIGFS=y

  ## Usage

  ### Enabling overlays configfs

  The overlays configfs must first be enabled :

      iex> DtsBuddy.enable_overlays()
      :ok

  This has the same effect as running this command (and does behind the scenes) :

      System.cmd("mount" , ["-t", "configfs", "none", "/sys/kernel/config"])

  ### Checking if overlays are enabled

      iex> DtsBuddy.overlays_enabled?()
      true

  ### Compiling a DTS source

  If your source is fully static, you can either call `DtsBuddy.compile/2` or use
  the sigil provided by `DtsBuddy.Sigil`. The source of the following examples was
  provided by Frank Hunleth.

      iex> import DtsBuddy.Sigil
      iex> ~DTS"""
        /dts-v1/;
        /plugin/;

        /* Compile:
            dtc -@ -I dts -O dtb -o gpio_led.dtbo gpio_led.dts
        */

        &{/} {
            gpios_leds {
                compatible = "gpio-leds";
                test_led@36 {
                    label = "test-led-gpio36";
                    gpios = <&pio 1 4 0>; /* GPIO36/PB4 */

                    /* Blink LED at 1 Hz (500 ms on, off) */
                    linux,default-trigger = "pattern";
                    led-pattern = <1 500 1 0 0 500 0 0>;
                };
            };
        };
      """test_led
      {:ok, "/data/test_led.dtbo", "test_led"}


  You should provide both the heredoc contents (inside triple quotes) and modifiers
  (after the heredoc closes, here "test_led"). We use the modifiers as the overlay
  name later.

  Using the sigil is strictly equivalent to calling `DtsBuddy.compile/2`.
  `DtsBuddy` does not immediately load this overlay.

  If your source is not static, you can either manually build it to call `DtsBuddy.compile/2`,
  or use `DtsBuddy.compile_eex/3` to use an EEX template string.

  ### Loading an overlay

  The DtsBuddy.load function is thought to use the compilation result coming from either
  `DtsBuddy.compile/2` or `DtsBuddy.compile_eex/3` directly, that is, a tuple having
  the form `{:ok, dtbo_file, name}`.

  Loading the overlay with the name <name> will create the directory `/sys/kernel/config/device-tree/overlays/<name>`,
  and write the contents of the compiled dtbo file to `/sys/kernel/config/device-tree/overlays/<name>/dtbo`.

  After loading an overlay, calling `DtsBuddy.status/1` with the overlay name should return `:applied`.