[sane-devel] Sane support for Canon PIXMA MG2120, trying to get it to work

Rolf Bensch rolf at bensch-online.de
Fri Jan 18 20:00:16 UTC 2013

Hi David,

I prepared a patch to fix 1200dpi scans.

First you should install Sane 1.0.24 as described in README.linux.

You can accelerate build time with this special configure command:
BACKENDS="pixma" ./configure

(1) save "pixma_mp150c.diff1" into the folder "sane-backends/backend/".
(2) cd into this folder
(3) patch the sources with this command:
    patch pixma_mp150.c pixma_mp150.c.diff1
(4) cd ..
(5) make && sudo make install
(6) test 1200 dpi scan again.

If this patch won't work, please send me an jpeg image directly to my
email address.


Am 18.01.2013 19:24, schrieb David H. Durgee:
> Rolf Bensch wrote:
>> Hi David,
>> Please try a 1200 dpi scan.
>> If the image is OK, I'll change the status of your scanner as complete
>> installed.
>> Otherwise you need to install Sane 1.0.24 from git and we will go on
>> with patching and testing.
>> The manual installation is described in README.linux:
>> http://www.sane-project.org/README.linux. There comes a newer version
>> with the sources from git.
>> Cheers,
>> Rolf
> Per your request I installed xsane and tried a 1200 dpi scan.  The
> results appear as if there were some sort of wrap-around in the image in
> one direction that was not present in lower resolutions.  I assume that
> this is the problem you are referring to and thus I need to look into
> installing 1.0.24 here to address it.  If you need the sample scans I
> ran I can post them on DropBox for you.
> Have a good weekend.
> Dave
-------------- next part --------------
--- ./pixma_mp150.c	2013-01-18 20:20:46.000000000 +0100
+++ ../sane-backends/backend/pixma_mp150.c	2013-01-18 20:20:49.000000000 +0100
@@ -1087,6 +1087,7 @@
               && s->cfg->pid != MX370_PID
               && s->cfg->pid != MX890_PID
               && s->cfg->pid != MG3100_PID
+              && s->cfg->pid != MG2100_PID
               && s->cfg->pid != MG5300_PID)
               reorder_pixels (mp->linebuf, sptr, c, n, m, s->param->wx, line_size);
-------------- next part --------------
Information about USB scanners:

With Linux 2.4.* you could either use the kernel scanner module or libusb to
access USB scanners.  In Linux 2.6.4 the kernel scanner module was removed.
Therefore with this and later kernels libusb must be used.

While SANE automatically uses libusb when the library and its header file were
present during the build of sane-backends, setting permissions will require some
attention. So if scanimage -L lists your scanner as root but not as normal user
read on this text.

Most distributions support setting permissions without much manual
configuration. Usually you must just add the users that are allowed to access
the scanner to group "scanner". To make that change active, the user must login
again. For more details, see your distribution's documentation e.g. for Debian:
README.debian.gz. If this doesn't work you you want to know more, read on.

The device files used by libusb are located in /proc/bus/usb/
(e.g. /proc/bus/usb/001/003) or in /dev/bus/usb/ (e.g. /dev/bus/usb/001/003), if
you use udev.  The exact file name can be found out by running sane-find-scanner
which would print "libusb:001:003" in this case.  While setting permissions with
e.g. "chmod a+rw /proc/bus/usb/001/003" works, this change is not permanent.
The permissions will be reset when the scanner is replugged or Linux is

One solution to set permissions on-the-fly is Linux udev which comes with
current distributions. SANE comes with a udev rules file in the tools/udev
directory which may be used by distributions or can be copied to
/etc/udev/rules.d manually. The file format is explained on top of the file
itself. Either you need libusb 0.1.12 or newer or USB_DEVFS_PATH=/dev/bus/usb
must be exported as a system-wide environment variable.

Older distributions may use the Linux hot-plug tools (or hotplug-ng). Your
distribution should have set up the scripts to automatically change permissions
correctly. Look for "libsane.usermap" and "libusbscanner" in /etc/hotplug/usb.
If you build SANE from source you can use the hotplug script that comes with
SANE. See the tools/hotplug/ directory in the source distribution. Please refer
to the README in that directory for the details.

Gentoo information:
Gentoo users: If your USB scanner is not detected at all check that USE=usb is
set when emerging.

Quick install:

$ ./configure
$ make
$ make install

Step by step install on Linux 2.6.* and 3.*, both with udev:

1. Install missing development packages with your prefered package manager:
	- libusb-dev

2. Get the latest SANE backend from git:
	You can download daily git snapshot from here:


	If you prefer to use git, you can fetch a read-only copy of the git tree
	with this command:

	$ git clone git://git.debian.org/sane/sane-backends.git

	If you already are using a self compiled SANE backend and just fetched a
	new copy of the git tree or if you patched some source files, there is no
	need to follow the installation procedure again. You only need to make and
	install libsane:

	$ make && sudo make install

3. Search the location where your system installed libsane:
	Each distribution uses different folders for the libraries.

	Here are some examples from 64 bit Ubuntu 10.04. For the installation on
	your system you need to replace /usr/lib with the folder detected below.

	$ sudo find / -name libsane.so.1

	/usr/lib is the folder we are looking for.

	Be careful on 64 bit systems, if you already installed 32 bit compatibility
		libraries, e.g. the package ia32-libs:

		$ sudo find / -name libsane.so.1

		This response contains 2 folders:
		(1) /usr/lib32 is the location of the 32 bit compatibility libraries.
		(2) /usr/lib is the folder we are looking for.

	Be careful, if you already compiled and installed new SANE backend:

		$ sudo find / -name libsane.so.1

		This response contains 3 folders:
		(1) /usr/local/lib is the location of installed new SANE backend.
		(2) /home/user/src/sane-backends/backend/.libs is the location of
		    compiled new SANE backend in the source tree.
		(3) /usr/lib is the folder we are looking for.

4. Decide where you want to install new libsane:
	You don't need to remove your linux distribution's libsane packages, this
	may break needed depedencies to other useful packages like xsane.

	You should set symbolic links to new libsane. This avoids problems with the
	package manager of your Linux distribution.

	I assume that new libsane version 1.0.24 will be installed to
	/usr/local/lib and your system installed libsane.so.1 to /usr/lib.

	You can backup the existing symlinks and files as *.orig.

	$ cd /usr/lib
	$ sudo mv libsane.so.1 libsane.so.1.orig
	$ sudo mv libsane.la libsane.la.orig
	$ sudo ln -sf /usr/local/lib/libsane.so.1.0.24 libsane.so.1
	$ sudo ln -sf /usr/local/lib/sane/libsane.la libsane.la
	$ cd -

	Alternatively you can overwrite standard libsane. But then you must pay
		attention to your system's upgrades of libsane.

		You need to do some extra configuration for latest SANE backend:

		$ ./configure --libdir="/usr/lib"

	You also can replace the binaries, configuration, manuals, translations,
		etc. of your distribution. For more information please read:

		$ ./configure --help

5. Configure, make and install latest SANE backend:

	$ ./configure [with your options defined above]
	$ make && sudo make install

6. Use the scanner with normal user rights:
	Copy udev rules file:

	$ sudo cp tools/udev/libsane.rules /etc/udev/rules.d

	Reconnect your scanner to the USB bus to activate the new rules file.

	Your user must be a member of the group scanner:

	$ sudo adduser [username] scanner

	After this you must logoff and login again.

7. Test your scanner:
	First you should check the used libsane version.

		$ scanimage -V
		scanimage (sane-backends) 1.0.24git; backend version 1.0.24

		This example shows that backend and scanimage are version 1.0.24.

		$ /usr/bin/scanimage -V
		scanimage (sane-backends) 1.0.20; backend version 1.0.24

		This example shows that an old scanimage (1.0.20) uses the backend 1.0.24.

		If you want to use xsane, start xsane and check the used version with
		CTRL - i.

	Now you can test if your scanner is recognized with normal user rights.

		$ scanimage -L

		If your scanner isn't recognised here, try this:

			$ sudo scanimage -L

			If this works, your user doesn't have the rights to access the

			However, please check and redo the installation described above.
			If this doesn't help, you can ask the mailing list
			<sane-devel at lists.alioth.debian.org> for further support.

Information about SCSI scanners:

Under Linux, your kernel must have generic SCSI support (sg) as well as a
driver for your SCSI adapter. You may want to increase the SCSI buffer size
to increase scan speed. Details on all of the above can be found in

If your SCSI and sg driver are build as moduls you will need to load them
with modprobe:

# modprobe your-driver-name
# modprobe sg

You may find error messages in /var/log/messages. Look at the documentation
for your SCSI driver. Maybe you need to add options like the io port.

Now the SCSI adapter and your scanner should be visible at /proc/scsi/scsi.

# cat /proc/scsi/scsi
Host: scsi0 Channel: 00 Id: 06 Lun: 00
  Vendor: SCANNER  Model:                  Rev: 2.02
  Type:   Scanner                          ANSI SCSI revision: 01 CCS 

In this case the real vendor and scanner name are not shown (Mustek
Scannexpress 12000SP) but SANE will detect it nevertheless.

If your scanner is supported by SANE, scanimage -L will list it now:

# scanimage -L
device mustek:/dev/scanner' is a Mustek ScanExpress 12000SP flatbed scanner 

If this doesn't work you may have to add the right SCSI generic device name
to the configuration file. This should be documented in the man page for
your backend. To find out about the right SCSI device use sane-find-scanner:

# sane-find-scanner
found SCSI scanner "SCANNER  2.02" at /dev/scanner
found SCSI scanner "SCANNER  2.02" at /dev/sg0
found SCSI scanner "SCANNER  2.02" at /dev/sga 

It may help to set a symbolic link /dev/scanner to the respective device if
automatic detection does not work.

If you need more information on the Linux SCSI subsystem, look at
http://www.torque.net/scsi/linux_scsi_24/index.html. Although this
documentation is about the 2.4 kernels, large parts are also valid for
older kernels. One important exception is the section on "Device Names
in devfs".

Adaptec 1542 SCSI adapter:
  Using buffer sizes of more than 32768 bytes with the aha1542 driver can
  lead to kernel panic with older kernels. To avoid this, run configure with 
  the option --enable-scsibuffersize or set the environment variable
  SANE_SG_BUFFERSIZE to 32768 before running scanimage or another frontend, 
  or download and install the SG driver 2.1.37 or newer from 

  The Linux kernel "Emulation of a SCSI host adapter for IDE ATAPI
  devices" (idescsi) is reported to cause problems in connection with
  SANE. If your scanner isn't found or you encounter segmentation faults
  try to disable idescsi.

SCSI Direct IO: Recent versions of the Linux SG driver for the 2.4 kernels 
  support direct IO, i.e., the SCSI adapter's DMA chip copies data directly 
  to/from user memory. Direct IO reduces memory usage, but it can lead to 
  access conflicts, if a backend uses shared memory. SANE does not use 
  direct IO by default. If you want to use it, run

	configure --enable-scsi-directio=yes

Very old Linux distributions are missing the /usr/include/scsi directory.  In
such a case, it is necessary to copy the relevant files from the kernel
distribution.  Normally, the command:

  cp -a /usr/src/linux/include/scsi /usr/include

should fix this problem. Don't do this if you don't get compilation errors
about missing SCSI headers.

Other Information

ld.so.conf configuration:
  "/usr/local/lib/sane" or "/usr/lib/sane" MUST NOT be listed in
  /etc/ld.so.conf. If your scanner is not detected or only Video for Linux
  devices are found, check for one of the above lines in ld.so.conf.
  A line "/usr/local/lib" or "/usr/lib" in ld.so.conf is ok, however.

Excessive warnings "pointer of type `void *' used in arithmetic":
  Some older versions of glibc generate these warnings not related to SANE
  source code. To suppress these warnings do

  export CFLAGS="-g -O2 -D__NO_STRING_INLINES"

  and rerun configure.

If you use DEC cc on Linux Alpha, you may need to set LDFLAGS="-N" to
  be able to build sane-backends.

The Intel C++ Compiler for IA32 and IA64 isn't supported yet. If you want
  to try nevertheless, you will experience undefined references to inb
  and outb functions. To avoid those replace #include <sys/io.h> with

  #if defined(__ICC) && __ICC >= 700
  # define __GNUC__ 2
  #include <sys/io.h>
  #if defined(__ICC) && __ICC >= 700
  # undef __GNUC__
  #elif defined(__ICC) && defined(HAVE_ASM_IO_H)
  # include <asm/io.h>

Have a lot of fun with the latest SANE backend.

More information about the sane-devel mailing list