From 3087a5efb5226c2e5f3aa65cec677b80eb3f7556 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Thu, 18 Jul 2013 01:27:33 +0200 Subject: [PATCH] sane-desc: add support for udev's hwdb udev now comes with a hardware database (hwdb) which is meant to replace large rule files as the one typically shipped with sane. This should significantly speed up the processing of usb add events. Add the required output format and add a special udev output mode which is produces the udev file to be used with hwdb. Sample hwdb file: . Sample udev+hwdb rules file: . Similar support was recently added to gphoto2: . The new udev rules file does not support old udev/kernels as these anyway don't support hwdb. Moreover, it does not come with GROUP=/MODE= or ACL support as this can easily be done externally by hooking into the libsane_matched envvar. In particular systemd-logind uses this to do its own ACL handling. --- testsuite/tools/Makefile.am | 2 +- testsuite/tools/Makefile.in | 2 +- testsuite/tools/data/hwdb.ref | 2736 ++++++++++++++++++++++++++++ testsuite/tools/data/udev+hwdb.ref | 76 + tools/sane-desc.c | 212 ++- 5 files changed, 3025 insertions(+), 3 deletions(-) create mode 100644 testsuite/tools/data/hwdb.ref create mode 100644 testsuite/tools/data/udev+hwdb.ref diff --git a/testsuite/tools/Makefile.am b/testsuite/tools/Makefile.am index 192a51ddc..a07531503 100644 --- a/testsuite/tools/Makefile.am +++ b/testsuite/tools/Makefile.am @@ -24,7 +24,7 @@ check: check.local check.local: @echo "**** Testing $(SANEDESC) with $(TESTFILE)" - @for mode in ascii html-backends-split html-mfgs xml statistics usermap db udev udev+acl plist hal hal-new; \ + @for mode in ascii html-backends-split html-mfgs xml statistics usermap db udev udev+acl udev+hwdb hwdb plist hal hal-new; \ do \ echo "PASS: sane-desc -m $$mode"; \ $(SANEDESC) -m $$mode -s data >$$mode.res ;\ diff --git a/testsuite/tools/Makefile.in b/testsuite/tools/Makefile.in index 542800475..139e35c72 100644 --- a/testsuite/tools/Makefile.in +++ b/testsuite/tools/Makefile.in @@ -422,7 +422,7 @@ check: check.local check.local: @echo "**** Testing $(SANEDESC) with $(TESTFILE)" - @for mode in ascii html-backends-split html-mfgs xml statistics usermap db udev udev+acl plist hal hal-new; \ + @for mode in ascii html-backends-split html-mfgs xml statistics usermap db udev udev+acl udev+hwdb hwdb plist hal hal-new; \ do \ echo "PASS: $(SANEDESC) -m $$mode"; \ $(SANEDESC) -m $$mode -s data >$$mode.res ;\ diff --git a/testsuite/tools/data/hwdb.ref b/testsuite/tools/data/hwdb.ref new file mode 100644 index 000000000..357aaa817 --- /dev/null +++ b/testsuite/tools/data/hwdb.ref @@ -0,0 +1,2736 @@ +# This file was automatically created based on description files (*.desc) +# by sane-desc 3.5 from sane-backends 1.0.24git on Thu Aug 1 18:50:19 2013 +# +# hwdb file for supported USB devices +# +# If your scanner isn't listed below, you can add it to a new hwdb file +# under /etc/udev/hwdb.d/. +# +# If your scanner is supported by some external backend (brother, epkowa, +# hpaio, etc) please ask the author of the backend to provide proper +# device detection support for your OS +# +# If the scanner is supported by sane-backends, please mail the entry to +# the sane-devel mailing list (sane-devel@lists.alioth.debian.org). +# +# Hewlett-Packard ScanJet 4100C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 4200C | Hewlett-Packard ScanJet 4200Cxi | Hewlett-Packard ScanJet 4200Cse +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 6200C | Hewlett-Packard ScanJet 6250C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 3300c +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 4300c +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 5200C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 3400c +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 2100C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 6300C | Hewlett-Packard ScanJet 6350C | Hewlett-Packard ScanJet 6390C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 2200C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 5300C | Hewlett-Packard ScanJet 5370C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard scanjet 4400c +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 7400c | Hewlett-Packard ScanJet 7450c | Hewlett-Packard ScanJet 7490c +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard scanjet 4470c +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 2300C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 2400C | Hewlett-Packard ScanJet G2410 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 8200 | Hewlett-Packard ScanJet 8250 | Hewlett-Packard ScanJet 8290 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 5400c +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 5470c +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 4500C | Hewlett-Packard ScanJet 5550C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 4570C | Hewlett-Packard ScanJet 5500C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 3670C | Hewlett-Packard ScanJet 3690C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 5590 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 7650 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 4850C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 3530C | Hewlett-Packard ScanJet 3570C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 3500C +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 3970c +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 4070 Photosmart +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 3800 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet G2710 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 8300 | Hewlett-Packard ScanJet 8350 | Hewlett-Packard ScanJet 8390 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 8270 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard LaserJet M1005 MFP +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet 4370 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet G3010 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet G3110 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet G4010 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet G4050 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard ScanJet N6310 +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard LaserJet M1120 MFP +usb:v03F0p03F0* + libsane_matched=yes + +# Hewlett-Packard LaserJet M1120n MFP +usb:v03F0p03F0* + libsane_matched=yes + +# Mustek BearPaw 1200 +usb:v0400p0400* + libsane_matched=yes + +# Mustek BearPaw 1200 | Mustek BearPaw 2400 +usb:v0400p0400* + libsane_matched=yes + +# Kodak ESP 5100 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 5300 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 5500 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 5000 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 3300 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 5 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 7 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 9 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 5200 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 3200 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 4100 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 6100 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 7200 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP C110 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP C115 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 2150 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP C310 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP C315 +usb:v040Ap040A* + libsane_matched=yes + +# Advent AW10 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak Hero Office 6.1 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak Hero 7.1 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak Hero 5.1 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 9200 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak ESP 2170 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak Hero 9.1 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak Hero 3.1 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak i30 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak i40 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak i50 | Kodak i55 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak i60 | Kodak i65 +usb:v040Ap040A* + libsane_matched=yes + +# Kodak i80 +usb:v040Ap040A* + libsane_matched=yes + +# Creative WebCam Go Mini +usb:v041Ep041E* + libsane_matched=yes + +# Lexmark X70 | Lexmark X73 +usb:v043Dp043D* + libsane_matched=yes + +# Lexmark X74 +usb:v043Dp043D* + libsane_matched=yes + +# Lexmark X1110 | Lexmark X1130 | Lexmark X1140 +# Lexmark X1150 | Lexmark X1170 | Lexmark X1180 +# Lexmark X1185 | Lexmark X1195 +usb:v043Dp043D* + libsane_matched=yes + +# Lexmark X12xx +usb:v043Dp043D* + libsane_matched=yes + +# Genius ColorPage HR6 V1 +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage HR6 V2 +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage HR6 V2 +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage HR6A +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage Vivid3x | Genius Colorpage Vivid3 V2 +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage HR7 +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage Vivid4 +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage HR7LE +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage HR6X +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage Vivid3xe +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage Vivid4xe +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage Vivid4x +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage Vivid 1200 X +usb:v0458p0458* + libsane_matched=yes + +# Genius ColorPage Slim 1200 +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage Vivid 1200 XE +usb:v0458p0458* + libsane_matched=yes + +# Genius Colorpage SF600 +usb:v0458p0458* + libsane_matched=yes + +# Medion/Lifetec/Tevion/Cytron MD5345 | Medion/Lifetec/Tevion/Cytron MD6228 | Medion/Lifetec/Tevion/Cytron MD6471 +usb:v0461p0461* + libsane_matched=yes + +# Xerox 2400 Onetouch +usb:v0461p0461* + libsane_matched=yes + +# Trust Office Scan USB 19200 +usb:v047Bp047B* + libsane_matched=yes + +# Hewlett-Packard ScanJet 4300c/Silitek +usb:v047Bp047B* + libsane_matched=yes + +# Kyocera FS-1016MFP +usb:v0482p0482* + libsane_matched=yes + +# Compaq S4-100 +usb:v049Fp049F* + libsane_matched=yes + +# Benq (Acer) 310U +usb:v04A5p04A5* + libsane_matched=yes + +# Benq (Acer) 620U +usb:v04A5p04A5* + libsane_matched=yes + +# Benq (Acer) 320U | Benq (Acer) 340U | Mitsubishi Diamondview 648UT +usb:v04A5p04A5* + libsane_matched=yes + +# Benq (Acer) 620UT +usb:v04A5p04A5* + libsane_matched=yes + +# Benq (Acer) 640U | Guillemot / Hercules Maxi Scan A4 USB 640U | Guillemot / Hercules Maxi A4 36 bit +usb:v04A5p04A5* + libsane_matched=yes + +# Benq (Acer) 640bu +usb:v04A5p04A5* + libsane_matched=yes + +# Benq (Acer) 3300 | Benq (Acer) 4300 | Mitsubishi Diamondview 650U +usb:v04A5p04A5* + libsane_matched=yes + +# Benq (Acer) 640BT +usb:v04A5p04A5* + libsane_matched=yes + +# Benq (Acer) 1240 +usb:v04A5p04A5* + libsane_matched=yes + +# Benq (Acer) 3300 | Benq (Acer) 4300 | Guillemot / Hercules Scan@home Touch 1248 (USB) +usb:v04A5p04A5* + libsane_matched=yes + +# Benq (Acer) 5000 +usb:v04A5p04A5* + libsane_matched=yes + +# Benq (Acer) 5000E | Benq (Acer) 5000U +usb:v04A5p04A5* + libsane_matched=yes + +# Benq (Acer) 5300 +usb:v04A5p04A5* + libsane_matched=yes + +# Benq (Acer) 5150 | Benq (Acer) 5250 +usb:v04A5p04A5* + libsane_matched=yes + +# BenQ 5550 +usb:v04A5p04A5* + libsane_matched=yes + +# Visioneer Visioneer OneTouch 7100 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer 9650 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer 9320 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer 9450 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer 9550 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer 9750 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer Strobe XP 450 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer Strobe XP 200 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer Strobe XP 100 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer OneTouch 7300 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate510 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate520 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate250 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate252 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate262 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer Strobe XP 300 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate272 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate232 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate152 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate752 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer Strobe XP 470 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer 9450-G +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer 9650-G +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate510-G +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate252-G +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate262-G +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate272-G +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer Strobe XP 470-G | Visioneer Patriot 470 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate250-G +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer Strobe XP 450-G +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate520-G +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer 9750-G +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer Roadwarrior +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate512 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer Patriot 430 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer Patriot 680 | Xerox DocuMate632 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer Patriot 780 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate752 +usb:v04A7p04A7* + libsane_matched=yes + +# Visioneer Strobe XP 100,r3 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate150 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate162 +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox DocuMate262i +usb:v04A7p04A7* + libsane_matched=yes + +# Xerox Travel Scanner 100 +usb:v04A7p04A7* + libsane_matched=yes + +# Canon DR-2080C +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CR-180 | Canon CR-180II +usb:v04A9p04A9* + libsane_matched=yes + +# Canon DR-9080C +usb:v04A9p04A9* + libsane_matched=yes + +# Canon DR-7080C +usb:v04A9p04A9* + libsane_matched=yes + +# Canon DR-5010C +usb:v04A9p04A9* + libsane_matched=yes + +# Canon DR-6080 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon DR-2580C +usb:v04A9p04A9* + libsane_matched=yes + +# Canon DR-3080CII +usb:v04A9p04A9* + libsane_matched=yes + +# Canon DR-2050C | Canon DR-2050SP +usb:v04A9p04A9* + libsane_matched=yes + +# Canon DR-7580 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP750 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP780 | Canon PIXMA MP790 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP760 | Canon PIXMA MP770 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP150 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP170 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP450 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP500 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP800 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP800R +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP530 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP830 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP160 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP180 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP460 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP510 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP600 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP600R +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP810 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP960 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX7600 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP210 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP220 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP470 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP520 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP610 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP970 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX300 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX310 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX700 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP140 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX850 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP980 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP630 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP620 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP540 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP480 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP240 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP260 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP190 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX860 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX320 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX330 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP250 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP270 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP490 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP550 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP560 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP640 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP990 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX340 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX350 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX870 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP280 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP495 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG5100 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG5200 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG6100 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG8100 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX360 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX410 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX420 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX880 Series | Canon PIXMA MX882 | Canon PIXMA MX885 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG2100 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG3100 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG4100 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG5300 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG6200 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG8200 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP493 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA E500 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX370 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA E600 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX430 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX510 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX710 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX890 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP230 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG2200 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA E510 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG3200 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG4200 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG5400 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MG6300 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX390 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA E610 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX450 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX520 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX720 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MX920 Series +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan 8800F +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan LiDE 100 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan LiDE 200 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan 700F +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan 9000F +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan LiDE 110 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan LiDE 210 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan 9000F Mark II +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan fb630u | Canon CanoScan fb636u +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan N650U/N656U +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan N1220U +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan D660U +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan N670U/N676U/LiDE20 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan N1240U/LiDE30 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan LiDE 35 | Canon CanoScan LiDE 40 | Canon CanoScan LiDE 50 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan LiDE 60 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon CanoScan LiDE25 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon DR-1210C +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP730 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP700 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP360 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP370 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP390 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP375R +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP740 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon PIXMA MP710 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF5630 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon laserBase MF5650 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF8170c +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF5730 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF5750 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF5770 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF3110 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF3240 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF6500 series | Canon imageCLASS MF6550 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF4120 | Canon imageCLASS MF4122 | Canon imageCLASS MF4140 +# Canon imageCLASS MF4150 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF4660 | Canon imageCLASS MF4690 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF4010 | Canon imageCLASS MF4018 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF4270 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageRUNNER 1020/1024/1025 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF4370dn | Canon imageCLASS MF4380dn +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS D480 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon I-SENSYS MF4320d | Canon I-SENSYS MF4330d | Canon imageCLASS MF4350d +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS D420 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon i-SENSYS MF5880dn +usb:v04A9p04A9* + libsane_matched=yes + +# Canon i-SENSYS MF6680dn +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF8030 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon i-SENSYS MF4550d +usb:v04A9p04A9* + libsane_matched=yes + +# Canon imageCLASS MF4410 | Canon imageCLASS MF4430 +usb:v04A9p04A9* + libsane_matched=yes + +# Canon i-SENSYS MF3010 +usb:v04A9p04A9* + libsane_matched=yes + +# Nikon LS 40 ED | Nikon LS 40 ED | Nikon Coolspan IV +usb:v04B0p04B0* + libsane_matched=yes + +# Nikon LS 50 ED | Nikon Coolscan V ED | Nikon LS 50 ED +# Nikon Coolscan V ED +usb:v04B0p04B0* + libsane_matched=yes + +# Nikon Super Coolscan LS-5000 ED | Nikon Super Coolscan LS-5000 ED +usb:v04B0p04B0* + libsane_matched=yes + +# Epson Perfection 636U | Epson GT-7000U | Epson Perfection 636U +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 610 | Epson GT-6600U | Epson Perfection 610 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 1200U | Epson Perfection 1200Photo | Epson GT-7600U +# Epson GT-7600UF | Epson Perfection 1200U | Epson Perfection 1200U PHOTO +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Stylus Scan 2000 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Stylus Scan 2500 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Expression 1600 | Epson ES-2000 | Epson Expression 1600 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson ES-8500 | Epson Expression 1640XL +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 1640 | Epson GT-8700 | Epson GT-8700F +# Epson Perfection 1640SU | Epson Perfection 1640SU PHOTO +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 1240 | Epson GT-7700U | Epson Perfection 1240U +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 640 | Epson GT-6700U | Epson Perfection 640U +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Expression 1680 | Epson ES-2200 | Epson Expression 1680 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 1250 | Epson Perfection 1250Photo +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 1650 | Epson GT-8200U | Epson GT-8200UF +# Epson Perfection 1650 | Epson Perfection 1650 PHOTO +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 2450 | Epson GT-9700F | Epson Perfection 2450 PHOTO +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 660 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 2400 | Epson GT-9300UF | Epson Perfection 2400 PHOTO +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 3200 | Epson GT-9800F | Epson Perfection 3200 PHOTO +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 1260 | Epson Perfection 1260Photo +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 1660 | Epson GT-8300UF | Epson Perfection 1660 PHOTO +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 1670 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 1270 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 2480 | Epson Perfection 2580 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 3490 | Epson Perfection 3590 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson ES-7000H | Epson GT-15000 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 4870 | Epson GT-X700 | Epson Perfection 4870 PHOTO +usb:v04B8p04B8* + libsane_matched=yes + +# Epson ES-10000G | Epson Expression 10000XL +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Perfection 4990 | Epson GT-X800 | Epson Perfection 4990 PHOTO +usb:v04B8p04B8* + libsane_matched=yes + +# Epson ES-H300 | Epson GT-2500 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson V700 | Epson V750 | Epson GT-X900 +# Epson Perfection V700 Photo | Epson Perfection V750 Photo +usb:v04B8p04B8* + libsane_matched=yes + +# Epson GT-X970 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson CX-5200 | Epson CX-5400 | Epson CC-600PX +# Epson Stylus CX5100 | Epson Stylus CX5200 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson CX-3200 | Epson CC-570L | Epson Stylus CX3100 +# Epson Stylus CX3200 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson CX-6300 | Epson CX-6400 | Epson Stylus CX6300 +# Epson Stylus CX6400 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson RX-600 | Epson PM-A850 | Epson Stylus Photo RX600 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson RX-500 | Epson Stylus Photo RX500 | Epson Stylus Photo RX510 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson CX-5400 | Epson Stylus CX5300 | Epson Stylus CX5400 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Stylus CX-1500 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson CX-4600 | Epson Stylus CX4500 | Epson Stylus CX4600 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson CX-3600 | Epson CX-3650 | Epson PX-A550 +# Epson Stylus CX3500 | Epson Stylus CX3600 | Epson Stylus CX3650 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson RX-425 | Epson Stylus Photo RX420 | Epson Stylus Photo RX425 +# Epson Stylus Photo RX430 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson RX-700 | Epson PM-A900 | Epson Stylus Photo RX700 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson RX-620 | Epson PM-A870 | Epson Stylus Photo RX620 +# Epson Stylus Photo RX630 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson CX-6500 | Epson CX-6600 | Epson Stylus CX6500 +# Epson Stylus CX6600 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PM-A700 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson AcuLaser CX11 | Epson AcuLaser CX11NF | Epson AcuLaser CX11 +# Epson AcuLaser CX11NF | Epson LP-A500 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson LP-M5500 | Epson LP-M5500F +usb:v04B8p04B8* + libsane_matched=yes + +# Epson DX-3850 | Epson CX-3700 | Epson CX-3800 +# Epson DX-3800 | Epson Stylus CX3700 | Epson Stylus CX3800 +# Epson Stylus DX3800 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson CX-4800 | Epson PX-A650 | Epson Stylus CX4700 +# Epson Stylus CX4800 | Epson Stylus DX4800 | Epson Stylus DX4850 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PM-A750 | Epson Stylus Photo RX520 | Epson Stylus Photo RX530 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PM-A890 | Epson Stylus Photo RX640 | Epson Stylus Photo RX650 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PM-A950 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Stylus CX7700 | Epson Stylus CX7800 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson CX-4200 | Epson Stylus CX4100 | Epson Stylus CX4200 +# Epson Stylus DX4200 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PM-A820 | Epson Stylus Photo RX560 | Epson Stylus Photo RX580 +# Epson Stylus Photo RX590 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PM-A970 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PM-T990 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PM-A920 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson CX-5000 | Epson DX-5000 | Epson DX-5050 +# Epson Stylus CX4900 | Epson Stylus CX5000 | Epson Stylus DX5000 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson DX-6000 | Epson PX-A720 | Epson Stylus CX5900 +# Epson Stylus CX6000 | Epson Stylus DX6000 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson DX-4050 | Epson PX-A620 | Epson Stylus CX3900 +# Epson Stylus DX4000 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson ME 200 | Epson Stylus CX2800 | Epson Stylus CX2900 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson LP-M5600 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson LP-M6000 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson AcuLaser CX21 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PM-T960 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PM-A940 | Epson Stylus Photo RX680 | Epson Stylus Photo RX685 +# Epson Stylus Photo RX690 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson DX-7400 | Epson PX-A640 | Epson Stylus CX7300 +# Epson Stylus CX7400 | Epson Stylus DX7400 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PX-A740 | Epson Stylus CX8300 | Epson Stylus CX8400 +# Epson Stylus DX8400 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PX-FA700 | Epson Stylus CX9300F | Epson Stylus CX9400Fax +# Epson Stylus DX9400F +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PM-A840 | Epson PM-A840S | Epson Stylus Photo RX585 +# Epson Stylus Photo RX595 | Epson Stylus Photo RX610 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson ME 300 | Epson PX-401A | Epson Stylus NX100 +# Epson Stylus SX100 | Epson Stylus TX100 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson LP-M5000 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Artisan 800 | Epson EP-901A | Epson EP-901F +# Epson Stylus Photo PX800FW | Epson Stylus Photo TX800FW +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Artisan 700 | Epson EP-801A | Epson Stylus Photo PX700W +# Epson Stylus Photo TX700W +usb:v04B8p04B8* + libsane_matched=yes + +# Epson ME Office 700FW | Epson PX-601F | Epson Stylus Office BX600FW +# Epson Stylus Office TX600FW | Epson Stylus SX600FW | Epson WorkForce 600 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson ME Office 600F | Epson Stylus Office BX300F | Epson Stylus Office TX300F +# Epson Stylus NX300 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Stylus NX200 | Epson Stylus SX200 | Epson Stylus SX205 +# Epson Stylus TX200 | Epson Stylus TX203 | Epson Stylus TX209 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PX-501A | Epson Stylus NX400 | Epson Stylus SX400 +# Epson Stylus SX405 | Epson Stylus TX400 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson WorkForce 500 +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PX-402A | Epson Stylus NX110 Series | Epson Stylus SX110 Series +# Epson Stylus TX110 Series +usb:v04B8p04B8* + libsane_matched=yes + +# Epson ME OFFICE 510 | Epson Stylus NX210 Series | Epson Stylus SX210 Series +# Epson Stylus TX210 Series +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Stylus NX410 Series | Epson Stylus SX410 Series | Epson Stylus TX410 Series +usb:v04B8p04B8* + libsane_matched=yes + +# Epson ME OFFICE 650FN Series | Epson Stylus Office BX310FN Series | Epson Stylus Office TX510FN Series +# Epson WorkForce 310 Series +usb:v04B8p04B8* + libsane_matched=yes + +# Epson PX-502A | Epson Stylus NX510 Series | Epson Stylus SX510W Series +# Epson Stylus TX550W Series +usb:v04B8p04B8* + libsane_matched=yes + +# Epson Stylus SX125 +usb:v04B8p04B8* + libsane_matched=yes + +# Fujitsu fi-4010CU +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-4120C +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-4220C +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-4530C +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-5750C +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-5110EOX/2 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-5110C +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-5650C +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-4120C2 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-4220C2 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-60F +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-4340C +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-5120C +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-5220C +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-5530C +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-5110EOX3 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-5900C +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-5015C +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-5110EOXM +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu ScanSnap S500 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu ScanSnap S500M +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-5530C2 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6140 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6240 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6130 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6230 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu ScanSnap S510 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu ScanSnap S300 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu ScanSnap S510M +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6770 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6770A +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6670 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6670A +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6750S +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu ScanSnap S300M +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6800 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6800-CGA +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu ScanSnap S1500 | Fujitsu ScanSnap S1500M +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu ScanSnap S1300 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6140Z +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6240Z +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6130Z +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6230Z +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-6110 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu fi-5950 +usb:v04C5p04C5* + libsane_matched=yes + +# Fujitsu ScanSnap iX500 +usb:v04C5p04C5* + libsane_matched=yes + +# Konica e-mini +usb:v04C8p04C8* + libsane_matched=yes + +# Panasonic KV-S2026C +usb:v04DAp04DA* + libsane_matched=yes + +# Panasonic KV-S2046C +usb:v04DAp04DA* + libsane_matched=yes + +# Panasonic KV-S1025C +usb:v04DAp04DA* + libsane_matched=yes + +# Panasonic KV-S1020C +usb:v04DAp04DA* + libsane_matched=yes + +# Panasonic KV-S2048C +usb:v04DAp04DA* + libsane_matched=yes + +# Panasonic KV-S2028C +usb:v04DAp04DA* + libsane_matched=yes + +# Panasonic KV-S4085C +usb:v04DAp04DA* + libsane_matched=yes + +# Panasonic KV-S4065C +usb:v04DAp04DA* + libsane_matched=yes + +# Panasonic KV-S7075C +usb:v04DAp04DA* + libsane_matched=yes + +# Panasonic KV-SS080 +usb:v04DAp04DA* + libsane_matched=yes + +# Panasonic KV-S1045C +usb:v04DAp04DA* + libsane_matched=yes + +# Samsung SCX-4x16 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-6x20 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung MFP-560 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung MFP-750 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4x20 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4100 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4x21 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-5x30 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4200 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-3160 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-6x22 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX4725 | Samsung SCX4725-FN +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-6x45 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-8380 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-2160 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4500 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-6200 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-6240 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-6x55 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-3170fn (CLX-3170 Series) | Samsung CLX-3175FW +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4500W +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4824 (SCX-4x24 Series) +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4828FN (SCX-4x28 Series) +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4300 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-5835_5935 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-5635 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4x26 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4600 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4623 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung MFP-65x +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-6545 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-8385 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-6220 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-6250 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4825FN (SCX-4x25 Series) +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-3185 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-8540 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4623FW +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-3205W (SCX-3200 Series) +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-6545X +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-6x55X +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-8385X +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-5835_5935X +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4833FD | Samsung SCX-4835FD +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-3400 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SF-760 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4729FD +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-6260 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-3300 Series +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-470x +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung CLX-4190 +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-4650 4x21S Series +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung M337x 387x 407x Series +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung M267x 287x Series +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung SCX-681x +usb:v04E8p04E8* + libsane_matched=yes + +# Samsung C460 +usb:v04E8p04E8* + libsane_matched=yes + +# Pentax DSmobile 600 +usb:v04F9p04F9* + libsane_matched=yes + +# Aiptek Aiptek Pencam +usb:v0553p0553* + libsane_matched=yes + +# Mustek ScanExpress 1200 CU +usb:v055Fp055F* + libsane_matched=yes + +# Mustek ScanExpress 600 CU +usb:v055Fp055F* + libsane_matched=yes + +# Mustek ScanExpress 1200 UB | Trust Compact Scan USB 19200 +usb:v055Fp055F* + libsane_matched=yes + +# Mustek ScanExpress 1200 CU Plus +usb:v055Fp055F* + libsane_matched=yes + +# Mustek BearPaw 1200 F +usb:v055Fp055F* + libsane_matched=yes + +# Mustek ScanExpress A3 USB +usb:v055Fp055F* + libsane_matched=yes + +# Mustek BearPaw 2400 CS | Mustek BearPaw 2400 TA | Trust 240TH Easy Webscan Gold +usb:v055Fp055F* + libsane_matched=yes + +# Mustek BearPaw 2400 CS Plus | Mustek BearPaw 2400 TA Plus | Mustek Plug-n-Scan 2400 MT +# Mustek Plug-n-Scan 2400 M | Packard Bell Diamond 2450 +usb:v055Fp055F* + libsane_matched=yes + +# Mustek BearPaw 2448 CS Plus | Mustek BearPaw 2448 TA Plus +usb:v055Fp055F* + libsane_matched=yes + +# Mustek BearPaw 1200 CU Plus | Packard Bell Diamond 1200 Plus +usb:v055Fp055F* + libsane_matched=yes + +# Mustek BearPaw 1200 CU Plus | Mustek BearPaw 1248 CU | Packard Bell Diamond 1200 Plus +# Trust Direct WebScan 19200 +usb:v055Fp055F* + libsane_matched=yes + +# Mustek BearPaw 2400 CU Plus +usb:v055Fp055F* + libsane_matched=yes + +# Mustek BearPaw 1200 CS | Mustek BearPaw 1200 TA +usb:v055Fp055F* + libsane_matched=yes + +# Mustek ScanExpress 1248 UB +usb:v055Fp055F* + libsane_matched=yes + +# Mustek BearPaw 2448TA Pro +usb:v055Fp055F* + libsane_matched=yes + +# Artec/Ultima Ultima 2000 | Artec/Ultima Ultima 2000 e+ | Boeder Sm@rtScan Slim Edition +# Fujitsu 1200CUS | Googlegear 2000 | Medion/Lifetec/Tevion/Cytron MD 4394 +# Medion/Lifetec/Tevion/Cytron MD/LT 9375 | Medion/Lifetec/Tevion/Cytron MD/LT 9385 | Medion/Lifetec/Tevion/Cytron LT 9452 +# Medion/Lifetec/Tevion/Cytron MD 9458 | Mustek BearPaw 1200 CU | Mustek BearPaw 2400 CU +# Mustek ScanExpress 1200 UB Plus | Mustek ScanExpress 2400 USB | Mustek ScanMagic 1200 UB Plus +# Packard Bell Diamond 1200 | Trust Compact Scan USB 19200 | Trust Flat Scan USB 19200 +usb:v05D8p05D8* + libsane_matched=yes + +# Artec/Ultima E+ 48U | Medion/Lifetec/Tevion/Cytron MD9693 | Medion/Lifetec/Tevion/Cytron MD9705 +# Medion/Lifetec/Tevion/Cytron MD4394 | Microstar MR 9791 +usb:v05D8p05D8* + libsane_matched=yes + +# Artec/Ultima E+ Pro +usb:v05D8p05D8* + libsane_matched=yes + +# Memorex MEM 48U +usb:v05D8p05D8* + libsane_matched=yes + +# Trust Easy Webscan 19200 +usb:v05D8p05D8* + libsane_matched=yes + +# Trust 240H Easy Webscan Gold +usb:v05D8p05D8* + libsane_matched=yes + +# UMAX AstraSlim SE +usb:v05D8p05D8* + libsane_matched=yes + +# UMAX AstraSlim 1200 SE +usb:v05D8p05D8* + libsane_matched=yes + +# Yakumo Scan50 +usb:v05D8p05D8* + libsane_matched=yes + +# Microtek ScanMaker X6USB +usb:v05DAp05DA* + libsane_matched=yes + +# Microtek SlimScan C6 +usb:v05DAp05DA* + libsane_matched=yes + +# Microtek ScanMaker V6USL +usb:v05DAp05DA* + libsane_matched=yes + +# Microtek ScanMaker V6UPL +usb:v05DAp05DA* + libsane_matched=yes + +# Microtek ScanMaker 4800 +usb:v05DAp05DA* + libsane_matched=yes + +# Microtek ScanMaker 3840 +usb:v05DAp05DA* + libsane_matched=yes + +# Microtek ScanMaker 3600 +usb:v05DAp05DA* + libsane_matched=yes + +# Microtek ScanMaker 3700 +usb:v05DAp05DA* + libsane_matched=yes + +# Microtek ScanMaker 3600 +usb:v05DAp05DA* + libsane_matched=yes + +# Microtek ScanMaker 3700 +usb:v05DAp05DA* + libsane_matched=yes + +# Microtek ScanMaker 3750 +usb:v05DAp05DA* + libsane_matched=yes + +# Microtek ScanMaker 3600 +usb:v05DAp05DA* + libsane_matched=yes + +# Microtek ScanMaker V6USL +usb:v05DAp05DA* + libsane_matched=yes + +# iVina 1200U +usb:v0638p0638* + libsane_matched=yes + +# Minolta Dimage Scan Dual II +usb:v0638p0638* + libsane_matched=yes + +# Avision AV600U +usb:v0638p0638* + libsane_matched=yes + +# Minolta-QMS SC-110 +usb:v0638p0638* + libsane_matched=yes + +# Avision DS610CU Scancopier | Minolta-QMS SC-215 | OKI S700 Scancopier +usb:v0638p0638* + libsane_matched=yes + +# Avision AV610 | Avision AV600U Plus +usb:v0638p0638* + libsane_matched=yes + +# Avision AV220 +usb:v0638p0638* + libsane_matched=yes + +# Avision AV210 +usb:v0638p0638* + libsane_matched=yes + +# Avision AV210 +usb:v0638p0638* + libsane_matched=yes + +# Avision AV120 +usb:v0638p0638* + libsane_matched=yes + +# Avision AV220C2 +usb:v0638p0638* + libsane_matched=yes + +# Avision AV220D2 +usb:v0638p0638* + libsane_matched=yes + +# Avision AV220+ +usb:v0638p0638* + libsane_matched=yes + +# Avision AV220C2-G +usb:v0638p0638* + libsane_matched=yes + +# Avision AV220C2-B +usb:v0638p0638* + libsane_matched=yes + +# Avision AV210C2-G +usb:v0638p0638* + libsane_matched=yes + +# Avision AV122 +usb:v0638p0638* + libsane_matched=yes + +# Avision AV210C2 +usb:v0638p0638* + libsane_matched=yes + +# Avision AV121 +usb:v0638p0638* + libsane_matched=yes + +# Avision AV8300 +usb:v0638p0638* + libsane_matched=yes + +# Avision AM3000 Series +usb:v0638p0638* + libsane_matched=yes + +# Avision @V5100 +usb:v0638p0638* + libsane_matched=yes + +# Avision AV8050U +usb:v0638p0638* + libsane_matched=yes + +# Avision AV3200SU +usb:v0638p0638* + libsane_matched=yes + +# Avision AV3730SU +usb:v0638p0638* + libsane_matched=yes + +# Avision AV610C2 +usb:v0638p0638* + libsane_matched=yes + +# Avision IT8300 +usb:v0638p0638* + libsane_matched=yes + +# Avision AV3750SU +usb:v0638p0638* + libsane_matched=yes + +# Avision AV3850SU +usb:v0638p0638* + libsane_matched=yes + +# Avision AV8350 +usb:v0638p0638* + libsane_matched=yes + +# Avision FB6080E +usb:v0638p0638* + libsane_matched=yes + +# Avision FB2080E +usb:v0638p0638* + libsane_matched=yes + +# Avision AV122 C2 +usb:v0638p0638* + libsane_matched=yes + +# Avision AV220-G +usb:v0638p0638* + libsane_matched=yes + +# Avision @V2500 +usb:v0638p0638* + libsane_matched=yes + +# Avision AV210D2+ +usb:v0638p0638* + libsane_matched=yes + +# Minolta Elite II +usb:v0686p0686* + libsane_matched=yes + +# Minolta Dimage Scan Dual III +usb:v0686p0686* + libsane_matched=yes + +# Minolta Dimage Scan Elite 5400 +usb:v0686p0686* + libsane_matched=yes + +# AGFA SnapScan 1212U +usb:v06BDp06BD* + libsane_matched=yes + +# AGFA SnapScan 1236u +usb:v06BDp06BD* + libsane_matched=yes + +# Agfa Snapscan Touch +usb:v06BDp06BD* + libsane_matched=yes + +# AGFA SnapScan 1212U_2 +usb:v06BDp06BD* + libsane_matched=yes + +# AGFA SnapScan e40 +usb:v06BDp06BD* + libsane_matched=yes + +# AGFA SnapScan e50 +usb:v06BDp06BD* + libsane_matched=yes + +# AGFA SnapScan e20 +usb:v06BDp06BD* + libsane_matched=yes + +# AGFA SnapScan e10 +usb:v06BDp06BD* + libsane_matched=yes + +# AGFA SnapScan e25 +usb:v06BDp06BD* + libsane_matched=yes + +# AGFA SnapScan e26 +usb:v06BDp06BD* + libsane_matched=yes + +# AGFA SnapScan e52 +usb:v06BDp06BD* + libsane_matched=yes + +# AGFA SnapScan e42 +usb:v06BDp06BD* + libsane_matched=yes + +# UMAX Astra 4900 +usb:v06DCp06DC* + libsane_matched=yes + +# Plustek OpticPro U12 | Plustek OpticPro UT12 | Plustek OpticPro 1212U +# RevScan RevScan Orange R48Ti | Genius ColorPage Vivid III USB +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticPro U12 +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticPro U24 +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticPro UT12 +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticPro U24 +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticPro UT12 | Plustek OpticPro UT16 | Plustek OpticPro UT24 +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticPro 1248U | RevScan 19200i +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticPro 1248U +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticPro U16B +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticPro U16B+ | Plustek OpticPro UT16B +usb:v07B3p07B3* + libsane_matched=yes + +# Nortek MyScan 1200 | Plustek OpticPro S12 | Plustek OpticPro ST12 +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticPro S24 +usb:v07B3p07B3* + libsane_matched=yes + +# NeatReceipts Scanalizer Professional 2.5 | Plustek OpticSlim M12 +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticSlim 1200 +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticSlim 2400 +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticSlim 2400 plus +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek Iriscan Express 2 +usb:v07B3p07B3* + libsane_matched=yes + +# NeatReceipts Mobile Scanner +usb:v07B3p07B3* + libsane_matched=yes + +# Plustek OpticBook 3600 +usb:v07B3p07B3* + libsane_matched=yes + +# Corex 600c +usb:v08F0p08F0* + libsane_matched=yes + +# Corex 800c +usb:v08F0p08F0* + libsane_matched=yes + +# Xerox Phaser 6110MFP +usb:v0924p0924* + libsane_matched=yes + +# Xerox Phaser 3200MFP +usb:v0924p0924* + libsane_matched=yes + +# Xerox WorkCentre 4118 Series +usb:v0924p0924* + libsane_matched=yes + +# Xerox WorkCentre 3119 Series +usb:v0924p0924* + libsane_matched=yes + +# Xerox WorkCentre 3210 +usb:v0924p0924* + libsane_matched=yes + +# Xerox WorkCentre 3220 +usb:v0924p0924* + libsane_matched=yes + +# Pentax DSmobile 600 +usb:v0A17p0A17* + libsane_matched=yes + +# Portable Peripheral Co., Ltd. Q-Scan USB001 (A4 portable scanner) +usb:v0A53p0A53* + libsane_matched=yes + +# Portable Peripheral Co., Ltd. Q-Scan USB201 (A6 portable scanner) +usb:v0A53p0A53* + libsane_matched=yes + +# Syscan TravelScan 460/464 | Ambir Visigo A4 +usb:v0A82p0A82* + libsane_matched=yes + +# Syscan DocketPort 465 +usb:v0A82p0A82* + libsane_matched=yes + +# Syscan DocketPort 665 +usb:v0A82p0A82* + libsane_matched=yes + +# Syscan DocketPort 685/ Ambir DS685 +usb:v0A82p0A82* + libsane_matched=yes + +# Syscan DocketPort 485 +usb:v0A82p0A82* + libsane_matched=yes + +# Syscan TravelScan 662 +usb:v0A82p0A82* + libsane_matched=yes + +# Canon CR-55 +usb:v1083p1083* + libsane_matched=yes + +# Canon DR-1210C +usb:v1083p1083* + libsane_matched=yes + +# Canon DR-4010C +usb:v1083p1083* + libsane_matched=yes + +# Canon DR-2510C +usb:v1083p1083* + libsane_matched=yes + +# Canon DR-X10C +usb:v1083p1083* + libsane_matched=yes + +# Canon CR-25 +usb:v1083p1083* + libsane_matched=yes + +# Canon DR-2010C +usb:v1083p1083* + libsane_matched=yes + +# Canon DR-3010C +usb:v1083p1083* + libsane_matched=yes + +# Canon DR-7090C +usb:v1083p1083* + libsane_matched=yes + +# Canon DR-9050C +usb:v1083p1083* + libsane_matched=yes + +# Canon DR-7550C +usb:v1083p1083* + libsane_matched=yes + +# Canon DR-6050C +usb:v1083p1083* + libsane_matched=yes + +# Canon DR-6010C +usb:v1083p1083* + libsane_matched=yes + +# Canon CR-190i +usb:v1083p1083* + libsane_matched=yes + +# Canon DR-6030C +usb:v1083p1083* + libsane_matched=yes + +# Canon CR-135i +usb:v1083p1083* + libsane_matched=yes + +# Digital Dream l' espion XS +usb:v1183p1183* + libsane_matched=yes + +# KONICA MINOLTA magicolor 1690MF +usb:v132Bp132B* + libsane_matched=yes + +# UMAX Astra 1220U +usb:v1606p1606* + libsane_matched=yes + +# UMAX Astra 1600U | UMAX Astra 2000U +usb:v1606p1606* + libsane_matched=yes + +# Umax UMAX 3400 +usb:v1606p1606* + libsane_matched=yes + +# Umax UMAX 3400 | Umax UMAX Astranet ia101 | Umax UMAX 3450 +usb:v1606p1606* + libsane_matched=yes + +# UMAX Astra 4400 | UMAX Astra 4450 +usb:v1606p1606* + libsane_matched=yes + +# UMAX Astra 2100U +usb:v1606p1606* + libsane_matched=yes + +# Umax UMAX 5400 +usb:v1606p1606* + libsane_matched=yes + +# UMAX Astra 2200 (SU) +usb:v1606p1606* + libsane_matched=yes + +# DCT DocketPort 487 +usb:v1DCCp1DCC* + libsane_matched=yes + +# Dell A920 +usb:v413Cp413C* + libsane_matched=yes + +# Dell Dell MFP Laser Printer 1815dn +usb:v413Cp413C* + libsane_matched=yes + +# Dell 1600n +usb:v413Cp413C* + libsane_matched=yes + diff --git a/testsuite/tools/data/udev+hwdb.ref b/testsuite/tools/data/udev+hwdb.ref new file mode 100644 index 000000000..a7157db91 --- /dev/null +++ b/testsuite/tools/data/udev+hwdb.ref @@ -0,0 +1,76 @@ +# This file was automatically created based on description files (*.desc) +# by sane-desc 3.5 from sane-backends 1.0.24git on Thu Aug 1 18:50:15 2013 +# +# udev rules file for supported USB and SCSI devices +# +# For the list of supported USB devices see /usr/lib/udev/hwdb.d/20-sane.hwdb +# +# The SCSI device support is very basic and includes only +# scanners that mark themselves as type "scanner" or +# SCSI-scanners from HP and other vendors that are entitled "processor" +# but are treated accordingly. +# +# If your SCSI scanner isn't listed below, you can add it to a new rules +# file under /etc/udev/rules.d/. +# +# If your scanner is supported by some external backend (brother, epkowa, +# hpaio, etc) please ask the author of the backend to provide proper +# device detection support for your OS +# +# If the scanner is supported by sane-backends, please mail the entry to +# the sane-devel mailing list (sane-devel@lists.alioth.debian.org). +# +ACTION!="add", GOTO="libsane_rules_end" + +# The following rule will disable USB autosuspend for the device +ENV{DEVTYPE}=="usb_device", ENV{libsane_matched}=="yes", TEST=="power/control", ATTR{power/control}="on" + +SUBSYSTEMS!="scsi", GOTO="libsane_rules_end" +KERNEL!="sg[0-9]*", GOTO="libsane_rules_end" + +# Generic: SCSI device type 6 indicates a scanner +ATTRS{type}=="6", ENV{libsane_matched}="yes" + +# Some scanners advertise themselves as SCSI device type 3 + +# Wildcard: for some Epson SCSI scanners +ATTRS{type}=="3", ATTRS{vendor}=="EPSON", ATTRS{model}=="SCANNER*", ENV{libsane_matched}="yes" + +# Epson Perfection 2450 | Epson Perfection 2450 PHOTO +ATTRS{type}=="3", ATTRS{vendor}=="EPSON", ATTRS{model}=="GT-9700", ENV{libsane_matched}="yes" + +# Epson Perfection 3200 | Epson Perfection 3200 PHOTO +ATTRS{type}=="3", ATTRS{vendor}=="EPSON", ATTRS{model}=="GT-9800", ENV{libsane_matched}="yes" + +# Epson Perfection 636S | Epson Perfection 1200S +ATTRS{type}=="3", ATTRS{vendor}=="EPSON", ATTRS{model}=="Perfection1200", ENV{libsane_matched}="yes" + +# Epson Perfection 636 +ATTRS{type}=="3", ATTRS{vendor}=="EPSON", ATTRS{model}=="Perfection636", ENV{libsane_matched}="yes" + +# Hewlett-Packard ScanJet 4p +ATTRS{type}=="3", ATTRS{vendor}=="HP", ATTRS{model}=="C1130A", ENV{libsane_matched}="yes" + +# Hewlett-Packard ScanJet IIc +ATTRS{type}=="3", ATTRS{vendor}=="HP", ATTRS{model}=="C1750A", ENV{libsane_matched}="yes" + +# Hewlett-Packard ScanJet IIp +ATTRS{type}=="3", ATTRS{vendor}=="HP", ATTRS{model}=="C1790A", ENV{libsane_matched}="yes" + +# Hewlett-Packard ScanJet IIcx +ATTRS{type}=="3", ATTRS{vendor}=="HP", ATTRS{model}=="C2500A", ENV{libsane_matched}="yes" + +# Hewlett-Packard ScanJet 4c +ATTRS{type}=="3", ATTRS{vendor}=="HP", ATTRS{model}=="C2520A", ENV{libsane_matched}="yes" + +# Hewlett-Packard ScanJet 5p +ATTRS{type}=="3", ATTRS{vendor}=="HP", ATTRS{model}=="C5110A", ENV{libsane_matched}="yes" + +# Hewlett-Packard ScanJet 6200C +ATTRS{type}=="3", ATTRS{vendor}=="HP", ATTRS{model}=="C6270A", ENV{libsane_matched}="yes" + +# Hewlett-Packard ScanJet 6300C +ATTRS{type}=="3", ATTRS{vendor}=="HP", ATTRS{model}=="C7670A", ENV{libsane_matched}="yes" + + +LABEL="libsane_rules_end" diff --git a/tools/sane-desc.c b/tools/sane-desc.c index 5fb51bc6e..98cf1940c 100644 --- a/tools/sane-desc.c +++ b/tools/sane-desc.c @@ -81,6 +81,8 @@ typedef enum output_mode output_mode_db, output_mode_udev, output_mode_udevacl, + output_mode_udevhwdb, + output_mode_hwdb, output_mode_plist, output_mode_hal, output_mode_halnew @@ -317,7 +319,7 @@ print_usage (char *program_name) "(multiple directories can be concatenated by \":\")\n"); printf (" -m|--mode mode " "Output mode (ascii, html-backends-split, html-mfgs,\n" - " xml, statistics, usermap, db, udev, udev+acl, plist, hal, hal-new)\n"); + " xml, statistics, usermap, db, udev, udev+acl, udev+hwdb, hwdb, plist, hal, hal-new)\n"); printf (" -t|--title \"title\" The title used for HTML pages\n"); printf (" -i|--intro \"intro\" A short description of the " "contents of the page\n"); @@ -419,6 +421,16 @@ get_options (int argc, char **argv) DBG_INFO ("Output mode: %s\n", optarg); mode = output_mode_udevacl; } + else if (strcmp (optarg, "udev+hwdb") == 0) + { + DBG_INFO ("Output mode: %s\n", optarg); + mode = output_mode_udevhwdb; + } + else if (strcmp (optarg, "hwdb") == 0) + { + DBG_INFO ("Output mode: %s\n", optarg); + mode = output_mode_hwdb; + } else if (strcmp (optarg, "plist") == 0) { DBG_INFO ("Output mode: %s\n", optarg); @@ -3635,6 +3647,198 @@ print_udev (void) printf ("\nLABEL=\"libsane_rules_end\"\n"); } + +/* print libsane.rules for Linux udev */ +static void +print_udevhwdb_header (void) +{ + time_t current_time = time (0); + printf ("# This file was automatically created based on description files (*.desc)\n" + "# by sane-desc %s from %s on %s", + SANE_DESC_VERSION, PACKAGE_STRING, asctime (localtime (¤t_time))); + + printf + ("#\n" + "# udev rules file for supported USB and SCSI devices\n" + "#\n" + "# For the list of supported USB devices see /usr/lib/udev/hwdb.d/20-sane.hwdb\n" + "# \n" + "# The SCSI device support is very basic and includes only\n" + "# scanners that mark themselves as type \"scanner\" or\n" + "# SCSI-scanners from HP and other vendors that are entitled \"processor\"\n" + "# but are treated accordingly.\n" + "#\n"); + printf + ("# If your SCSI scanner isn't listed below, you can add it to a new rules\n" + "# file under /etc/udev/rules.d/.\n" + "#\n" + "# If your scanner is supported by some external backend (brother, epkowa,\n" + "# hpaio, etc) please ask the author of the backend to provide proper\n" + "# device detection support for your OS\n" + "#\n" + "# If the scanner is supported by sane-backends, please mail the entry to\n" + "# the sane-devel mailing list (sane-devel@lists.alioth.debian.org).\n" + "#\n" + ); +} + +static void +print_udevhwdb (void) +{ + scsiid_type *scsiid = create_scsiids_table (); + int i; + + print_udevhwdb_header (); + printf("ACTION!=\"add\", GOTO=\"libsane_rules_end\"\n\n"); + + printf("# The following rule will disable USB autosuspend for the device\n"); + printf("ENV{DEVTYPE}==\"usb_device\", ENV{libsane_matched}==\"yes\", TEST==\"power/control\", ATTR{power/control}=\"on\"\n\n"); + + printf ("SUBSYSTEMS!=\"scsi\", GOTO=\"libsane_rules_end\"\n"); + printf ("KERNEL!=\"sg[0-9]*\", GOTO=\"libsane_rules_end\"\n\n"); + + printf ("# Generic: SCSI device type 6 indicates a scanner\n"); + printf ("ATTRS{type}==\"6\", ENV{libsane_matched}=\"yes\"\n\n"); + + printf ("# Some scanners advertise themselves as SCSI device type 3\n\n"); + + printf ("# Wildcard: for some Epson SCSI scanners\n"); + printf ("ATTRS{type}==\"3\", ATTRS{vendor}==\"EPSON\", ATTRS{model}==\"SCANNER*\", ENV{libsane_matched}=\"yes\"\n\n"); + + while (scsiid) + { + manufacturer_model_type * name = scsiid->name; + + if (!scsiid->is_processor) + { + scsiid = scsiid->next; + continue; + } + + /* Wildcard for Epson scanners: vendor = EPSON, product = SCANNER* */ + if ((strcmp(scsiid->scsi_vendor_id, "EPSON") == 0) + && (strncmp(scsiid->scsi_product_id, "SCANNER", 7) == 0)) + { + scsiid = scsiid->next; + continue; + } + + i = 0; + printf ("# "); + while (name) + { + if ((name != scsiid->name) && (i > 0)) + printf (" | "); + printf ("%s", name->name); + name = name->next; + + i++; + + /* + * Limit the number of model names on the same line to 3, + * as udev cannot handle very long lines and prints a warning + * message while loading the rules files. + */ + if ((i == 3) && (name != NULL)) + { + printf("\n# "); + i = 0; + } + } + printf ("\n"); + + printf ("ATTRS{type}==\"3\", ATTRS{vendor}==\"%s\", ATTRS{model}==\"%s\", ENV{libsane_matched}=\"yes\"\n\n", + scsiid->scsi_vendor_id, scsiid->scsi_product_id); + + scsiid = scsiid->next; + } + + printf ("\nLABEL=\"libsane_rules_end\"\n"); +} + +/* print /usr/lib/udev/hwdb.d/20-sane.conf for Linux hwdb */ +static void +print_hwdb_header (void) +{ + time_t current_time = time (0); + printf ("# This file was automatically created based on description files (*.desc)\n" + "# by sane-desc %s from %s on %s", + SANE_DESC_VERSION, PACKAGE_STRING, asctime (localtime (¤t_time))); + + printf + ("#\n" + "# hwdb file for supported USB devices\n" + "#\n"); + printf + ("# If your scanner isn't listed below, you can add it to a new hwdb file\n" + "# under /etc/udev/hwdb.d/.\n" + "#\n" + "# If your scanner is supported by some external backend (brother, epkowa,\n" + "# hpaio, etc) please ask the author of the backend to provide proper\n" + "# device detection support for your OS\n" + "#\n" + "# If the scanner is supported by sane-backends, please mail the entry to\n" + "# the sane-devel mailing list (sane-devel@lists.alioth.debian.org).\n" + "#\n" + ); +} + +static void +print_hwdb (void) +{ + usbid_type *usbid = create_usbids_table (); + char *vendor_id; + char *product_id; + int i,j; + + print_hwdb_header (); + + while (usbid) + { + manufacturer_model_type * name = usbid->name; + + i = 0; + printf ("# "); + while (name) + { + if ((name != usbid->name) && (i > 0)) + printf (" | "); + printf ("%s", name->name); + name = name->next; + + i++; + + /* + * Limit the number of model names on the same line to 3, + * as udev cannot handle very long lines and prints a warning + * message while loading the rules files. + */ + if ((i == 3) && (name != NULL)) + { + printf("\n# "); + i = 0; + } + } + printf ("\n"); + + vendor_id = strdup(usbid->usb_vendor_id + 2); + product_id = strdup(usbid->usb_product_id + 2); + + for(j = 0; j < 4; j++) { + vendor_id[j] = toupper(vendor_id[j]); + product_id[j] = toupper(vendor_id[j]); + } + + printf ("usb:v%sp%s*\n libsane_matched=yes\n\n", + vendor_id, product_id); + + free(vendor_id); + free(product_id); + + usbid = usbid->next; + } +} + static void print_plist (void) { @@ -3827,6 +4031,12 @@ main (int argc, char **argv) case output_mode_udevacl: print_udev (); break; + case output_mode_udevhwdb: + print_udevhwdb (); + break; + case output_mode_hwdb: + print_hwdb (); + break; case output_mode_plist: print_plist (); break;