9.1.7. Radiotrack 无线电驱动程序¶
作者:Stephen M. Benoit <benoits@servicepro.com>
日期:1996 年 12 月 14 日
9.1.7.1. 致谢¶
本文档基于 Gideon le Grange ( legrang@active.co.za 或 legrang@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)