Hardware/Razer: Difference between revisions

Axka (talk | contribs)
Make code blocks use File template
Revert code blocks to syntax highlighting
 
Line 5: Line 5:
OpenRazer is an open-source project to support Razer peripherals, including those found in their laptops. To enable the OpenRazer you need to add the following to your system configuration:
OpenRazer is an open-source project to support Razer peripherals, including those found in their laptops. To enable the OpenRazer you need to add the following to your system configuration:


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
<syntaxHighlight lang=nix>
hardware.openrazer.enable = true;
  hardware.openrazer.enable = true;
environment.systemPackages = with pkgs; [
  environment.systemPackages = with pkgs; [
  openrazer-daemon
    openrazer-daemon
];
  ];
</nowiki>}}
</syntaxHighlight>


To run the <code>openrazer-daemon</code>, you need to be in the <code>openrazer</code> group.
To run the <code>openrazer-daemon</code>, you need to be in the <code>openrazer</code> group.


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
<syntaxHighlight lang=nix>
users.users.<username>.extraGroups = [ "openrazer" ];
users.users.<username>.extraGroups = [ "openrazer" ];
</nowiki>}}
</syntaxHighlight>


To enable a front-end to control the peripherals, add the following to your system configuration:
To enable a front-end to control the peripherals, add the following to your system configuration:


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
<syntaxHighlight lang=nix>
environment.systemPackages = with pkgs; [
  environment.systemPackages = with pkgs; [
  polychromatic
    polychromatic
];
  ];
</nowiki>}}
</syntaxHighlight>


== Razer Blade 15 Advanced (Early 2020 model) ==
== Razer Blade 15 Advanced (Early 2020 model) ==
Line 32: Line 32:
Upon closing the lid to the laptop and reopening, an issue occurs where the device will intermittently go back into hybernate mode after around 10-30 seconds. Setting the kernel parameter <code>button.lid_init_state=open</code> fixes this issue. The following is an example configuration (working in NixOS 22.05):
Upon closing the lid to the laptop and reopening, an issue occurs where the device will intermittently go back into hybernate mode after around 10-30 seconds. Setting the kernel parameter <code>button.lid_init_state=open</code> fixes this issue. The following is an example configuration (working in NixOS 22.05):


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
<syntaxHighlight lang=nix>
boot.kernelParams = [ "button.lid_init_state=open" ];
boot.kernelParams = [ "button.lid_init_state=open" ];
</nowiki>}}
</syntaxHighlight>


=== Getting the Nvidia card to work properly with external displays ===
=== Getting the Nvidia card to work properly with external displays ===
Line 42: Line 42:
After setting the GPU MODE to "Dedicated GPU only" in the BIOS, enabling [[NVIDIA#Sync mode]] is necessary in order for both the laptop's display and external display/ports to work properly. Here is an example configuration snippet for NixOS 22.05:
After setting the GPU MODE to "Dedicated GPU only" in the BIOS, enabling [[NVIDIA#Sync mode]] is necessary in order for both the laptop's display and external display/ports to work properly. Here is an example configuration snippet for NixOS 22.05:


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
<syntaxHighlight lang=nix>
services.xserver.videoDrivers = [ "nvidia" ];
  services.xserver.videoDrivers = [ "nvidia" ];
hardware.opengl.enable = true;
  hardware.opengl.enable = true;


hardware.nvidia = {
  hardware.nvidia = {
  package = config.boot.kernelPackages.nvidiaPackages.beta;
    package = config.boot.kernelPackages.nvidiaPackages.beta;
  powerManagement.enable = true;
    powerManagement.enable = true;
  modesetting.enable = true;
    modesetting.enable = true;
  prime = {
    prime = {
    sync.enable = true;
      sync.enable = true;
    nvidiaBusId = "PCI:1:0:0";
      nvidiaBusId = "PCI:1:0:0";
    intelBusId = "PCI:0:2:0";
      intelBusId = "PCI:0:2:0";
    };
   };
   };
};
</syntaxHighlight>
</nowiki>}}




Line 73: Line 73:


Add the below to your system configuration:
Add the below to your system configuration:
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
<syntaxHighlight lang=nix>
nixpkgs.config = {
  nixpkgs.config = {
  allowUnfree = true;
    allowUnfree = true;


  packageOverrides = pkgs: {
    packageOverrides = pkgs: {
    stable = import <nixos-stable> { config = config.nixpkgs.config; };
      stable = import <nixos-stable> { config = config.nixpkgs.config; };
    unstable = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-unstable.tar.gz") { config = config.nixpkgs.config; };
      unstable = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-unstable.tar.gz") { config = config.nixpkgs.config; };
    };
   };
   };
};


# updates the whole kernel to unstable so you have the correct drivers.
  # updates the whole kernel to unstable so you have the correct drivers.
boot.kernelPackages = pkgs.unstable.linuxPackages;
  boot.kernelPackages = pkgs.unstable.linuxPackages;


# overrides the openrazer-daemon that the harware.openrazer.enable starts
  # overrides the openrazer-daemon that the harware.openrazer.enable starts
nixpkgs.overlays = [
  nixpkgs.overlays = [
  (final: prev: {
    (final: prev: {
    openrazer-daemon = pkgs.unstable.openrazer-daemon;
      openrazer-daemon = pkgs.unstable.openrazer-daemon;
  })
    })
];
  ];


environment.systemPackages = with pkgs; [
  environment.systemPackages = with pkgs; [
  unstable.polychromatic
    unstable.polychromatic
# alternatively
  # alternatively
# unstable.razergenie
  # unstable.razergenie
];
  ];
</nowiki>}}
</syntaxHighlight>


== USB disable Issues ==
== USB disable Issues ==
If you are encountering issues that your Razer keyboard does light up on boot shortly and then can not be found by the open-razer-daemon until you unplug your USB cable and re-plug it. Then you might want to reset your USB on startup so that after login the daemon finds it again.
If you are encountering issues that your Razer keyboard does light up on boot shortly and then can not be found by the open-razer-daemon until you unplug your USB cable and re-plug it. Then you might want to reset your USB on startup so that after login the daemon finds it again.


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
<syntaxHighlight lang=nix>
# Razer usb reset. Since it disables somehow on boot.
# Razer usb reset. Since it disables somehow on boot.
systemd.services."usb-reset" = {
systemd.services."usb-reset" = {
Line 122: Line 122:
   wantedBy = [ "graphical.target" ];
   wantedBy = [ "graphical.target" ];
};
};
</nowiki>}}
</syntaxHighlight>


The text <code>7-3</code> is composed of the bus number (7) and the port (device?) number (3).
The text <code>7-3</code> is composed of the bus number (7) and the port (device?) number (3).
Line 130: Line 131:
If that does not work, you can reset all USB controllers instead <ref>https://unix.stackexchange.com/questions/704341/how-to-reset-usb-controllers</ref>:
If that does not work, you can reset all USB controllers instead <ref>https://unix.stackexchange.com/questions/704341/how-to-reset-usb-controllers</ref>:


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
<syntaxHighlight lang=nix>
# Razer usb reset. Since it disables somehow on boot.
  # Razer usb reset. Since it disables somehow on boot.
systemd.services."usb-reset" = {
  systemd.services."usb-reset" = {
  enable = true;
    enable = true;


  description = "Resets usb port for my Razer Keyboard";
    description = "Resets usb port for my Razer Keyboard";
  after = ["multi-user.target"];
    after = ["multi-user.target"];
  serviceConfig = {
    serviceConfig = {
      User = "root";
        User = "root";
      Type = "simple";
        Type = "simple";
      ExecStart = pkgs.writeShellScript "unit-restart-usb-controller" ''
        ExecStart = pkgs.writeShellScript "unit-restart-usb-controller" ''
        #!/usr/bin/env bash
          #!/usr/bin/env bash
        # Resets all USB host controllers of the system.
          # Resets all USB host controllers of the system.
        # This is useful in case one stopped working
          # This is useful in case one stopped working
        # due to a faulty device having been connected to it.
          # due to a faulty device having been connected to it.


        base="/sys/bus/pci/drivers"
          base="/sys/bus/pci/drivers"
        sleep_secs="1"
          sleep_secs="1"


        # This might find a sub-set of these:
          # This might find a sub-set of these:
        # * 'ohci_hcd' - USB 3.0
          # * 'ohci_hcd' - USB 3.0
        # * 'ehci-pci' - USB 2.0
          # * 'ehci-pci' - USB 2.0
        # * 'xhci_hcd' - USB 3.0
          # * 'xhci_hcd' - USB 3.0
        echo "Looking for USB standards ..."
          echo "Looking for USB standards ..."
        for usb_std in "$base/"?hci[-_]?c*
          for usb_std in "$base/"?hci[-_]?c*
        do
          do
            echo "* USB standard '$usb_std' ..."
              echo "* USB standard '$usb_std' ..."
            for dev_path in "$usb_std/"*:*
              for dev_path in "$usb_std/"*:*
            do
              do
                dev="$(basename "$dev_path")"
                  dev="$(basename "$dev_path")"
                echo "  - Resetting device '$dev' ..."
                  echo "  - Resetting device '$dev' ..."
                printf '%s' "$dev" | tee "$usb_std/unbind" > /dev/null
                  printf '%s' "$dev" | tee "$usb_std/unbind" > /dev/null
                sleep "$sleep_secs"
                  sleep "$sleep_secs"
                printf '%s' "$dev" | tee "$usb_std/bind" > /dev/null
                  printf '%s' "$dev" | tee "$usb_std/bind" > /dev/null
                echo "    done."
                  echo "    done."
            done
              done
            echo "  done."
              echo "  done."
        done
          done
        echo "done."
          echo "done."
      '';
        '';
      KillMode = "process";
        KillMode = "process";
      Restart = "on-failure";
        Restart = "on-failure";
    };
    wantedBy = [ "graphical.target" ];
   };
   };
  wantedBy = [ "graphical.target" ];
</syntaxHighlight>
};
</nowiki>}}


== References ==
== References ==