Homepage of the AcuLaser C900 CUPS Project
How to Install an Epson AcuLaser C900 for Linux ix86 and x86_64 with CUPS

SF Logo

Copyright (C) SEIKO EPSON CORPORATION 2002-2004.

If you want to support this project:

This Program package will support the EPSON AcuLaser C900 to work together with the CUPS printer spooler

Before I start, I would like to thank Claude Gygax, whose precise, detailed and very professional How-To on http://www.mabase.ch/c900/ inspired me to write the code for this package.
I would also like to thank him, for making the required binaries available on his server.
Thank you very much, Claude!


Version 1.0

Have a lot of fun

See the older ChangeLog, if you are interested in what changed before.


Basic Preparation
Download and Installation
Selection of the Correct Printer Interface URI
AcuLaser C900N with Built-In Network Card
URI-Syntax for the ALC900-Backend

Changing Toner / Polling Printer Status / Changing Paper Tray Size
Setting the Paper Sizes for the Trays
System Check Up / Print Test Page
ALC900-CUPS Insight
CUPS Options
Do Your System a Favor
Developers! Create your own, Clean Packages


You will need
cups (or cupsys)
Installed on your machine.

Further, the installation of pipsplus, pipsplus-epson-laser, pipsplus-epson-alc900, pipsplus-gtk
and the presence of the file libstdc++-libc6.2-2.so.3 in /usr/lib is mandatory.

You will not need to do anything about the last 5 files, when you are connected to the internet.
If not online, get the files from our sourceforge-page, copy the
unpacked pipsplus-rpms and the libstdc++-libc6.2-2.so.3 into the unpacked installation directory alc900-cups-1.0, and start the installer as described next.

When you would install the pipsplus-rpms yourself it is essential, that you do this with the --noscripts option. Otherwise an error will be reported on most systems and the installation would probably fail. Same applies to uninstallation.

> rpm -Uhv <rpm-file-name> --noscripts
> rpm -e
<rpm-name> --noscripts

But ... the best preparation is to re-build proper packages and to install the package of your distribution, which contains the libstdc++-libc6.2-2.so.3.


Download and Installation process:

Get our latest version from sourceforge
SF Logo

download it into some local directory
log on as (best as “root” in a local graphical
Unpack and install the tar.gz package.
Connect and switch on the printer, and check if your internet connection is up, before you start the installation.
The installer will try to retrieve all needed files from the internet, if some of them are missing locally.

> tar -xzvf alc900-cups-1.0.i386.tar.gz
> cd alc900-cups-1.0.i386
> sudo ./install.sh
Once started, the installer tells you what to do. Just follow the instructions on the screen.
In the run of the installation, the installer will start your system’s printer configuration tools.
see the examples for:
Or you will get hints on how to set up the printer via the command-line tool lpdamin, if you are not working in a graphical environment.
Alternatively you can start a web-browser at localhost:631 after the installation.


To connect a printer to an interface, you need a URI (Unique Resource Identifier). CUPS and SAMBA have standardized URIs, which will do the job well for most printers with standard handshake.
usb://      (local USB port)
parallel:// (local parallel port)
ipp://      (CUPS IPP-protocol)
lpd://      (LPR network printing)
smb://      (SMB-share over network)
socket://   (HP DeskJet over network)
But – as you might have guessed – none of these URIs is a good choice for your AcuLaser C900, because of its very special handshake.
Even the
EPSON-URIs will not work correctly.

I would recommend to set up your printers as usual, at one of the URIs mentioned above. Then invoke:
> alc900.update-uris
and you will end with perfectly set up URIs for your C900-queues.
The installer automatically calls
alc900.update-uris at the end of the installation process.


An AcuLaser C900N with built in ethernet network card works best, when connected through socket://<C900N-IP-address>:9100, which is the HP JetDirect network configuration.
But be sure, you call
alc900.update-uris after the configuration for correct URI-configuration.


The AcuLaser C900 features a very special local handshake, which is different from anything I have seen. Additionally to this proprietary handshake, the alc900-cups backend offers some special options like bundling or memory size limiting (for 16MB printers), which make additional streaming patterns necessary.

Therefore you must connect the AcuLaser C900 to the proprietary alc900:// URI
For the local ports these URIs look like:
alc900://usblp0/EPSON/AL-C900                (local USB port #0)
alc900://parport0/EPSON/AL-C900              (local parallel port #0)
Depending on your printer, the URIs and the port numbers might differ a bit.

For network connections the URIs look like:
alc900://ipp://<ipp-address-of-printer>      (IPP over network)
alc900://lpd://<lpd-network-id-of-printer>   (LPD over network)
alc900://smb://<samba/windows-share>         (printing to a Samba-share)
The syntax is the same as for the regular URIs, but alc900:// is always used as a kind of prefix.

For an AcuLaser C900N with built in network card, use:
alc900://<ip-address-of-alc900n>             (printing to a AcuLaser C900N, e.g. alc900://

I could not get the network card working with the IPP-protocol-option, it steady failed. The job always hung at its end. So I highly recommend to use the RAW protocol, and connect via a plain network socket URI (
alc900://XXX.XXX.X.XX) , as described above. Changing the network settings is very easy, with the EPSON NetWare, which you can get from the EPSON Support-Page.
It could install and run the program without any problems under wine (Linux-Windows-Emulation), which usually is part of your Linux Distribution.


The alc900-cups package comes with executables, to service and poll the printer. You must work in a graphic desktop-environment, to use the GTK-1.2 service tools.

and the program will lead you through the process of connecting to a printer and setting up the printer for regular printing again. You can find more details about the pipsplus GTK-frontend in EPKOWA’s online instruction manual.
alc900(_with_some_extension), if you see the selection list below. Once done so, you can proceed.

After you have polled status, changed toner or changed paper tray size, you will get the possibility to select “regular printing” again.
It is important to switch back to “regular printing”. Otherwise the pipsplus tools will block the local printer port.


Select “Configuration Printer” to reach the screen “Printer Properties” and the tab “Extension”.

If you have a locally connected AcuLaser C900, this is the entry to the “Printer Setting” screen.
The ovals show you where to set the paper sizes for the cartridges.

Usually you must change the paper tray sizes, every time the formats of your printed documents change, unless you use the PPD-option TraySize.
As an example, the xpp (XPrintingPanel) window shows the selection “Tray Size Setting”, which controls the option

Make the setting of TraySize (as here in XPrintingPanel) the same as in the “Printer Setting” screen of pipsplus-config, so you need not adapt the pipsplus-config setting for the Tray Size, when the document sizes change.


> alc900.post
to check if an installation went right.

You must print a document to test your CUPS spooler setup:
> lp -d <my-printer-name> <name-of-the-document>
> lpr -P
<my-printer-name> <name-of-the-document>
> xpp -d <
my-printer-name> <name-of-the-document>
> kprinter -d <
my-printer-name> <name-of-the-document>
or ... any other CUPS front-end, which is installed on your machine

A good candidate for <name-of-the-document> is /usr/share/cups/data/testprint.ps


To uninstall the whole driver (tar.gz-version), call – in the directory where you unpacked the package – (as root):
> ./install.sh -–remove-only


If the rare case might occur that your printer hangs, you can call as root
> killall alc900.cat pipsplusd
The killall-command will most probably halt the printer queue.
In this case, enable spooling again either by your graphical setup tool or via the command:
> lpadmin -p <name-of-the-printer-queue> -E
Also call
> alc900.connect
and check if all AcuLasers are configured for “regular printing”.


If you are interested in what is actually going on in the backend, have a look at the log-file of the program
Especially in the first phase after an installation call:
> tail -f /var/log/alc900.log
> tail -f /var/log/cups/error_log
> tail -f /tmp/alc900-
where <name-of-the-interface> denotes the actual hardware interfaces of the printer queues.
Please, look into the directory
/tmp for log-files.


The knowledge of the printer options (lpoptions-command) is essential for those people who like to print from the command line.
CUPS supports command line printing by passing control options in the print command line.
This is usually achieved by
> lp -d <printer-name> -o Option1=Value1 -o Option2=Value2 ...
The alc900-driver knows the following options (apart from the standard CUPS options):
Underlined values show the driver-default.

Option Name



Alt, Std
Alternative or Standard duplex page arrangement.
Standard – like implemented in the pipsplus-driver 0.1 – does not seem to work correctly


Left, Right
Defining the side of the duplex binding for DuplexNoTumble


Defining the max. number of pages, which are processed without pause.
If you are using the option SizeLimit (values less than 150) this value is essential, because it divides the job into digestible portions for printers with only 16MB cartridges. Since the driver is closed source, the job can only be analyzed per stream, and a new portion cannot be generated, before the old one is converted and streamed completely. Conversion is the most time consuming part of the printing process. Waiting until the driver has converted a whole, long stream may take some time and block your system (at least slows it down).
Using some lower number for BundleSize would help you out of this problem.


Off, On
Switching on or off the grouping of pages to a separate job.


c900, c1100
Allows calling the alc1100 filter of the AcuLaser C1100 driver bundle from EPKOWA instead of the regular AcuLaser C900 driver, just in case the results of the regular driver are not satisfying.
For sure, the AcuLaser C1100 driver binary must be installed to use this feature. See the EPKOWA pages for the according downloads at


None, DuplexTumble, DuplexNoTumble


No, Yes
“No” releases network printers immediately, so that the performance of shared printers can be increased. The disadvantage may be, that split jobs might get mixed.


Autoselect, Lower, MultiPurpose
Selection of the paper source


Normal, Coated, Envelope, Thick, Transparency
Note: Only Epson-Transparencies are supported


Letter, A4, A5, HalfLetter, Executive, EnvC5, EnvC6, Env10, EnvDL, Monarch


Draft, Fast, Fine
PrintQuality=Draft prints fast with only half of toner use.


Maximum streamed Esc/P2 job size in MB.
Bundling should be set to On for SizeLimit=1..149 and BundleSize should be set to some lower number to supply a reasonable look-ahead page count – BundleSize=10 would be a good guess.
SizeLimit=150 disables the size checking.


Color, Black, Autoselect, AutoselectRelaxed, Sorted
Sorted is not available with Duplex Printing, where it would default to Color


Document, A4, Letter, Executive
Assumes that the Paper Tray Feeder was set to the according size via pipsplus-config.
Using a fix setting (A4, Letter, Executive) will allow to print smaller document formats, while the Tray remains set to the according constant value.
The setting “Document” will require a tray setting that matches with the document size of every printed job.


Zooming in % of the pages to print.
This function is emulated, bypassing the EPKOWA driver option


Enable the Bundling Option!
Setting e.g.
-o Bundling=On and -o BundleSize=10 on the command line (or setting the according options via the graphical CUPS interface) will
- shorten the delay until the first page comes out of the printer
- save main memory consumption
Bundling will mostly be the only way to print big documents in one job (in combination with e.g.
-o SizeLimit=10), if your printer is only equipped with a 16MB RAM.

Enable the Color-Autoselection!
-o Toner=Autoselect or -o AutoselectRelaxed or -o Sorted on the command line (or setting the according option via the graphical CUPS interface) will:
- significantly speed up the printing process for documents with only some colored pages
- save main memory consumption
- reduce processed and transferred data

will only work correctly, when the CUPS queue uses an alc900:// URI.
Print Servers with RAW-queue connection, which run alc900-cups version 0.12 and above, connected through an alc900-URI, will be capable of handling these options, when a client uses it.


The installation described above is the fastest and easiest variant, but has some big disadvantages:
It will not really care about package dependencies
It would live partly outside your package manager
The configuration-scripts in the rpms are just wrong and the installer tricks around them
There are wrong or obsolete dependencies in the packages

Therefore pipsplus-1.1-b-rpms.tar.gz , libstdc-6.2-2.tar.gz , and the alc900-cups installer come with the capability to create proper RPM packages and (lintian-conform) DEBIAN packages, which are exactly tailored for your system.
To (re-)create the proper pipsplus-packages, you will find the scripts:
repack-rpms.sh in pipsplus-1.1-b-rpms.tar.gz.
pack-libstdc.sh in libstdc-6.2-2.tar.gz
To create the alc900-cups-packages,
install.sh offers the option  --pkg-build.

Call./repack-rpms.sh , ./pack-libstdc.sh and ./install.sh with the parameter --help to learn more about package building.

You will always need to generate the libstdc-package, when your Linux-distribution does not provide libstdc++-libc6.2-2.so.3 in some package.
In this case, you will need to generate the lib-package first by

> ./pack-libstdc.sh                                 # in the libstdc's directory

and install the new lib-package by the rpm or deb package manager.
Then create the rest of the needed packages.

An example to create deb-packages on Ubuntu 7.10 (Gutsy Gibbon) might be:
> ./repack-rpms.sh --pkg-release=1gutsy1            # in the rpms’ directory

> ./install.sh --pkg-build --pkg-release=1gutsy1    # in the installer's directory
An example to create correct rpm-packages on openSuSE 10.3 might be:
> ./repack-rpms.sh --pkg-release=1suse103           # in the rpms’ directory

> ./install.sh --pkg-build --pkg-release=1suse103   # in the installer's directory
In both cases the --pkg-release is an arbitrary name which should start with a digit.

The examples above may give you an idea, what is appropriate.
You could also omit this option, but then the script will take the release number of the original packages.
The output on the screen will tell you, where to find the new packages.

For RPM-distributions like SuSE, MANDRIVA, FEDORA CORE, REDHAT deinstall old (original) packages with:
> rpm -e alc900-cups
> rpm -e --noscripts pipsplus pipsplus-epson-laser pipsplus-epson-alc900 pipsplus-gtk
and install the new packages with:
> rpm -ihv <names-of-the-rpm-files>
Once you installed the re-packed rpms, you don't need to use the --noscripts option anymore.

For DEBIAN, KNOPPIX and UBUNTU deinstall old packages with:
> dpkg --purge pipsplus pipsplus-epson-laser pipsplus-epson-alc900 pipsplus-gtk alc900-cups alc900-cups-gtk
and install the new packages with:
> dpkg -i <names-of-the-deb-files>


I would like to thank everybody, who helped me in continuing this project. Many thanks to all the testers, who invested their valuable time to find out, whether my coding also works with real devices for various Linux flavors.

Special thanks to all the project donors, whom I would like to do some more favor.

I finally made it to a 2nd hand AcuLaser C900 in my office, which helped me a lot to find out the secrets of the protocol. The protocol is totally apart from everything, that EPSON states in their documentation. Without the hardware in place, I would have been lost (actually I was).

Many, many thanks to you all of you, who supported me. I hope I am able to pay the confidence in me back, by supplying this driver.

And last but not least: Many thanks to my family for their appreciation.

Copyright ©2005-2008 Ullrich Sigwanz. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU FreeDocumentation License, Version 1.2.or any later version published by the Free Software Foundation.

$Id: index.html,v 1.37 2009/01/11 09:26:53 ullsig Exp $