162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci 362306a36Sopenharmony_ciThe Radiotrack radio driver 462306a36Sopenharmony_ci=========================== 562306a36Sopenharmony_ci 662306a36Sopenharmony_ciAuthor: Stephen M. Benoit <benoits@servicepro.com> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ciDate: Dec 14, 1996 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ciACKNOWLEDGMENTS 1162306a36Sopenharmony_ci---------------- 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ciThis document was made based on 'C' code for Linux from Gideon le Grange 1462306a36Sopenharmony_ci(legrang@active.co.za or legrang@cs.sun.ac.za) in 1994, and elaborations from 1562306a36Sopenharmony_ciFrans Brinkman (brinkman@esd.nl) in 1996. The results reported here are from 1662306a36Sopenharmony_ciexperiments that the author performed on his own setup, so your mileage may 1762306a36Sopenharmony_civary... I make no guarantees, claims or warranties to the suitability or 1862306a36Sopenharmony_civalidity of this information. No other documentation on the AIMS 1962306a36Sopenharmony_ciLab (http://www.aimslab.com/) RadioTrack card was made available to the 2062306a36Sopenharmony_ciauthor. This document is offered in the hopes that it might help users who 2162306a36Sopenharmony_ciwant to use the RadioTrack card in an environment other than MS Windows. 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ciWHY THIS DOCUMENT? 2462306a36Sopenharmony_ci------------------ 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ciI have a RadioTrack card from back when I ran an MS-Windows platform. After 2762306a36Sopenharmony_ciconverting to Linux, I found Gideon le Grange's command-line software for 2862306a36Sopenharmony_cirunning the card, and found that it was good! Frans Brinkman made a 2962306a36Sopenharmony_cicomfortable X-windows interface, and added a scanning feature. For hack 3062306a36Sopenharmony_civalue, I wanted to see if the tuner could be tuned beyond the usual FM radio 3162306a36Sopenharmony_cibroadcast band, so I could pick up the audio carriers from North American 3262306a36Sopenharmony_cibroadcast TV channels, situated just below and above the 87.0-109.0 MHz range. 3362306a36Sopenharmony_ciI did not get much success, but I learned about programming ioports under 3462306a36Sopenharmony_ciLinux and gained some insights about the hardware design used for the card. 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ciSo, without further delay, here are the details. 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ciPHYSICAL DESCRIPTION 4062306a36Sopenharmony_ci-------------------- 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ciThe RadioTrack card is an ISA 8-bit FM radio card. The radio frequency (RF) 4362306a36Sopenharmony_ciinput is simply an antenna lead, and the output is a power audio signal 4462306a36Sopenharmony_ciavailable through a miniature phone plug. Its RF frequencies of operation are 4562306a36Sopenharmony_cimore or less limited from 87.0 to 109.0 MHz (the commercial FM broadcast 4662306a36Sopenharmony_ciband). Although the registers can be programmed to request frequencies beyond 4762306a36Sopenharmony_cithese limits, experiments did not give promising results. The variable 4862306a36Sopenharmony_cifrequency oscillator (VFO) that demodulates the intermediate frequency (IF) 4962306a36Sopenharmony_cisignal probably has a small range of useful frequencies, and wraps around or 5062306a36Sopenharmony_cigets clipped beyond the limits mentioned above. 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ciCONTROLLING THE CARD WITH IOPORT 5462306a36Sopenharmony_ci-------------------------------- 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ciThe RadioTrack (base) ioport is configurable for 0x30c or 0x20c. Only one 5762306a36Sopenharmony_ciioport seems to be involved. The ioport decoding circuitry must be pretty 5862306a36Sopenharmony_cisimple, as individual ioport bits are directly matched to specific functions 5962306a36Sopenharmony_ci(or blocks) of the radio card. This way, many functions can be changed in 6062306a36Sopenharmony_ciparallel with one write to the ioport. The only feedback available through 6162306a36Sopenharmony_cithe ioports appears to be the "Stereo Detect" bit. 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ciThe bits of the ioport are arranged as follows: 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci.. code-block:: none 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci MSb LSb 6862306a36Sopenharmony_ci +------+------+------+--------+--------+-------+---------+--------+ 6962306a36Sopenharmony_ci | VolA | VolB | ???? | Stereo | Radio | TuneA | TuneB | Tune | 7062306a36Sopenharmony_ci | (+) | (-) | | Detect | Audio | (bit) | (latch) | Update | 7162306a36Sopenharmony_ci | | | | Enable | Enable | | | Enable | 7262306a36Sopenharmony_ci +------+------+------+--------+--------+-------+---------+--------+ 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci==== ==== ================================= 7662306a36Sopenharmony_ciVolA VolB Description 7762306a36Sopenharmony_ci==== ==== ================================= 7862306a36Sopenharmony_ci0 0 audio mute 7962306a36Sopenharmony_ci0 1 volume + (some delay required) 8062306a36Sopenharmony_ci1 0 volume - (some delay required) 8162306a36Sopenharmony_ci1 1 stay at present volume 8262306a36Sopenharmony_ci==== ==== ================================= 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci==================== =========== 8562306a36Sopenharmony_ciStereo Detect Enable Description 8662306a36Sopenharmony_ci==================== =========== 8762306a36Sopenharmony_ci0 No Detect 8862306a36Sopenharmony_ci1 Detect 8962306a36Sopenharmony_ci==================== =========== 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ciResults available by reading ioport >60 msec after last port write. 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci 0xff ==> no stereo detected, 0xfd ==> stereo detected. 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci============================= ============================= 9662306a36Sopenharmony_ciRadio to Audio (path) Enable Description 9762306a36Sopenharmony_ci============================= ============================= 9862306a36Sopenharmony_ci0 Disable path (silence) 9962306a36Sopenharmony_ci1 Enable path (audio produced) 10062306a36Sopenharmony_ci============================= ============================= 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci===== ===== ================== 10362306a36Sopenharmony_ciTuneA TuneB Description 10462306a36Sopenharmony_ci===== ===== ================== 10562306a36Sopenharmony_ci0 0 "zero" bit phase 1 10662306a36Sopenharmony_ci0 1 "zero" bit phase 2 10762306a36Sopenharmony_ci1 0 "one" bit phase 1 10862306a36Sopenharmony_ci1 1 "one" bit phase 2 10962306a36Sopenharmony_ci===== ===== ================== 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci24-bit code, where bits = (freq*40) + 10486188. 11362306a36Sopenharmony_ciThe Most Significant 11 bits must be 1010 xxxx 0x0 to be valid. 11462306a36Sopenharmony_ciThe bits are shifted in LSb first. 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci================== =========================== 11762306a36Sopenharmony_ciTune Update Enable Description 11862306a36Sopenharmony_ci================== =========================== 11962306a36Sopenharmony_ci0 Tuner held constant 12062306a36Sopenharmony_ci1 Tuner updating in progress 12162306a36Sopenharmony_ci================== =========================== 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ciPROGRAMMING EXAMPLES 12562306a36Sopenharmony_ci-------------------- 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci.. code-block:: none 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci Default: BASE <-- 0xc8 (current volume, no stereo detect, 13062306a36Sopenharmony_ci radio enable, tuner adjust disable) 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci Card Off: BASE <-- 0x00 (audio mute, no stereo detect, 13362306a36Sopenharmony_ci radio disable, tuner adjust disable) 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci Card On: BASE <-- 0x00 (see "Card Off", clears any unfinished business) 13662306a36Sopenharmony_ci BASE <-- 0xc8 (see "Default") 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci Volume Down: BASE <-- 0x48 (volume down, no stereo detect, 13962306a36Sopenharmony_ci radio enable, tuner adjust disable) 14062306a36Sopenharmony_ci wait 10 msec 14162306a36Sopenharmony_ci BASE <-- 0xc8 (see "Default") 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci Volume Up: BASE <-- 0x88 (volume up, no stereo detect, 14462306a36Sopenharmony_ci radio enable, tuner adjust disable) 14562306a36Sopenharmony_ci wait 10 msec 14662306a36Sopenharmony_ci BASE <-- 0xc8 (see "Default") 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci Check Stereo: BASE <-- 0xd8 (current volume, stereo detect, 14962306a36Sopenharmony_ci radio enable, tuner adjust disable) 15062306a36Sopenharmony_ci wait 100 msec 15162306a36Sopenharmony_ci x <-- BASE (read ioport) 15262306a36Sopenharmony_ci BASE <-- 0xc8 (see "Default") 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci x=0xff ==> "not stereo", x=0xfd ==> "stereo detected" 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci Set Frequency: code = (freq*40) + 10486188 15762306a36Sopenharmony_ci foreach of the 24 bits in code, 15862306a36Sopenharmony_ci (from Least to Most Significant): 15962306a36Sopenharmony_ci to write a "zero" bit, 16062306a36Sopenharmony_ci BASE <-- 0x01 (audio mute, no stereo detect, radio 16162306a36Sopenharmony_ci disable, "zero" bit phase 1, tuner adjust) 16262306a36Sopenharmony_ci BASE <-- 0x03 (audio mute, no stereo detect, radio 16362306a36Sopenharmony_ci disable, "zero" bit phase 2, tuner adjust) 16462306a36Sopenharmony_ci to write a "one" bit, 16562306a36Sopenharmony_ci BASE <-- 0x05 (audio mute, no stereo detect, radio 16662306a36Sopenharmony_ci disable, "one" bit phase 1, tuner adjust) 16762306a36Sopenharmony_ci BASE <-- 0x07 (audio mute, no stereo detect, radio 16862306a36Sopenharmony_ci disable, "one" bit phase 2, tuner adjust) 169