kopia lustrzana https://gitlab.com/sane-project/backends
Add new kvs20xx backend from Panasonic, for KV-S202xC and KV-S204xC
rodzic
c615c665b4
commit
e7efa77aa5
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -40,6 +40,7 @@ hs2p
|
|||
ibm
|
||||
kodak
|
||||
kvs1025
|
||||
kvs20xx
|
||||
leo
|
||||
lexmark
|
||||
ma1509
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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*/
|
|
@ -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;
|
||||
}
|
|
@ -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*/
|
|
@ -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;
|
||||
}
|
|
@ -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 \
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
@ -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>
|
||||
|
Ładowanie…
Reference in New Issue