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