{ config, lib, pkgs, ... }: let cfg = config.hardware.raspberry-pi."4"; simple-overlay = { target, status }: { name = "${target}-${status}-overlay"; dtsText = '' /dts-v1/; /plugin/; / { compatible = "brcm,bcm2711"; fragment@0 { target = <&${target}>; __overlay__ { status = "${status}"; }; }; }; ''; }; in { options.hardware.raspberry-pi."4" = { i2c0.enable = lib.mkEnableOption '' Turn on the VideoCore I2C bus (maps to /dev/i2c-22) and enable access from the i2c group. After a reboot, i2c-tools (e.g. i2cdetect -F 22) should work for root or any user in i2c. ''; i2c1.enable = lib.mkEnableOption '' Turn on the ARM I2C bus (/dev/i2c-1 on GPIO pins 3 and 5) and enable access from the i2c group. After a reboot, i2c-tools (e.g. i2cdetect -F 1) should work for root or any user in i2c. ''; }; config.hardware = lib.mkMerge [ (lib.mkIf cfg.i2c0.enable { i2c.enable = lib.mkDefault true; deviceTree = { overlays = [ (simple-overlay { target = "i2c0if"; status = "okay"; }) ]; }; }) (lib.mkIf cfg.i2c1.enable { i2c.enable = lib.mkDefault true; deviceTree = { overlays = [ (simple-overlay { target = "i2c1"; status = "okay"; }) ]; }; }) ]; }