[BACK]Return to tea5757.c CVS log [TXT][DIR] Up to [local] / sys / dev / ic

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