4.6. IrDA 和 USB

IrDA USB 驱动程序包含在最新的 2.4 内核中。它不如其他 FIR 硬件高效,但至少受到支持,并且相对容易使其工作。此外,目前所有产品都基于相同的硬件,并且我们了解它的大部分错误。

据我所知,Actisys 2000U 和 Extended System ESI-9685 加密狗似乎基于相同的硬件。这两款 USB 加密狗都能与 Linux 驱动程序良好工作。在一个盒子里可以使用多个 USB 加密狗(目前最多 4 个)。

最新版本的驱动程序已经过 usb-uhciusb-ohci 测试。另请参阅 src 中的驱动程序信息,例如 USB 2.0

有一个 USB IrDA 桥接设备规范 Rev 0.9B,它正在被采纳为 USB 类规范。您可以在 USB.org 的 0.9 类规范标题下找到它。

最近,市场上出现了一种来自 SigmaTel 的新型 USB 加密狗,它 _不_ 符合 IrDA-USB 规范,因此无法与此驱动程序一起工作。另一方面,SigmaTel 提供了 完整的技术规范,因此为它编写驱动程序是可能的。

4.6.1. 环境

我已在此环境下检查过本章:ACTiSYS ACT-IR2000U FIR-USB 适配器(但它应该适用于任何其他 USB 加密狗,除了上面提到的那款),内核 2.4.19,irda-utils 0.9.14 和 Debian GNU/Linux 3.0 Woody。

4.6.2. 先决条件

您需要一个具有适当 IrDA 和 USB 支持的内核,以及以下文件中的标准条目/etc/modprobe.conf(kernel 2.6)/etc/modules.conf(kernel 2.4) 以及以下文件中的设备/dev/ir*如以上章节所述。以及第二个 IrDA 设备,无论其内部是否有 Linux,例如,带有 IrDA 端口的笔记本电脑、打印机或手机。

您需要一个工作的 USB 控制器。使用 lsmod 检查是否已插入相应的模块。如果未插入,您可以使用 modprobe usb-uhci (对于 Intel/Via USB 控制器) 或 modprobe usb-ohci (对于其他 USB 控制器) 插入它

注意:此驱动程序尚未在 usb-ehci 驱动程序(对于 USB 2.0 控制器)上进行测试。此驱动程序将 _不_ 适用于 uhci 驱动程序(适用于 Intel/Via USB 控制器的备用/JE 驱动程序)。

Warning

请注意,还有另一个 USB IrDA 驱动程序(由 Linux USB Project 提供)用于这些设备,名为 ir-usb。此模块与 IrDA 堆栈 _不_ 兼容,并且与 irda-usb 冲突。因为它总是首先加载,所以您必须完全删除 ir-usb

如果您不熟悉路由问题,我建议在首次设置期间使用 ifconfig 关闭所有外部网络接口。然后使用 route -n 检查。此外,网络过滤 (iptables) 可能会导致问题,因此如果您未连接到网络,则可以禁用它。

我已经详细描述了该过程,以尽可能清楚地说明每个注意事项。实际配置要简短得多且更容易。在配置期间,我将选择打开三个不同的终端窗口来查看来自不同程序的日志消息。

4.6.3. 插入加密狗

现在插入加密狗并使用 dmesg 检查内核消息

hub.c: USB new device connect on bus1/1, assigned device number 2
usb.c: USB device 2 (vend/prod 0x50f/0x180) is not claimed by any active driver.
usb.c: registered new driver irda-usb
IRDA-USB found at address 2, Vendor: 50f, Product: 180
irda_usb_parse_endpoints(), And our endpoints are : in=02, out=01 (64), int=03
irda_usb_init_qos(), dongle says speed=0x13E, size=0x20, window=0x2, bofs=0x4, turn=0x2
IrDA: Registered device irda1
USB IrDA support registered

如果您已经在 PC 上配置了一些其他 IrDA 硬件,则驱动程序将不会加载为irda0,因此检查如上所示的消息日志非常重要(驱动程序可以管理每台 PC 最多 4 个 IrDA-USB 加密狗,这可以在源代码中增加)。

在此示例中,设备是irda1。您也可以使用 ifconfig 检查这一点

irda1     Link encap:IrLAP  HWaddr 2c:52:61:ec
          EtherTalk Phase 2 addr:140/191
          UP RUNNING NOARP  MTU:2048  Metric:1
          RX packets:2278 errors:0 dropped:0 overruns:0 frame:0
          TX packets:844 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0
          RX bytes:33848 (33.0 KiB)  TX bytes:15116 (14.7 KiB)

4.6.4. 附加驱动程序

现在您已准备好将 Linux/IrDA 服务附加到加密狗。使用 irattach irda1 -s (请注意上一步中的设备名称)。

适配器上的绿色 LED 现在应该闪烁,大约每三秒一次。使用 dmesg 您可能会看到此消息

irlap_change_speed(), setting speed to 9600
irlap_recv_discovery_xid_cmd(), discovery frame to short!

现在启动 irdadump,您应该看到范围内的所有 IrDA 设备。或者至少是这一个,这里是 “japh”(本示例中的另一个 IrDA 设备名为 “Olga”)。为了诊断目的,请让 irdadump 在此终端窗口中运行,然后切换到另一个窗口进行下一步操作。

07:58:40.889590 xid:cmd ffffffff < 4fe026d8 S=6 s=3 (14)
07:58:40.979575 xid:cmd ffffffff < 4fe026d8 S=6 s=4 (14)
07:58:40.979679 xid:rsp 2c5261ec > 4fe026d8 S=6 s=4 japh hint=0400 [ Computer ] (20)
07:58:41.069571 xid:cmd ffffffff < 4fe026d8 S=6 s=5 (14)
07:58:41.166552 xid:cmd ffffffff < 4fe026d8 S=6 s=* Olga hint=0400 [ Computer ] (20)
07:58:43.620104 xid:cmd ffffffff < 4fe026d8 S=6 s=0 (14)
07:58:43.709078 xid:cmd ffffffff < 4fe026d8 S=6 s=1 (14)

4.6.5. 加载 IrCOMM 模块

现在加载 IrCOMM 模块(请注意,如果您通过 IrDA 启动 PPP 或打印,这通常由内核守护程序 kmod 自动完成,但对于第一次,我们手动执行操作)。因此,执行 modprobe ircommmodprobe ircomm-tty

现在 dmesg 将显示

IrCOMM protocol (Dag Brattli)
ircomm_open_lsap()
ircomm_tty_attach_cable()
ircomm_tty_ias_register()
ircomm_tty_close()
ircomm_tty_shutdown()
ircomm_tty_detach_cable()
ircomm_close()

使用 lsmod 您可能会看到

Module                  Size  Used by    Tainted: P  
ircomm-tty             30080   0  (autoclean)
ircomm                 13164   0  (autoclean) [ircomm-tty]
irda-usb               13776   1 
...
irtty                   7264   0  (autoclean)
irda                  141648   1  (autoclean) [ircomm-tty ircomm irda-usb irtty]

4.6.6. 设置网络 (PPP)

您可以使用命令行选项启动 pppd,但对我来说,拥有一个配置文件更方便/etc/ppp/peers/irda.

connect /bin/true
noauth
persist
debug
kdebug 7
nodetach
115200
local
/dev/ircomm0
192.168.0.2:192.168.0.3

关于配置的一些说明:是的,设备名称是正确的,这里不要选择 USB 设备。如果另一个 IrDA 设备是 Linux 笔记本电脑,您可以使用相同的配置文件和相同的 PPP 选项,而无需最后一行,最后一行设置了本地和远程 IP 地址。以下条目用于调试目的,当一切正常工作时可以注释掉

persist
debug
kdebug 7
nodetach

现在使用 pppd call irda 启动 PPP。为了诊断目的,请让消息在此终端窗口中运行,然后切换到另一个窗口进行下一步操作。

Serial connection established.
using channel 3
Using interface ppp0
Connect: ppp0 <--> /dev/ircomm0
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x4592a46e> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x4592a46e> <pcomp> <accomp>]
...

现在在远程 IrDA 设备上启动 PPP,您应该看到

sent [LCP EchoReq id=0x0 magic=0x3c8803b1]
sent [IPCP ConfReq id=0x1 <addr 192.168.0.2> <compress VJ 0f 01>]
sent [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x3c8803b1> <pcomp> <accomp>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x3c8803b1> <pcomp> <accomp>]
rcvd [LCP EchoReq id=0x0 magic=0xa922f0e8]
sent [LCP EchoRep id=0x0 magic=0x3c8803b1]
rcvd [IPCP ConfReq id=0x1 <addr 0.0.0.0> <compress VJ 0f 01>]
sent [IPCP ConfNak id=0x1 <addr 192.168.0.3>]
rcvd [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
sent [CCP ConfAck id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
rcvd [LCP EchoRep id=0x0 magic=0xa922f0e8]
rcvd [IPCP ConfAck id=0x1 <addr 192.168.0.2> <compress VJ 0f 01>]
rcvd [CCP ConfAck id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
Deflate (15) compression enabled
rcvd [IPCP ConfReq id=0x2 <addr 192.168.0.3> <compress VJ 0f 01>]
sent [IPCP ConfAck id=0x2 <addr 192.168.0.3> <compress VJ 0f 01>]
Cannot determine ethernet address for proxy ARP
local  IP address 192.168.0.2
remote IP address 192.168.0.3
Script /etc/ppp/ip-up started (pid 3975)
Script /etc/ppp/ip-up finished (pid 3975), status = 0x1

在运行 irdadump 的窗口中,您会看到 IrDA 流量

08:17:11.179260 i:rsp  > ca=08 pf=1 nr=1 ns=2 LM slsap=00 dlsap=19 CONN_RSP (6)
08:17:11.199127 i:cmd  < ca=08 pf=1 nr=3 ns=1 LM slsap=00 dlsap=1d CONN_RSP (6)
08:17:11.199226 i:rsp  > ca=08 pf=1 nr=2 ns=3 LM slsap=1d dlsap=00 GET_VALUE_BY_CLASS: "IrLPT" "IrDA:IrLMP:LsapSel" (30)
08:17:11.219123 i:cmd  < ca=08 pf=1 nr=4 ns=2 LM slsap=00 dlsap=1c CONN_RSP (6)
08:17:11.219207 i:rsp  > ca=08 pf=1 nr=3 ns=4 LM slsap=1c dlsap=00 GET_VALUE_BY_CLASS: "IrDA:IrCOMM" "Parameters" (28)
08:17:11.241117 i:cmd  < ca=08 pf=1 nr=5 ns=3 LM slsap=19 dlsap=00 GET_VALUE_BY_CLASS: "IrDA:IrCOMM" "Parameters" (28)
08:17:11.241213 i:rsp  > ca=08 pf=1 nr=4 ns=5 LM slsap=00 dlsap=19 GET_VALUE_BY_CLASS: Success N/A (19)
08:17:11.259114 i:cmd  < ca=08 pf=1 nr=6 ns=4 LM slsap=00 dlsap=1d GET_VALUE_BY_CLASS: No such class (11)
08:17:11.259216 i:rsp  > ca=08 pf=1 nr=5 ns=6 LM slsap=1d dlsap=00 DISC (6)
08:17:11.280107 i:cmd  < ca=08 pf=1 nr=7 ns=5 LM slsap=00 dlsap=1c GET_VALUE_BY_CLASS: Success N/A (19)
08:17:11.280281 i:rsp  > ca=08 pf=0 nr=6 ns=7 LM slsap=1c dlsap=00 DISC (6)
08:17:11.282124 i:rsp  > ca=08 pf=1 nr=6 ns=0 LM slsap=1e dlsap=00 CONN_CMD (6)
08:17:11.299104 i:cmd  < ca=08 pf=1 nr=1 ns=6 LM slsap=19 dlsap=00 DISC (6)
08:17:11.299204 rr:rsp > ca=08 pf=1 nr=7 (2)
08:17:11.319102 i:cmd  < ca=08 pf=1 nr=1 ns=7 LM slsap=1a dlsap=00 CONN_CMD (6)
08:17:11.319209 i:rsp  > ca=08 pf=1 nr=0 ns=1 LM slsap=00 dlsap=1a CONN_RSP (6)
08:17:11.339100 i:cmd  < ca=08 pf=1 nr=2 ns=0 LM slsap=00 dlsap=1e CONN_RSP (6)
08:17:11.339197 i:rsp  > ca=08 pf=1 nr=1 ns=2 LM slsap=1e dlsap=00 GET_VALUE_BY_CLASS: "IrDA:IrCOMM" "IrDA:TinyTP:LsapSel" (37)
08:17:11.361096 i:cmd  < ca=08 pf=1 nr=3 ns=1 LM slsap=1a dlsap=00 GET_VALUE_BY_CLASS: "IrDA:IrCOMM" "IrDA:TinyTP:LsapSel" (37)
08:17:11.361191 i:rsp  > ca=08 pf=1 nr=2 ns=3 LM slsap=00 dlsap=1a GET_VALUE_BY_CLASS: Success Integer: 14 (15)
08:17:11.380092 i:cmd  < ca=08 pf=1 nr=4 ns=2 LM slsap=00 dlsap=1e GET_VALUE_BY_CLASS: Success Integer: 14 (15)
08:17:11.380214 i:rsp  > ca=08 pf=0 nr=3 ns=4 LM slsap=1e dlsap=00 DISC (6)
08:17:11.382104 i:rsp  > ca=08 pf=1 nr=3 ns=5 LM slsap=14 dlsap=14 CONN_CMD TTP credits=0(7)
08:17:11.399090 i:cmd  < ca=08 pf=1 nr=6 ns=3 LM slsap=1a dlsap=00 DISC (6)
08:17:11.399190 rr:rsp > ca=08 pf=1 nr=4 (2)
08:17:11.419082 i:cmd  < ca=08 pf=1 nr=6 ns=4 LM slsap=14 dlsap=14 CONN_CMD TTP credits=0(7)
08:17:11.419159 rr:rsp > ca=08 pf=1 nr=5 (2)
08:17:11.438080 rr:cmd < ca=08 pf=1 nr=6 (2)

切换到另一个终端并使用 ifconfig 检查 PPP 设备

ppp0      Link encap:Point-to-Point Protocol
          inet addr:192.168.0.2  P-t-P:192.168.0.3  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0
          RX bytes:318 (318.0 b)  TX bytes:708 (708.0 b)

使用 ps aux | grep irda 您现在应该看到这些进程

root      3534  0.0  0.2  1272  464 ?        S    06:51   0:00 irattach irda1 -s
root      3579  0.3  0.2  1400  476 tty1     S    06:55   0:06 irdadump
root      4312  0.1  0.4  2088  948 tty2     S    07:18   0:00 pppd call irda

使用 route -n 您现在可能会看到此 PPP 设备

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.3     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
0.0.0.0         192.168.0.3     0.0.0.0         UG    0      0        0 ppp0

并且应该可以对远程主机执行 ping 192.168.0.3

PING 192.168.0.3 (192.168.0.3): 56 data bytes
64 bytes from 192.168.0.3: icmp_seq=0 ttl=64 time=290.7 ms
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=146.6 ms

现在您可以使用 TCP/IP 应用程序。例如 ssh (请注意,建立连接需要一些时间,请耐心等待)

ssh -v USER@192.168.0.3

4.6.7. 设置打印机连接 (IrLPT)

除了使用 TCP/IP 连接外,加密狗也适用于打印机连接。设备名称是/dev/irlpt0。有关 IrDA 打印机连接的详细信息,请参阅上面的相应章节。

4.6.8. 清理

您现在可以微调您的设置,例如,解决路由问题。也可能设置更高的速度,但我尚未尝试过。如果一切正常,您现在可以选择使配置永久化。您可以编辑/etc/irda.conf并配置 system V init 脚本(用于 IrDA、网络等)。但正确执行此操作的方式取决于您的 Linux 发行版。

4.6.9. 遗留问题

我遇到了一个奇怪的问题。当插入 IrDA-USB 加密狗时,我从蜂鸣器中听到轻微且持续的噪音。