/ginko

A device-tree source parser, analyzer and language server.

Primary LanguageRustMIT LicenseMIT

Ginko

A device-tree source parser, analyzer and language server. The main goal of this project is to make working with device-trees easy. For example, for the following device-tree:

/dts-v1/;

/ {
    pic@10000000 {
        phandle = <1>;
        interrupt-controller;
        reg = <0x10000000 0x100>;
    }
};

dtc produces the following output:

Error: test.dts:9.1-2 syntax error
FATAL ERROR: Unable to parse input tree

whereas ginko produces the following output:

 --> test.dts:8:6
  |
8 |     }
  |      ^ Expected ';'

At the moment, the command-line tool ginko only checks the device-tree source. It curently does not generate device-tree binary files nor can it output reformatted device-tree source files.

Projects

ginko

Installation and Usage

To install ginko with the rust toolchain, simply call

cargo install ginko

Additionally, pre-built binaries exist for x86 Linux and x86 Windows. Simply downloading them and adding the executables to a directory that is on the path should suffice to run the tool. Pre-built binaries also exist for macOS running on Apple Silicon, however these are not signed and notarized with apple so installation is more tedious. See this for more information.

Run

ginko <path/to/file.dts>

to run ginko on a device-tree source file and check the contents.

Goals:

  • A complete device-tree source parser.
  • Error tolerant parsing for device-tree usage
  • Providing readable and helpful feedback to the user

Shortcomings

This project is in its infancy. Therefore, a couple of features aren't supported yet:

  • C-style includes (i.e., #include "some_header.h")
  • Expressions (parenthesized expressions are ignored and do not throw an error)
  • Binary Device Tree format
  • Stable API

ginko_ls

ginko_ls is meant to be a feature-complete language server for device-trees. Language servers can be used in many editors, such as Visual Studio Code, Emacs or Vim

Features

  • Outline
  • Go to definition (nodes)
  • hover

Planned features

  • Incremental analysis
  • completion
  • formatting

Editor Configuration

Neovim

Either install the ginko_ls manually, or you can install with :Mason.

Configure the server with nvim-lspconfig with the configuration name ginko_ls.

In order to configure it, simply add the following to your init.lua

lspconfig = require('lspconfig')
lspconfig['ginko_ls'].setup({
  on_attach = on_attach,
  capabilities = capabilities
})

This assumes you have on_attach and capabilities defined, see the nvim-lspconfig docs for more information.

VSCode

Use Ginko VSCode

Helix

If you want to use the Helix Editor, you can modify the devicetree language definition in languages.toml. An example is below.

[[language]]
name = "devicetree"
language-servers = ["ginko_ls"]

[language-server.ginko_ls]
command = "ginko_ls"
config = { provideFormatter = false }

All contributions, whether in the form of Pull Requests or Issues are highly appreciated and welcome.