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

Annotation of sys/dev/ic/lm700x.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: lm700x.c,v 1.3 2007/05/22 04:14:03 jsg 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 lm700x routines */
        !            29:
        !            30: /*
        !            31:  * Sanyo LM7001 Direct PLL Frequency Synthesizer
        !            32:  *
        !            33:  * The LM7001J and LM7001JM (used in Aztech/PackardBell cards) are PLL
        !            34:  * frequency synthesizer LSIs for tuners. These LSIs are software compatible
        !            35:  * with LM7000 (used in Radiotrack, Radioreveal RA300, some Mediaforte cards),
        !            36:  * but do not include an IF calculation circuit.
        !            37:  *
        !            38:  * The FM VCO circuit includes a high-speed programmable divider that can
        !            39:  * divide directly.
        !            40:  *
        !            41:  * Features:
        !            42:  * Seven reference frequencies: 1, 5, 9, 10, 25, 50, and 100 kHz;
        !            43:  * Band-switching outputs (3 bits);
        !            44:  * Controller clock output (400 kHz);
        !            45:  * Serial input circuit for data input (using the CE, CL and DATA pins).
        !            46:  *
        !            47:  * The LM7001J and LM7001JM have a 24-bit shift register.
        !            48:  */
        !            49:
        !            50: #include <sys/param.h>
        !            51: #include <sys/radioio.h>
        !            52:
        !            53: #include <dev/ic/lm700x.h>
        !            54:
        !            55: u_int32_t
        !            56: lm700x_encode_freq(u_int32_t nfreq, u_int32_t rf)
        !            57: {
        !            58:        nfreq += IF_FREQ;
        !            59:        nfreq /= lm700x_decode_ref(rf);
        !            60:        return nfreq;
        !            61: }
        !            62:
        !            63: void
        !            64: lm700x_hardware_write(struct lm700x_t *lm, u_int32_t data, u_int32_t addon)
        !            65: {
        !            66:        int i;
        !            67:
        !            68:        lm->init(lm->iot, lm->ioh, lm->offset, lm->rsetdata | addon);
        !            69:
        !            70:        for (i = 0; i < LM700X_REGISTER_LENGTH; i++)
        !            71:                if (data & (1 << i)) {
        !            72:                        bus_space_write_1(lm->iot, lm->ioh, lm->offset,
        !            73:                                        lm->wocl | addon);
        !            74:                        DELAY(LM700X_WRITE_DELAY);
        !            75:                        bus_space_write_1(lm->iot, lm->ioh, lm->offset,
        !            76:                                        lm->woch | addon);
        !            77:                        DELAY(LM700X_WRITE_DELAY);
        !            78:                        bus_space_write_1(lm->iot, lm->ioh, lm->offset,
        !            79:                                        lm->wocl | addon);
        !            80:                } else {
        !            81:                        bus_space_write_1(lm->iot, lm->ioh, lm->offset,
        !            82:                                        lm->wzcl | addon);
        !            83:                        DELAY(LM700X_WRITE_DELAY);
        !            84:                        bus_space_write_1(lm->iot, lm->ioh, lm->offset,
        !            85:                                        lm->wzch | addon);
        !            86:                        DELAY(LM700X_WRITE_DELAY);
        !            87:                        bus_space_write_1(lm->iot, lm->ioh, lm->offset,
        !            88:                                        lm->wzcl | addon);
        !            89:                }
        !            90:
        !            91:        lm->rset(lm->iot, lm->ioh, lm->offset, lm->rsetdata | addon);
        !            92: }
        !            93:
        !            94: u_int32_t
        !            95: lm700x_encode_ref(u_int8_t rf)
        !            96: {
        !            97:        u_int32_t ret;
        !            98:
        !            99:        if (rf < 36)
        !           100:                ret = LM700X_REF_025;
        !           101:        else if (rf > 35 && rf < 75)
        !           102:                        ret = LM700X_REF_050;
        !           103:        else
        !           104:                ret = LM700X_REF_100;
        !           105:
        !           106:        return ret;
        !           107: }
        !           108:
        !           109: u_int8_t
        !           110: lm700x_decode_ref(u_int32_t rf)
        !           111: {
        !           112:        u_int8_t ret;
        !           113:
        !           114:        switch (rf) {
        !           115:        case LM700X_REF_100:
        !           116:                ret = 100;
        !           117:                break;
        !           118:        case LM700X_REF_025:
        !           119:                ret = 25;
        !           120:                break;
        !           121:        case LM700X_REF_050:
        !           122:                /* FALLTHROUGH */
        !           123:        default:
        !           124:                ret = 50;
        !           125:                break;
        !           126:        }
        !           127:
        !           128:        return ret;
        !           129: }

CVSweb