8.6. 图象扫描仪

撰写人 Marc Fonvieille.

8.6.1. 介绍

在 FreeBSD 中, 访问扫描仪的能力, 是通过 SANE (Scanner Access Now Easy) API 提供的。 SANE 也会使用一些 FreeBSD 设备驱动来访问扫描仪硬件。

FreeBSD 支持 SCSI 和 USB 扫描仪。 在做任何配置之前请确保您的扫描仪被 SANE 支持。 SANE 有一个 支持的设备 列表, 可以为您提供有关扫描仪的支持情况和状态的信息。 在 FreeBSD 8.X 之前版本的系统中, uscanner(4) 手册页也提供了系统支持的 USB 扫描仪列表。

8.6.2. 内核配置

上面提到 SCSI 和 USB 接口都是支持的。 取决于您的扫描仪接口, 需要不同的设备驱动程序。

8.6.2.1. USB 接口

默认的 GENERIC 内核包含了支持 USB 扫描仪需要的设备驱动。 如果您决定使用一个定制的内核, 确保下面在您的内核配置文件中存在下面这些行:

device usb
device uhci
device ohci
device ehci

在 FreeBSD 8.X 之前的版本中, 还需要下面这行配置:

device uscanner

在这些 FreeBSD 版本中, 是通过设备驱动程序 uscanner(4) 来提供对 USB 扫描仪的支持的。 从 FreeBSD 8.0 开始, 这些支持则直接由 libusb(3) 函数库提供。

使用正确的内核重新引导系统之后, 插入 USB 扫描仪。 系统消息缓冲区 (使用 dmesg(8) 查看) 中会出现下面的信息, 表示检测到了扫描仪:

ugen0.2: <EPSON> at usbus0

或者, 对于 FreeBSD 7.X 系统而言:

uscanner0: EPSON EPSON Scanner, rev 1.10/3.02, addr 2

随 FreeBSD 版本不同, 这些信息表示扫描仪设备位于设备节点 /dev/ugen0.2/dev/uscanner0。 在这个例子中, 我们使用的是 EPSON Perfection® 1650 USB 扫描仪。

8.6.2.2. SCSI 接口

如果您的扫描仪是 SCSI 接口的, 重要的是要知道您使用哪种 SCSI 控制器。 取决于所使用的 SCSI 芯片, 您需要调整内核配置文件。 GENERIC 的内核支持最常用的 SCSI 控制器。 请阅读 NOTES 文件并在您的内核配置文件中添加正确的行。 除了 SCSI 适配器驱动之外, 您还需要在内核配置文件中增加下述配置:

device scbus
device pass

在正确地联编并安装了内核之后, 就应该可以在系统启动时, 从系统消息缓冲中看到这些设备:

pass2 at aic0 bus 0 target 2 lun 0
pass2: <AGFA SNAPSCAN 600 1.10> Fixed Scanner SCSI-2 device
pass2: 3.300MB/s transfers

如果您的扫描仪没有在系统启动的时候加电, 很可能还需要强制手动检测一下,用 camcontrol(8) 命令执行一次 SCSI 总线扫描:

# camcontrol rescan all
Re-scan of bus 0 was successful
Re-scan of bus 1 was successful
Re-scan of bus 2 was successful
Re-scan of bus 3 was successful

然后扫描仪就会出现在 SCSI 设备列表里:

# camcontrol devlist
<IBM DDRS-34560 S97B>              at scbus0 target 5 lun 0 (pass0,da0)
<IBM DDRS-34560 S97B>              at scbus0 target 6 lun 0 (pass1,da1)
<AGFA SNAPSCAN 600 1.10>           at scbus1 target 2 lun 0 (pass3)
<PHILIPS CDD3610 CD-R/RW 1.00>     at scbus2 target 0 lun 0 (pass2,cd0)

有关 SCSI 设备的更多细节, 可查看 scsi(4)camcontrol(8) 手册页。

8.6.3. SANE 配置

SANE 系统分为两部分: 后端 (graphics/sane-backends) 和前端 (graphics/sane-frontends)。 后端部分提供到扫描仪自身的访问。 SANE 支持设备列表详细说明了哪一个后端可以支持您的图象扫描仪。 如果您想使用您的设备,就必须为您的扫描仪选定正确的后端。 前端部分提供图形化的扫描界面 (xscanimage)。

要做的第一步就是安装 graphics/sane-backends port 或者 package。然后,使用 sane-find-scanner 命令来检查 SANE 系统做的扫描仪检测:

# sane-find-scanner -q
found SCSI scanner "AGFA SNAPSCAN 600 1.10" at /dev/pass3

输出显示了扫描仪的接口类型和扫描仪连接到系统上的设备节点。 生产厂家和产品型号可能没有显示,不过不重要。

注意:

一些 USB 扫描仪需要您加载固件,后端的手册页中有这方面的解释。 您也应该阅读 sane-find-scanner(1)sane(7) 手册页。

现在我们需要检查扫描仪是否可以被扫描前端识别。 默认情况下, SANE 后端自带一个叫做 scanimage(1) 的命令行工具。 这个命令允许您列出设备以及从命令行执行图片扫描。 -L 选项用来列出扫描仪设备:

# scanimage -L
device `snapscan:/dev/pass3' is a AGFA SNAPSCAN 600 flatbed scanner

或者, 如果使用的是 第 8.6.2.1 节 “USB 接口” 中的 USB 扫描仪:

# scanimage -L
device 'epson2:libusb:/dev/usb:/dev/ugen0.2' is a Epson GT-8200 flatbed scanner

上述输出来自于 FreeBSD 8.X 系统。 'epson2:libusb:/dev/usb:/dev/ugen0.2' 给出了扫描仪所使用的后台名字 (epson2) 和设备节点 (/dev/ugen0.2)。

注意:

如果没有输出任何信息, 或提示没有识别到扫描仪, 则说明 scanimage(1) 无法识别它。 如果发生这种情况, 您就需要修改扫描仪支持后端的配置文件, 并定义所使用的扫描设备。 /usr/local/etc/sane.d/ 目录中包含了所有的后端配置文件。 这类识别问题经常会在某些 USB 扫描仪上发生。

linkend="scanners-kernel-usb"> 中所使用的 USB 扫描仪, sane-find-scanner 会给出下面的信息:

例如, 对于在 第 8.6.2.1 节 “USB 接口”, 在 FreeBSD 8.X 中, 扫描仪已经被很好地识别并能够正常工作了; 而对于更早版本的 FreeBSD 而言 (使用 uscanner(4) 驱动程序) sane-find-scanner 则会给出这样的信息:

# sane-find-scanner -q
found USB scanner (UNKNOWN vendor and product) at device /dev/uscanner0

扫描仪被正确的探测到了,它使用 USB 接口,连接在 /dev/uscanner0 设备节点上。 我们现在可以检查看看扫描仪是否被正确的识别:

# scanimage -L

No scanners were identified. If you were expecting something different,
check that the scanner is plugged in, turned on and detected by the
sane-find-scanner tool (if appropriate). Please read the documentation
which came with this software (README, FAQ, manpages).

由于扫描仪没有识别成功, 我们就需要编辑 /usr/local/etc/sane.d/epson2.conf 文件。 所用的扫描仪型号是 EPSON Perfection® 1650, 这样我们知道扫描仪应使用 epson 后端。确保阅读后端配置文件中的帮助注释。 改动非常简单:注释掉导致您的扫描仪使用错误接口的所有行 (在我们这种情况下,我们将注释掉从 scsi 开始的所有行,因为我们的扫描仪使用 USB 接口),然后在文件的结尾添加指定的接口和所用的设备节点。 这种情况下, 添加下面这行:

usb /dev/uscanner0

请确保阅读后端配置文件提供的注释以及后端手册页了解更多细节, 并使用正确的语法。我们现在可以检验扫描仪是否被识别到了:

# scanimage -L
device `epson:/dev/uscanner0' is a Epson GT-8200 flatbed scanner

我们的 USB 扫描仪被识别到了。 此时如果商标和型号与扫描仪的实际情况不符, 并不会带来太大的麻烦。 您需要关注的是 `epson:/dev/uscanner0' 字段, 这个给了我们正确地后端名称和正确的设备节点。

一旦 scanimage -L 命令可以看到扫描仪, 配置就完成了。设备现在准备好等待扫描了。

scanimage(1) 允许我们从命令行执行图片扫描, 相比之下使用图形用户界面来执行图片扫描会更好。 SANE 提供了一个简单但实用的图形界面: xscanimage (graphics/sane-frontends)。

Xsane (graphics/xsane)是另一个流行的图形扫描前端。 这个前端提供了一些高级特性, 比如多样的扫描模式(photocopy,fax,等。), 色彩校正,批量扫描,等等。这两个程序都可以作为 GIMP 的插件使用。

8.6.4. 授权其他用户访问扫描仪

前面所有的操作都是用 root 权限来完成的。 然而您可能需要让其他的用户也可以访问扫描仪。 用户需要有扫描仪所用的设备节点的读和写权限。 比如,我们的 USB 扫描仪使用设备节点 /dev/ugen0.2 实际上只是到实际设备节点 /dev/usb/0.2.0 的符号连接 (可以通过查看 /dev 目录的内容来确认这一点)。 设备节点本身和这个符号连接分别属于 wheeloperator 组。 将用户 joe 添加到 这些组中, 就可以允许他使用扫描仪了, 不过, 出于显而易见的安全方面的原因, 在将用户加到特定的用户组, 特别是 wheel 组时, 无疑需三思而后行。 更好的解决方法是创建一个专门用于访问 USB 设备的组, 并让这个组的成员能够访问 USB 设备。

这里作为示例, 我们将会使用名为 usb 的组。 第一步是借助 pw(8) 命令来创建它:

# pw groupadd usb

接下来, 令 /dev/ugen0.2 符号连接和 /dev/usb/0.2.0 设备节点能够以 usb 组的身份来访问, 具体而言是配置正确的写权限 (06600664), 因为默认情况下只有属主 (root) 才能写这些设备。 这些配置是通过在 /etc/devfs.rules 文件中添加如下的设置来实现的:

[system=5]
add path ugen0.2 mode 0660 group usb
add path usb/0.2.0 mode 0666 group usb

FreeBSD 7.X 用户需要将上面的配置改为使用与之对应的 /dev/uscanner0

[system=5]
add path uscanner0 mode 660 group usb

随后您还需要在 /etc/rc.conf 中添加下面的内容并重新启动:

devfs_system_ruleset="system"

关于这些配置的进一步细节请参考联机手册 devfs(8)

现在, 只需将用户添加到 usb 组, 就可以使用扫描仪了:

# pw groupmod usb -m joe

更多详情, 请参见联机手册 pw(8)

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.