| NOTES ON RADIOTRACK CARD CONTROL | 
 | by Stephen M. Benoit ([email protected])  Dec 14, 1996 | 
 | ---------------------------------------------------------------------------- | 
 |  | 
 | Document version 1.0 | 
 |  | 
 | ACKNOWLEDGMENTS | 
 | ---------------- | 
 | This document was made based on 'C' code for Linux from Gideon le Grange | 
 | ([email protected] or [email protected]) in 1994, and elaborations from | 
 | Frans Brinkman ([email protected]) in 1996.  The results reported here are from | 
 | experiments that the author performed on his own setup, so your mileage may | 
 | vary... I make no guarantees, claims or warranties to the suitability or | 
 | validity of this information.  No other documentation on the AIMS | 
 | Lab (http://www.aimslab.com/) RadioTrack card was made available to the | 
 | author.  This document is offered in the hopes that it might help users who | 
 | want to use the RadioTrack card in an environment other than MS Windows. | 
 |  | 
 | WHY THIS DOCUMENT? | 
 | ------------------ | 
 | I have a RadioTrack card from back when I ran an MS-Windows platform.  After | 
 | converting to Linux, I found Gideon le Grange's command-line software for | 
 | running the card, and found that it was good!  Frans Brinkman made a | 
 | comfortable X-windows interface, and added a scanning feature.  For hack | 
 | value, I wanted to see if the tuner could be tuned beyond the usual FM radio | 
 | broadcast band, so I could pick up the audio carriers from North American | 
 | broadcast TV channels, situated just below and above the 87.0-109.0 MHz range. | 
 | I did not get much success, but I learned about programming ioports under | 
 | Linux and gained some insights about the hardware design used for the card. | 
 |  | 
 | So, without further delay, here are the details. | 
 |  | 
 |  | 
 | PHYSICAL DESCRIPTION | 
 | -------------------- | 
 | The RadioTrack card is an ISA 8-bit FM radio card.  The radio frequency (RF) | 
 | input is simply an antenna lead, and the output is a power audio signal | 
 | available through a miniature phone plug.  Its RF frequencies of operation are | 
 | more or less limited from 87.0 to 109.0 MHz (the commercial FM broadcast | 
 | band).  Although the registers can be programmed to request frequencies beyond | 
 | these limits, experiments did not give promising results.  The variable | 
 | frequency oscillator (VFO) that demodulates the intermediate frequency (IF) | 
 | signal probably has a small range of useful frequencies, and wraps around or | 
 | gets clipped beyond the limits mentioned above. | 
 |  | 
 |  | 
 | CONTROLLING THE CARD WITH IOPORT | 
 | -------------------------------- | 
 | The RadioTrack (base) ioport is configurable for 0x30c or 0x20c.  Only one | 
 | ioport seems to be involved.  The ioport decoding circuitry must be pretty | 
 | simple, as individual ioport bits are directly matched to specific functions | 
 | (or blocks) of the radio card.  This way, many functions can be changed in | 
 | parallel with one write to the ioport.  The only feedback available through | 
 | the ioports appears to be the "Stereo Detect" bit. | 
 |  | 
 | The bits of the ioport are arranged as follows: | 
 |  | 
 |   MSb                                                         LSb | 
 | +------+------+------+--------+--------+-------+---------+--------+ | 
 | | VolA | VolB | ???? | Stereo | Radio  | TuneA | TuneB   | Tune   | | 
 | |  (+) |  (-) |      | Detect | Audio  | (bit) | (latch) | Update | | 
 | |      |      |      | Enable | Enable |       |         | Enable | | 
 | +------+------+------+--------+--------+-------+---------+--------+ | 
 |  | 
 |  | 
 | VolA . VolB  [AB......] | 
 | ----------- | 
 | 0 0 : audio mute | 
 | 0 1 : volume +    (some delay required) | 
 | 1 0 : volume -    (some delay required) | 
 | 1 1 : stay at present volume | 
 |  | 
 | Stereo Detect Enable [...S....] | 
 | -------------------- | 
 | 0 : No Detect | 
 | 1 : Detect | 
 |  | 
 |   Results available by reading ioport >60 msec after last port write. | 
 |   0xff ==> no stereo detected,  0xfd ==> stereo detected. | 
 |  | 
 | Radio to Audio (path) Enable [....R...] | 
 | ---------------------------- | 
 | 0 : Disable path (silence) | 
 | 1 : Enable path  (audio produced) | 
 |  | 
 | TuneA . TuneB [.....AB.] | 
 | ------------- | 
 | 0 0 : "zero" bit phase 1 | 
 | 0 1 : "zero" bit phase 2 | 
 |  | 
 | 1 0 : "one" bit phase 1 | 
 | 1 1 : "one" bit phase 2 | 
 |  | 
 |   24-bit code, where bits = (freq*40) + 10486188. | 
 |   The Most Significant 11 bits must be 1010 xxxx 0x0 to be valid. | 
 |   The bits are shifted in LSb first. | 
 |  | 
 | Tune Update Enable [.......T] | 
 | ------------------ | 
 | 0 : Tuner held constant | 
 | 1 : Tuner updating in progress | 
 |  | 
 |  | 
 | PROGRAMMING EXAMPLES | 
 | -------------------- | 
 | 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) | 
 |  | 
 | ---------------------------------------------------------------------------- |