Nikon Coolscan IV ED

Nikon Coolscan IV ED.

  • Model: LS-40 ED
  • 35 mm film, positive or negative, color and monochrome
  • optical resolution: max 2900 pixels per inch
  • scan range
  • in MA-20: 2870 x 4203 pixels
  • in FH-3 : 2870 x 4203 pixels
  • in SA-21: 2870 x 4332 pixels
  • effective aperture
  • in MA-20: 25.1 x 36.8 mm
  • in FH-3 : 24.0 x 36.0 mm
  • in SA-21: 23.3 x 36.0 mm
  • effective scan range
  • in MA-20: 2870 x 4203 pixels
  • in FH-3 : 2736 x 4104 pixels
  • in SA-21: 2657 x 4104 pixels
  • light source: Red, green and blue (RGB) LEDs
  • sensor: 2870-pixel linear CCD image sensor
  • ADC: 12 bits per color (RGB)
  • Output: full color (8 or 16 bits per color [RGB])
  • focus: autofocus, manual
  • interface: USB 1.1
  • power supply: AC 100 - 240 V, 50 - 60 Hz
  • power consumption: idle 10 W max, scanning 20 W max

operating range

  • temperature: +10 - + 35 degrees Celsius
  • humdity 20 - 60 %

adapters

  • MA-20 slide mount adapter
  • SA-21 strip film adapter
  • FH-3 strip film holder

back to scanners page.

Links

Gleb Schtengel Service and Repair of Nikon Coolscan Scanners, VueScan, coolscanpy, digital fauxice, NegPy, Nikon Coolscan modification project, coolirr, Helmut Stöpfgeshoff modify SA-21 to SA-30 (only for Super Coolscan 4000 / 5000 ED), Coolscan PSU Replacement, nikon-coolscan-kiosk,

local links

c2,

History

2026-07-24: VueScan (trial) on a Mac works better, it produces good and consistent results- But after a while, it stop the color wheel and stops responding.

2026-07-24: c2 - scanimage produces inconsistent results. When I run with the same options, I very often get back a picture that looks like the --negative=yes option wasn't specified.

tingo@kg-core2:~/work/coolscan/2026/0724_testing $ scanimage -d coolscan3:usb:libusb:001:008 --format=png --negative=yes  --frame 2 > f2_1.png
tingo@kg-core2:~/work/coolscan/2026/0724_testing $ scanimage -d coolscan3:usb:libusb:001:008 --format=png --negative=yes  --frame 3 > f3_1.png
tingo@kg-core2:~/work/coolscan/2026/0724_testing $ scanimage -d coolscan3:usb:libusb:001:008 --format=png --negative=yes  --frame 4 > f4_1.png
tingo@kg-core2:~/work/coolscan/2026/0724_testing $ scanimage -d coolscan3:usb:libusb:001:008 --format=jpeg --negative=yes  --frame 1 > f1_1.jpg
tingo@kg-core2:~/work/coolscan/2026/0724_testing $ scanimage -d coolscan3:usb:libusb:001:008 --eject

I don'y know why.

2026-07-24: c2 - now when I run scanimage with the help option

tingo@kg-core2:~ $  scanimage --help -d coolscan3:usb:libusb:001:008
Usage: scanimage [OPTION]...

Start image acquisition on a scanner device and write image data to
standard output.

Parameters are separated by a blank from single-character options (e.g.
-d epson) and by a "=" from multi-character options (e.g. --device-name=epson).
-d, --device-name=DEVICE   use a given scanner device (e.g. hp:/dev/scanner)
    --format=pnm|tiff|png|jpeg|pdf  file format of output file
-i, --icc-profile=PROFILE  include this ICC profile into TIFF file
-L, --list-devices         show available scanner devices
-f, --formatted-device-list=FORMAT similar to -L, but the FORMAT of the output
                           can be specified: %d (device name), %v (vendor),
                           %m (model), %t (type), %i (index number), and
                           %n (newline)
-b, --batch[=FORMAT]       working in batch mode, FORMAT is `out%d.pnm' `out%d.tif'
                           `out%d.png' or `out%d.jpg' by default depending on --format
                           This option is incompatible with --output-file.
    --batch-start=#        page number to start naming files with
    --batch-count=#        how many pages to scan in batch mode
    --batch-increment=#    increase page number in filename by #
    --batch-double         increment page number by two, same as
                           --batch-increment=2
    --batch-print          print image filenames to stdout
    --batch-prompt         ask for pressing a key before scanning a page
    --accept-md5-only      only accept authorization requests using md5
-p, --progress             print progress messages
-o, --output-file=PATH     save output to the given file instead of stdout.
                           This option is incompatible with --batch.
-n, --dont-scan            only set options, don't actually scan
-T, --test                 test backend thoroughly
-A, --all-options          list all available backend options
-h, --help                 display this help message and exit
-v, --verbose              give even more status messages
-B, --buffer-size=#        change input buffer size (in kB, default 32)
-V, --version              print version information
Output format is not set, using pnm as a default.

Options specific to device `coolscan3:usb:libusb:001:008':
    --preview[=(yes|no)] [no] [advanced]
        Preview mode
    --negative[=(yes|no)] [no]
        Negative film: make scanner invert colors
    --infrared[=(yes|no)] [inactive]
        Read infrared channel in addition to scan colors
    --samples-per-scan 1..16 (in steps of 1) [inactive]
        Number of samples per scan
    --depth 8|12 [8]
        Number of bits output by scanner for each channel
    --exposure 0..10 (in steps of 0.0999908) [1]
        Exposure multiplier for all channels
    --red-exposure 50..20000us (in steps of 10) [1200]
        Exposure time for red channel
    --green-exposure 50..20000us (in steps of 10) [1200]
        Exposure time for green channel
    --blue-exposure 50..20000us (in steps of 10) [1000]
        Exposure time for blue channel
    --ae[=(yes|no)] [no]
        Perform auto-exposure before scan
    --ae-wb[=(yes|no)] [no]
        Perform auto-exposure with white balance before scan
    --red-gamma-table 0..4095,... (in steps of 1)
        LUT for red channel
    --green-gamma-table 0..4095,... (in steps of 1)
        LUT for green channel
    --blue-gamma-table 0..4095,... (in steps of 1)
        LUT for blue channel
    --resolution 2900|1450|966|725|580|483|414|362|322|290|263|241|223|207|193|181|170|161|152|145|138|131|126|120|116|111|107|103|100|96|93|90dpi [2900]
        Scanning resolution in dpi, affecting both x and y directions
    --x-resolution 2900|1450|966|725|580|483|414|362|322|290|263|241|223|207|193|181|170|161|152|145|138|131|126|120|116|111|107|103|100|96|93|90dpi [inactive]
        Scanning resolution in dpi, affecting x direction only
    --y-resolution 2900|1450|966|725|580|483|414|362|322|290|263|241|223|207|193|181|170|161|152|145|138|131|126|120|116|111|107|103|100|96|93|90dpi [inactive]
        Scanning resolution in dpi, affecting y direction only
    --independent-res[=(yes|no)] [inactive]
        Enable independent controls for scanning resolution in x and y
        direction
    --preview-resolution 2900|1450|966|725|580|483|414|362|322|290|263|241|223|207|193|181|170|161|152|145|138|131|126|120|116|111|107|103|100|96|93|90dpi [290] [advanced]
        Scanning resolution for preview mode in dpi, affecting both x and y
        directions
    --frame 1..0 (in steps of 1) [inactive]
        Number of frame to be scanned, starting with 1
    --frame-count 1..1 (in steps of 1) [inactive]
        Amount of frames to scan
    --subframe 0..37.9336mm [0]
        Fine position within the selected frame
    -l 0..2869pel (in steps of 1) [0]
        Left x value of scan area
    -x 0..2869pel (in steps of 1) [2869]
        Width of scan-area.
    -t 0..4331pel (in steps of 1) [0]
        Top y value of scan area
    -y 0..4331pel (in steps of 1) [4331]
        Height of scan-area.
    --load
        Load next slide
    --autoload[=(yes|no)] [no]
        Autoload slide before each scan
    --eject
        Eject loaded medium
    --reset
        Initialize scanner
    --focus-on-centre[=(yes|no)] [yes]
        Use centre of scan area as AF point instead of manual AF point
        selection
    --focus 0..323 (in steps of 1) [0]
        Focus position for manual focus
    --autofocus[=(yes|no)] [no]
        Perform autofocus before scan
    --focusx 0..2869pel (in steps of 1) [inactive]
        X coordinate of AF point
    --focusy 0..4331pel (in steps of 1) [inactive]
        Y coordinate of AF point

Type ``scanimage --help -d DEVICE'' to get list of all options for DEVICE.

List of available devices:

2026-07-24: I inserted the SA-21 strip film adapter, the LED on the scanner blinked a few times, then went steady.

2026-07-24: c2 - create a devd file for it

root@kg-core2:~ # cat /usr/local/etc/devd/nikoncoolscaniv.conf
# allow non root users access to the Nikon Coolscan IV film scanner
#
notify 100 {
        match "system" "USB";
        match "subsystem" "DEVICE";
        match "type" "ATTACH";
        match "vendor" "0x04b0";
        match "product" "0x4000";
# Please change the group name to suit your own needs.
        action "chgrp operator /dev/$cdev && chmod 660 /dev/$cdev";
};

restart devd, unplug and replug the scanner, and now scanimage works as a normal user too

tingo@kg-core2:~ $ scanimage -L
device `coolscan3:usb:libusb:001:008' is a Nikon LS-40 ED film scanner

2026-07-24: c2 - scanimage -L reports

root@kg-core2:~ # scanimage -L
device `coolscan3:usb:libusb:001:008' is a Nikon LS-40 ED film scanner

2026-07-24: testing - I powered on the LS-40 ED, it blinked with the power LED and made som noise, before the power LED is steady on. I connected the usb cable to my c2 workstation. usbconfig reports

root@kg-core2:~ # usbconfig -d ugen1.8
ugen1.8: <Coolscan LS 40 ED Nikon Corp.> at usbus1, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (0mA)

device description

root@kg-core2:~ # usbconfig -d ugen1.8 dump_device_desc
ugen1.8: <Coolscan LS 40 ED Nikon Corp.> at usbus1, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (0mA)

  bLength = 0x0012 
  bDescriptorType = 0x0001 
  bcdUSB = 0x0110 
  bDeviceClass = 0x00ff  <Vendor specific>
  bDeviceSubClass = 0x00ff 
  bDeviceProtocol = 0x00ff 
  bMaxPacketSize0 = 0x0008 
  idVendor = 0x04b0 
  idProduct = 0x4000 
  bcdDevice = 0x0110 
  iManufacturer = 0x0001  <Nikon>
  iProduct = 0x0002  <LS-40 ED>
  iSerialNumber = 0x0003  <16777215>
  bNumConfigurations = 0x0001 

current config descriptor

root@kg-core2:~ # usbconfig -d ugen1.8 dump_curr_config_desc
ugen1.8: <Coolscan LS 40 ED Nikon Corp.> at usbus1, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (0mA)


 Configuration index 0

    bLength = 0x0009 
    bDescriptorType = 0x0002 
    wTotalLength = 0x0027 
    bNumInterfaces = 0x0001 
    bConfigurationValue = 0x0001 
    iConfiguration = 0x0000  <no string>
    bmAttributes = 0x00c0 
    bMaxPower = 0x0000 

    Interface 0
      bLength = 0x0009 
      bDescriptorType = 0x0004 
      bInterfaceNumber = 0x0000 
      bAlternateSetting = 0x0000 
      bNumEndpoints = 0x0003 
      bInterfaceClass = 0x00ff  <Vendor specific>
      bInterfaceSubClass = 0x00ff 
      bInterfaceProtocol = 0x00ff 
      iInterface = 0x0000  <no string>

     Endpoint 0
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0001  <OUT>
        bmAttributes = 0x0002  <BULK>
        wMaxPacketSize = 0x0040 
        bInterval = 0x0000 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 

     Endpoint 1
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0082  <IN>
        bmAttributes = 0x0002  <BULK>
        wMaxPacketSize = 0x0040 
        bInterval = 0x0000 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 

     Endpoint 2
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0083  <IN>
        bmAttributes = 0x0003  <INTERRUPT>
        wMaxPacketSize = 0x0008 
        bInterval = 0x00c8 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 

2026-07-23: coolscan-mods modifies the firmware on LS-40 and LS-50 to support using SA-30 and SF-210 adapters.

2026-07-23: VueScan supports the Coolscan IV ED on Linux and macOS (and Windows).

2026-07-23: I bought a used Nikon Coolscan IV ED on FINN.no for NOK 4000.-

2026-07-23: I created this page.