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 位代码,其中 bits = (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)