The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/i386/isa/spigot.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Video spigot capture driver.
    3  *
    4  * Copyright (c) 1995, Jim Lowe.  All rights reserved.
    5  *
    6  * Redistribution and use in source and binary forms, with or without
    7  * modification, are permitted provided that the following conditions are
    8  * met: 1. Redistributions of source code must retain the above copyright
    9  * notice, this list of conditions and the following disclaimer. 2.
   10  * Redistributions in binary form must reproduce the above copyright notice,
   11  * this list of conditions and the following disclaimer in the documentation
   12  * and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
   15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   17  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
   18  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   20  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
   21  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  *
   26  * This is the minimum driver code required to make a spigot work.
   27  * Unfortunatly, I can't include a real driver since the information
   28  * on the spigot is under non-disclosure.  You can pick up a library
   29  * that will work with this driver from
   30  * ftp://ftp.cs.uwm.edu/pub/FreeBSD-UWM.  The library contains the
   31  * source that I can release as well as several object modules and
   32  * functions that allows one to read spigot data.  See the code for
   33  * spigot_grab.c that is included with the library data.
   34  *
   35  * The vendor will not allow me to release the spigot library code.
   36  * Please don't ask me for it.
   37  *
   38  * To use this driver you will need the spigot library.  The library is
   39  * available from:
   40  *
   41  *      ftp.cs.uwm.edu://pub/FreeBSD-UWM/spigot/spigot.tar.gz
   42  *
   43  * Version 1.7, December 1995.
   44  *
   45  * $FreeBSD: releng/5.0/sys/i386/isa/spigot.c 118752 2003-08-10 23:17:49Z nectar $
   46  *
   47  */
   48 
   49 #include        "spigot.h"
   50 
   51 #if NSPIGOT > 1
   52 error "Can only have 1 spigot configured."
   53 #endif
   54 
   55 #include        "opt_spigot.h"
   56 
   57 #include        <sys/param.h>
   58 #include        <sys/systm.h>
   59 #include        <sys/bus.h>
   60 #include        <sys/conf.h>
   61 #include        <sys/kernel.h>
   62 #include        <sys/lock.h>
   63 #include        <sys/mman.h>
   64 #include        <sys/mutex.h>
   65 #include        <sys/proc.h>
   66 #include        <sys/signalvar.h>
   67 
   68 #include        <machine/frame.h>
   69 #include        <machine/md_var.h>
   70 #include        <machine/spigot.h>
   71 #include        <machine/psl.h>
   72 
   73 #include        <i386/isa/isa_device.h>
   74 
   75 static struct spigot_softc {
   76         u_long          flags;
   77         u_long          maddr;
   78         struct proc     *p;
   79         u_long          signal_num;
   80         u_short         irq;
   81 } spigot_softc[NSPIGOT];
   82 
   83 /* flags in softc */
   84 #define OPEN            0x01
   85 #define ALIVE           0x02
   86 
   87 #define UNIT(dev) minor(dev)
   88 
   89 static int      spigot_probe(struct isa_device *id);
   90 static int      spigot_attach(struct isa_device *id);
   91 
   92 struct isa_driver       spigotdriver = {
   93         INTR_TYPE_MISC,
   94         spigot_probe,
   95         spigot_attach,
   96         "spigot"
   97 };
   98 COMPAT_ISA_DRIVER(spigot, spigotdriver);
   99 
  100 static  d_open_t        spigot_open;
  101 static  d_close_t       spigot_close;
  102 static  d_read_t        spigot_read;
  103 static  d_write_t       spigot_write;
  104 static  d_ioctl_t       spigot_ioctl;
  105 static  d_mmap_t        spigot_mmap;
  106 
  107 #define CDEV_MAJOR 11
  108 static struct cdevsw spigot_cdevsw = {
  109         /* open */      spigot_open,
  110         /* close */     spigot_close,
  111         /* read */      spigot_read,
  112         /* write */     spigot_write,
  113         /* ioctl */     spigot_ioctl,
  114         /* poll */      nopoll,
  115         /* mmap */      spigot_mmap,
  116         /* strategy */  nostrategy,
  117         /* name */      "spigot",
  118         /* maj */       CDEV_MAJOR,
  119         /* dump */      nodump,
  120         /* psize */     nopsize,
  121         /* flags */     0,
  122 };
  123 
  124 static ointhand2_t      spigintr;
  125 
  126 static int
  127 spigot_probe(struct isa_device *devp)
  128 {
  129 int                     status;
  130 struct  spigot_softc    *ss=(struct spigot_softc *)&spigot_softc[devp->id_unit];
  131 
  132         ss->flags = 0;
  133         ss->maddr = 0;
  134         ss->irq = 0;
  135 
  136         if(devp->id_iobase != 0xad6 || inb(0xad9) == 0xff) 
  137                 status = 0;     /* not found */
  138         else {
  139                 status = 1;     /* found */
  140                 ss->flags |= ALIVE;
  141         }
  142 
  143         return(status);
  144 }
  145 
  146 static int
  147 spigot_attach(struct isa_device *devp)
  148 {
  149         int     unit;
  150         struct  spigot_softc    *ss= &spigot_softc[unit = devp->id_unit];
  151 
  152         devp->id_ointr = spigintr;
  153         ss->maddr = kvtop(devp->id_maddr);
  154         ss->irq = devp->id_irq;
  155         make_dev(&spigot_cdevsw, unit, 0, 0, 0644, "spigot%d", unit);
  156         return 1;
  157 }
  158 
  159 static  int
  160 spigot_open(dev_t dev, int flags, int fmt, struct thread *td)
  161 {
  162 int                     error;
  163 struct  spigot_softc    *ss = (struct spigot_softc *)&spigot_softc[UNIT(dev)];
  164 
  165         if((ss->flags & ALIVE) == 0)
  166                 return ENXIO;
  167 
  168         if(ss->flags & OPEN)
  169                 return EBUSY;
  170 
  171 #if !defined(SPIGOT_UNSECURE)
  172         /*
  173          * Don't allow open() unless the process has sufficient privileges,
  174          * since mapping the i/o page and granting i/o privilege would
  175          * require sufficient privilege soon and nothing much can be done
  176          * without them.
  177          */
  178         error = suser(td);
  179         if (error != 0)
  180                 return error;
  181         error = securelevel_gt(td->td_ucred, 0);
  182         if (error != 0)
  183                 return error;
  184 #endif
  185 
  186         ss->flags |= OPEN;
  187         ss->p = 0;
  188         ss->signal_num = 0;
  189 
  190         return 0;
  191 }
  192 
  193 static  int
  194 spigot_close(dev_t dev, int flags, int fmt, struct thread *td)
  195 {
  196 struct  spigot_softc    *ss = (struct spigot_softc *)&spigot_softc[UNIT(dev)];
  197 
  198         ss->flags &= ~OPEN;
  199         ss->p = 0;
  200         ss->signal_num = 0;
  201 
  202         outb(0xad6, 0);
  203 
  204         return 0;
  205 }
  206 
  207 static  int
  208 spigot_write(dev_t dev, struct uio *uio, int ioflag)
  209 {
  210         return ENXIO;
  211 }
  212 
  213 static  int
  214 spigot_read(dev_t dev, struct uio *uio, int ioflag)
  215 {
  216         return ENXIO;
  217 }
  218 
  219 
  220 static  int
  221 spigot_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td)
  222 {
  223 int                     error;
  224 struct  spigot_softc    *ss = (struct spigot_softc *)&spigot_softc[UNIT(dev)];
  225 struct  spigot_info     *info;
  226 
  227         if(!data) return(EINVAL);
  228         switch(cmd){
  229         case    SPIGOT_SETINT:
  230                 if (*(int *)data < 0 || *(int *)data > _SIG_MAXSIG)
  231                         return EINVAL;
  232                 ss->p = td->td_proc;
  233                 ss->signal_num = *((int *)data);
  234                 break;
  235         case    SPIGOT_IOPL_ON: /* allow access to the IO PAGE */
  236 #if !defined(SPIGOT_UNSECURE)
  237                 error = suser(td);
  238                 if (error != 0)
  239                         return error;
  240                 error = securelevel_gt(td->td_ucred, 0);
  241                 if (error)
  242                         return error;
  243 #endif
  244                 td->td_frame->tf_eflags |= PSL_IOPL;
  245                 break;
  246         case    SPIGOT_IOPL_OFF: /* deny access to the IO PAGE */
  247                 td->td_frame->tf_eflags &= ~PSL_IOPL;
  248                 break;
  249         case    SPIGOT_GET_INFO:
  250                 info = (struct spigot_info *)data;
  251                 info->maddr  = ss->maddr;
  252                 info->irq = ss->irq;
  253                 break;
  254         default:
  255                 return ENOTTY;
  256         }
  257 
  258         return 0;
  259 }
  260 
  261 /*
  262  * Interrupt procedure.
  263  * Just call a user level interrupt routine.
  264  */
  265 static void
  266 spigintr(int unit)
  267 {
  268 struct  spigot_softc    *ss = (struct spigot_softc *)&spigot_softc[unit];
  269 
  270         if(ss->p && ss->signal_num) {
  271                 PROC_LOCK(ss->p);
  272                 psignal(ss->p, ss->signal_num);
  273                 PROC_UNLOCK(ss->p);
  274         }
  275 }
  276 
  277 static  int
  278 spigot_mmap(dev_t dev, vm_offset_t offset, int nprot)
  279 {
  280 struct  spigot_softc    *ss = (struct spigot_softc *)&spigot_softc[0];
  281 
  282         if(offset != 0) {
  283                 printf("spigot mmap failed, offset = 0x%x != 0x0\n", offset);
  284                 return -1;
  285         }
  286 
  287         if(nprot & PROT_EXEC)
  288                 return -1;
  289 
  290         return i386_btop(ss->maddr);
  291 }

Cache object: 1b1831c33ada026223dd9bbf6c97c99f


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.