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)