7.7. 图像扫描器

在 FreeBSD 中,对图像扫描仪的访问是由 SANE (Scanner Access Now Easy) 提供的,它可以在 FreeBSD ports 中找到。SANE 也会使用一些 FreeBSD 设备驱动程序来提供对扫描仪硬件的访问。

FreeBSD 同时支持 SCSI 和 USB 扫描仪。根据扫描仪接口的不同,需要不同的设备驱动。在进行任何配置之前,请确认扫描仪是由 SANE 支持的。关于支持的扫描仪的更多信息,请参考 http://www.sane-project.org/sane-supported-devices.htmlopen in new window

这一章描述了如何确定扫描仪是否已经被 FreeBSD 检测到。然后概述了如何在 FreeBSD 系统上配置和使用 SANE。

7.7.1. 检查扫描器

GENERIC 内核包括支持 USB 扫描仪所需的设备驱动。使用自定义内核的用户应该确保在自定义内核的配置文件中存在以下几行:

device usb
device uhci
device ohci
device ehci
device xhci

要确定是否检测到 USB 扫描仪,请将其插入并使用 dmesg 来确定扫描仪是否出现在系统信息缓冲区中。如果它出现了,应该会显示类似这样的信息:

ugen0.2: <EPSON> at usbus0

在这个例子中,在 /dev/ugen0.2 上检测到一台 EPSON Perfection® 1650 USB扫描仪。

如果扫描仪使用 SCSI 接口,重要的是要知道它将使用哪块 SCSI 控制器板。根据 SCSI 芯片组的不同,可能需要一个自定义的内核配置文件。GENERIC 内核支持最常见的 SCSI 控制器。参考 /usr/src/sys/conf/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 进行 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(4)camcontrol(8) 以了解更多关于 FreeBSD 上 SCSI 设备的细节。

7.7.2. SANE配置

SANE 系统通过后端(图形/SANE-后端)提供对扫描仪的访问。请参考 http://www.sane-project.org/sane-supported-devices.htmlopen in new window,以确定哪个后端支持扫描仪。图形化扫描界面由第三方应用程序提供,如 Kooka(graphics/kooka)或 XSane(graphics/xsane)。SANE 的后端足够用来测试扫描器。

要从二进制包中安装后端:

# pkg install sane-backends

或者,从 ports 中安装:

# cd /usr/ports/graphics/sane-backends
# make install clean

在安装了 graphics/sane-backends ports 或软件包后,使用 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,可以用来列出设备并执行图像采集。使用 -L 来列出扫描仪的设备。第一个例子是 SCSI 扫描仪,第二个例子是 USB 扫描仪:

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

# scanimage -L
device 'epson2:libusb:000:002' is a Epson GT-8200 flatbed scanner

在这第二个例子中,epson2是后端名称,libusb:000:002意味着 /dev/ugen0.2 是扫描仪使用的设备节点。

如果 scanimage 无法识别扫描仪,会出现这个信息:

# 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/ 中的后端配置文件,并定义所使用的扫描仪设备。例如,如果未检测到的扫描仪型号是 EPSON Perfection® 1650,并且它使用 epson2 后端,请编辑 /usr/local/etc/sane.d/epson2.conf。编辑时,添加一行指定接口和使用的设备节点。在这种情况下,添加以下一行:

usb /dev/ugen0.2

保存编辑内容,并验证扫描仪是否被正确的后端名称和设备节点所识别:

# scanimage -L
device 'epson2:libusb:000:002' is a Epson GT-8200 flatbed scanner

如果使用 scanimage -L 能够看到该扫描仪,配置就完成了,现在可以使用扫描仪了。

虽然可以用 scanimage 从命令行执行图像采集,但通常最好是使用图形界面来执行图像扫描。像 Kooka 或 XSane 这样的应用程序是流行的扫描前台。它们提供高级功能,如各种扫描模式、颜色校正和批量扫描。XSane 也可以作为 GIMP 插件使用。

7.7.3. 扫描仪的权限

为了能够访问扫描仪,用户需要对扫描仪使用的设备节点有读写权限。在前面的例子中,USB 扫描器使用设备节点 /dev/ugen0.2,它实际上是真正的设备节点 /dev/usb/0.2.0 的一个符号链接。该符号链接和设备节点分别由 wheel 组和 operator 组拥有。虽然将用户添加到这些组中会允许访问扫描仪,但将用户添加到 wheel 中被认为是不安全的。一个更好的解决方案是创建一个组,让这个组的成员可以访问扫描仪设备。

这个例子创建了一个叫做 usb 的组:

# pw groupadd usb

然后,通过在 /etc/devfs.rules 中添加以下几行,使 /dev/ugen0.2 符号链接和 /dev/usb/0.2.0 设备节点可以被 usb 组访问,写入权限为 0660 或 0664:

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

注意: 设备节点会随着设备的增加或移除而发生变化,所以人们可能想用这个规则集给所有的 USB 设备以访问权:

[system=5]
add path 'ugen*' mode 0660 group usb
add path 'usb/*' mode 0666 group usb

关于这个文件的更多信息,请参考 [devfs.rules(5)]。

接下来,在 /etc/rc.conf 中启用该规则集:

devfs_system_ruleset="system"

并且,重新启动 [devfs(8)]系统:

# service devfs restart

最后,将用户添加到 usb,以便允许访问扫描仪:

# pw groupmod usb -m joe

更多细节请参考 [pw(8)]。