Annotation of sys/dev/ic/tea5757.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: tea5757.c,v 1.3 2002/01/07 18:32:19 mickey Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 2001 Vladimir Popov <jumbo@narod.ru>
! 5: * All rights reserved.
! 6: *
! 7: * Redistribution and use in source and binary forms, with or without
! 8: * modification, are permitted provided that the following conditions
! 9: * are met:
! 10: * 1. Redistributions of source code must retain the above copyright
! 11: * notice, this list of conditions and the following disclaimer.
! 12: * 2. Redistributions in binary form must reproduce the above copyright
! 13: * notice, this list of conditions and the following disclaimer in the
! 14: * documentation and/or other materials provided with the distribution.
! 15: *
! 16: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 17: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 18: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 19: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
! 20: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
! 21: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
! 22: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
! 23: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
! 24: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
! 25: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 26: */
! 27:
! 28: /* Implementation of most common TEA5757 routines */
! 29:
! 30: /*
! 31: * Philips TEA5757H Self Tuned Radio
! 32: * http://www.semiconductors.philips.com/pip/TEA5757H
! 33: *
! 34: * The TEA5757; TEA5759 is a 44-pin integrated AM/FM stereo radio circuit.
! 35: * The radio part is based on the TEA5712.
! 36: *
! 37: * The TEA5757 is used in FM-standards in which the local oscillator
! 38: * frequency is above the radio frequency (e.g. European and American
! 39: * standards). The TEA5759 is the version in which the oscillator frequency
! 40: * is below the radio frequency (e.g. Japanese standard).
! 41: *
! 42: * The TEA5757; TEA5759 radio has a bus which consists of three wires:
! 43: * BUS-CLOCK: software driven clock input
! 44: * DATA: data input/output
! 45: * WRITE-ENABLE: write/read input
! 46: *
! 47: * The TEA5757; TEA5759 has a 25-bit shift register.
! 48: *
! 49: * The chips are used in Radiotrack II, Guillemot Maxi Radio FM 2000,
! 50: * Gemtek PCI cards and most Mediaforte FM tuners and sound cards with
! 51: * integrated FM tuners.
! 52: */
! 53:
! 54: #include <sys/param.h>
! 55: #include <sys/radioio.h>
! 56:
! 57: #include <dev/ic/tea5757.h>
! 58:
! 59: /*
! 60: * Convert frequency to hardware representation
! 61: */
! 62: u_int32_t
! 63: tea5757_encode_freq(u_int32_t freq, int tea5759)
! 64: {
! 65: if (tea5759)
! 66: freq -= IF_FREQ;
! 67: else
! 68: freq += IF_FREQ;
! 69:
! 70: /*
! 71: * NO FLOATING POINT!
! 72: */
! 73: freq *= 10;
! 74: freq /= 125;
! 75:
! 76: return freq & TEA5757_FREQ;
! 77: }
! 78:
! 79: /*
! 80: * Convert frequency from hardware representation
! 81: */
! 82: u_int32_t
! 83: tea5757_decode_freq(u_int32_t freq, int tea5759)
! 84: {
! 85: freq &= TEA5757_FREQ;
! 86: freq *= 125; /* 12.5 kHz */
! 87: freq /= 10;
! 88:
! 89: if (tea5759)
! 90: freq += IF_FREQ;
! 91: else
! 92: freq -= IF_FREQ;
! 93:
! 94: return freq;
! 95: }
! 96:
! 97: /*
! 98: * Hardware search
! 99: */
! 100: void
! 101: tea5757_search(struct tea5757_t *tea, u_int32_t stereo, u_int32_t lock, int dir)
! 102: {
! 103: u_int32_t reg;
! 104: u_int co = 0;
! 105:
! 106: reg = stereo | lock | TEA5757_SEARCH_START;
! 107: reg |= dir ? TEA5757_SEARCH_UP : TEA5757_SEARCH_DOWN;
! 108: tea5757_hardware_write(tea, reg);
! 109:
! 110: DELAY(TEA5757_ACQUISITION_DELAY);
! 111:
! 112: do {
! 113: DELAY(TEA5757_WAIT_DELAY);
! 114: reg = tea->read(tea->iot, tea->ioh, tea->offset);
! 115: } while ((reg & TEA5757_FREQ) == 0 && ++co < 200);
! 116: }
! 117:
! 118: void
! 119: tea5757_hardware_write(struct tea5757_t *tea, u_int32_t data)
! 120: {
! 121: int i = TEA5757_REGISTER_LENGTH;
! 122:
! 123: tea->init(tea->iot, tea->ioh, tea->offset, 0);
! 124:
! 125: while (i--)
! 126: if (data & (1 << i))
! 127: tea->write_bit(tea->iot, tea->ioh, tea->offset, 1);
! 128: else
! 129: tea->write_bit(tea->iot, tea->ioh, tea->offset, 0);
! 130:
! 131: tea->rset(tea->iot, tea->ioh, tea->offset, 0);
! 132: }
! 133:
! 134: u_int32_t
! 135: tea5757_set_freq(struct tea5757_t *tea, u_int32_t stereo, u_int32_t lock, u_int32_t freq)
! 136: {
! 137: u_int32_t data = 0ul;
! 138:
! 139: if (freq < MIN_FM_FREQ)
! 140: freq = MIN_FM_FREQ;
! 141: if (freq > MAX_FM_FREQ)
! 142: freq = MAX_FM_FREQ;
! 143:
! 144: data |= tea5757_encode_freq(freq, tea->flags & TEA5757_TEA5759);
! 145: data |= stereo | lock | TEA5757_SEARCH_END;
! 146: tea5757_hardware_write(tea, data);
! 147:
! 148: return freq;
! 149: }
! 150:
! 151: u_int32_t
! 152: tea5757_encode_lock(u_int8_t lock)
! 153: {
! 154: u_int32_t ret;
! 155:
! 156: if (lock < 8)
! 157: ret = TEA5757_S005;
! 158: else if (lock > 7 && lock < 15)
! 159: ret = TEA5757_S010;
! 160: else if (lock > 14 && lock < 51)
! 161: ret = TEA5757_S030;
! 162: else if (lock > 50)
! 163: ret = TEA5757_S150;
! 164:
! 165: return ret;
! 166: }
! 167:
! 168: u_int8_t
! 169: tea5757_decode_lock(u_int32_t lock)
! 170: {
! 171: u_int8_t ret = 150;
! 172:
! 173: switch (lock) {
! 174: case TEA5757_S005:
! 175: ret = 5;
! 176: break;
! 177: case TEA5757_S010:
! 178: ret = 10;
! 179: break;
! 180: case TEA5757_S030:
! 181: ret = 30;
! 182: break;
! 183: case TEA5757_S150:
! 184: ret = 150;
! 185: break;
! 186: }
! 187:
! 188: return ret;
! 189: }
CVSweb