Installing the software on Linux with X11


You will need to unpack the downloaded file in the location you have chosen to hold the executable files. Typically this might be in /usr/local/, or perhaps $HOME/bin/. You would then unpack the files using tar -zxf archivename.tgz, which will create a directory Argyll_VX.X.X, where X.X.X is the version number, and the executables will be in Argyll_VX.X.X/bin You will also have to configure your $PATH environment variable to give access to the executables from your command line environment. The .tgz file also contains several useful reference files (such as scanner chart recognition templates, sample illumination spectrum etc.) in the ref sub-directory, as well as all the current HTML documentation in a doc sub-directory. You may want to copy things to more standard locations such as /usr/local/bin, /usr/local/argyll/bin etc., depending on the conventions used on your system.

Note on the system bell:

When reading strips using the Eye-One Pro instrument, the system bell is used to indicate when the instrument the ready to be used, and to provide feedback on any problems. On some Linux installations the system bell may be disabled. As well as checking the terminal and GUI sound preferences, you may have to enable the used of the PC speaker driver, which can be done by adding the command /sbin/modprobe pcspkr to the /etc/rc.local startup script. You may also have to run xset b 100 1000 200 in your local setup, if you are running in an X11 environment. You can check that the system bell is operating by doing an "echo ^G", where ^G is ctrl-G.

Note on X11 multi-monitor setups:

When working with a multi-monitor X11 configuration, note that you will only be able to individually calibrate monitors if the multi-window extension you are using (if any), supports access to the individual screen Video LUT tables that are used for calibration. The native X11 multi-screen addressing supports this, as does the Xinerama extension, and XRandR V1.2.

The proprietary NVidia TwinView and ATI MergeFB extensions do not currently support access to the individual screen Video LUTs, so calibration of each screen independently is impossible if either of these extensions are running. You can try doing a calibration for the screens that do have accessible Video LUTs with these proprietary extensions, or ignore calibration and rely purely on display profiling. Use the dispwin utility to figure out what works on your system. The NVidia ATI binary drivers do not seem to properly support XRandR V1.2 either, even though they claim to do so. You may have to set the ARGYLL_IGNORE_XRANDR1_2 environment variable if the XRandR V1.2 extension is faulty.

If these limitations trouble you, then as a valuable customer of NVidia or AMD/ATI, perhaps you should contact them and urge them to fix the problems with Video LUT access in their proprietary multi-monitor extensions and XRandR implementation, bringing their support for multi-monitors on X11 up to the same standards as other operating systems. Urge them to add full and correct support for the XRandR V1.2 extension.

Fixing access to Video LUTs:

Some users have noted that their default X11 installation doesn't properly enable access to the video card Video Lookup Tables (RAMDAC). The Video LUTs are used for display calibration purposes, and a warning will be issues by the dispcal and dispread utilities if there is a problem with this.

The problem may be because certain X11 extensions aren't being loaded by default. You may want to check that you have

  Load  "extmod"

in the appropriate (or any) section of your Xorg.conf file, to allow the XF86Video LUT extensions to function correctly.

Setting up instrument access:

By default most Linux based systems make devices inaccessible to user mode programs, so it is necessary to make some modification to the permissions for Color Measurement Instrument devices to allow Argyll utilities to access them. In order from newest to oldest, the following sub-systems may need to be configured to permit this:


  No device configuration needed:

    Mandriva 2008.0 default installation
  PolicyKit + HAL:
    Fedora Core 8
    Mandriva 2008.1

  udev with libusb devices already present:
    OpenSuSE 10.3
    Ubuntu 7.1
    Kubuntu 7.1
    Debian 4.0
  udev without default libusb devices
  hotplug and udev:
   Red Hat 4.0

  Changing /dev permissions manually

No device configuration needed:
Some systems have in place  a security configuration such that anyone logging in at the console of a machine, has that login made the owner of all devices.
USB and Serial access using PolicyKit V0.6 + HAL:
The most recent Linux systems may be using PolicyKit and HAL to set hardware attributes. The following configuration files are known to work with PolicyKit V0.6. You can check which version of PolicyKit you have by running polkit-config-file-validate --version.

The following two configuration files can either be cut and pasted from here, or they are also in the libusb directory of the Argyll distribution.
You may need to check that the  haldaemon and ConsoleKit services are running.
After copying these files into place (as root), the new file should be automatically recognized the next time you plug the instrument in,
or you may need to run polkit-reload-config, restart the haldaemon, or to reboot the system for the changes to come into effect.

You may want to refer to this document for more guidance on writing HAL fdi files.

[Note that the serial port identification currently changes all serial ports. If you know which serial ports on your system get used for color instruments, then you could change the match key to be more specific, such as a serial.physical_device, serial.device or serial.port.

/usr/share/PolicyKit/policy/color-device-file.policy

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
<policyconfig>
  <action id="org.freedesktop.hal.device-access.color">
    <description>Directly access color meter devices</description>
    <message>System policy prevents access to the color meter devices</message>
    <defaults>
      <allow_inactive>no</allow_inactive>
      <allow_active>yes</allow_active>
    </defaults>
  </action>
</policyconfig>

/usr/share/hal/fdi/policy/10osvendor/19-color.fdi  should contain something like:

<?xml version="1.0" encoding="UTF-8"?>
<deviceinfo version="0.2">
  <!-- This file normally lives at "/usr/share/hal/fdi/policy/10osvendor/19-color.fdi" -->
  <!-- Color meter devices known to Argyll CMS
       FDI creation: Nicolas Mailhot <nicolas.mailhot at laposte.net>
       with input from David Zeuthen and Frdric Crozat,
       maintained by Graeme Gill.
    -->
  <device>
    <!-- Serial Connected Color Instruments -->
    <match key="serial.device" exists="true">
      <append key="info.capabilities" type="strlist">access_control</append>
      <merge key="access_control.type" type="string">color</merge>
      <merge key="access_control.file" type="copy_property">linux.device_file</merge>
    </match>
    <!-- HCFR association -->
    <match key="usb_device.vendor_id" int="0x04DB">
      <!-- Display colorimeter -->
      <match key="usb_device.product_id" int="0x005B">
        <append key="info.capabilities" type="strlist">access_control</append>
        <merge key="access_control.type" type="string">color</merge>
        <merge key="access_control.file" type="copy_property">linux.device_file</merge>
      </match>
    </match>
    <!-- MonacoOPTIX -->
    <match key="usb_device.vendor_id" int="0x0670">
      <!-- Eye-One Display 1 - display colorimeter -->
      <match key="usb_device.product_id" int="0x0001">
        <append key="info.capabilities" type="strlist">access_control</append>
        <merge key="access_control.type" type="string">color</merge>
        <merge key="access_control.file" type="copy_property">linux.device_file</merge>
      </match>
    </match>
    <!-- X-Rite -->
    <match key="usb_device.vendor_id" int="0x0765">
      <!-- DTP20 "Pulse" - "swipe" type reflective spectrometer, that can be used un-tethered. -->
      <match key="usb_device.product_id" int="0xd020">
        <append key="info.capabilities" type="strlist">access_control</append>
        <merge key="access_control.type" type="string">color</merge>
        <merge key="access_control.file" type="copy_property">linux.device_file</merge>
      </match>
      <!-- DTP92Q - CRT display colorimeter. (Not tested) -->
      <match key="usb_device.product_id" int="0xd092">
        <append key="info.capabilities" type="strlist">access_control</append>
        <merge key="access_control.type" type="string">color</merge>
        <merge key="access_control.file" type="copy_property">linux.device_file</merge>
      </match>
      <!-- DTP94 "Optix XR" or "Optix XR2" - display colorimeter -->
      <match key="usb_device.product_id" int="0xd094">
        <append key="info.capabilities" type="strlist">access_control</append>
        <merge key="access_control.type" type="string">color</merge>
        <merge key="access_control.file" type="copy_property">linux.device_file</merge>
      </match>
    </match>
    <!-- ColorVision -->
    <match key="usb_device.vendor_id" int="0x085C">
      <!-- Spyder 2 - display colorimeter -->
      <match key="usb_device.product_id" int="0x0200">
        <append key="info.capabilities" type="strlist">access_control</append>
        <merge key="access_control.type" type="string">color</merge>
        <merge key="access_control.file" type="copy_property">linux.device_file</merge>
      </match>
    </match>
    <!-- Gretag-Macbeth -->
    <match key="usb_device.vendor_id" int="0x0971">
      <!-- Eye-One Pro - spot and "swipe" reflective/emissive spectrometer -->
      <match key="usb_device.product_id" int="0x2000">
        <append key="info.capabilities" type="strlist">access_control</append>
        <merge key="access_control.type" type="string">color</merge>
        <merge key="access_control.file" type="copy_property">linux.device_file</merge>
      </match>
      <!-- Eye-One Display - display colorimeter -->
      <match key="usb_device.product_id" int="0x2003">
        <append key="info.capabilities" type="strlist">access_control</append>
        <merge key="access_control.type" type="string">color</merge>
        <merge key="access_control.file" type="copy_property">linux.device_file</merge>
      </match>
      <!-- Huey - display colorimeter -->
      <match key="usb_device.product_id" int="0x2005">
        <append key="info.capabilities" type="strlist">access_control</append>
        <merge key="access_control.type" type="string">color</merge>
        <merge key="access_control.file" type="copy_property">linux.device_file</merge>
      </match>
    </match>
  </device>
</deviceinfo>


USB and serial instruments using udev, where udev already creates /dev/bus/usb/00X/00X devices
Some systems appear to be setup with default udev rules (e.g. in /etc/udev/rules.d/20-names-rules or /etc/udev/rules.d/50-udev-default.rules) that automatically create the necessary /dev/bus/usb/00X/00Y device entries for libusb devices, but with permissions 644 meaning that Argyll utilities will be unable to open the devices for writing. To solve this a rule file needs to be added that modifies the group or permission of any Color Measurement Instruments.

You can check if your udev rules already create the correct device entry by plugging a USB instrument in, and running /sbin/lsusb to identify the bus and device number of the instrument, and then doing an ls /dev/bus/usb/00X/00Y (where you replace the X with the Y with the appropriate bus and device numbers) to check if the device exists. You could also check by doing a grep bus/usb *.rules in the /etc/udev/rules.d/ directory to locate the rules file that actually does this. If your system does not automatically create the libusb devices, skip to the next udev configuration section.

[The following procedure simply changes the permissions on all the color instrument devices and serial ports that might be used for color instruments to world writable. A more sophisticated approach would be to create or use a group for this, assign the instruments to this group using  GROUP="argyllgroup" rather than MODE="666", and making appropriate users members of this group.]

You may want to refer to this document for more guidance on writing udev rules

Copy the file libusb/55-Argyll.rules from the binary or source distribution into /etc/udev/rules.d/55-Argyll.rules with owner root, group root, permissions 644. The file starts with 55 to ensure that it is acted upon after the rule that creates the /dev/bus/usb/00X/00Y device entry.

You may need to run /sbin/udevtrigger/sbin/udevcontrol reload_rules or  /sbin/udevstart to get the new file noticed.

  ----------------- cut here ---------------------
# udev rule to recognize instruments and make them accessible to user applications.
# Copy to /etc/udev/rules.d/55-Argyll.rules

#Enable serial port connected instruments connected on first two ports.
KERNEL=="ttyS[01]", MODE="666"

#Enable serial port connected instruments on USB serial converted connected on first two ports.
KERNEL=="ttyUSB[01]", MODE="666"

# DTP20
SYSFS{idVendor}=="0765", SYSFS{idProduct}=="d020", MODE="666"

# DTP92Q (not testedt)
SYSFS{idVendor}=="0765", SYSFS{idProduct}=="d092", MODE="666"

# DTP94
SYSFS{idVendor}=="0765", SYSFS{idProduct}=="d094", MODE="666"

# MonacoOPTIX (Same as i1 Display 1)
SYSFS{idVendor}=="0670", SYSFS{idProduct}=="0001", MODE="666"

# i1Display
SYSFS{idVendor}=="0971", SYSFS{idProduct}=="2003", MODE="666"

# i1Pro
SYSFS{idVendor}=="0971", SYSFS{idProduct}=="2000", MODE="666"

# Colorimtre HCFR
SYSFS{idVendor}=="04db", SYSFS{idProduct}=="005b", MODE="666"

# Spyder 2
SYSFS{idVendor}=="085c", SYSFS{idProduct}=="0200", MODE="666"

# Huey
SYSFS{idVendor}=="0971", SYSFS{idProduct}=="2005", MODE="666"
    ----------------- cut here ---------------------
USB using udev, where there are NOT /dev/bus/usb/00X/00X devices.
If your system doesn't have a default rule for creating the necessary /dev/bus/usb/00X/00X device entries for libusb devices, then you need to add a rule to do so, as well as making the devices available to Argyll.

[The following procedure simply changes the permissions on all the color instrument devices and serial ports that might be used for color instruments to world writable. A more sophisticated approach would be to create, or use a group for this, assign the instruments to this group using  GROUP="argyllgroup" rather than MODE="666", and making appropriate users members of this group.]

You may want to refer to this document for more guidance on writing udev rules

 Copy the file libusb/45-Argyll.rules from the binary or source distribution into /etc/udev/rules.d/45-Argyll.rules with owner root, group root, permissions 644.

You may need to run /sbin/udevtrigger/sbin/udevcontrol reload_rules or  /sbin/udevstart to get the new file noticed.

  ----------------- cut here ---------------------
# udev rule to change permissions so that the USB instruments can be accessed by argyll
# Copy to /etc/udev/rules.d/45-Argyll.rules
# MODE="660", GROUP="argyll" would be better here.

# Enable serial port connected instruments connected on first two ports.
KERNEL=="ttyS[01]", MODE="666"

# Enable serial port connected instruments on USB serial converted connected on first two ports.
KERNEL=="ttyUSB[01]", MODE="666"

# DTP20
SYSFS{idVendor}=="0765", SYSFS{idProduct}=="d020", PROGRAM="/bin/sh -c 'K=%k; K=$${K#usbdev}; printf bus/usb/%%03i/%%03i $${K%%%%.*} $${K#*.}'", NAME="%c",  MODE="666"

# DTP92Q - not tested
SYSFS{idVendor}=="0765", SYSFS{idProduct}=="d092", PROGRAM="/bin/sh -c 'K=%k; K=$${K#usbdev}; printf bus/usb/%%03i/%%03i $${K%%%%.*} $${K#*.}'", NAME="%c",  MODE="666"

# DTP94
SYSFS{idVendor}=="0765", SYSFS{idProduct}=="d094", PROGRAM="/bin/sh -c 'K=%k; K=$${K#usbdev}; printf bus/usb/%%03i/%%03i $${K%%%%.*} $${K#*.}'", NAME="%c",  MODE="666"

# MonacoOPTIX (Same as i1 Display 1)
SYSFS{idVendor}=="0670", SYSFS{idProduct}=="0001", PROGRAM="/bin/sh -c 'K=%k; K=$${K#usbdev}; printf bus/usb/%%03i/%%03i $${K%%%%.*} $${K#*.}'", NAME="%c",  MODE="666"

# i1Display
SYSFS{idVendor}=="0971", SYSFS{idProduct}=="2003", PROGRAM="/bin/sh -c 'K=%k; K=$${K#usbdev}; printf bus/usb/%%03i/%%03i $${K%%%%.*} $${K#*.}'", NAME="%c",  MODE="666"

# i1Pro
SYSFS{idVendor}=="0971", SYSFS{idProduct}=="2000", PROGRAM="/bin/sh -c 'K=%k; K=$${K#usbdev}; printf bus/usb/%%03i/%%03i $${K%%%%.*} $${K#*.}'", NAME="%c",  MODE="666"

# Colorimtre HCFR
SYSFS{idVendor}=="04db", SYSFS{idProduct}=="005b", PROGRAM="/bin/sh -c 'K=%k; K=$${K#usbdev}; printf bus/usb/%%03i/%%03i $${K%%%%.*} $${K#*.}'", NAME="%c",  MODE="666"

# Spyder 2
SYSFS{idVendor}=="085c", SYSFS{idProduct}=="0200", PROGRAM="/bin/sh -c 'K=%k; K=$${K#usbdev}; printf bus/usb/%%03i/%%03i $${K%%%%.*} $${K#*.}'", NAME="%c",  MODE="666"

# Huey
SYSFS{idVendor}=="0971", SYSFS{idProduct}=="2005", PROGRAM="/bin/sh -c 'K=%k; K=$${K#usbdev}; printf bus/usb/%%03i/%%03i $${K%%%%.*} $${K#*.}'", NAME="%c",  MODE="666"
    ----------------- cut here ---------------------

Note that the "SYSFS==.." lines are one long line. You may need to run /sbin/udevtrigger/sbin/udevcontrol reload_rules or  /sbin/udevstart to get the new file noticed.
USB using hotplug and Serial using udev
Under older versions of Linux, you should look into the hotplug system configuration for USB devices. You know you are running this because the /etc/hotplug directory exists on your system.

[The following procedure simply changes the permissions on all the color instrument devices and serial ports that might be used for color instruments to world writable. A more sophisticated approach would be to create, or use a group for this, assign the instruments to this group using  chgrp argyllgroup "${DEVICE}" and chmod 664 "${DEVICE}"  rather than chmod 666 "${DEVICE}", and making appropriate users members of this group.]

Assuming we want to configure for all Argyll supported USB instruments, copy the file libusb/Argyll.usermap from the binary or source distribution into  /etc/hotplug/usb/Argyll.usermap with owner root, group root, permissions 644.

    ----------------- cut here ---------------------
# Detect instruments by their USB VID and PID
# DTP20
Argyll 0x0003 0x0765 0xd020 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
#
# DTP92Q - not tested
Argyll 0x0003 0x0765 0xd092 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
#
# DTP94
Argyll 0x0003 0x0765 0xd094 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
#
# MonacoOPTIX (Same as i1 Display 1)
Argyll 0x0003 0x0670 0x0001 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
#
# i1 Display
Argyll 0x0003 0x0971 0x2003 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
#
# i1 Pro
Argyll 0x0003 0x0971 0x2000 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
#
# Colorimtre HCFR
Argyll 0x0003 0x04DB 0x005B 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
#
# Spyder 2
Argyll 0x0003 0x085C 0x0200 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
#
# Huey
Argyll 0x0003 0x0971 0x2005 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
    ----------------- cut here ---------------------

 (For even older versions, append the lines above to /etc/hotplug/usb.usermap, and you may have to run update-usb.usermap)

Then copy the file libusb/Argyll from the binary or source distribution into /etc/hotplug/usb/Argyll with owner root, group root, permissions 744.

    ----------------- cut here ---------------------
    #!/bin/sh
    # Simply enable permissions.
    if [ "${ACTION}" = "add" ] && [ -f "${DEVICE}" ]
    then
        # Should have a "pci" group, or "argyll" group, but do it crudely for now,
        # by making it world readable.
        # chgrp argyllgroup "${DEVICE}"
        # chmod 664 "${DEVICE}"
        chmod 666 "${DEVICE}"
    fi
    ----------------- cut here ---------------------
Serial instruments using udev:
On older Linux systems using hotplug and udev, the serial ports are being created by the udev system, so modifying the udev permissions is one way of making the serial ports accessible to Argyll.

Copy the file libusb/10-Argyll.permissions from the binary or source distribution into  /etc/udev/permissions.d/10-Argyll.permissions with owner root, group root, permissions 644. You may need to run  /sbin/udevstart to get the new file noticed.


    ----------------- cut here ---------------------
    # Config file for serial ports using hotplug & udev
    # Change "ttyS0" to whatever ttySx or ttyUSBx your instruments will be on.
    # This file goes at /etc/udev/permissions.d/10-Argyll.permissions
    # Should have an "argyll" group, but do it crudely for now,
    ttyS0:root:uucp:0666
    ttyUSB0:root:uucp:0666
    ----------------- cut here ---------------------

We are assuming that ttyS0 is where you are going to connect your instruments. This might be another port (for instance ttyS1) if there were a serial mouse occupying ttyS0, or some other serial device such as a modem.

If you are using a USB to serial converted that is supported by your Linux distribution, then you will need to add or modify a line setting the permissions for its devices, such as ttyUSB0.
Changing /dev permissions manually:
On very old systems, the serial ports will be being created at startup, or statically. One way of changing the permissions is to do this manually:

(as root:)  chmod 666 /dev/ttyS0

but you may find that this has to be done on every system start. A way this can be automated is to add the chmod command to the /etc/rc.serial file (you may have to create this file if it doesn't exist. Check the /etc/rc.sysinit script, to make sure that the rc.serial file is being invoked.)

We are assuming that ttyS0 is where you are going to connect your instruments. This might be another port (for instance /dev/ttyS1) if there were a serial mouse occupying /dev/ttyS0, or some other serial device such as a modem.