# SPDX-FileCopyrightText: 2023 Frank Hunleth # # SPDX-License-Identifier: Apache-2.0 defmodule Circuits.SPI.SPIDev do @moduledoc """ Circuits.SPI backend for the Linux spidev interface This backend works on Nerves, embedded Linux, and desktop Linux. """ @behaviour Circuits.SPI.Backend alias Circuits.SPI.Backend alias Circuits.SPI.Bus alias Circuits.SPI.Nif defstruct [:ref] @doc """ Return the SPI bus names on this system No supported options """ case System.get_env("CIRCUITS_SPI_SPIDEV") do "test" -> @impl Backend def bus_names(_options), do: ["spidev0.0"] "normal" -> @impl Backend def bus_names(_options) do Path.wildcard("/dev/spidev*") |> Enum.map(fn p -> String.replace_prefix(p, "/dev/", "") end) end _ -> @impl Backend def bus_names(_options) do [] end end @doc """ Open an SPI bus """ @impl Backend def open(bus_name, options) do mode = Keyword.get(options, :mode, 0) bits_per_word = Keyword.get(options, :bits_per_word, 8) speed_hz = Keyword.get(options, :speed_hz, 1_000_000) delay_us = Keyword.get(options, :delay_us, 10) lsb_first = Keyword.get(options, :lsb_first, false) with {:ok, ref} <- Nif.open(to_string(bus_name), mode, bits_per_word, speed_hz, delay_us, lsb_first) do {:ok, %__MODULE__{ref: ref}} end end @doc """ Return information about this backend """ @impl Backend def info() do Nif.info() |> Map.put(:backend, __MODULE__) end defimpl Bus do @impl Bus def config(%Circuits.SPI.SPIDev{ref: ref}) do Nif.config(ref) end @impl Bus def transfer(%Circuits.SPI.SPIDev{ref: ref}, data) do Nif.transfer(ref, data) end @impl Bus def close(%Circuits.SPI.SPIDev{ref: ref}) do Nif.close(ref) end @impl Bus def max_transfer_size(%Circuits.SPI.SPIDev{}) do Nif.max_transfer_size() end end end