Merge pull request #41737 from jraygauthier/jrg/uvcvideo_dynctrl_rebased
nixos/uvcvideo.dynctrl: Init
This commit is contained in:
		
						commit
						53a75e3a2a
					
				
							
								
								
									
										64
									
								
								nixos/modules/hardware/video/uvcvideo/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								nixos/modules/hardware/video/uvcvideo/default.nix
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,64 @@
 | 
			
		||||
 | 
			
		||||
{ config, lib, pkgs, ... }:
 | 
			
		||||
 | 
			
		||||
with lib;
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
 | 
			
		||||
  cfg = config.services.uvcvideo;
 | 
			
		||||
 | 
			
		||||
  uvcdynctrl-udev-rules = packages: pkgs.callPackage ./uvcdynctrl-udev-rules.nix {
 | 
			
		||||
    drivers = packages;
 | 
			
		||||
    udevDebug = false;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
in
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  options = {
 | 
			
		||||
    services.uvcvideo.dynctrl = {
 | 
			
		||||
 | 
			
		||||
      enable = mkOption {
 | 
			
		||||
        type = types.bool;
 | 
			
		||||
        default = false;
 | 
			
		||||
        description = ''
 | 
			
		||||
          Whether to enable <command>uvcvideo</command> dynamic controls.
 | 
			
		||||
 | 
			
		||||
          Note that enabling this brings the <command>uvcdynctrl</command> tool
 | 
			
		||||
          into your environement and register all dynamic controls from
 | 
			
		||||
          specified <command>packages</command> to the <command>uvcvideo</command> driver.
 | 
			
		||||
        '';
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      packages = mkOption {
 | 
			
		||||
        type = types.listOf types.path;
 | 
			
		||||
        example = literalExample "[ pkgs.tiscamera ]";
 | 
			
		||||
        description = ''
 | 
			
		||||
          List of packages containing <command>uvcvideo</command> dynamic controls
 | 
			
		||||
          rules. All files found in
 | 
			
		||||
          <filename><replaceable>pkg</replaceable>/share/uvcdynctrl/data</filename>
 | 
			
		||||
          will be included.
 | 
			
		||||
 | 
			
		||||
          Note that these will serve as input to the <command>libwebcam</command>
 | 
			
		||||
          package which through its own <command>udev</command> rule will register
 | 
			
		||||
          the dynamic controls from specified packages to the <command>uvcvideo</command>
 | 
			
		||||
          driver.
 | 
			
		||||
        '';
 | 
			
		||||
        apply = map getBin;
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  config = mkIf cfg.dynctrl.enable {
 | 
			
		||||
 | 
			
		||||
    services.udev.packages = [
 | 
			
		||||
      (uvcdynctrl-udev-rules cfg.dynctrl.packages)
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    environment.systemPackages = [
 | 
			
		||||
      pkgs.libwebcam
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,46 @@
 | 
			
		||||
{ lib
 | 
			
		||||
, stdenv
 | 
			
		||||
, buildEnv
 | 
			
		||||
, libwebcam
 | 
			
		||||
, makeWrapper
 | 
			
		||||
, runCommand
 | 
			
		||||
, drivers ? []
 | 
			
		||||
, udevDebug ? false
 | 
			
		||||
}:
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
  version = "0.0.0";
 | 
			
		||||
 | 
			
		||||
  dataPath = buildEnv {
 | 
			
		||||
    name = "uvcdynctrl-with-drivers-data-path";
 | 
			
		||||
    paths = drivers ++ [ libwebcam ];
 | 
			
		||||
    pathsToLink = [ "/share/uvcdynctrl/data" ];
 | 
			
		||||
    ignoreCollisions = false;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  dataDir = "${dataPath}/share/uvcdynctrl/data";
 | 
			
		||||
  udevDebugVarValue = if udevDebug then "1" else "0";
 | 
			
		||||
in
 | 
			
		||||
 | 
			
		||||
runCommand "uvcdynctrl-udev-rules-${version}"
 | 
			
		||||
{
 | 
			
		||||
  inherit dataPath;
 | 
			
		||||
  buildInputs = [
 | 
			
		||||
    makeWrapper
 | 
			
		||||
    libwebcam
 | 
			
		||||
  ];
 | 
			
		||||
  dontPatchELF = true;
 | 
			
		||||
  dontStrip = true;
 | 
			
		||||
}
 | 
			
		||||
''
 | 
			
		||||
  mkdir -p "$out/lib/udev"
 | 
			
		||||
  makeWrapper "${libwebcam}/lib/udev/uvcdynctrl" "$out/lib/udev/uvcdynctrl" \
 | 
			
		||||
    --set NIX_UVCDYNCTRL_DATA_DIR "${dataDir}" \
 | 
			
		||||
    --set NIX_UVCDYNCTRL_UDEV_DEBUG "${udevDebugVarValue}"
 | 
			
		||||
 | 
			
		||||
  mkdir -p "$out/lib/udev/rules.d"
 | 
			
		||||
  cat "${libwebcam}/lib/udev/rules.d/80-uvcdynctrl.rules" | \
 | 
			
		||||
    sed -r "s#RUN\+\=\"([^\"]+)\"#RUN\+\=\"$out/lib/udev/uvcdynctrl\"#g" > \
 | 
			
		||||
    "$out/lib/udev/rules.d/80-uvcdynctrl.rules"
 | 
			
		||||
''
 | 
			
		||||
 | 
			
		||||
@ -50,6 +50,7 @@
 | 
			
		||||
  ./hardware/video/bumblebee.nix
 | 
			
		||||
  ./hardware/video/displaylink.nix
 | 
			
		||||
  ./hardware/video/nvidia.nix
 | 
			
		||||
  ./hardware/video/uvcvideo/default.nix
 | 
			
		||||
  ./hardware/video/webcam/facetimehd.nix
 | 
			
		||||
  ./i18n/input-method/default.nix
 | 
			
		||||
  ./i18n/input-method/fcitx.nix
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user