diff options
author | Grigoriy Orlov <gluk@cvs.openbsd.org> | 2001-10-04 19:18:01 +0000 |
---|---|---|
committer | Grigoriy Orlov <gluk@cvs.openbsd.org> | 2001-10-04 19:18:01 +0000 |
commit | 7edbc4af941083c1b1a127ec9fb8813c69d7af18 (patch) | |
tree | 346257fa52f642de9f862fdd296e1797b8a735ba /sys | |
parent | 588130b0936b03c0394bf9c9315da83dd3fa86ee (diff) |
Device independent framework for FM-radio driver.
Work by Maxim Tsyplakov <tm@oganer.net>,
Vladimir Popov <jumbo@narod.ru>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/radio.c | 136 | ||||
-rw-r--r-- | sys/dev/radio_if.h | 56 | ||||
-rw-r--r-- | sys/dev/radiovar.h | 39 | ||||
-rw-r--r-- | sys/sys/radioio.h | 69 |
4 files changed, 300 insertions, 0 deletions
diff --git a/sys/dev/radio.c b/sys/dev/radio.c new file mode 100644 index 00000000000..a63d5830185 --- /dev/null +++ b/sys/dev/radio.c @@ -0,0 +1,136 @@ +/* $OpenBSD: radio.c,v 1.1 2001/10/04 19:18:00 gluk Exp $ */ +/* $RuOBSD: radio.c,v 1.5 2001/09/30 14:52:49 pva Exp $ */ + +/* + * Copyright (c) 2001 Maxim Tsyplakov <tm@oganer.net> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* This is /dev/radio driver for OpenBSD */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/proc.h> +#include <sys/errno.h> +#include <sys/ioctl.h> +#include <sys/device.h> +#include <sys/radioio.h> +#include <dev/radio_if.h> +#include <dev/radiovar.h> + +int radioprobe(struct device *, void *, void *); +void radioattach(struct device *, struct device *, void *); +int radioopen(dev_t, int, int, struct proc *); +int radioclose(dev_t, int, int, struct proc *); +int radioioctl(dev_t, u_long, caddr_t, int, struct proc *); +int radioprint(void *, const char *); + +struct cfattach radio_ca = { + sizeof(struct radio_softc), radioprobe, radioattach, + NULL, NULL +}; + +struct cfdriver radio_cd = { + NULL, "radio", DV_DULL +}; + +int +radioprobe(struct device *parent, void *match, void *aux) +{ + printf("\n"); /* stub!?, fixme */ + return 1; +} + +void +radioattach(struct device *parent, struct device *self, void *aux) +{ + struct radio_softc *sc = (void *) self; + struct radio_attach_args *sa = aux; + struct radio_hw_if *hwp = sa->hwif; + void *hdlp = sa->hdl; + + printf("\n"); + sc->hw_if = hwp; + sc->hw_hdl = hdlp; + sc->sc_dev = parent; +} + +int +radioopen(dev_t dev, int flags, int fmt, struct proc *p) +{ + int unit; + struct radio_softc *sc; + + unit = RADIOUNIT(dev); + if (unit >= radio_cd.cd_ndevs || + (sc = radio_cd.cd_devs[unit]) == NULL || + sc->hw_if == NULL) + return (ENXIO); + else + return (sc->hw_if->open(dev, flags, fmt, p)); +} + +int +radioclose(dev_t dev, int flags, int fmt, struct proc *p) +{ + struct radio_softc *sc; + + sc = radio_cd.cd_devs[RADIOUNIT(dev)]; + return (sc->hw_if->close(dev, flags, fmt, p)); +} + +int +radioioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p) +{ + int unit; + struct radio_softc *sc; + + unit = RADIOUNIT(dev); + if (unit >= radio_cd.cd_ndevs || + (sc = radio_cd.cd_devs[unit]) == NULL || + sc->hw_if == NULL) + return (ENXIO); + else + return (sc->hw_if->ioctl(dev, cmd, data, flags, p)); +} + +/* + * Called from hardware driver. This is where the MI radio driver gets + * probed/attached to the hardware driver + */ + +struct device * +radio_attach_mi(struct radio_hw_if *rhwp, void *hdlp, struct device *dev) +{ + struct radio_attach_args arg; + + arg.hwif = rhwp; + arg.hdl = hdlp; + return (config_found(dev, &arg, radioprint)); +} + +int +radioprint(void *aux, const char *pnp) +{ + return UNCONF; +} diff --git a/sys/dev/radio_if.h b/sys/dev/radio_if.h new file mode 100644 index 00000000000..b8a87902c62 --- /dev/null +++ b/sys/dev/radio_if.h @@ -0,0 +1,56 @@ +/* $OpenBSD: radio_if.h,v 1.1 2001/10/04 19:17:59 gluk Exp $ */ +/* $RuOBSD: radio_if.h,v 1.5 2001/09/29 20:33:02 gluk Exp $ */ + +/* + * Copyright (c) 2001 Maxim Tsyplakov <tm@oganer.net> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_DEV_RADIO_IF_H +#define _SYS_DEV_RADIO_IF_H + +/* + * Generic interface to hardware driver + */ + +#define RADIOUNIT(x) (minor(x)) + +struct radio_hw_if { + /* open hardware */ + int (*open)(dev_t, int, int, struct proc *); + + /* close hardware */ + int (*close)(dev_t, int, int, struct proc *); + + /* ioctl hardware */ + int (*ioctl)(dev_t, u_long, caddr_t, int, struct proc*); +}; + +struct radio_attach_args { + struct radio_hw_if *hwif; + void *hdl; +}; + +struct device *radio_attach_mi(struct radio_hw_if *, void *, struct device *); + +#endif /* _SYS_DEV_RADIO_IF_H */ diff --git a/sys/dev/radiovar.h b/sys/dev/radiovar.h new file mode 100644 index 00000000000..613832d363f --- /dev/null +++ b/sys/dev/radiovar.h @@ -0,0 +1,39 @@ +/* $OpenBSD: radiovar.h,v 1.1 2001/10/04 19:17:59 gluk Exp $ */ +/* $RuOBSD: radiovar.h,v 1.3 2001/09/29 17:10:16 pva Exp $ */ + +/* + * Copyright (c) 2001 Maxim Tsyplakov <tm@oganer.net> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_DEV_RADIOVAR_H +#define _SYS_DEV_RADIOVAR_H + +struct radio_softc { + struct device dev; + void *hw_hdl; /* hardware driver handle */ + struct device *sc_dev; /* hardware device struct */ + struct radio_hw_if *hw_if; /* hardware interface */ +}; + +#endif /* _SYS_DEV_RADIOVAR_H */ diff --git a/sys/sys/radioio.h b/sys/sys/radioio.h new file mode 100644 index 00000000000..091f0b19d4f --- /dev/null +++ b/sys/sys/radioio.h @@ -0,0 +1,69 @@ +/* $OpenBSD: radioio.h,v 1.1 2001/10/04 19:17:59 gluk Exp $ */ +/* $RuOBSD: radioio.h,v 1.3 2001/09/29 17:10:16 pva Exp $ */ + +/* + * Copyright (c) 2001 Maxim Tsyplakov <tm@oganer.net>, + * Vladimir Popov <jumbo@narod.ru> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_RADIOIO_H_ +#define _SYS_RADIOIO_H_ + +#define MIN_FM_FREQ 87500 +#define MAX_FM_FREQ 108000 + +#define IF_FREQ 10700 + +#define RADIO_CAPS_DETECT_STEREO (1<<0) +#define RADIO_CAPS_DETECT_SIGNAL (1<<1) +#define RADIO_CAPS_SET_MONO (1<<2) +#define RADIO_CAPS_HW_SEARCH (1<<3) +#define RADIO_CAPS_HW_AFC (1<<4) +#define RADIO_CAPS_REFERENCE_FREQ (1<<5) +#define RADIO_CAPS_LOCK_SENSITIVITY (1<<6) +#define RADIO_CAPS_RESERVED1 (1<<7) +#define RADIO_CAPS_RESERVED2 (0xFF<<8) +#define RADIO_CARD_TYPE (0xFF<<16) + +#define RADIO_INFO_STEREO (1<<0) +#define RADIO_INFO_SIGNAL (1<<1) + +/* Radio device operations */ +#define RIOCSMUTE _IOW('R', 21, u_long) /* set mute/unmute */ +#define RIOCGMUTE _IOR('R', 21, u_long) /* get mute state */ +#define RIOCGVOLU _IOR('R', 22, u_long) /* get volume */ +#define RIOCSVOLU _IOW('R', 22, u_long) /* set volume */ +#define RIOCGMONO _IOR('R', 23, u_long) /* get mono/stereo */ +#define RIOCSMONO _IOW('R', 23, u_long) /* toggle mono/stereo */ +#define RIOCGFREQ _IOR('R', 24, u_long) /* get frequency (in kHz) */ +#define RIOCSFREQ _IOW('R', 24, u_long) /* set frequency (in kHz) */ +#define RIOCSSRCH _IOW('R', 25, u_long) /* search up/down */ +#define RIOCGCAPS _IOR('R', 26, u_long) /* get card capabilities */ +#define RIOCGINFO _IOR('R', 27, u_long) /* get generic information */ +#define RIOCSREFF _IOW('R', 28, u_long) /* set reference frequency */ +#define RIOCGREFF _IOR('R', 28, u_long) /* get reference frequency */ +#define RIOCSLOCK _IOW('R', 29, u_long) /* set lock sensetivity */ +#define RIOCGLOCK _IOR('R', 29, u_long) /* get lock sensetivity */ + +#endif /* _SYS_RADIOIO_H_ */ |