相比於集成在各大廠商筆記本中的紅外發射器,這個獨立的 USB 口發射器在 Linux 下驅動起來比較麻煩,不過最終 還是成功了。以下是 IRDA 子系統的工作原理 1)首先,與預先猜測的不同,這款紅外線收發器雖然用了 USB,但卻並不屬於 USB 設備類中規定的類型,因而無法使用 USB 通用驅動。在 Windows 上可以看出它屬於串口類,型號是 MA-620 2)這個收發器內部其實是一個 USB 轉串口線,型號是 PL2303,因此插入電腦後,能被最新的內核識別,並且映射成 USB 串口 /dev/ttyUSB0 3)在這個假冒串口的後面,才接著一個真正的紅外線收發器,它的真正類型是 MA-600,因而可以通用 MA-600 的驅動。 4)因此,驅動這個USB紅外,其實是在USB串口上安裝tty層,其上再裝IRDA協議棧。其圖示如下:
ircomm 等應用層協議 linux-irda-stack sir-dev irtty-sir [ma600-sir] tty-layer usbserial [pl2303] usb_hcd [ehci/ohci/uhci]
所使用的模塊如下: Module Size Used by ma600_sir 3328 1 irtty_sir 7424 2 sir_dev 17452 2 ma600_sir,irtty_sir irda 129468 2 ma600_sir,sir_dev pl2303 16644 1 usbserial 27812 3 pl2303 uhci_hcd 30736 0 5)但是,實際情況總是沒有分析得那麼好。上述方案有以下限制: 首先,在USB轉串口跑tty,在任何一個2.4版的kernel上都有嚴重的向題,會不定期的死鎖 其次,pl2303 驅動在kernel 2.6.3 以前存在著bug,會讓DMA傳輸沖掉堆棧。同時這個版本之前的 ma600 驅動不能正確處理錯誤,無法從出錯狀態中恢復出來 第三,直到最近版本,ma600都無法處理 ma620 的速度轉換請求,一轉速庋就出錯,因此我們只能使用默認的9600這個速度。同時不要嘗試 rmmod pl2303, 2.6.7 以前的內核版本會導致 oops 最後,你必須使用最新的 irda-utils 包 0.9.17-pre3 以上版本,舊版在特定情況下會崩潰 6)OK, 現在下面就是我們啟動紅外功能的腳本: Start: #!/bin/sh # # Minimal stuff required to get the MA620 USB IRDA dongle recognised by # the kernel. modprobe uhci_hcd modprobe pl2303 modprobe irda echo 9600 > /proc/sys/net/irda/max_baud_rate modprobe irtty-sir modprobe ma600-sir modprobe ircomm-tty irattach /dev/usb/ttyUSB0 -d ma600 -s exit 0 Stop: #!/bin/sh # # Minimal stuff required to stop the MA620 USB IRDA dongle killall irattach kIrDAd modprobe -r ircomm-tty modprobe -r ma600 modprobe -r ma600-sir modprobe -r irtty-sir # Not removing pl2303 since it causes a kernel oops exit 0 將上述2段腳本存成文件,運行 start 開啟 irda, stop 則關閉。啟動後,將紅外設備對准你的收發器,然後輸入 irdadump 命令,如果看見設備被發現了,這就說明紅外已經起來了。通過訪問 /dev/ircomm0 可以訪問紅外串口模擬協議,如果該設備支持,你甚至可以起一個 minicom 來讀寫這個模擬串口。輸入 cat /proc/net/irda/discovery,應該能看到你的設備的名字列在裡面