9.1.7. Radiotrack 无线电驱动程序

作者:Stephen M. Benoit <benoits@servicepro.com>

日期:1996 年 12 月 14 日

9.1.7.1. 致谢

本文档基于 Gideon le Grange ( legrang@active.co.zalegrang@cs.sun.ac.za ) 于 1994 年为 Linux 编写的“C”代码,以及 Frans Brinkman ( brinkman@esd.nl ) 于 1996 年的详细说明。此处报告的结果来自作者在他自己的设置上进行的实验,因此您的结果可能会有所不同... 我不保证、声明或担保此信息的适用性或有效性。作者没有获得 AIMS Lab ( http://www.aimslab.com/ ) RadioTrack 卡的其他文档。提供本文档的目的是希望它可以帮助那些想在 MS Windows 以外的环境中使用 RadioTrack 卡的用户。

9.1.7.2. 为什么要编写本文档?

我有一张 RadioTrack 卡,那是当我运行 MS-Windows 平台的时候用的。在转换为 Linux 后,我找到了 Gideon le Grange 用于运行该卡的命令行软件,并发现它非常好!Frans Brinkman 制作了一个舒适的 X-windows 界面,并添加了一个扫描功能。为了体现其黑客价值,我想看看调谐器是否可以调谐到超出通常的 FM 无线电广播频段,这样我就可以接收到位于 87.0-109.0 MHz 范围下方和上方一点的北美广播电视频道的音频载波。我没有取得太大的成功,但我了解了在 Linux 下对 ioport 进行编程,并获得了一些关于该卡所用硬件设计的见解。

所以,事不宜迟,以下是详细信息。

9.1.7.3. 物理描述

RadioTrack 卡是一张 ISA 8 位 FM 无线电卡。射频 (RF) 输入只是一个天线引线,输出是通过微型电话插头提供的功率音频信号。其工作射频大致限制在 87.0 到 109.0 MHz(商业 FM 广播频段)。虽然可以对寄存器进行编程以请求超出这些限制的频率,但实验没有给出有希望的结果。解调中频 (IF) 信号的可变频率振荡器 (VFO) 可能有一个很小的有用频率范围,并且超出上述限制时会回绕或被削波。

9.1.7.4. 使用 IOPORT 控制卡

RadioTrack(基本)ioport 可配置为 0x30c 或 0x20c。似乎只涉及一个 ioport。ioport 解码电路必须非常简单,因为单个 ioport 位直接与无线电卡的特定功能(或块)匹配。这样,可以通过一次写入 ioport 来并行更改许多功能。通过 ioport 获得的唯一反馈似乎是“立体声检测”位。

ioport 的位排列如下

MSb                                                         LSb
+------+------+------+--------+--------+-------+---------+--------+
| VolA | VolB | ???? | Stereo | Radio  | TuneA | TuneB   | Tune   |
|  (+) |  (-) |      | Detect | Audio  | (bit) | (latch) | Update |
|      |      |      | Enable | Enable |       |         | Enable |
+------+------+------+--------+--------+-------+---------+--------+

VolA

VolB

描述

0

0

音频静音

0

1

音量 +(需要一些延迟)

1

0

音量 -(需要一些延迟)

1

1

保持当前音量

立体声检测启用

描述

0

未检测到

1

检测到

在上次端口写入后 > 60 毫秒读取 ioport 可获得结果。

0xff ==> 未检测到立体声,0xfd ==> 检测到立体声。

无线电到音频(路径)启用

描述

0

禁用路径(静音)

1

启用路径(产生音频)

TuneA

TuneB

描述

0

0

“零”位相位 1

0

1

“零”位相位 2

1

0

“一”位相位 1

1

1

“一”位相位 2

24 位代码,其中位 = (freq*40) + 10486188。最高有效 11 位必须为 1010 xxxx 0x0 才有效。这些位以 LSb 开头移入。

调谐更新启用

描述

0

调谐器保持恒定

1

调谐器正在更新

9.1.7.5. 编程示例

Default:        BASE <-- 0xc8  (current volume, no stereo detect,
                                radio enable, tuner adjust disable)

Card Off:       BASE <-- 0x00  (audio mute, no stereo detect,
                                radio disable, tuner adjust disable)

Card On:        BASE <-- 0x00  (see "Card Off", clears any unfinished business)
                BASE <-- 0xc8  (see "Default")

Volume Down:    BASE <-- 0x48  (volume down, no stereo detect,
                                radio enable, tuner adjust disable)
                wait 10 msec
                BASE <-- 0xc8  (see "Default")

Volume Up:      BASE <-- 0x88  (volume up, no stereo detect,
                                radio enable, tuner adjust disable)
                wait 10 msec
                BASE <-- 0xc8  (see "Default")

Check Stereo:   BASE <-- 0xd8  (current volume, stereo detect,
                                radio enable, tuner adjust disable)
                wait 100 msec
                x <-- BASE     (read ioport)
                BASE <-- 0xc8  (see "Default")

                x=0xff ==> "not stereo", x=0xfd ==> "stereo detected"

Set Frequency:  code = (freq*40) + 10486188
                foreach of the 24 bits in code,
                (from Least to Most Significant):
                to write a "zero" bit,
                BASE <-- 0x01  (audio mute, no stereo detect, radio
                                disable, "zero" bit phase 1, tuner adjust)
                BASE <-- 0x03  (audio mute, no stereo detect, radio
                                disable, "zero" bit phase 2, tuner adjust)
                to write a "one" bit,
                BASE <-- 0x05  (audio mute, no stereo detect, radio
                                disable, "one" bit phase 1, tuner adjust)
                BASE <-- 0x07  (audio mute, no stereo detect, radio
                                disable, "one" bit phase 2, tuner adjust)