summaryrefslogtreecommitdiff
path: root/coffee
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2003-11-19 13:40:03 +0000
committerDimitri Sokolyuk <demon@dim13.org>2003-11-19 13:40:03 +0000
commit2df12b041f39d1f7131fa86a148ac5e0ca5da90b (patch)
tree2a5d8a2c194fe88197df11c00b6f9cb9ca766afc /coffee
OpenBSD LKM
initial import
Diffstat (limited to 'coffee')
-rw-r--r--coffee/Makefile5
-rw-r--r--coffee/README24
-rw-r--r--coffee/coffee.c118
3 files changed, 147 insertions, 0 deletions
diff --git a/coffee/Makefile b/coffee/Makefile
new file mode 100644
index 0000000..df6ea30
--- /dev/null
+++ b/coffee/Makefile
@@ -0,0 +1,5 @@
+LKM= coffee
+SRCS+= coffee.c
+NOMAN= noman
+
+.include <bsd.lkm.mk>
diff --git a/coffee/README b/coffee/README
new file mode 100644
index 0000000..f48e0d3
--- /dev/null
+++ b/coffee/README
@@ -0,0 +1,24 @@
+Simple driver for /dev/coffee:
+
+How install it:
+---------------
+You'll have to change the secure level of the kernel (see securelevel(7)):
+In /etc/rc.securelevel: change "securelevel=1" to "securelevel=-1".
+Copy coffee.tar.gz in /usr/src/lkm/
+untar it.
+cd /usr/src/lkm/coffee/
+make
+make load
+Next step: creating the /dev/ entry of the driver:
+Do `modstat`, and take the major number of the driver,
+`mknod coffee c $MAJOR 0`
+That's it.
+
+How it works:
+-------------
+`echo capuccino > /dev/coffee` puts the Coffee machine plugged on the parallel
+ port of the PC on, assuming you've put coffee and water in :)
+`cat /dev/coffee` puts it off.
+
+
+Good drink. :)
diff --git a/coffee/coffee.c b/coffee/coffee.c
new file mode 100644
index 0000000..9fc8e85
--- /dev/null
+++ b/coffee/coffee.c
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2001 Thomas Coffy.
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Terrence R. Lambert.
+ * 4. The name Terrence R. Lambert may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY TERRENCE R. LAMBERT ``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 TERRENCE R. LAMBERT 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.
+ */
+
+/*
+ * Basic lkm driver for making coffee from a shell.
+ * 0x3bc for /dev/lp0, 0x378 for /dev/lp1, and 0x278 for /dev/lp2
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/exec.h>
+#include <sys/lkm.h>
+
+#define PORT_ADDR 0x378 /* lpt1 */
+
+int coffee_load __P((struct lkm_table *, int));
+int coffee __P((struct lkm_table *, int, int));
+int coffee_open __P((dev_t, int, int, struct proc *));
+int coffee_read __P((dev_t, struct uio *, int));
+
+static struct cdevsw coffee_cdevsw = {
+ coffee_open, (dev_type_close((*))) enodev,
+ coffee_read, (dev_type_write((*))) enodev,
+ (dev_type_ioctl((*))) enodev,
+ (dev_type_stop((*))) enodev,
+ 0, seltrue, (dev_type_mmap((*))) enodev, 0
+};
+
+MOD_DEV("coffee", LM_DT_CHAR, -1, &coffee_cdevsw );
+
+int
+coffee(lkmtp, cmd, ver)
+ struct lkm_table *lkmtp;
+ int cmd;
+ int ver;
+{
+ DISPATCH(lkmtp, cmd, ver, coffee_load, lkm_nofunc, lkm_nofunc);
+ return 0;
+}
+
+int
+coffee_load(lkmtp, cmd)
+ struct lkm_table *lkmtp;
+ int cmd;
+{
+ if (cmd==LKM_E_LOAD)
+ printf("Coffee driver loaded.\n");
+ if (cmd==LKM_E_UNLOAD)
+ printf("Coffee driver unloaded.\n");
+ return 0;
+}
+
+/*
+ * Open the device
+ */
+int
+coffee_open(dev, oflags, devtype, p)
+ dev_t dev;
+ int oflags;
+ int devtype;
+ struct proc *p;
+{
+ int s;
+
+ /* set power everywhere on the // port */
+ s = splhigh();
+ outb(PORT_ADDR, 255);
+ splx(s);
+
+ return 0;
+}
+
+int
+coffee_read(dev, uio, ioflag)
+ dev_t dev;
+ struct uio *uio;
+ int ioflag;
+{
+ int s;
+
+ /* set power everywhere on the // port */
+ s = splhigh();
+ outb(PORT_ADDR, 0);
+ splx(s);
+
+ return 0;
+}