From 91df1f208c71c60dfaa457f2faf0ad4d2836b2ce Mon Sep 17 00:00:00 2001 From: Mel Date: Sun, 27 Apr 2025 17:21:04 +0200 Subject: Add device tree overlay for ADS7846 touchscreen Signed-off-by: Mel --- machines/fourmi/devices.nix | 1 + modules/hardware/ads7846.nix | 104 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 modules/hardware/ads7846.nix diff --git a/machines/fourmi/devices.nix b/machines/fourmi/devices.nix index de872a7..82342af 100644 --- a/machines/fourmi/devices.nix +++ b/machines/fourmi/devices.nix @@ -9,6 +9,7 @@ # correctly configure hardware in this pi server. imports = [ nixos-hardware.nixosModules.raspberry-pi-4 + ../../modules/hardware/ads7846.nix ]; # boot settings diff --git a/modules/hardware/ads7846.nix b/modules/hardware/ads7846.nix new file mode 100644 index 0000000..cf1131e --- /dev/null +++ b/modules/hardware/ads7846.nix @@ -0,0 +1,104 @@ +{ ... }: + +{ + hardware.deviceTree = { + overlays = [ + { + name = "ads7846-overlay"; + # taken from raspberry-pi kernel tree: + # https://github.com/raspberrypi/linux/blob/rpi-6.6.y/arch/arm/boot/dts/overlays/ads7846-overlay.dts + dtsText = '' + /* + * Generic Device Tree overlay for the ADS7846 touch controller + * + */ + + /dts-v1/; + /plugin/; + + / { + compatible = "brcm,bcm2835"; + + fragment@0 { + target = <&spi0>; + __overlay__ { + status = "okay"; + }; + }; + + fragment@1 { + target = <&spidev0>; + __overlay__ { + status = "disabled"; + }; + }; + + fragment@2 { + target = <&spidev1>; + __overlay__ { + status = "disabled"; + }; + }; + + fragment@3 { + target = <&gpio>; + __overlay__ { + ads7846_pins: ads7846_pins { + brcm,pins = <255>; /* illegal default value */ + brcm,function = <0>; /* in */ + brcm,pull = <0>; /* none */ + }; + }; + }; + + fragment@4 { + target = <&spi0>; + __overlay__ { + /* needed to avoid dtc warning */ + #address-cells = <1>; + #size-cells = <0>; + + ads7846: ads7846@1 { + compatible = "ti,ads7846"; + reg = <1>; + pinctrl-names = "default"; + pinctrl-0 = <&ads7846_pins>; + + spi-max-frequency = <2000000>; + interrupts = <255 2>; /* high-to-low edge triggered */ + interrupt-parent = <&gpio>; + pendown-gpio = <&gpio 255 1>; + + /* driver defaults */ + ti,x-min = /bits/ 16 <0>; + ti,y-min = /bits/ 16 <0>; + ti,x-max = /bits/ 16 <0x0FFF>; + ti,y-max = /bits/ 16 <0x0FFF>; + ti,pressure-min = /bits/ 16 <0>; + ti,pressure-max = /bits/ 16 <0xFFFF>; + ti,x-plate-ohms = /bits/ 16 <400>; + }; + }; + }; + __overrides__ { + cs = <&ads7846>,"reg:0"; + speed = <&ads7846>,"spi-max-frequency:0"; + penirq = <&ads7846_pins>,"brcm,pins:0", /* REQUIRED */ + <&ads7846>,"interrupts:0", + <&ads7846>,"pendown-gpio:4"; + penirq_pull = <&ads7846_pins>,"brcm,pull:0"; + swapxy = <&ads7846>,"ti,swap-xy?"; + xmin = <&ads7846>,"ti,x-min;0"; + ymin = <&ads7846>,"ti,y-min;0"; + xmax = <&ads7846>,"ti,x-max;0"; + ymax = <&ads7846>,"ti,y-max;0"; + pmin = <&ads7846>,"ti,pressure-min;0"; + pmax = <&ads7846>,"ti,pressure-max;0"; + xohms = <&ads7846>,"ti,x-plate-ohms;0"; + }; + }; + ''; + } + ]; + }; +} -- cgit 1.4.1