Add new kvs20xx backend from Panasonic, for KV-S202xC and KV-S204xC

merge-requests/1/head
m. allan noah 2010-06-09 16:31:00 -04:00
rodzic c615c665b4
commit e7efa77aa5
15 zmienionych plików z 2241 dodań i 30 usunięć

Wyświetl plik

@ -1,3 +1,7 @@
2010-06-09 m. allan noah <kitno455 at gmail dot com>
* backend/kvs20xx*, Makefiles, confs and docs:
- Add new kvs20xx backend from Panasonic, for KV-S202xC and KV-S204xC
2010-06-09 m. allan noah <kitno455 at gmail dot com>
* backend/fujitsu.[ch]: backend v100:
- store more Request Sense data in scanner struct

Wyświetl plik

@ -176,7 +176,7 @@ be_convenience_libs = libabaton.la libagfafocus.la \
libhp3500.la libhp3900.la libhp4200.la \
libhp5400.la libhp5590.la libhpljm1005.la \
libhpsj5s.la libhs2p.la libibm.la libkodak.la \
libkvs1025.la \
libkvs1025.la libkvs20xx.la \
libleo.la liblexmark.la libma1509.la \
libmatsushita.la libmicrotek.la libmicrotek2.la \
libmustek.la libmustek_pp.la libmustek_usb.la \
@ -209,7 +209,7 @@ be_dlopen_libs = libsane-abaton.la libsane-agfafocus.la \
libsane-hp3500.la libsane-hp3900.la libsane-hp4200.la \
libsane-hp5400.la libsane-hp5590.la libsane-hpljm1005.la \
libsane-hpsj5s.la libsane-hs2p.la libsane-ibm.la libsane-kodak.la \
libsane-kvs1025.la \
libsane-kvs1025.la libsane-kvs20xx.la \
libsane-leo.la libsane-lexmark.la libsane-ma1509.la \
libsane-matsushita.la libsane-microtek.la libsane-microtek2.la \
libsane-mustek.la libsane-mustek_pp.la libsane-mustek_usb.la \
@ -629,6 +629,15 @@ libsane_kvs1025_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kvs1025
libsane_kvs1025_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_kvs1025_la_LIBADD = $(COMMON_LIBS) libkvs1025.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(USB_LIBS) $(RESMGR_LIBS)
libkvs20xx_la_SOURCES = kvs20xx.c kvs20xx_cmd.c kvs20xx_opt.c \
kvs20xx_cmd.h kvs20xx.h
libkvs20xx_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kvs20xx
nodist_libsane_kvs20xx_la_SOURCES = kvs20xx-s.c
libsane_kvs20xx_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kvs20xx
libsane_kvs20xx_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_kvs20xx_la_LIBADD = $(COMMON_LIBS) libkvs20xx.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS)
libleo_la_SOURCES = leo.c leo.h
libleo_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=leo

Wyświetl plik

@ -205,6 +205,10 @@ am_libkvs1025_la_OBJECTS = libkvs1025_la-kvs1025.lo \
libkvs1025_la-kvs1025_low.lo libkvs1025_la-kvs1025_opt.lo \
libkvs1025_la-kvs1025_usb.lo
libkvs1025_la_OBJECTS = $(am_libkvs1025_la_OBJECTS)
libkvs20xx_la_LIBADD =
am_libkvs20xx_la_OBJECTS = libkvs20xx_la-kvs20xx.lo \
libkvs20xx_la-kvs20xx_cmd.lo libkvs20xx_la-kvs20xx_opt.lo
libkvs20xx_la_OBJECTS = $(am_libkvs20xx_la_OBJECTS)
libleo_la_LIBADD =
am_libleo_la_OBJECTS = libleo_la-leo.lo
libleo_la_OBJECTS = $(am_libleo_la_OBJECTS)
@ -722,6 +726,17 @@ libsane_kvs1025_la_OBJECTS = $(nodist_libsane_kvs1025_la_OBJECTS)
libsane_kvs1025_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(libsane_kvs1025_la_LDFLAGS) $(LDFLAGS) -o $@
libsane_kvs20xx_la_DEPENDENCIES = $(COMMON_LIBS) libkvs20xx.la \
../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo \
../sanei/sanei_config.lo sane_strstatus.lo \
../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1)
nodist_libsane_kvs20xx_la_OBJECTS = libsane_kvs20xx_la-kvs20xx-s.lo
libsane_kvs20xx_la_OBJECTS = $(nodist_libsane_kvs20xx_la_OBJECTS)
libsane_kvs20xx_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(libsane_kvs20xx_la_LDFLAGS) $(LDFLAGS) -o $@
libsane_leo_la_DEPENDENCIES = $(COMMON_LIBS) libleo.la \
../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo \
../sanei/sanei_config.lo ../sanei/sanei_config2.lo \
@ -1278,14 +1293,15 @@ SOURCES = $(libabaton_la_SOURCES) $(libagfafocus_la_SOURCES) \
$(libhp5590_la_SOURCES) $(libhpljm1005_la_SOURCES) \
$(libhpsj5s_la_SOURCES) $(libhs2p_la_SOURCES) \
$(libibm_la_SOURCES) $(libkodak_la_SOURCES) \
$(libkvs1025_la_SOURCES) $(libleo_la_SOURCES) \
$(liblexmark_la_SOURCES) $(libma1509_la_SOURCES) \
$(libmatsushita_la_SOURCES) $(libmicrotek_la_SOURCES) \
$(libmicrotek2_la_SOURCES) $(libmustek_la_SOURCES) \
$(libmustek_pp_la_SOURCES) $(libmustek_usb_la_SOURCES) \
$(libmustek_usb2_la_SOURCES) $(libnec_la_SOURCES) \
$(libnet_la_SOURCES) $(libniash_la_SOURCES) \
$(libp5_la_SOURCES) $(libpie_la_SOURCES) $(libpint_la_SOURCES) \
$(libkvs1025_la_SOURCES) $(libkvs20xx_la_SOURCES) \
$(libleo_la_SOURCES) $(liblexmark_la_SOURCES) \
$(libma1509_la_SOURCES) $(libmatsushita_la_SOURCES) \
$(libmicrotek_la_SOURCES) $(libmicrotek2_la_SOURCES) \
$(libmustek_la_SOURCES) $(libmustek_pp_la_SOURCES) \
$(libmustek_usb_la_SOURCES) $(libmustek_usb2_la_SOURCES) \
$(libnec_la_SOURCES) $(libnet_la_SOURCES) \
$(libniash_la_SOURCES) $(libp5_la_SOURCES) \
$(libpie_la_SOURCES) $(libpint_la_SOURCES) \
$(libpixma_la_SOURCES) $(libplustek_la_SOURCES) \
$(libplustek_pp_la_SOURCES) $(libpnm_la_SOURCES) \
$(libqcam_la_SOURCES) $(libricoh_la_SOURCES) \
@ -1331,6 +1347,7 @@ SOURCES = $(libabaton_la_SOURCES) $(libagfafocus_la_SOURCES) \
$(nodist_libsane_ibm_la_SOURCES) \
$(nodist_libsane_kodak_la_SOURCES) \
$(nodist_libsane_kvs1025_la_SOURCES) \
$(nodist_libsane_kvs20xx_la_SOURCES) \
$(nodist_libsane_leo_la_SOURCES) \
$(nodist_libsane_lexmark_la_SOURCES) \
$(nodist_libsane_ma1509_la_SOURCES) \
@ -1404,14 +1421,15 @@ DIST_SOURCES = $(libabaton_la_SOURCES) $(libagfafocus_la_SOURCES) \
$(libhp5590_la_SOURCES) $(libhpljm1005_la_SOURCES) \
$(libhpsj5s_la_SOURCES) $(libhs2p_la_SOURCES) \
$(libibm_la_SOURCES) $(libkodak_la_SOURCES) \
$(libkvs1025_la_SOURCES) $(libleo_la_SOURCES) \
$(liblexmark_la_SOURCES) $(libma1509_la_SOURCES) \
$(libmatsushita_la_SOURCES) $(libmicrotek_la_SOURCES) \
$(libmicrotek2_la_SOURCES) $(libmustek_la_SOURCES) \
$(libmustek_pp_la_SOURCES) $(libmustek_usb_la_SOURCES) \
$(libmustek_usb2_la_SOURCES) $(libnec_la_SOURCES) \
$(libnet_la_SOURCES) $(libniash_la_SOURCES) \
$(libp5_la_SOURCES) $(libpie_la_SOURCES) $(libpint_la_SOURCES) \
$(libkvs1025_la_SOURCES) $(libkvs20xx_la_SOURCES) \
$(libleo_la_SOURCES) $(liblexmark_la_SOURCES) \
$(libma1509_la_SOURCES) $(libmatsushita_la_SOURCES) \
$(libmicrotek_la_SOURCES) $(libmicrotek2_la_SOURCES) \
$(libmustek_la_SOURCES) $(libmustek_pp_la_SOURCES) \
$(libmustek_usb_la_SOURCES) $(libmustek_usb2_la_SOURCES) \
$(libnec_la_SOURCES) $(libnet_la_SOURCES) \
$(libniash_la_SOURCES) $(libp5_la_SOURCES) \
$(libpie_la_SOURCES) $(libpint_la_SOURCES) \
$(libpixma_la_SOURCES) $(libplustek_la_SOURCES) \
$(libplustek_pp_la_SOURCES) $(libpnm_la_SOURCES) \
$(libqcam_la_SOURCES) $(libricoh_la_SOURCES) \
@ -1751,7 +1769,7 @@ be_convenience_libs = libabaton.la libagfafocus.la \
libhp3500.la libhp3900.la libhp4200.la \
libhp5400.la libhp5590.la libhpljm1005.la \
libhpsj5s.la libhs2p.la libibm.la libkodak.la \
libkvs1025.la \
libkvs1025.la libkvs20xx.la \
libleo.la liblexmark.la libma1509.la \
libmatsushita.la libmicrotek.la libmicrotek2.la \
libmustek.la libmustek_pp.la libmustek_usb.la \
@ -1785,7 +1803,7 @@ be_dlopen_libs = libsane-abaton.la libsane-agfafocus.la \
libsane-hp3500.la libsane-hp3900.la libsane-hp4200.la \
libsane-hp5400.la libsane-hp5590.la libsane-hpljm1005.la \
libsane-hpsj5s.la libsane-hs2p.la libsane-ibm.la libsane-kodak.la \
libsane-kvs1025.la \
libsane-kvs1025.la libsane-kvs20xx.la \
libsane-leo.la libsane-lexmark.la libsane-ma1509.la \
libsane-matsushita.la libsane-microtek.la libsane-microtek2.la \
libsane-mustek.la libsane-mustek_pp.la libsane-mustek_usb.la \
@ -2067,6 +2085,14 @@ nodist_libsane_kvs1025_la_SOURCES = kvs1025-s.c
libsane_kvs1025_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kvs1025
libsane_kvs1025_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_kvs1025_la_LIBADD = $(COMMON_LIBS) libkvs1025.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(USB_LIBS) $(RESMGR_LIBS)
libkvs20xx_la_SOURCES = kvs20xx.c kvs20xx_cmd.c kvs20xx_opt.c \
kvs20xx_cmd.h kvs20xx.h
libkvs20xx_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kvs20xx
nodist_libsane_kvs20xx_la_SOURCES = kvs20xx-s.c
libsane_kvs20xx_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kvs20xx
libsane_kvs20xx_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_kvs20xx_la_LIBADD = $(COMMON_LIBS) libkvs20xx.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS)
libleo_la_SOURCES = leo.c leo.h
libleo_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=leo
nodist_libsane_leo_la_SOURCES = leo-s.c
@ -2538,6 +2564,8 @@ libkodak.la: $(libkodak_la_OBJECTS) $(libkodak_la_DEPENDENCIES)
$(LINK) $(libkodak_la_OBJECTS) $(libkodak_la_LIBADD) $(LIBS)
libkvs1025.la: $(libkvs1025_la_OBJECTS) $(libkvs1025_la_DEPENDENCIES)
$(LINK) $(libkvs1025_la_OBJECTS) $(libkvs1025_la_LIBADD) $(LIBS)
libkvs20xx.la: $(libkvs20xx_la_OBJECTS) $(libkvs20xx_la_DEPENDENCIES)
$(LINK) $(libkvs20xx_la_OBJECTS) $(libkvs20xx_la_LIBADD) $(LIBS)
libleo.la: $(libleo_la_OBJECTS) $(libleo_la_DEPENDENCIES)
$(LINK) $(libleo_la_OBJECTS) $(libleo_la_LIBADD) $(LIBS)
liblexmark.la: $(liblexmark_la_OBJECTS) $(liblexmark_la_DEPENDENCIES)
@ -2668,6 +2696,8 @@ libsane-kodak.la: $(libsane_kodak_la_OBJECTS) $(libsane_kodak_la_DEPENDENCIES)
$(libsane_kodak_la_LINK) $(libsane_kodak_la_OBJECTS) $(libsane_kodak_la_LIBADD) $(LIBS)
libsane-kvs1025.la: $(libsane_kvs1025_la_OBJECTS) $(libsane_kvs1025_la_DEPENDENCIES)
$(libsane_kvs1025_la_LINK) $(libsane_kvs1025_la_OBJECTS) $(libsane_kvs1025_la_LIBADD) $(LIBS)
libsane-kvs20xx.la: $(libsane_kvs20xx_la_OBJECTS) $(libsane_kvs20xx_la_DEPENDENCIES)
$(libsane_kvs20xx_la_LINK) $(libsane_kvs20xx_la_OBJECTS) $(libsane_kvs20xx_la_LIBADD) $(LIBS)
libsane-leo.la: $(libsane_leo_la_OBJECTS) $(libsane_leo_la_DEPENDENCIES)
$(libsane_leo_la_LINK) $(libsane_leo_la_OBJECTS) $(libsane_leo_la_LIBADD) $(LIBS)
libsane-lexmark.la: $(libsane_lexmark_la_OBJECTS) $(libsane_lexmark_la_DEPENDENCIES)
@ -2865,6 +2895,9 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkvs1025_la-kvs1025_low.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkvs1025_la-kvs1025_opt.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkvs1025_la-kvs1025_usb.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkvs20xx_la-kvs20xx.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkvs20xx_la-kvs20xx_cmd.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkvs20xx_la-kvs20xx_opt.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libleo_la-leo.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liblexmark_la-lexmark.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liblexmark_la-lexmark_low.Plo@am__quote@
@ -2939,6 +2972,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_ibm_la-ibm-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_kodak_la-kodak-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_kvs1025_la-kvs1025-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_kvs20xx_la-kvs20xx-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_la-dll-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_leo_la-leo-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_lexmark_la-lexmark-s.Plo@am__quote@
@ -3474,6 +3508,27 @@ libkvs1025_la-kvs1025_usb.lo: kvs1025_usb.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkvs1025_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkvs1025_la-kvs1025_usb.lo `test -f 'kvs1025_usb.c' || echo '$(srcdir)/'`kvs1025_usb.c
libkvs20xx_la-kvs20xx.lo: kvs20xx.c
@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkvs20xx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkvs20xx_la-kvs20xx.lo -MD -MP -MF $(DEPDIR)/libkvs20xx_la-kvs20xx.Tpo -c -o libkvs20xx_la-kvs20xx.lo `test -f 'kvs20xx.c' || echo '$(srcdir)/'`kvs20xx.c
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkvs20xx_la-kvs20xx.Tpo $(DEPDIR)/libkvs20xx_la-kvs20xx.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kvs20xx.c' object='libkvs20xx_la-kvs20xx.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkvs20xx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkvs20xx_la-kvs20xx.lo `test -f 'kvs20xx.c' || echo '$(srcdir)/'`kvs20xx.c
libkvs20xx_la-kvs20xx_cmd.lo: kvs20xx_cmd.c
@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkvs20xx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkvs20xx_la-kvs20xx_cmd.lo -MD -MP -MF $(DEPDIR)/libkvs20xx_la-kvs20xx_cmd.Tpo -c -o libkvs20xx_la-kvs20xx_cmd.lo `test -f 'kvs20xx_cmd.c' || echo '$(srcdir)/'`kvs20xx_cmd.c
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkvs20xx_la-kvs20xx_cmd.Tpo $(DEPDIR)/libkvs20xx_la-kvs20xx_cmd.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kvs20xx_cmd.c' object='libkvs20xx_la-kvs20xx_cmd.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkvs20xx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkvs20xx_la-kvs20xx_cmd.lo `test -f 'kvs20xx_cmd.c' || echo '$(srcdir)/'`kvs20xx_cmd.c
libkvs20xx_la-kvs20xx_opt.lo: kvs20xx_opt.c
@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkvs20xx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkvs20xx_la-kvs20xx_opt.lo -MD -MP -MF $(DEPDIR)/libkvs20xx_la-kvs20xx_opt.Tpo -c -o libkvs20xx_la-kvs20xx_opt.lo `test -f 'kvs20xx_opt.c' || echo '$(srcdir)/'`kvs20xx_opt.c
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkvs20xx_la-kvs20xx_opt.Tpo $(DEPDIR)/libkvs20xx_la-kvs20xx_opt.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kvs20xx_opt.c' object='libkvs20xx_la-kvs20xx_opt.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkvs20xx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkvs20xx_la-kvs20xx_opt.lo `test -f 'kvs20xx_opt.c' || echo '$(srcdir)/'`kvs20xx_opt.c
libleo_la-leo.lo: leo.c
@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libleo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libleo_la-leo.lo -MD -MP -MF $(DEPDIR)/libleo_la-leo.Tpo -c -o libleo_la-leo.lo `test -f 'leo.c' || echo '$(srcdir)/'`leo.c
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libleo_la-leo.Tpo $(DEPDIR)/libleo_la-leo.Plo
@ -3992,6 +4047,13 @@ libsane_kvs1025_la-kvs1025-s.lo: kvs1025-s.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsane_kvs1025_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsane_kvs1025_la-kvs1025-s.lo `test -f 'kvs1025-s.c' || echo '$(srcdir)/'`kvs1025-s.c
libsane_kvs20xx_la-kvs20xx-s.lo: kvs20xx-s.c
@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsane_kvs20xx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsane_kvs20xx_la-kvs20xx-s.lo -MD -MP -MF $(DEPDIR)/libsane_kvs20xx_la-kvs20xx-s.Tpo -c -o libsane_kvs20xx_la-kvs20xx-s.lo `test -f 'kvs20xx-s.c' || echo '$(srcdir)/'`kvs20xx-s.c
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_kvs20xx_la-kvs20xx-s.Tpo $(DEPDIR)/libsane_kvs20xx_la-kvs20xx-s.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kvs20xx-s.c' object='libsane_kvs20xx_la-kvs20xx-s.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsane_kvs20xx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsane_kvs20xx_la-kvs20xx-s.lo `test -f 'kvs20xx-s.c' || echo '$(srcdir)/'`kvs20xx-s.c
libsane_leo_la-leo-s.lo: leo-s.c
@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsane_leo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsane_leo_la-leo-s.lo -MD -MP -MF $(DEPDIR)/libsane_leo_la-leo-s.Tpo -c -o libsane_leo_la-leo-s.lo `test -f 'leo-s.c' || echo '$(srcdir)/'`leo-s.c
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libsane_leo_la-leo-s.Tpo $(DEPDIR)/libsane_leo_la-leo-s.Plo

Wyświetl plik

@ -40,6 +40,7 @@ hs2p
ibm
kodak
kvs1025
kvs20xx
leo
lexmark
ma1509

537
backend/kvs20xx.c 100644
Wyświetl plik

@ -0,0 +1,537 @@
/*
Copyright (C) 2008, Panasonic Russia Ltd.
Copyright (C) 2010, m. allan noah
*/
/*
Panasonic KV-S20xx USB-SCSI scanners.
*/
#define DEBUG_NOT_STATIC
#define BUILD 2
#include "../include/sane/config.h"
#include <string.h>
#include <unistd.h>
#include "../include/sane/sanei_backend.h"
#include "../include/sane/sanei_scsi.h"
#include "../include/sane/sanei_usb.h"
#include "../include/sane/saneopts.h"
#include "../include/sane/sanei_config.h"
#include "../include/lassert.h"
#include "kvs20xx.h"
#include "kvs20xx_cmd.h"
/* private functions */
SANE_Status attach (SANE_String_Const devname);
struct known_device
{
const SANE_Int id;
const SANE_Device scanner;
};
static const struct known_device known_devices[] = {
{
KV_S2025C,
{ "", "MATSHITA", "KV-S2025C", "sheetfed scanner" },
},
{
KV_S2045C,
{ "", "MATSHITA", "KV-S2045C", "sheetfed scanner" },
},
{
KV_S2026C,
{ "", "MATSHITA", "KV-S2026C", "sheetfed scanner" },
},
{
KV_S2046C,
{ "", "MATSHITA", "KV-S2046C", "sheetfed scanner" },
},
{
KV_S2028C,
{ "", "MATSHITA", "KV-S2028C", "sheetfed scanner" },
},
{
KV_S2048C,
{ "", "MATSHITA", "KV-S2048C", "sheetfed scanner" },
},
};
SANE_Status
sane_init (SANE_Int __sane_unused__ * version_code,
SANE_Auth_Callback __sane_unused__ authorize)
{
DBG_INIT ();
DBG (DBG_INFO, "This is panasonic kvs20xx driver\n");
*version_code = SANE_VERSION_CODE (V_MAJOR, V_MINOR, BUILD);
/* Initialize USB */
sanei_usb_init ();
return SANE_STATUS_GOOD;
}
/*
* List of available devices, allocated by sane_get_devices, released
* by sane_exit()
*/
static SANE_Device **devlist = NULL;
static unsigned curr_scan_dev = 0;
void
sane_exit ()
{
if (devlist)
{
int i;
for (i = 0; devlist[i]; i++)
{
free ((void *) devlist[i]->name);
free ((void *) devlist[i]);
}
free ((void *) devlist);
devlist = NULL;
}
}
SANE_Status
attach (SANE_String_Const devname)
{
int i = 0;
if (devlist)
{
for (; devlist[i]; i++);
devlist = realloc (devlist, sizeof (SANE_Device *) * (i + 1));
if (!devlist)
return SANE_STATUS_NO_MEM;
}
else
{
devlist = malloc (sizeof (SANE_Device *) * 2);
if (!devlist)
return SANE_STATUS_NO_MEM;
}
devlist[i] = malloc (sizeof (SANE_Device));
if (!devlist[i])
return SANE_STATUS_NO_MEM;
memcpy (devlist[i], &known_devices[curr_scan_dev].scanner,
sizeof (SANE_Device));
devlist[i]->name = strdup (devname);
/* terminate device list with NULL entry: */
devlist[i + 1] = 0;
DBG (DBG_INFO, "%s device attached\n", devname);
return SANE_STATUS_GOOD;
}
/* Get device list */
SANE_Status
sane_get_devices (const SANE_Device *** device_list,
SANE_Bool __sane_unused__ local_only)
{
if (devlist)
{
int i;
for (i = 0; devlist[i]; i++)
{
free ((void *) devlist[i]->name);
free ((void *) devlist[i]);
}
free ((void *) devlist);
devlist = NULL;
}
for (curr_scan_dev = 0;
curr_scan_dev < sizeof (known_devices) / sizeof (known_devices[0]);
curr_scan_dev++)
{
sanei_usb_find_devices (PANASONIC_ID,
known_devices[curr_scan_dev].id, attach);
}
for (curr_scan_dev = 0;
curr_scan_dev < sizeof (known_devices) / sizeof (known_devices[0]);
curr_scan_dev++)
{
sanei_scsi_find_devices (known_devices[curr_scan_dev].scanner.vendor,
known_devices[curr_scan_dev].scanner.model,
NULL, -1, -1, -1, -1, attach);
}
*device_list = (const SANE_Device **) devlist;
return SANE_STATUS_GOOD;
}
/* Open device, return the device handle */
SANE_Status
sane_open (SANE_String_Const devname, SANE_Handle * handle)
{
unsigned i, j, id = 0;
struct scanner *s;
SANE_Int h, bus;
SANE_Status st;
for (i = 0; devlist[i]; i++)
{
if (!strcmp (devlist[i]->name, devname))
break;
}
if (!devlist[i])
return SANE_STATUS_INVAL;
for (j = 0; j < sizeof (known_devices) / sizeof (known_devices[0]); j++)
{
if (!strcmp (devlist[i]->model, known_devices[j].scanner.model))
{
id = known_devices[j].id;
break;
}
}
st = sanei_usb_open (devname, &h);
if (st == SANE_STATUS_ACCESS_DENIED)
return st;
if (st)
{
st = sanei_scsi_open (devname, &h, sense_handler, NULL);
if (st)
{
return st;
}
bus = SCSI;
}
else
{
bus = USB;
st = sanei_usb_claim_interface (h, 0);
if (st)
{
sanei_usb_close (h);
return st;
}
}
s = malloc (sizeof (struct scanner));
if (!s)
return SANE_STATUS_NO_MEM;
memset (s, 0, sizeof (struct scanner));
s->buffer = malloc (MAX_READ_DATA_SIZE + BULK_HEADER_SIZE);
if (!s->buffer)
return SANE_STATUS_NO_MEM;
s->file = h;
s->bus = bus;
s->id = id;
init_options (s);
*handle = s;
for (i = 0; i < 3; i++)
{
st = test_unit_ready (s);
if (st)
{
if (s->bus == SCSI)
{
sanei_scsi_close (s->file);
st = sanei_scsi_open (devname, &h, sense_handler, NULL);
if (st)
return st;
}
else
{
sanei_usb_release_interface (s->file, 0);
sanei_usb_close (s->file);
st = sanei_usb_open (devname, &h);
if (st)
return st;
st = sanei_usb_claim_interface (h, 0);
if (st)
{
sanei_usb_close (h);
return st;
}
}
s->file = h;
}
else
break;
}
if (i == 3)
return SANE_STATUS_DEVICE_BUSY;
st = set_timeout (s, s->val[FEED_TIMEOUT].w);
if (st)
{
sane_close (s);
return st;
}
return SANE_STATUS_GOOD;
}
/* Close device */
void
sane_close (SANE_Handle handle)
{
struct scanner *s = (struct scanner *) handle;
int i;
if (s->bus == USB)
{
sanei_usb_release_interface (s->file, 0);
sanei_usb_close (s->file);
}
else
sanei_scsi_close (s->file);
for (i = 1; i < NUM_OPTIONS; i++)
{
if (s->opt[i].type == SANE_TYPE_STRING && s->val[i].s)
free (s->val[i].s);
}
if (s->data)
free (s->data);
free (s->buffer);
free (s);
}
/* Get option descriptor */
const SANE_Option_Descriptor *
sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
{
struct scanner *s = handle;
if ((unsigned) option >= NUM_OPTIONS || option < 0)
return NULL;
return s->opt + option;
}
static SANE_Status
wait_document (struct scanner *s)
{
SANE_Status st;
int i;
if (!strcmp ("off", s->val[MANUALFEED].s))
return document_exist (s);
for (i = 0; i < s->val[FEED_TIMEOUT].w; i++)
{
st = document_exist (s);
if (st != SANE_STATUS_NO_DOCS)
return st;
sleep (1);
}
return SANE_STATUS_NO_DOCS;
}
/* Start scanning */
SANE_Status
sane_start (SANE_Handle handle)
{
struct scanner *s = (struct scanner *) handle;
SANE_Status st;
int duplex = s->val[DUPLEX].w;
if (!s->scanning)
{
unsigned dummy_length;
st = test_unit_ready (s);
if (st)
return st;
st = wait_document (s);
if (st)
return st;
st = reset_window (s);
if (st)
return st;
st = set_window (s, SIDE_FRONT);
if (st)
return st;
if (duplex)
{
st = set_window (s, SIDE_BACK);
if (st)
return st;
}
st = scan (s);
if (st)
return st;
st = read_picture_element (s, SIDE_FRONT, &s->params);
if (st)
return st;
if (duplex)
{
st = get_adjust_data (s, &dummy_length);
if (st)
return st;
}
else
{
dummy_length = 0;
}
s->scanning = 1;
s->page = 0;
s->read = 0;
s->side = SIDE_FRONT;
sane_get_parameters (s, NULL);
s->saved_dummy_size = s->dummy_size = dummy_length
? (dummy_length * s->val[RESOLUTION].w / 1200 - 1)
* s->params.bytes_per_line : 0;
s->side_size = s->params.lines * s->params.bytes_per_line;
s->data = realloc (s->data, duplex ? s->side_size * 2 : s->side_size);
if (!s->data)
{
s->scanning = 0;
return SANE_STATUS_NO_MEM;
}
}
if (duplex)
{
unsigned side = SIDE_FRONT;
unsigned read, mx;
if (s->side == SIDE_FRONT && s->read == s->side_size - s->dummy_size)
{
s->side = SIDE_BACK;
s->read = s->dummy_size;
s->dummy_size = 0;
return SANE_STATUS_GOOD;
}
s->read = 0;
s->dummy_size = s->saved_dummy_size;
s->side = SIDE_FRONT;
st = document_exist (s);
if (st)
return st;
for (mx = s->side_size * 2; !st; mx -= read, side ^= SIDE_BACK)
st = read_image_data (s, s->page, side,
&s->data[s->side_size * 2 - mx], mx, &read);
}
else
{
unsigned read, mx;
s->read = 0;
st = document_exist (s);
if (st)
return st;
DBG (DBG_INFO, "start: %d\n", s->page);
for (mx = s->side_size; !st; mx -= read)
st = read_image_data (s, s->page, SIDE_FRONT,
&s->data[s->side_size - mx], mx, &read);
}
if (st && st != SANE_STATUS_EOF)
{
s->scanning = 0;
return st;
}
s->page++;
return SANE_STATUS_GOOD;
}
inline static void
memcpy24 (u8 * dest, u8 * src, unsigned size, unsigned ls)
{
unsigned i;
for (i = 0; i < size; i++)
{
dest[i * 3] = src[i];
dest[i * 3 + 1] = src[i + ls];
dest[i * 3 + 2] = src[i + 2 * ls];
}
}
SANE_Status
sane_read (SANE_Handle handle, SANE_Byte * buf,
SANE_Int max_len, SANE_Int * len)
{
struct scanner *s = (struct scanner *) handle;
int duplex = s->val[DUPLEX].w;
int color = !strcmp (s->val[MODE].s, SANE_VALUE_SCAN_MODE_COLOR);
int rest = s->side_size - s->read - s->dummy_size;
*len = 0;
if (!s->scanning || !rest)
{
if (strcmp (s->val[FEEDER_MODE].s, SANE_I18N ("continuous")))
{
if (!duplex || s->side == SIDE_BACK)
s->scanning = 0;
}
return SANE_STATUS_EOF;
}
*len = max_len < rest ? max_len : rest;
if (duplex && (s->id == KV_S2025C
|| s->id == KV_S2026C || s->id == KV_S2028C))
{
if (color)
{
unsigned ls = s->params.bytes_per_line;
unsigned i, a = s->side == SIDE_FRONT ? 0 : ls / 3;
u8 *data;
*len = (*len / ls) * ls;
for (i = 0, data = s->data + s->read * 2 + a;
i < *len / ls; buf += ls, data += 2 * ls, i++)
memcpy24 (buf, data, ls / 3, ls * 2 / 3);
}
else
{
unsigned ls = s->params.bytes_per_line;
unsigned i = s->side == SIDE_FRONT ? 0 : ls;
unsigned head = ls - (s->read % ls);
unsigned tail = (*len - head) % ls;
unsigned lines = (*len - head) / ls;
u8 *data = s->data + (s->read / ls) * ls * 2 + i + s->read % ls;
assert (data <= s->data + s->side_size * 2);
memcpy (buf, data, head);
for (i = 0, buf += head, data += head + (head ? ls : 0);
i < lines; buf += ls, data += ls * 2, i++)
{
assert (data <= s->data + s->side_size * 2);
memcpy (buf, data, ls);
}
assert ((data <= s->data + s->side_size * 2) || !tail);
memcpy (buf, data, tail);
}
s->read += *len;
}
else
{
if (color)
{
unsigned i, ls = s->params.bytes_per_line;
u8 *data = s->data + s->read;
*len = (*len / ls) * ls;
for (i = 0; i < *len / ls; buf += ls, data += ls, i++)
memcpy24 (buf, data, ls / 3, ls / 3);
}
else
{
memcpy (buf, s->data + s->read, *len);
}
s->read += *len;
}
return SANE_STATUS_GOOD;
}
void
sane_cancel (SANE_Handle handle)
{
struct scanner *s = (struct scanner *) handle;
s->scanning = 0;
}
SANE_Status
sane_set_io_mode (SANE_Handle __sane_unused__ h, SANE_Bool __sane_unused__ m)
{
return SANE_STATUS_UNSUPPORTED;
}
SANE_Status
sane_get_select_fd (SANE_Handle __sane_unused__ h,
SANE_Int __sane_unused__ * fd)
{
return SANE_STATUS_UNSUPPORTED;
}

211
backend/kvs20xx.h 100644
Wyświetl plik

@ -0,0 +1,211 @@
#ifndef __KVS20XX_H
#define __KVS20XX_H
/*
Copyright (C) 2008, Panasonic Russia Ltd.
Copyright (C) 2010, m. allan noah
*/
/*
Panasonic KV-S20xx USB-SCSI scanners.
*/
# include <endian.h>
#undef BACKEND_NAME
#define BACKEND_NAME kvs20xx
#define DBG_ERR 1
#define DBG_WARN 2
#define DBG_MSG 3
#define DBG_INFO 4
#define DBG_DBG 5
#define PANASONIC_ID 0x04da
#define KV_S2025C 0xdeadbeef
#define KV_S2045C 0xdeadbeee
#define KV_S2026C 0x1000
#define KV_S2046C 0x1001
#define KV_S2048C 0x1009
#define KV_S2028C 0x100a
#define USB 1
#define SCSI 2
#define MAX_READ_DATA_SIZE 0x10000
#define BULK_HEADER_SIZE 12
typedef unsigned char u8;
typedef unsigned u32;
typedef unsigned short u16;
#define SIDE_FRONT 0x00
#define SIDE_BACK 0x80
/* options */
typedef enum
{
NUM_OPTS = 0,
/* General options */
MODE_GROUP,
MODE, /* scanner modes */
RESOLUTION, /* X and Y resolution */
DUPLEX, /* Duplex mode */
FEEDER_MODE, /* Feeder mode, fixed to Continous */
LENGTHCTL, /* Length control mode */
MANUALFEED, /* Manual feed mode */
FEED_TIMEOUT, /* Feed timeout */
DBLFEED, /* Double feed detection mode */
FIT_TO_PAGE, /* Scanner shrinks image to fit scanned page */
/* Geometry group */
GEOMETRY_GROUP,
PAPER_SIZE, /* Paper size */
LANDSCAPE, /* true if landscape */
TL_X, /* upper left X */
TL_Y, /* upper left Y */
BR_X, /* bottom right X */
BR_Y, /* bottom right Y */
ADVANCED_GROUP,
BRIGHTNESS, /* Brightness */
CONTRAST, /* Contrast */
THRESHOLD, /* Binary threshold */
IMAGE_EMPHASIS, /* Image emphasis */
GAMMA_CORRECTION, /* Gamma correction */
LAMP, /* Lamp -- color drop out */
/* must come last: */
NUM_OPTIONS
} KV_OPTION;
#ifndef SANE_OPTION
typedef union
{
SANE_Bool b; /**< bool */
SANE_Word w; /**< word */
SANE_Word *wa; /**< word array */
SANE_String s; /**< string */
}
Option_Value;
#define SANE_OPTION 1
#endif
struct scanner
{
unsigned id;
int scanning;
int page;
int side;
int bus;
SANE_Int file;
SANE_Option_Descriptor opt[NUM_OPTIONS];
Option_Value val[NUM_OPTIONS];
SANE_Parameters params;
u8 *buffer;
u8 *data;
unsigned side_size;
unsigned read;
unsigned dummy_size;
unsigned saved_dummy_size;
};
struct window
{
u8 reserved[6];
u8 window_descriptor_block_length[2];
u8 window_identifier;
u8 reserved2;
u8 x_resolution[2];
u8 y_resolution[2];
u8 upper_left_x[4];
u8 upper_left_y[4];
u8 width[4];
u8 length[4];
u8 brightness;
u8 threshold;
u8 contrast;
u8 image_composition;
u8 bit_per_pixel;
u8 halftone_pattern[2];
u8 reserved3;
u8 bit_ordering[2];
u8 compression_type;
u8 compression_argument;
u8 reserved4[6];
u8 vendor_unique_identifier;
u8 nobuf_fstspeed_dfstop;
u8 mirror_image;
u8 image_emphasis;
u8 gamma_correction;
u8 mcd_lamp_dfeed_sens;
u8 reserved5;
u8 document_size;
u8 document_width[4];
u8 document_length[4];
u8 ahead_deskew_dfeed_scan_area_fspeed_rshad;
u8 continuous_scanning_pages;
u8 automatic_threshold_mode;
u8 automatic_separation_mode;
u8 standard_white_level_mode;
u8 b_wnr_noise_reduction;
u8 mfeed_toppos_btmpos_dsepa_hsepa_dcont_rstkr;
u8 stop_mode;
};
void init_options (struct scanner *);
void init_window (struct scanner *s, struct window *wnd, int wnd_id);
static inline u16
swap_bytes16 (u16 x)
{
return x << 8 | x >> 8;
}
static inline u32
swap_bytes32 (u32 x)
{
return x << 24 | x >> 24 |
(x & (u32) 0x0000ff00UL) << 8 | (x & (u32) 0x00ff0000UL) >> 8;
}
#if __BYTE_ORDER == __BIG_ENDIAN
static inline void
set24 (u8 * p, u32 x)
{
p[2] = x >> 16;
p[1] = x >> 8;
p[0] = x >> 0;
}
#define cpu2be16(x) (x)
#define cpu2be32(x) (x)
#define cpu2le16(x) swap_bytes16(x)
#define cpu2le32(x) swap_bytes32(x)
#define le2cpu16(x) swap_bytes16(x)
#define le2cpu32(x) swap_bytes32(x)
#define be2cpu16(x) (x)
#define be2cpu32(x) (x)
#define BIT_ORDERING 0
#elif __BYTE_ORDER == __LITTLE_ENDIAN
static inline void
set24 (u8 * p, u32 x)
{
p[0] = x >> 16;
p[1] = x >> 8;
p[2] = x >> 0;
}
#define cpu2le16(x) (x)
#define cpu2le32(x) (x)
#define cpu2be16(x) swap_bytes16(x)
#define cpu2be32(x) swap_bytes32(x)
#define le2cpu16(x) (x)
#define le2cpu32(x) (x)
#define be2cpu16(x) swap_bytes16(x)
#define be2cpu32(x) swap_bytes32(x)
#define BIT_ORDERING 1
#else
#error __BYTE_ORDER not defined
#endif
#endif /*__KVS20XX_H*/

Wyświetl plik

@ -0,0 +1,378 @@
/*
Copyright (C) 2008, Panasonic Russia Ltd.
Copyright (C) 2010, m. allan noah
*/
/*
Panasonic KV-S20xx USB-SCSI scanners.
*/
#include "../include/sane/config.h"
#include <string.h>
/*#include <unistd.h>*/
#define DEBUG_DECLARE_ONLY
#define BACKEND_NAME kvs20xx
#include "../include/sane/sanei_backend.h"
#include "../include/sane/sanei_scsi.h"
#include "../include/sane/sanei_usb.h"
#include "kvs20xx.h"
#include "kvs20xx_cmd.h"
SANE_Status
usb_send_command (struct scanner *s, struct cmd *c, struct response *r,
void *buf)
{
SANE_Status st;
struct bulk_header *h = (struct bulk_header *) buf;
u8 resp[sizeof (*h) + STATUS_SIZE];
size_t sz = sizeof (*h) + MAX_CMD_SIZE;
memset (h, 0, sz);
h->length = cpu2be32 (sz);
h->type = cpu2be16 (COMMAND_BLOCK);
h->code = cpu2be16 (COMMAND_CODE);
memcpy (h + 1, c->cmd, c->cmd_size);
st = sanei_usb_write_bulk (s->file, (const SANE_Byte *) h, &sz);
if (st)
return st;
if (sz != sizeof (*h) + MAX_CMD_SIZE)
return SANE_STATUS_IO_ERROR;
if (c->dir == CMD_IN)
{
sz = sizeof (*h) + c->data_size;
st = sanei_usb_read_bulk (s->file, (SANE_Byte *) h, &sz);
c->data = h + 1;
c->data_size = sz - sizeof (*h);
if (st || sz < sizeof (*h))
{
st = sanei_usb_release_interface (s->file, 0);
if (st)
return st;
st = sanei_usb_claim_interface (s->file, 0);
if (st)
return st;
r->status = CHECK_CONDITION;
return SANE_STATUS_GOOD;
}
}
else if (c->dir == CMD_OUT)
{
sz = sizeof (*h) + c->data_size;
memset (h, 0, sizeof (*h));
h->length = cpu2be32 (sizeof (*h) + c->data_size);
h->type = cpu2be16 (DATA_BLOCK);
h->code = cpu2be16 (DATA_CODE);
memcpy (h + 1, c->data, c->data_size);
st = sanei_usb_write_bulk (s->file, (const SANE_Byte *) h, &sz);
if (st)
return st;
}
sz = sizeof (resp);
st = sanei_usb_read_bulk (s->file, resp, &sz);
if (st || sz != sizeof (resp))
return SANE_STATUS_IO_ERROR;
r->status = be2cpu32 (*((u32 *) (resp + sizeof (*h))));
return st;
}
SANE_Status
sense_handler (int __sane_unused__ fd,
u_char * sense_buffer, void __sane_unused__ * arg)
{
unsigned i;
SANE_Status st = SANE_STATUS_GOOD;
for (i = 0; i < sizeof (s_errors) / sizeof (s_errors[0]); i++)
if ((sense_buffer[2] & 0xf) == s_errors[i].sense
&& sense_buffer[12] == s_errors[i].asc
&& sense_buffer[13] == s_errors[i].ascq)
{
st = s_errors[i].st;
break;
}
if (st == SANE_STATUS_GOOD && sense_buffer[2] & END_OF_MEDIUM)
st = SANE_STATUS_EOF;
if (i == sizeof (s_errors) / sizeof (s_errors[0]))
st = SANE_STATUS_IO_ERROR;
DBG (DBG_ERR,
"send_command: CHECK_CONDITION: sence:0x%x ASC:0x%x ASCQ:0x%x\n",
sense_buffer[2], sense_buffer[12], sense_buffer[13]);
return st;
}
SANE_Status
send_command (struct scanner * s, struct cmd * c)
{
SANE_Status st = SANE_STATUS_GOOD;
if (s->bus == USB)
{
struct response r;
memset (&r, 0, sizeof (r));
st = usb_send_command (s, c, &r, s->buffer);
if (st)
return st;
if (r.status)
{
u8 b[sizeof (struct bulk_header) + RESPONSE_SIZE];
struct cmd c2 = {
{0},
6,
0,
RESPONSE_SIZE,
CMD_IN
};
c2.cmd[0] = REQUEST_SENSE;
c2.cmd[4] = RESPONSE_SIZE;
st = usb_send_command (s, &c2, &r, b);
if (st)
return st;
st = sense_handler (0, b + sizeof (struct bulk_header), NULL);
}
}
else
{
if (c->dir == CMD_OUT)
{
memcpy (s->buffer, c->cmd, c->cmd_size);
memcpy (s->buffer + c->cmd_size, c->data, c->data_size);
st = sanei_scsi_cmd (s->file, s->buffer, c->cmd_size + c->data_size,
NULL, NULL);
}
else if (c->dir == CMD_IN)
{
c->data = s->buffer;
st = sanei_scsi_cmd (s->file, c->cmd, c->cmd_size,
c->data, (size_t *) & c->data_size);
}
else
{
st = sanei_scsi_cmd (s->file, c->cmd, c->cmd_size, NULL, NULL);
}
}
return st;
}
SANE_Status
test_unit_ready (struct scanner * s)
{
struct cmd c = {
{0},
6,
0,
0,
CMD_NONE
};
c.cmd[0] = TEST_UNIT_READY;
if (send_command (s, &c))
return SANE_STATUS_DEVICE_BUSY;
return SANE_STATUS_GOOD;
}
SANE_Status
set_timeout (struct scanner * s, int timeout)
{
u16 t = cpu2be16 ((u16) timeout);
struct cmd c = {
{0},
10,
0,
0,
CMD_OUT
};
c.cmd[0] = SET_TIMEOUT;
c.cmd[2] = 0x8d;
*((u16 *) (c.cmd + 7)) = cpu2be16 (sizeof (t));
c.data = &t;
c.data_size = sizeof (t);
if (s->bus == USB)
sanei_usb_set_timeout (timeout * 1000);
return send_command (s, &c);
}
SANE_Status
set_window (struct scanner * s, int wnd_id)
{
struct window wnd;
struct cmd c = {
{0},
10,
0,
0,
CMD_OUT
};
c.cmd[0] = SET_WINDOW;
*((u16 *) (c.cmd + 7)) = cpu2be16 (sizeof (wnd));
c.data = &wnd;
c.data_size = sizeof (wnd);
init_window (s, &wnd, wnd_id);
return send_command (s, &c);
}
SANE_Status
reset_window (struct scanner * s)
{
struct cmd c = {
{0},
10,
0,
0,
CMD_NONE
};
c.cmd[0] = SET_WINDOW;
return send_command (s, &c);
}
SANE_Status
scan (struct scanner * s)
{
struct cmd c = {
{0},
6,
0,
0,
CMD_NONE
};
c.cmd[0] = SCAN;
return send_command (s, &c);
}
SANE_Status
document_exist (struct scanner * s)
{
SANE_Status status;
struct cmd c = {
{0},
10,
0,
6,
CMD_IN,
};
u8 *d;
c.cmd[0] = READ_10;
c.cmd[2] = 0x81;
set24 (c.cmd + 6, c.data_size);
status = send_command (s, &c);
if (status)
return status;
d = c.data;
if (d[0] & 0x20)
return SANE_STATUS_GOOD;
return SANE_STATUS_NO_DOCS;
}
SANE_Status
read_picture_element (struct scanner * s, unsigned side, SANE_Parameters * p)
{
SANE_Status status;
struct cmd c = {
{0},
10,
0,
16,
CMD_IN
};
u32 *data;
c.cmd[0] = READ_10;
c.cmd[2] = 0x80;
c.cmd[5] = side;
set24 (c.cmd + 6, c.data_size);
status = send_command (s, &c);
if (status)
return status;
data = (u32 *) c.data;
p->pixels_per_line = be2cpu32 (data[0]);
p->lines = be2cpu32 (data[1]);
return SANE_STATUS_GOOD;
}
SANE_Status
get_buffer_status (struct scanner * s, unsigned *data_avalible)
{
SANE_Status status;
struct cmd c = {
{0},
10,
0,
12,
CMD_IN
};
u32 *data;
c.cmd[0] = GET_BUFFER_STATUS;
c.cmd[7] = 12;
status = send_command (s, &c);
if (status)
return status;
data = (u32 *) c.data;
*data_avalible = be2cpu32 (data[3]);
return SANE_STATUS_GOOD;
}
SANE_Status
read_image_data (struct scanner * s, unsigned page,
unsigned side, void *buf, unsigned max_size, unsigned *size)
{
SANE_Status status;
struct cmd c = {
{0},
10,
0,
0,
CMD_IN
};
c.cmd[0] = READ_10;
c.cmd[4] = page;
c.cmd[5] = side;
c.data_size = max_size < MAX_READ_DATA_SIZE ? max_size : MAX_READ_DATA_SIZE;
set24 (c.cmd + 6, c.data_size);
status = send_command (s, &c);
if (status && status != SANE_STATUS_EOF)
return status;
*size = c.data_size;
DBG (DBG_INFO, "read_image_data: read %d, status %d\n", *size, status);
memcpy (buf, c.data, *size);
return status;
}
SANE_Status
get_adjust_data (struct scanner * s, unsigned *dummy_length)
{
SANE_Status status;
struct cmd c = {
{0},
10,
0,
40,
CMD_IN
};
u16 *data;
c.cmd[0] = GET_ADJUST_DATA;
c.cmd[2] = 0x9b;
c.cmd[8] = 40;
status = send_command (s, &c);
if (status)
return status;
data = (u16 *) c.data;
*dummy_length = be2cpu16 (data[0]);
return SANE_STATUS_GOOD;
}

Wyświetl plik

@ -0,0 +1,131 @@
#ifndef __KVS20XX_CMD_H
#define __KVS20XX_CMD_H
/*
Copyright (C) 2008, Panasonic Russia Ltd.
Copyright (C) 2010, m. allan noah
*/
/*
Panasonic KV-S20xx USB-SCSI scanners.
*/
#define COMMAND_BLOCK 1
#define DATA_BLOCK 2
#define RESPONSE_BLOCK 3
#define COMMAND_CODE 0x9000
#define DATA_CODE 0xb000
#define RESPONSE_CODE 0xa000
#define STATUS_SIZE 4
struct bulk_header
{
u32 length;
u16 type;
u16 code;
u32 transaction_id;
};
#define TEST_UNIT_READY 0x00
#define INQUIRY 0x12
#define SET_WINDOW 0x24
#define SCAN 0x1B
#define SEND_10 0x2A
#define READ_10 0x28
#define REQUEST_SENSE 0x03
#define GET_BUFFER_STATUS 0x34
#define SET_TIMEOUT 0xE1
#define GET_ADJUST_DATA 0xE0
#define GOOD 0
#define CHECK_CONDITION 2
typedef enum
{
CMD_NONE = 0,
CMD_IN = 0x81, /* scanner to pc */
CMD_OUT = 0x02 /* pc to scanner */
} CMD_DIRECTION; /* equals to endpoint address */
#define RESPONSE_SIZE 0x12
#define MAX_CMD_SIZE 12
struct cmd
{
unsigned char cmd[MAX_CMD_SIZE];
int cmd_size;
void *data;
int data_size;
int dir;
};
struct response
{
int status;
unsigned char data[RESPONSE_SIZE];
};
#define END_OF_MEDIUM (1<<6)
#define INCORRECT_LENGTH_INDICATOR (1<<5)
static const struct
{
unsigned sense, asc, ascq;
SANE_Status st;
} s_errors[] =
{
{
0, 0, 0, SANE_STATUS_GOOD},
{
2, 0, 0, SANE_STATUS_DEVICE_BUSY},
{
2, 4, 1, SANE_STATUS_DEVICE_BUSY},
{
2, 4, 0x80, SANE_STATUS_COVER_OPEN},
{
2, 4, 0x81, SANE_STATUS_COVER_OPEN},
{
2, 4, 0x82, SANE_STATUS_COVER_OPEN},
{
2, 4, 0x83, SANE_STATUS_COVER_OPEN},
{
2, 4, 0x84, SANE_STATUS_COVER_OPEN},
{
2, 0x80, 1, SANE_STATUS_CANCELLED},
{
2, 0x80, 2, SANE_STATUS_CANCELLED},
{
3, 0x3a, 0, SANE_STATUS_NO_DOCS},
{
3, 0x80, 1, SANE_STATUS_JAMMED},
{
3, 0x80, 2, SANE_STATUS_JAMMED},
{
3, 0x80, 3, SANE_STATUS_JAMMED},
{
3, 0x80, 4, SANE_STATUS_JAMMED},
{
3, 0x80, 5, SANE_STATUS_JAMMED},
{
3, 0x80, 6, SANE_STATUS_JAMMED},
{
3, 0x80, 7, SANE_STATUS_JAMMED},
{
3, 0x80, 8, SANE_STATUS_JAMMED},
{
3, 0x80, 9, SANE_STATUS_JAMMED},};
SANE_Status usb_send_command (struct scanner *s, struct cmd *c,
struct response *r, void *buf);
SANE_Status send_command (struct scanner * s, struct cmd * c);
SANE_Status test_unit_ready (struct scanner *s);
SANE_Status set_timeout (struct scanner *s, int timeout);
SANE_Status set_window (struct scanner *s, int wnd_id);
SANE_Status reset_window (struct scanner *s);
SANE_Status read_picture_element (struct scanner *s, unsigned side,
SANE_Parameters * p);
SANE_Status read_image_data (struct scanner *s, unsigned page, unsigned side,
void *buf, unsigned max_size, unsigned *size);
SANE_Status document_exist (struct scanner *s);
SANE_Status get_buffer_status (struct scanner *s, unsigned *data_avalible);
SANE_Status scan (struct scanner *s);
SANE_Status get_adjust_data (struct scanner *s, unsigned *dummy_length);
SANE_Status sense_handler (int fd, u_char * sense_buffer, void *arg);
#endif /*__KVS20XX_CMD_H*/

Wyświetl plik

@ -0,0 +1,799 @@
/*
Copyright (C) 2008, Panasonic Russia Ltd.
Copyright (C) 2010, m. allan noah
*/
/*
Panasonic KV-S20xx USB-SCSI scanners.
*/
#include "../include/sane/config.h"
#include <string.h>
#define DEBUG_DECLARE_ONLY
#define BACKEND_NAME kvs20xx
#include "../include/sane/sane.h"
#include "../include/sane/saneopts.h"
#include "../include/sane/sanei.h"
#include "../include/sane/sanei_backend.h"
#include "../include/sane/sanei_config.h"
#include "../include/lassert.h"
#include "kvs20xx.h"
static size_t
max_string_size (SANE_String_Const strings[])
{
size_t size, max_size = 0;
SANE_Int i;
for (i = 0; strings[i]; ++i)
{
size = strlen (strings[i]) + 1;
if (size > max_size)
max_size = size;
}
return max_size;
}
static SANE_String_Const mode_list[] = {
SANE_VALUE_SCAN_MODE_LINEART,
SANE_VALUE_SCAN_MODE_GRAY,
SANE_VALUE_SCAN_MODE_COLOR,
NULL
};
static const unsigned mode_val[] = { 0, 2, 5 };
static const unsigned bps_val[] = { 1, 8, 24 };
static const SANE_Range resolutions_range = {100,600,10};
/* List of feeder modes */
static SANE_String_Const feeder_mode_list[] = {
SANE_I18N ("single"),
SANE_I18N ("continuous"),
NULL
};
/* List of manual feed mode */
static SANE_String_Const manual_feed_list[] = {
SANE_I18N ("off"),
SANE_I18N ("wait_doc"),
SANE_I18N ("wait_key"),
NULL
};
/* List of paper sizes */
static SANE_String_Const paper_list[] = {
SANE_I18N ("user_def"),
SANE_I18N ("business_card"),
/*SANE_I18N("Check"), */
/*SANE_I18N ("A3"), */
SANE_I18N ("A4"),
SANE_I18N ("A5"),
SANE_I18N ("A6"),
SANE_I18N ("Letter"),
/*SANE_I18N ("Double letter 11x17 in"),
SANE_I18N ("B4"), */
SANE_I18N ("B5"),
SANE_I18N ("B6"),
SANE_I18N ("Legal"),
NULL
};
static const unsigned paper_val[] = { 0, 1, 4, 5, 6, 7, 13, 14, 15 };
struct paper_size
{
int width;
int height;
};
static const struct paper_size paper_sizes[] = {
{210, 297}, /* User defined, default=A4 */
{54, 90}, /* Business card */
/*{80, 170}, *//* Check (China business) */
/*{297, 420}, *//* A3 */
{210, 297}, /* A4 */
{148, 210}, /* A5 */
{105, 148}, /* A6 */
{215, 280}, /* US Letter 8.5 x 11 in */
/*{280, 432}, *//* Double Letter 11 x 17 in */
/*{250, 353}, *//* B4 */
{176, 250}, /* B5 */
{125, 176}, /* B6 */
{215, 355} /* US Legal */
};
#define MIN_WIDTH 51
#define MAX_WIDTH 215
#define MIN_LENGTH 70
#define MAX_LENGTH 355
static SANE_Range tl_x_range = { 0, MAX_WIDTH - MIN_WIDTH, 0 };
static SANE_Range tl_y_range = { 0, MAX_LENGTH - MIN_LENGTH, 0 };
static SANE_Range br_x_range = { MIN_WIDTH, MAX_WIDTH, 0 };
static SANE_Range br_y_range = { MIN_LENGTH, MAX_LENGTH, 0 };
static SANE_Range byte_value_range = { 0, 255, 0 };
/* List of image emphasis options, 5 steps */
static SANE_String_Const image_emphasis_list[] = {
SANE_I18N ("none"),
SANE_I18N ("low"),
SANE_I18N ("medium"),
SANE_I18N ("high"),
SANE_I18N ("smooth"),
NULL
};
/* List of gamma */
static SANE_String_Const gamma_list[] = {
SANE_I18N ("normal"),
SANE_I18N ("crt"),
NULL
};
static unsigned gamma_val[] = { 0, 1 };
/* List of lamp color dropout */
static SANE_String_Const lamp_list[] = {
SANE_I18N ("normal"),
SANE_I18N ("red"),
SANE_I18N ("green"),
SANE_I18N ("blue"),
NULL
};
/* Reset the options for that scanner. */
void
init_options (struct scanner *s)
{
int i;
SANE_Option_Descriptor *o;
/* Pre-initialize the options. */
memset (s->opt, 0, sizeof (s->opt));
memset (s->val, 0, sizeof (s->val));
for (i = 0; i < NUM_OPTIONS; i++)
{
s->opt[i].size = sizeof (SANE_Word);
s->opt[i].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
}
/* Number of options. */
o = &s->opt[NUM_OPTS];
o->name = "";
o->title = SANE_TITLE_NUM_OPTIONS;
o->desc = SANE_DESC_NUM_OPTIONS;
o->type = SANE_TYPE_INT;
o->cap = SANE_CAP_SOFT_DETECT;
s->val[NUM_OPTS].w = NUM_OPTIONS;
/* Mode group */
o = &s->opt[MODE_GROUP];
o->title = SANE_I18N ("Scan Mode");
o->desc = ""; /* not valid for a group */
o->type = SANE_TYPE_GROUP;
o->cap = 0;
o->size = 0;
o->constraint_type = SANE_CONSTRAINT_NONE;
/* Scanner supported modes */
o = &s->opt[MODE];
o->name = SANE_NAME_SCAN_MODE;
o->title = SANE_TITLE_SCAN_MODE;
o->desc = SANE_DESC_SCAN_MODE;
o->type = SANE_TYPE_STRING;
o->size = max_string_size (mode_list);
o->constraint_type = SANE_CONSTRAINT_STRING_LIST;
o->constraint.string_list = mode_list;
s->val[MODE].s = malloc (o->size);
strcpy (s->val[MODE].s, mode_list[0]);
/* X and Y resolution */
o = &s->opt[RESOLUTION];
o->name = SANE_NAME_SCAN_RESOLUTION;
o->title = SANE_TITLE_SCAN_RESOLUTION;
o->desc = SANE_DESC_SCAN_RESOLUTION;
o->type = SANE_TYPE_INT;
o->unit = SANE_UNIT_DPI;
o->constraint_type = SANE_CONSTRAINT_RANGE;
o->constraint.range = &resolutions_range;
s->val[RESOLUTION].w = 100;
/* Duplex */
o = &s->opt[DUPLEX];
o->name = "duplex";
o->title = SANE_I18N ("Duplex");
o->desc = SANE_I18N ("Enable Duplex (Dual-Sided) Scanning");
o->type = SANE_TYPE_BOOL;
o->unit = SANE_UNIT_NONE;
s->val[DUPLEX].w = SANE_FALSE;
/*FIXME
if (!s->support_info.support_duplex)
o->cap |= SANE_CAP_INACTIVE;
*/
/* Feeder mode */
o = &s->opt[FEEDER_MODE];
o->name = "feeder-mode";
o->title = SANE_I18N ("Feeder mode");
o->desc = SANE_I18N ("Sets the feeding mode");
o->type = SANE_TYPE_STRING;
o->size = max_string_size (feeder_mode_list);
o->constraint_type = SANE_CONSTRAINT_STRING_LIST;
o->constraint.string_list = feeder_mode_list;
s->val[FEEDER_MODE].s = malloc (o->size);
strcpy (s->val[FEEDER_MODE].s, feeder_mode_list[0]);
/* Length control */
o = &s->opt[LENGTHCTL];
o->name = "length-control";
o->title = SANE_I18N ("Length control mode");
o->desc =
SANE_I18N
("Length Control Mode is a mode that the scanner reads up to the shorter length of actual"
" paper or logical document length.");
o->type = SANE_TYPE_BOOL;
o->unit = SANE_UNIT_NONE;
s->val[LENGTHCTL].w = SANE_FALSE;
/* Manual feed */
o = &s->opt[MANUALFEED];
o->name = "manual-feed";
o->title = SANE_I18N ("Manual feed mode");
o->desc = SANE_I18N ("Sets the manual feed mode");
o->type = SANE_TYPE_STRING;
o->size = max_string_size (manual_feed_list);
o->constraint_type = SANE_CONSTRAINT_STRING_LIST;
o->constraint.string_list = manual_feed_list;
s->val[MANUALFEED].s = malloc (o->size);
strcpy (s->val[MANUALFEED].s, manual_feed_list[0]);
/*Manual feed timeout */
o = &s->opt[FEED_TIMEOUT];
o->name = "feed-timeout";
o->title = SANE_I18N ("Manual feed timeout");
o->desc = SANE_I18N ("Sets the manual feed timeout in seconds");
o->type = SANE_TYPE_INT;
o->unit = SANE_UNIT_NONE;
o->size = sizeof (SANE_Int);
o->constraint_type = SANE_CONSTRAINT_RANGE;
o->constraint.range = &(byte_value_range);
o->cap |= SANE_CAP_INACTIVE;
s->val[FEED_TIMEOUT].w = 30;
/* Double feed */
o = &s->opt[DBLFEED];
o->name = "double-feed";
o->title = SANE_I18N ("Double feed detection");
o->desc = SANE_I18N ("Enable/Disable double feed detection");
o->type = SANE_TYPE_BOOL;
o->unit = SANE_UNIT_NONE;
s->val[DBLFEED].w = SANE_FALSE;
/* Fit to page */
o = &s->opt[FIT_TO_PAGE];
o->name = SANE_I18N ("fit-to-page");
o->title = SANE_I18N ("Fit to page");
o->desc = SANE_I18N ("Scanner shrinks image to fit scanned page");
o->type = SANE_TYPE_BOOL;
o->unit = SANE_UNIT_NONE;
s->val[FIT_TO_PAGE].w = SANE_FALSE;
/* Geometry group */
o = &s->opt[GEOMETRY_GROUP];
o->title = SANE_I18N ("Geometry");
o->desc = ""; /* not valid for a group */
o->type = SANE_TYPE_GROUP;
o->cap = 0;
o->size = 0;
o->constraint_type = SANE_CONSTRAINT_NONE;
/* Paper sizes list */
o = &s->opt[PAPER_SIZE];
o->name = "paper-size";
o->title = SANE_I18N ("Paper size");
o->desc = SANE_I18N ("Physical size of the paper in the ADF");
o->type = SANE_TYPE_STRING;
o->size = max_string_size (paper_list);
o->constraint_type = SANE_CONSTRAINT_STRING_LIST;
o->constraint.string_list = paper_list;
s->val[PAPER_SIZE].s = malloc (o->size);
strcpy (s->val[PAPER_SIZE].s, SANE_I18N ("A4"));
/* Landscape */
o = &s->opt[LANDSCAPE];
o->name = "landscape";
o->title = SANE_I18N ("Landscape");
o->desc =
SANE_I18N ("Set paper position : "
"true for landscape, false for portrait");
o->type = SANE_TYPE_BOOL;
o->unit = SANE_UNIT_NONE;
s->val[LANDSCAPE].w = SANE_FALSE;
o->cap |= SANE_CAP_INACTIVE;
/* Upper left X */
o = &s->opt[TL_X];
o->name = SANE_NAME_SCAN_TL_X;
o->title = SANE_TITLE_SCAN_TL_X;
o->desc = SANE_DESC_SCAN_TL_X;
o->type = SANE_TYPE_INT;
o->unit = SANE_UNIT_MM;
o->constraint_type = SANE_CONSTRAINT_RANGE;
o->constraint.range = &tl_x_range;
o->cap |= SANE_CAP_INACTIVE;
s->val[TL_X].w = 0;
/* Upper left Y */
o = &s->opt[TL_Y];
o->name = SANE_NAME_SCAN_TL_Y;
o->title = SANE_TITLE_SCAN_TL_Y;
o->desc = SANE_DESC_SCAN_TL_Y;
o->type = SANE_TYPE_INT;
o->unit = SANE_UNIT_MM;
o->constraint_type = SANE_CONSTRAINT_RANGE;
o->constraint.range = &tl_y_range;
o->cap |= SANE_CAP_INACTIVE;
s->val[TL_Y].w = 0;
/* Bottom-right x */
o = &s->opt[BR_X];
o->name = SANE_NAME_SCAN_BR_X;
o->title = SANE_TITLE_SCAN_BR_X;
o->desc = SANE_DESC_SCAN_BR_X;
o->type = SANE_TYPE_INT;
o->unit = SANE_UNIT_MM;
o->constraint_type = SANE_CONSTRAINT_RANGE;
o->constraint.range = &br_x_range;
o->cap |= SANE_CAP_INACTIVE;
s->val[BR_X].w = 210;
/* Bottom-right y */
o = &s->opt[BR_Y];
o->name = SANE_NAME_SCAN_BR_Y;
o->title = SANE_TITLE_SCAN_BR_Y;
o->desc = SANE_DESC_SCAN_BR_Y;
o->type = SANE_TYPE_INT;
o->unit = SANE_UNIT_MM;
o->constraint_type = SANE_CONSTRAINT_RANGE;
o->constraint.range = &br_y_range;
o->cap |= SANE_CAP_INACTIVE;
s->val[BR_Y].w = 297;
/* Enhancement group */
o = &s->opt[ADVANCED_GROUP];
o->title = SANE_I18N ("Advanced");
o->desc = ""; /* not valid for a group */
o->type = SANE_TYPE_GROUP;
o->cap = SANE_CAP_ADVANCED;
o->size = 0;
o->constraint_type = SANE_CONSTRAINT_NONE;
/* Brightness */
o = &s->opt[BRIGHTNESS];
o->name = SANE_NAME_BRIGHTNESS;
o->title = SANE_TITLE_BRIGHTNESS;
o->desc = SANE_DESC_BRIGHTNESS;
o->type = SANE_TYPE_INT;
o->unit = SANE_UNIT_NONE;
o->size = sizeof (SANE_Int);
o->constraint_type = SANE_CONSTRAINT_RANGE;
o->constraint.range = &(byte_value_range);
s->val[BRIGHTNESS].w = 128;
/* Contrast */
o = &s->opt[CONTRAST];
o->name = SANE_NAME_CONTRAST;
o->title = SANE_TITLE_CONTRAST;
o->desc = SANE_DESC_CONTRAST;
o->type = SANE_TYPE_INT;
o->unit = SANE_UNIT_NONE;
o->size = sizeof (SANE_Int);
o->constraint_type = SANE_CONSTRAINT_RANGE;
o->constraint.range = &(byte_value_range);
s->val[CONTRAST].w = 128;
/* threshold */
o = &s->opt[THRESHOLD];
o->name = SANE_NAME_THRESHOLD;
o->title = SANE_TITLE_THRESHOLD;
o->desc = SANE_DESC_THRESHOLD;
o->type = SANE_TYPE_INT;
o->size = sizeof (SANE_Int);
o->constraint_type = SANE_CONSTRAINT_RANGE;
o->constraint.range = &(byte_value_range);
s->val[THRESHOLD].w = 128;
/* Image emphasis */
o = &s->opt[IMAGE_EMPHASIS];
o->name = "image-emphasis";
o->title = SANE_I18N ("Image emphasis");
o->desc = SANE_I18N ("Sets the image emphasis");
o->type = SANE_TYPE_STRING;
o->size = max_string_size (image_emphasis_list);
o->constraint_type = SANE_CONSTRAINT_STRING_LIST;
o->constraint.string_list = image_emphasis_list;
s->val[IMAGE_EMPHASIS].s = malloc (o->size);
strcpy (s->val[IMAGE_EMPHASIS].s, image_emphasis_list[0]);
/* Gamma */
o = &s->opt[GAMMA_CORRECTION];
o->name = "gamma-cor";
o->title = SANE_I18N ("Gamma correction");
o->desc = SANE_I18N ("Gamma correction");
o->type = SANE_TYPE_STRING;
o->size = max_string_size (gamma_list);
o->constraint_type = SANE_CONSTRAINT_STRING_LIST;
o->constraint.string_list = gamma_list;
s->val[GAMMA_CORRECTION].s = malloc (o->size);
strcpy (s->val[GAMMA_CORRECTION].s, gamma_list[0]);
/* Lamp color dropout */
o = &s->opt[LAMP];
o->name = "lamp-color";
o->title = SANE_I18N ("Lamp color");
o->desc = SANE_I18N ("Sets the lamp color (color dropout)");
o->type = SANE_TYPE_STRING;
o->size = max_string_size (lamp_list);
o->constraint_type = SANE_CONSTRAINT_STRING_LIST;
o->constraint.string_list = lamp_list;
s->val[LAMP].s = malloc (o->size);
strcpy (s->val[LAMP].s, lamp_list[0]);
}
/* Lookup a string list from one array and return its index. */
static int
str_index (const SANE_String_Const * list, SANE_String_Const name)
{
int index;
index = 0;
while (list[index])
{
if (!strcmp (list[index], name))
return (index);
index++;
}
return (-1); /* not found */
}
/* Control option */
SANE_Status
sane_control_option (SANE_Handle handle, SANE_Int option,
SANE_Action action, void *val, SANE_Int * info)
{
int i;
SANE_Status status;
SANE_Word cap;
struct scanner *s = (struct scanner *) handle;
if (info)
*info = 0;
if (option < 0 || option >= NUM_OPTIONS)
return SANE_STATUS_UNSUPPORTED;
cap = s->opt[option].cap;
if (!SANE_OPTION_IS_ACTIVE (cap))
return SANE_STATUS_UNSUPPORTED;
if (action == SANE_ACTION_GET_VALUE)
{
if (s->opt[option].type == SANE_TYPE_STRING)
{
DBG (DBG_INFO, "sane_control_option: reading opt[%d] = %s\n",
option, s->val[option].s);
strcpy (val, s->val[option].s);
}
else
{
*(SANE_Word *) val = s->val[option].w;
DBG (DBG_INFO, "sane_control_option: reading opt[%d] = %d\n",
option, s->val[option].w);
}
return SANE_STATUS_GOOD;
}
else if (action == SANE_ACTION_SET_VALUE)
{
if (!SANE_OPTION_IS_SETTABLE (cap))
return SANE_STATUS_INVAL;
status = sanei_constrain_value (s->opt + option, val, info);
if (status != SANE_STATUS_GOOD)
return status;
if (s->opt[option].type == SANE_TYPE_STRING)
{
if (!strcmp (val, s->val[option].s))
return SANE_STATUS_GOOD;
DBG (DBG_INFO, "sane_control_option: writing opt[%d] = %s\n",
option, (SANE_String_Const) val);
}
else
{
if (*(SANE_Word *) val == s->val[option].w)
return SANE_STATUS_GOOD;
DBG (DBG_INFO, "sane_control_option: writing opt[%d] = %d\n",
option, *(SANE_Word *) val);
}
switch (option)
{
/* Side-effect options */
case RESOLUTION:
s->val[option].w = *(SANE_Word *) val;
if (info)
*info |= SANE_INFO_RELOAD_PARAMS;
return SANE_STATUS_GOOD;
case TL_Y:
if ((*(SANE_Word *) val) + MIN_LENGTH <= s->val[BR_Y].w)
{
s->val[option].w = *(SANE_Word *) val;
if (info)
*info |= SANE_INFO_RELOAD_PARAMS;
}
else if (info)
*info |= SANE_INFO_INEXACT;
return SANE_STATUS_GOOD;
case BR_Y:
if ((*(SANE_Word *) val) >= s->val[TL_Y].w + MIN_LENGTH)
{
s->val[option].w = *(SANE_Word *) val;
if (info)
*info |= SANE_INFO_RELOAD_PARAMS;
}
else if (info)
*info |= SANE_INFO_INEXACT;
return SANE_STATUS_GOOD;
case TL_X:
if ((*(SANE_Word *) val) + MIN_WIDTH <= s->val[BR_X].w)
{
s->val[option].w = *(SANE_Word *) val;
if (info)
*info |= SANE_INFO_RELOAD_PARAMS;
}
else if (info)
*info |= SANE_INFO_INEXACT;
return SANE_STATUS_GOOD;
case BR_X:
if (*(SANE_Word *) val >= s->val[TL_X].w + MIN_WIDTH)
{
s->val[option].w = *(SANE_Word *) val;
if (info)
*info |= SANE_INFO_RELOAD_PARAMS;
}
else if (info)
*info |= SANE_INFO_INEXACT;
return SANE_STATUS_GOOD;
case LANDSCAPE:
s->val[option].w = *(SANE_Word *) val;
if (info)
*info |= SANE_INFO_RELOAD_PARAMS;
return SANE_STATUS_GOOD;
/* Side-effect free options */
case CONTRAST:
case BRIGHTNESS:
case DUPLEX:
case LENGTHCTL:
case DBLFEED:
case FIT_TO_PAGE:
case THRESHOLD:
s->val[option].w = *(SANE_Word *) val;
return SANE_STATUS_GOOD;
case FEED_TIMEOUT:
s->val[option].w = *(SANE_Word *) val;
return set_timeout (s, s->val[option].w);
/* String mode */
case IMAGE_EMPHASIS:
case GAMMA_CORRECTION:
case LAMP:
case FEEDER_MODE:
strcpy (s->val[option].s, val);
return SANE_STATUS_GOOD;
case MODE:
strcpy (s->val[MODE].s, val);
if (!strcmp (s->val[MODE].s, SANE_VALUE_SCAN_MODE_LINEART))
{
s->opt[THRESHOLD].cap &= ~SANE_CAP_INACTIVE;
s->opt[GAMMA_CORRECTION].cap |= SANE_CAP_INACTIVE;
s->opt[BRIGHTNESS].cap |= SANE_CAP_INACTIVE;
}
else
{
s->opt[THRESHOLD].cap |= SANE_CAP_INACTIVE;
s->opt[GAMMA_CORRECTION].cap &= ~SANE_CAP_INACTIVE;
s->opt[BRIGHTNESS].cap &= ~SANE_CAP_INACTIVE;
}
if (info)
*info |= SANE_INFO_RELOAD_OPTIONS | SANE_INFO_RELOAD_PARAMS;
return SANE_STATUS_GOOD;
case MANUALFEED:
strcpy (s->val[option].s, val);
if (strcmp (s->val[option].s, manual_feed_list[0]) == 0) /* off */
s->opt[FEED_TIMEOUT].cap |= SANE_CAP_INACTIVE;
else
s->opt[FEED_TIMEOUT].cap &= ~SANE_CAP_INACTIVE;
if (info)
*info |= SANE_INFO_RELOAD_OPTIONS;
return SANE_STATUS_GOOD;
case PAPER_SIZE:
strcpy (s->val[PAPER_SIZE].s, val);
i = str_index (paper_list, s->val[PAPER_SIZE].s);
if (i == 0)
{ /*user def */
s->opt[TL_X].cap &=
s->opt[TL_Y].cap &=
s->opt[BR_X].cap &= s->opt[BR_Y].cap &= ~SANE_CAP_INACTIVE;
s->opt[LANDSCAPE].cap |= SANE_CAP_INACTIVE;
s->val[LANDSCAPE].w = 0;
}
else
{
s->opt[TL_X].cap |=
s->opt[TL_Y].cap |=
s->opt[BR_X].cap |= s->opt[BR_Y].cap |= SANE_CAP_INACTIVE;
if (i == 3 || i == 4 || i == 7)
{ /*A5, A6 or B6 */
s->opt[LANDSCAPE].cap &= ~SANE_CAP_INACTIVE;
}
else
{
s->opt[LANDSCAPE].cap |= SANE_CAP_INACTIVE;
s->val[LANDSCAPE].w = 0;
}
}
if (info)
*info |= SANE_INFO_RELOAD_OPTIONS | SANE_INFO_RELOAD_PARAMS;
return SANE_STATUS_GOOD;
}
}
return SANE_STATUS_UNSUPPORTED;
}
static inline unsigned
mm2scanner_units (unsigned mm)
{
return mm * 12000 / 254;
}
static inline unsigned
scanner_units2mm (unsigned u)
{
return u * 254 / 12000;
}
void
init_window (struct scanner *s, struct window *wnd, int wnd_id)
{
int paper = str_index (paper_list, s->val[PAPER_SIZE].s);
memset (wnd, 0, sizeof (struct window));
*(u16 *) wnd->window_descriptor_block_length = cpu2be16 (64);
wnd->window_identifier = wnd_id;
*(u16 *) wnd->x_resolution = cpu2be16 (s->val[RESOLUTION].w);
*(u16 *) wnd->y_resolution = cpu2be16 (s->val[RESOLUTION].w);
if (!paper)
{
*(u32 *) wnd->upper_left_x =
cpu2be32 (mm2scanner_units (s->val[TL_X].w));
*(u32 *) wnd->upper_left_y =
cpu2be32 (mm2scanner_units (s->val[TL_Y].w));
*(u32 *) wnd->width =
cpu2be32 (mm2scanner_units (s->val[BR_X].w - s->val[TL_X].w));
*(u32 *) wnd->length =
cpu2be32 (mm2scanner_units (s->val[BR_Y].w - s->val[TL_Y].w));
}
else
{
u32 w = cpu2be32 (mm2scanner_units (paper_sizes[paper].width));
u32 h = cpu2be32 (mm2scanner_units (paper_sizes[paper].height));
*(u32 *) wnd->upper_left_x = cpu2be32 (mm2scanner_units (0));
*(u32 *) wnd->upper_left_y = cpu2be32 (mm2scanner_units (0));
if (!s->val[LANDSCAPE].b)
{
*(u32 *) wnd->document_width = *(u32 *) wnd->width = w;
*(u32 *) wnd->document_length = *(u32 *) wnd->length = h;
}
else
{
*(u32 *) wnd->document_width = *(u32 *) wnd->width = h;
*(u32 *) wnd->document_length = *(u32 *) wnd->length = w;
}
}
wnd->brightness = s->val[BRIGHTNESS].w;
wnd->threshold = s->val[THRESHOLD].w;
wnd->contrast = s->val[CONTRAST].w;
wnd->image_composition = mode_val[str_index (mode_list, s->val[MODE].s)];
wnd->bit_per_pixel = bps_val[str_index (mode_list, s->val[MODE].s)];
*(u16 *) wnd->halftone_pattern = 0; /*Does not supported */
*(u16 *) wnd->bit_ordering = cpu2be16 (BIT_ORDERING);
wnd->compression_type = 0; /*Does not supported */
wnd->compression_argument = 0; /*Does not supported */
wnd->vendor_unique_identifier = 0;
wnd->nobuf_fstspeed_dfstop = 0;
wnd->mirror_image = 0;
wnd->image_emphasis = str_index (image_emphasis_list,
s->val[IMAGE_EMPHASIS].s);
wnd->gamma_correction = gamma_val[str_index (gamma_list,
s->val[GAMMA_CORRECTION].s)];
wnd->mcd_lamp_dfeed_sens = str_index (lamp_list, s->val[LAMP].s) << 4 | 2;
wnd->document_size = (paper != 0) << 7
| s->val[LENGTHCTL].b << 6 | s->val[LANDSCAPE].b << 4 | paper_val[paper];
wnd->ahead_deskew_dfeed_scan_area_fspeed_rshad = s->val[DBLFEED].b << 4
| s->val[FIT_TO_PAGE].b << 2;
wnd->continuous_scanning_pages = str_index (feeder_mode_list,
s->val[FEEDER_MODE].
s) ? 0xff : 0;
wnd->automatic_threshold_mode = 0; /*Does not supported */
wnd->automatic_separation_mode = 0; /*Does not supported */
wnd->standard_white_level_mode = 0; /*Does not supported */
wnd->b_wnr_noise_reduction = 0; /*Does not supported */
if (str_index (manual_feed_list, s->val[MANUALFEED].s) == 2)
wnd->mfeed_toppos_btmpos_dsepa_hsepa_dcont_rstkr = 2 << 6;
wnd->stop_mode = 1;
}
/* Get scan parameters */
SANE_Status
sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
{
struct scanner *s = (struct scanner *) handle;
SANE_Parameters *p = &s->params;
if (!s->scanning)
{
unsigned w, h, res = s->val[RESOLUTION].w;
unsigned i = str_index (paper_list,
s->val[PAPER_SIZE].s);
if (i)
{
if (s->val[LANDSCAPE].b)
{
w = paper_sizes[i].height;
h = paper_sizes[i].width;
}
else
{
w = paper_sizes[i].width;
h = paper_sizes[i].height;
}
}
else
{
w = s->val[BR_X].w - s->val[TL_X].w;
h = s->val[BR_Y].w - s->val[TL_Y].w;
}
p->pixels_per_line = w * res / 25.4;
p->lines = h * res / 25.4;
}
p->format = (!strcmp(s->val[MODE].s,SANE_VALUE_SCAN_MODE_COLOR)) ?
SANE_FRAME_RGB : SANE_FRAME_GRAY;
p->last_frame = SANE_TRUE;
p->depth = bps_val[str_index (mode_list, s->val[MODE].s)];
p->bytes_per_line = p->depth * p->pixels_per_line / 8;
if (p->depth > 8)
p->depth = 8;
if (params)
memcpy (params, p, sizeof (SANE_Parameters));
return SANE_STATUS_GOOD;
}

2
configure vendored
Wyświetl plik

@ -34319,7 +34319,7 @@ ALL_BACKENDS="abaton agfafocus apple artec artec_eplus48u as6e \
coolscan coolscan2 coolscan3 dc25 dc210 dc240 \
dell1600n_net dmc epjitsu epson epson2 fujitsu genesys \
gphoto2 gt68xx hp hp3500 hp3900 hp4200 hp5400 \
hp5590 hpsj5s hpljm1005 hs2p ibm kodak kvs1025 \
hp5590 hpsj5s hpljm1005 hs2p ibm kodak kvs1025 kvs20xx \
leo lexmark ma1509 \
matsushita microtek microtek2 mustek mustek_pp \
mustek_usb mustek_usb2 nec net niash pie pint \

Wyświetl plik

@ -510,7 +510,7 @@ ALL_BACKENDS="abaton agfafocus apple artec artec_eplus48u as6e \
coolscan coolscan2 coolscan3 dc25 dc210 dc240 \
dell1600n_net dmc epjitsu epson epson2 fujitsu genesys \
gphoto2 gt68xx hp hp3500 hp3900 hp4200 hp5400 \
hp5590 hpsj5s hpljm1005 hs2p ibm kodak kvs1025 \
hp5590 hpsj5s hpljm1005 hs2p ibm kodak kvs1025 kvs20xx \
leo lexmark ma1509 \
matsushita microtek microtek2 mustek mustek_pp \
mustek_usb mustek_usb2 nec net niash pie pint \

Wyświetl plik

@ -36,7 +36,8 @@ BACKEND_5MANS = sane-abaton.5 sane-agfafocus.5 sane-apple.5 sane-as6e.5 \
sane-mustek_usb2.5 sane-hp3500.5 sane-pixma.5 sane-stv680.5 \
sane-hp5590.5 sane-hpljm1005.5 sane-cardscan.5 sane-hp3900.5 \
sane-epjitsu.5 sane-hs2p.5 sane-canon_dr.5 sane-xerox_mfp.5 \
sane-rts8891.5 sane-coolscan3.5 sane-kvs1025.5 sane-p5.5
sane-rts8891.5 sane-coolscan3.5 sane-kvs1025.5 sane-kvs20xx.5 \
sane-p5.5
EXTRA_DIST += sane-abaton.man sane-agfafocus.man sane-apple.man sane-as6e.man \
sane-dll.man sane-dc25.man sane-dmc.man sane-epson.man \
@ -60,7 +61,7 @@ EXTRA_DIST += sane-abaton.man sane-agfafocus.man sane-apple.man sane-as6e.man \
sane-pixma.man sane-stv680.man sane-hp5590.man sane-hpljm1005.man \
sane-cardscan.man sane-hp3900.man sane-epjitsu.man sane-hs2p.man \
sane-canon_dr.man sane-xerox_mfp.man sane-rts8891.man \
sane-coolscan3.man sane-kvs1025.man sane-p5.man
sane-coolscan3.man sane-kvs1025.man sane-kvs20xx.man sane-p5.man
man7_MANS = sane.7
EXTRA_DIST += sane.man
@ -172,7 +173,7 @@ DESC_FILES = descriptions/abaton.desc descriptions/agfafocus.desc \
descriptions/hp3900.desc descriptions/hp4200.desc descriptions/hp5400.desc \
descriptions/hp5590.desc descriptions/hp.desc descriptions/hpljm1005.desc \
descriptions/hpsj5s.desc descriptions/hs2p.desc descriptions/ibm.desc \
descriptions/kodak.desc descriptions/kvs1025.desc \
descriptions/kodak.desc descriptions/kvs1025.desc descriptions/kvs20xx.desc \
descriptions/leo.desc descriptions/lexmark.desc descriptions/ma1509.desc \
descriptions/matsushita.desc descriptions/microtek2.desc \
descriptions/microtek.desc descriptions/mustek.desc \

Wyświetl plik

@ -280,9 +280,9 @@ EXTRA_DIST = scanimage.man sane-config.man sane-find-scanner.man \
sane-hpljm1005.man sane-cardscan.man sane-hp3900.man \
sane-epjitsu.man sane-hs2p.man sane-canon_dr.man \
sane-xerox_mfp.man sane-rts8891.man sane-coolscan3.man \
sane-kvs1025.man sane-p5.man sane.man saned.man \
descriptions.txt releases.txt sane-logo2.jpg sane-logo.png \
sane.png sane.tex net.tex html.sty $(DESC_FILES) \
sane-kvs1025.man sane-kvs20xx.man sane-p5.man sane.man \
saned.man descriptions.txt releases.txt sane-logo2.jpg \
sane-logo.png sane.png sane.tex net.tex html.sty $(DESC_FILES) \
descriptions/template.desc. $(DESC_EXT_FILES) \
descriptions-external/template.desc. figs/area.eps \
figs/area.fig figs/flow.eps figs/flow.fig figs/hierarchy.eps \
@ -310,7 +310,8 @@ BACKEND_5MANS = sane-abaton.5 sane-agfafocus.5 sane-apple.5 sane-as6e.5 \
sane-mustek_usb2.5 sane-hp3500.5 sane-pixma.5 sane-stv680.5 \
sane-hp5590.5 sane-hpljm1005.5 sane-cardscan.5 sane-hp3900.5 \
sane-epjitsu.5 sane-hs2p.5 sane-canon_dr.5 sane-xerox_mfp.5 \
sane-rts8891.5 sane-coolscan3.5 sane-kvs1025.5 sane-p5.5
sane-rts8891.5 sane-coolscan3.5 sane-kvs1025.5 sane-kvs20xx.5 \
sane-p5.5
man7_MANS = sane.7
man8_MANS = saned.8
@ -375,7 +376,7 @@ DESC_FILES = descriptions/abaton.desc descriptions/agfafocus.desc \
descriptions/hp3900.desc descriptions/hp4200.desc descriptions/hp5400.desc \
descriptions/hp5590.desc descriptions/hp.desc descriptions/hpljm1005.desc \
descriptions/hpsj5s.desc descriptions/hs2p.desc descriptions/ibm.desc \
descriptions/kodak.desc descriptions/kvs1025.desc \
descriptions/kodak.desc descriptions/kvs1025.desc descriptions/kvs20xx.desc \
descriptions/leo.desc descriptions/lexmark.desc descriptions/ma1509.desc \
descriptions/matsushita.desc descriptions/microtek2.desc \
descriptions/microtek.desc descriptions/mustek.desc \

Wyświetl plik

@ -0,0 +1,48 @@
;
; SANE Backend specification file
;
; It's basically emacs-lisp --- so ";" indicates comment to end of line.
; All syntactic elements are keyword tokens, followed by a string or
; keyword argument, as specified.
;
; ":backend" *must* be specified.
; All other information is optional (but what good is the file without it?).
;
:backend "kvs20xx" ; name of backend
:version "2" ; version of backend
:manpage "sane-kvs1025" ; name of manpage (if it exists)
:comment "New backend for SANE release 1.0.22, see sane-kvs20xx manpage"
:devicetype :scanner ; start of a list of devices....
:mfg "Panasonic" ; name a manufacturer
:url "http://www.panasonic.com/"
:model "KV-S2025C"
:interface "SCSI"
:status :untested
:model "KV-S2026C"
:interface "USB"
:usbid "0x04da" "0x1000"
:status :untested
:model "KV-S2028C"
:interface "USB"
:usbid "0x04da" "0x100a"
:status :untested
:model "KV-S2045C"
:interface "SCSI"
:status :untested
:model "KV-S2046C"
:interface "USB"
:usbid "0x04da" "0x1001"
:status :untested
:model "KV-S2048C"
:interface "USB"
:usbid "0x04da" "0x1009"
:status :untested

Wyświetl plik

@ -0,0 +1,29 @@
.TH sane\-kvs20xx 5 "09 Jun 2010" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
.IX sane\-kvs20xx
.SH NAME
sane\-kvs20xx \- SANE backend for Panasonic KV-S20xxC USB/SCSI ADF scanners.
.SH DESCRIPTION
The
.B sane\-kvs20xx
library implements a SANE (Scanner Access Now Easy) backend which
provides access to the Panasonic KV-S202xC and KV-S204xC scanners.
.SH KNOWN ISSUES
This document was written by the SANE project, which has no information
regarding the capabilites or reliability of the backend. All information
contained here is suspect.
.SH CREDITS
The backend was written by Panasonic Russia Ltd.
The backend was ported to sane-backends 1.0.22 and downgraded to C89
by m. allan noah.
.SH "SEE ALSO"
sane(7), sane\-usb(5), sane\-scsi(5)
.SH AUTHOR
m. allan noah: <kitno455 a t gmail d o t com>