Skip to content

Latest commit

 

History

History
85 lines (59 loc) · 2.74 KB

README.md

File metadata and controls

85 lines (59 loc) · 2.74 KB

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 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.