15e176f9aSJulian Elischer#!/bin/sh
25e176f9aSJulian Elischer# This writes a skeleton driver and puts it into the kernel tree for you
3d339df73SRoman Kurakin#
45e176f9aSJulian Elischer# arg1 is lowercase "foo"
5d339df73SRoman Kurakin# arg2 path to the kernel sources, "/sys" if omitted
65e176f9aSJulian Elischer#
75e176f9aSJulian Elischer# Trust me, RUN THIS SCRIPT :)
85e176f9aSJulian Elischer#
9418df1e4SMark Murray#
105e176f9aSJulian Elischer#-------cut here------------------
115e176f9aSJulian Elischer
125e176f9aSJulian Elischerif [ "${1}X" = "X" ]
135e176f9aSJulian Elischerthen
145e176f9aSJulian Elischer	echo "Hey , how about some help here.. give me a device name!"
155e176f9aSJulian Elischer	exit 1
165e176f9aSJulian Elischerfi
17d339df73SRoman Kurakinif [ "X${2}" = "X" ]; then
18d339df73SRoman Kurakin	TOP=`cd /sys; pwd -P`
19d339df73SRoman Kurakin	echo "Using ${TOP} as the path to the kernel sources!"
20d339df73SRoman Kurakinelse
21d339df73SRoman Kurakin	TOP=${2}
22d339df73SRoman Kurakinfi
23d339df73SRoman Kurakin
24d339df73SRoman Kurakinfor i in "" "conf" "i386" "i386/conf" "dev" "sys" "modules"
25d339df73SRoman Kurakindo
26d339df73SRoman Kurakin	if [ -d ${TOP}/${i} ]
27d339df73SRoman Kurakin	then
28d339df73SRoman Kurakin		continue
29d339df73SRoman Kurakin	fi
30d339df73SRoman Kurakin	echo "${TOP}/${i}: no such directory."
31d339df73SRoman Kurakin	echo "Please, correct the error and try again."
32d339df73SRoman Kurakin	exit 1
33d339df73SRoman Kurakindone
345e176f9aSJulian Elischer
355e176f9aSJulian ElischerUPPER=`echo ${1} |tr "[:lower:]" "[:upper:]"`
36d339df73SRoman Kurakin
37d339df73SRoman Kurakinif [ -d ${TOP}/modules/${1} ]; then
38d339df73SRoman Kurakin	echo "There appears to already be a module called ${1}"
39d339df73SRoman Kurakin	echo -n "Should it be overwritten? [Y]"
40d339df73SRoman Kurakin	read VAL
41d339df73SRoman Kurakin	if [ "-z" "$VAL" ]; then
42d339df73SRoman Kurakin		VAL=YES
43d339df73SRoman Kurakin	fi
44d339df73SRoman Kurakin	case ${VAL} in
45d339df73SRoman Kurakin	[yY]*)
46d339df73SRoman Kurakin		echo "Cleaning up from prior runs"
47d339df73SRoman Kurakin		rm -rf ${TOP}/dev/${1}
48d339df73SRoman Kurakin		rm -rf ${TOP}/modules/${1}
49d339df73SRoman Kurakin		rm ${TOP}/conf/files.${UPPER}
50d339df73SRoman Kurakin		rm ${TOP}/i386/conf/${UPPER}
51d339df73SRoman Kurakin		rm ${TOP}/sys/${1}io.h
52d339df73SRoman Kurakin		;;
53d339df73SRoman Kurakin	*)
54d339df73SRoman Kurakin		exit 1
55d339df73SRoman Kurakin		;;
56d339df73SRoman Kurakin	esac
57d339df73SRoman Kurakinfi
58d339df73SRoman Kurakin
59d339df73SRoman Kurakinecho "The following files will be created:"
60d339df73SRoman Kurakinecho ${TOP}/modules/${1}
61d339df73SRoman Kurakinecho ${TOP}/conf/files.${UPPER}
62d339df73SRoman Kurakinecho ${TOP}/i386/conf/${UPPER}
63d339df73SRoman Kurakinecho ${TOP}/dev/${1}
64d339df73SRoman Kurakinecho ${TOP}/dev/${1}/${1}.c
65d339df73SRoman Kurakinecho ${TOP}/sys/${1}io.h
66d339df73SRoman Kurakinecho ${TOP}/modules/${1}
67d339df73SRoman Kurakinecho ${TOP}/modules/${1}/Makefile
68d339df73SRoman Kurakin
69d339df73SRoman Kurakinmkdir ${TOP}/modules/${1}
70d339df73SRoman Kurakin
71d339df73SRoman Kurakincat >${TOP}/conf/files.${UPPER} <<DONE
725eedd41eSRoman Kurakindev/${1}/${1}.c      optional ${1}
735e176f9aSJulian ElischerDONE
745e176f9aSJulian Elischer
75d339df73SRoman Kurakincat >${TOP}/i386/conf/${UPPER} <<DONE
765e176f9aSJulian Elischer# Configuration file for kernel type: ${UPPER}
775e176f9aSJulian Elischer
78d339df73SRoman Kurakinfiles		"${TOP}/conf/files.${UPPER}"
795e176f9aSJulian Elischer
80d339df73SRoman Kurakininclude		GENERIC
81d339df73SRoman Kurakin
82d339df73SRoman Kurakinident		${UPPER}
83d339df73SRoman Kurakin
845e176f9aSJulian Elischer# trust me, you'll need this
85d339df73SRoman Kurakinoptions		KDB
865e176f9aSJulian Elischeroptions		DDB
87ca6c5ccdSStefan Farfelederdevice		${1}
885e176f9aSJulian ElischerDONE
895e176f9aSJulian Elischer
90d339df73SRoman Kurakinif [ ! -d ${TOP}/dev/${1} ]; then
91d339df73SRoman Kurakin	mkdir -p ${TOP}/dev/${1}
92d339df73SRoman Kurakinfi
93d339df73SRoman Kurakin
94d339df73SRoman Kurakincat >${TOP}/dev/${1}/${1}.c <<DONE
955e176f9aSJulian Elischer/*
9600cbc48bSRoman Kurakin * Copyright (c) [year] [your name]
9700cbc48bSRoman Kurakin *
9800cbc48bSRoman Kurakin * Redistribution and use in source and binary forms, with or without
9900cbc48bSRoman Kurakin * modification, are permitted provided that the following conditions
10000cbc48bSRoman Kurakin * are met:
10100cbc48bSRoman Kurakin * 1. Redistributions of source code must retain the above copyright
10200cbc48bSRoman Kurakin *    notice, this list of conditions and the following disclaimer.
10300cbc48bSRoman Kurakin * 2. Redistributions in binary form must reproduce the above copyright
10400cbc48bSRoman Kurakin *    notice, this list of conditions and the following disclaimer in the
10500cbc48bSRoman Kurakin *    documentation and/or other materials provided with the distribution.
10600cbc48bSRoman Kurakin *
10700cbc48bSRoman Kurakin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
10800cbc48bSRoman Kurakin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
10900cbc48bSRoman Kurakin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
11000cbc48bSRoman Kurakin * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
11100cbc48bSRoman Kurakin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
11200cbc48bSRoman Kurakin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
11300cbc48bSRoman Kurakin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
11400cbc48bSRoman Kurakin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
11500cbc48bSRoman Kurakin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
11600cbc48bSRoman Kurakin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
11700cbc48bSRoman Kurakin * SUCH DAMAGE.
1185e176f9aSJulian Elischer *
1195e176f9aSJulian Elischer * ${1} driver
1205e176f9aSJulian Elischer */
1215e176f9aSJulian Elischer
1225e176f9aSJulian Elischer#include <sys/param.h>
1235e176f9aSJulian Elischer#include <sys/systm.h>
1245e176f9aSJulian Elischer#include <sys/kernel.h>		/* SYSINIT stuff */
12500cbc48bSRoman Kurakin#include <sys/uio.h>		/* SYSINIT stuff */
1265e176f9aSJulian Elischer#include <sys/conf.h>		/* cdevsw stuff */
1275e176f9aSJulian Elischer#include <sys/malloc.h>		/* malloc region definitions */
128853fbff5SAndrew R. Reiter#include <sys/proc.h>
1295e176f9aSJulian Elischer#include <sys/${1}io.h>		/* ${1} IOCTL definitions */
1305e176f9aSJulian Elischer
131418df1e4SMark Murray#include <machine/clock.h>	/* DELAY() */
1325e176f9aSJulian Elischer
13300cbc48bSRoman Kurakin#define N${UPPER}	3	/* defines number of instances */
13400cbc48bSRoman Kurakin
13500cbc48bSRoman Kurakin/* XXX These should be defined in terms of bus-space ops. */
13600cbc48bSRoman Kurakin#define ${UPPER}_INB(port) inb(port)
13700cbc48bSRoman Kurakin#define ${UPPER}_OUTB(port, val) (port, (val))
1385e176f9aSJulian Elischer
139c8e6b347SBruce Evans/* Function prototypes (these should all be static) */
1405e176f9aSJulian Elischerstatic  d_open_t	${1}open;
1415e176f9aSJulian Elischerstatic  d_close_t	${1}close;
1425e176f9aSJulian Elischerstatic  d_read_t	${1}read;
1435e176f9aSJulian Elischerstatic  d_write_t	${1}write;
1445e176f9aSJulian Elischerstatic  d_ioctl_t	${1}ioctl;
1455e176f9aSJulian Elischerstatic  d_mmap_t	${1}mmap;
146f7fa6f64SJulian Elischerstatic  d_poll_t	${1}poll;
1475e176f9aSJulian Elischer
1485e176f9aSJulian Elischer#define CDEV_MAJOR 20
1495e176f9aSJulian Elischerstatic struct cdevsw ${1}_cdevsw = {
15000cbc48bSRoman Kurakin	.d_version =	D_VERSION,
15100cbc48bSRoman Kurakin	.d_open =	${1}open,
15200cbc48bSRoman Kurakin	.d_close =	${1}close,
15300cbc48bSRoman Kurakin	.d_read =	${1}read,
15400cbc48bSRoman Kurakin	.d_write =	${1}write,
15500cbc48bSRoman Kurakin	.d_ioctl =	${1}ioctl,
15600cbc48bSRoman Kurakin	.d_poll =	${1}poll,
15700cbc48bSRoman Kurakin	.d_mmap =	${1}mmap,
15800cbc48bSRoman Kurakin	.d_name =	"${1}",
159418df1e4SMark Murray};
1605e176f9aSJulian Elischer
1615e176f9aSJulian Elischer/*
1625e176f9aSJulian Elischer * device  specific Misc defines
1635e176f9aSJulian Elischer */
1645e176f9aSJulian Elischer#define BUFFERSIZE 1024
16500b4430eSEd Schouten#define UNIT(dev) dev2unit(dev)	/* assume one minor number per unit */
1665e176f9aSJulian Elischer
1675e176f9aSJulian Elischer/*
1685e176f9aSJulian Elischer * One of these per allocated device
1695e176f9aSJulian Elischer */
1705e176f9aSJulian Elischerstruct ${1}_softc {
17100cbc48bSRoman Kurakin	u_long	iobase;
1725e176f9aSJulian Elischer	char	buffer[BUFFERSIZE];
17300cbc48bSRoman Kurakin  	struct cdev *dev;
1745e176f9aSJulian Elischer};
1755e176f9aSJulian Elischer
1765e176f9aSJulian Elischertypedef	struct ${1}_softc *sc_p;
1775e176f9aSJulian Elischer
1785e176f9aSJulian Elischerstatic sc_p sca[N${UPPER}];
1795e176f9aSJulian Elischer
1805e176f9aSJulian Elischer/*
1815e176f9aSJulian Elischer * Macro to check that the unit number is valid
1825e176f9aSJulian Elischer * Often this isn't needed as once the open() is performed,
1835e176f9aSJulian Elischer * the unit number is pretty much safe.. The exception would be if we
1845e176f9aSJulian Elischer * implemented devices that could "go away". in which case all these routines
1855e176f9aSJulian Elischer * would be wise to check the number, DIAGNOSTIC or not.
1865e176f9aSJulian Elischer */
1875e176f9aSJulian Elischer#define CHECKUNIT(RETVAL)						\
1885e176f9aSJulian Elischerdo { /* the do-while is a safe way to do this grouping */		\
1895e176f9aSJulian Elischer	if (unit > N${UPPER}) {						\
19063d45d7dSStefan Farfeleder		printf("%s: bad unit %d\n", __func__, unit);		\
1915e176f9aSJulian Elischer		return (RETVAL);					\
1925e176f9aSJulian Elischer	}								\
1935e176f9aSJulian Elischer	if (scp == NULL) { 						\
19463d45d7dSStefan Farfeleder		printf("%s: unit %d not attached\n", __func__, unit);	\
1955e176f9aSJulian Elischer		return (RETVAL);					\
1965e176f9aSJulian Elischer	}								\
1975e176f9aSJulian Elischer} while (0)
198418df1e4SMark Murray
1995e176f9aSJulian Elischer#ifdef	DIAGNOSTIC
2005e176f9aSJulian Elischer#define	CHECKUNIT_DIAG(RETVAL) CHECKUNIT(RETVAL)
2015e176f9aSJulian Elischer#else	/* DIAGNOSTIC */
2025e176f9aSJulian Elischer#define	CHECKUNIT_DIAG(RETVAL)
2035e176f9aSJulian Elischer#endif 	/* DIAGNOSTIC */
2045e176f9aSJulian Elischer
205418df1e4SMark Murraystatic int
20600cbc48bSRoman Kurakin${1}ioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *td)
2075e176f9aSJulian Elischer{
2085e176f9aSJulian Elischer	int unit = UNIT(dev);
2095e176f9aSJulian Elischer	sc_p scp  = sca[unit];
2105e176f9aSJulian Elischer
2115e176f9aSJulian Elischer	CHECKUNIT_DIAG(ENXIO);
2125e176f9aSJulian Elischer
2135e176f9aSJulian Elischer	switch (cmd) {
2145e176f9aSJulian Elischer	    case DHIOCRESET:
2155e176f9aSJulian Elischer		/*  whatever resets it */
21600cbc48bSRoman Kurakin		(void)scp; /* Delete this line after using scp. */
21700cbc48bSRoman Kurakin#if 0
21800cbc48bSRoman Kurakin		${UPPER}_OUTB(scp->iobase, 0xff);
21900cbc48bSRoman Kurakin#endif
2205e176f9aSJulian Elischer		break;
2215e176f9aSJulian Elischer	    default:
2225e176f9aSJulian Elischer		return ENXIO;
2235e176f9aSJulian Elischer	}
2245e176f9aSJulian Elischer	return (0);
2255e176f9aSJulian Elischer}
226418df1e4SMark Murray
2275e176f9aSJulian Elischer/*
2285e176f9aSJulian Elischer * You also need read, write, open, close routines.
2295e176f9aSJulian Elischer * This should get you started
2305e176f9aSJulian Elischer */
2315e176f9aSJulian Elischerstatic int
23200cbc48bSRoman Kurakin${1}open(struct cdev *dev, int oflags, int devtype, struct thread *td)
2335e176f9aSJulian Elischer{
2345e176f9aSJulian Elischer	int unit = UNIT(dev);
2355e176f9aSJulian Elischer	sc_p scp  = sca[unit];
2365e176f9aSJulian Elischer
2375e176f9aSJulian Elischer	CHECKUNIT(ENXIO);
2385e176f9aSJulian Elischer
23900cbc48bSRoman Kurakin	(void)scp; /* Delete this line after using scp. */
2405e176f9aSJulian Elischer	/*
2415e176f9aSJulian Elischer	 * Do processing
2425e176f9aSJulian Elischer	 */
2435e176f9aSJulian Elischer	return (0);
2445e176f9aSJulian Elischer}
2455e176f9aSJulian Elischer
2465e176f9aSJulian Elischerstatic int
24700cbc48bSRoman Kurakin${1}close(struct cdev *dev, int fflag, int devtype, struct thread *td)
2485e176f9aSJulian Elischer{
2495e176f9aSJulian Elischer	int unit = UNIT(dev);
2505e176f9aSJulian Elischer	sc_p scp  = sca[unit];
2515e176f9aSJulian Elischer
2525e176f9aSJulian Elischer	CHECKUNIT_DIAG(ENXIO);
2535e176f9aSJulian Elischer
25400cbc48bSRoman Kurakin	(void)scp; /* Delete this line after using scp. */
2555e176f9aSJulian Elischer	/*
2565e176f9aSJulian Elischer	 * Do processing
2575e176f9aSJulian Elischer	 */
2585e176f9aSJulian Elischer	return (0);
2595e176f9aSJulian Elischer}
2605e176f9aSJulian Elischer
2615e176f9aSJulian Elischerstatic int
26200cbc48bSRoman Kurakin${1}read(struct cdev *dev, struct uio *uio, int ioflag)
2635e176f9aSJulian Elischer{
2645e176f9aSJulian Elischer	int unit = UNIT(dev);
2655e176f9aSJulian Elischer	sc_p scp  = sca[unit];
2665e176f9aSJulian Elischer	int     toread;
2675e176f9aSJulian Elischer
2685e176f9aSJulian Elischer
2695e176f9aSJulian Elischer	CHECKUNIT_DIAG(ENXIO);
2705e176f9aSJulian Elischer
2715e176f9aSJulian Elischer	/*
2725e176f9aSJulian Elischer	 * Do processing
2735e176f9aSJulian Elischer	 * read from buffer
2745e176f9aSJulian Elischer	 */
2755e176f9aSJulian Elischer	toread = (min(uio->uio_resid, sizeof(scp->buffer)));
2765e176f9aSJulian Elischer	return(uiomove(scp->buffer, toread, uio));
2775e176f9aSJulian Elischer}
2785e176f9aSJulian Elischer
2795e176f9aSJulian Elischerstatic int
28000cbc48bSRoman Kurakin${1}write(struct cdev *dev, struct uio *uio, int ioflag)
2815e176f9aSJulian Elischer{
2825e176f9aSJulian Elischer	int unit = UNIT(dev);
2835e176f9aSJulian Elischer	sc_p scp  = sca[unit];
2845e176f9aSJulian Elischer	int	towrite;
2855e176f9aSJulian Elischer
2865e176f9aSJulian Elischer	CHECKUNIT_DIAG(ENXIO);
2875e176f9aSJulian Elischer
2885e176f9aSJulian Elischer	/*
2895e176f9aSJulian Elischer	 * Do processing
2905e176f9aSJulian Elischer	 * write to buffer
2915e176f9aSJulian Elischer	 */
2925e176f9aSJulian Elischer	towrite = (min(uio->uio_resid, sizeof(scp->buffer)));
2935e176f9aSJulian Elischer	return(uiomove(scp->buffer, towrite, uio));
2945e176f9aSJulian Elischer}
2955e176f9aSJulian Elischer
2965e176f9aSJulian Elischerstatic int
29700cbc48bSRoman Kurakin${1}mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot)
2985e176f9aSJulian Elischer{
2995e176f9aSJulian Elischer	int unit = UNIT(dev);
3005e176f9aSJulian Elischer	sc_p scp  = sca[unit];
3015e176f9aSJulian Elischer
3025e176f9aSJulian Elischer	CHECKUNIT_DIAG(-1);
3035e176f9aSJulian Elischer
30400cbc48bSRoman Kurakin	(void)scp; /* Delete this line after using scp. */
3055e176f9aSJulian Elischer	/*
3065e176f9aSJulian Elischer	 * Do processing
3075e176f9aSJulian Elischer	 */
3085e176f9aSJulian Elischer#if 0	/* if we had a frame buffer or whatever.. do this */
3095e176f9aSJulian Elischer	if (offset > FRAMEBUFFERSIZE - PAGE_SIZE) {
3105e176f9aSJulian Elischer		return (-1);
3115e176f9aSJulian Elischer	}
3125e176f9aSJulian Elischer	return i386_btop((FRAMEBASE + offset));
3135e176f9aSJulian Elischer#else
3145e176f9aSJulian Elischer	return (-1);
3155e176f9aSJulian Elischer#endif
3165e176f9aSJulian Elischer}
3175e176f9aSJulian Elischer
3185e176f9aSJulian Elischerstatic int
31900cbc48bSRoman Kurakin${1}poll(struct cdev *dev, int which, struct thread *td)
3205e176f9aSJulian Elischer{
3215e176f9aSJulian Elischer	int unit = UNIT(dev);
3225e176f9aSJulian Elischer	sc_p scp  = sca[unit];
3235e176f9aSJulian Elischer
3245e176f9aSJulian Elischer	CHECKUNIT_DIAG(ENXIO);
3255e176f9aSJulian Elischer
32600cbc48bSRoman Kurakin	(void)scp; /* Delete this line after using scp. */
3275e176f9aSJulian Elischer	/*
3285e176f9aSJulian Elischer	 * Do processing
3295e176f9aSJulian Elischer	 */
3305e176f9aSJulian Elischer	return (0); /* this is the wrong value I'm sure */
3315e176f9aSJulian Elischer}
3325e176f9aSJulian Elischer
3335e176f9aSJulian Elischer/*
3345e176f9aSJulian Elischer * Now  for some driver initialisation.
3355e176f9aSJulian Elischer * Occurs ONCE during boot (very early).
3365e176f9aSJulian Elischer */
3375e176f9aSJulian Elischerstatic void
3385e176f9aSJulian Elischer${1}_drvinit(void *unused)
3395e176f9aSJulian Elischer{
3405e176f9aSJulian Elischer	int	unit;
34130105b9cSEd Schouten	sc_p	scp;
3425e176f9aSJulian Elischer
3435e176f9aSJulian Elischer	for (unit = 0; unit < N${UPPER}; unit++) {
3445e176f9aSJulian Elischer		/*
3455e176f9aSJulian Elischer		 * Allocate storage for this instance .
3465e176f9aSJulian Elischer		 */
347853fbff5SAndrew R. Reiter		scp = malloc(sizeof(*scp), M_DEVBUF, M_NOWAIT | M_ZERO);
3485e176f9aSJulian Elischer		if( scp == NULL) {
3495e176f9aSJulian Elischer			printf("${1}%d failed to allocate strorage\n", unit);
3505e176f9aSJulian Elischer			return;
3515e176f9aSJulian Elischer		}
3525e176f9aSJulian Elischer		sca[unit] = scp;
35300cbc48bSRoman Kurakin    		scp->dev = make_dev(&${1}_cdevsw, unit,
3545e176f9aSJulian Elischer			UID_ROOT, GID_KMEM, 0640, "${1}%d", unit);
3555e176f9aSJulian Elischer	}
3565e176f9aSJulian Elischer}
3575e176f9aSJulian Elischer
3585e176f9aSJulian ElischerSYSINIT(${1}dev, SI_SUB_DRIVERS, SI_ORDER_MIDDLE+CDEV_MAJOR,
35930105b9cSEd Schouten		${1}_drvinit, NULL);
3605e176f9aSJulian ElischerDONE
3615e176f9aSJulian Elischer
362d339df73SRoman Kurakincat >${TOP}/sys/${1}io.h <<DONE
3635e176f9aSJulian Elischer/*
3645e176f9aSJulian Elischer * Definitions needed to access the ${1} device (ioctls etc)
3655e176f9aSJulian Elischer * see mtio.h , ioctl.h as examples
3665e176f9aSJulian Elischer */
3675e176f9aSJulian Elischer#ifndef SYS_DHIO_H
3685e176f9aSJulian Elischer#define SYS_DHIO_H
3695e176f9aSJulian Elischer
3705e176f9aSJulian Elischer#ifndef KERNEL
3715e176f9aSJulian Elischer#include <sys/types.h>
3725e176f9aSJulian Elischer#endif
3735e176f9aSJulian Elischer#include <sys/ioccom.h>
3745e176f9aSJulian Elischer
3755e176f9aSJulian Elischer/*
3765e176f9aSJulian Elischer * define an ioctl here
3775e176f9aSJulian Elischer */
3785e176f9aSJulian Elischer#define DHIOCRESET _IO('D', 0)   /* reset the ${1} device */
3795e176f9aSJulian Elischer#endif
3805e176f9aSJulian ElischerDONE
3815e176f9aSJulian Elischer
382d339df73SRoman Kurakinif [ ! -d ${TOP}/modules/${1} ]; then
383d339df73SRoman Kurakin	mkdir -p ${TOP}/modules/${1}
384d339df73SRoman Kurakinfi
385d339df73SRoman Kurakin
386d339df73SRoman Kurakincat >${TOP}/modules/${1}/Makefile <<DONE
387d339df73SRoman Kurakin#	${UPPER} Loadable Kernel Module
388d339df73SRoman Kurakin
389d339df73SRoman Kurakin.PATH:  \${.CURDIR}/../../dev/${1}
390d339df73SRoman KurakinKMOD    = ${1}
391d339df73SRoman KurakinSRCS    = ${1}.c
392d339df73SRoman Kurakin
393d339df73SRoman Kurakin.include <bsd.kmod.mk>
394d339df73SRoman KurakinDONE
395d339df73SRoman Kurakin
396d339df73SRoman Kurakinecho -n "Do you want to build the '${1}' module? [Y]"
397d339df73SRoman Kurakinread VAL
398d339df73SRoman Kurakinif [ "-z" "$VAL" ]; then
399d339df73SRoman Kurakin	VAL=YES
400d339df73SRoman Kurakinfi
401d339df73SRoman Kurakincase ${VAL} in
402d339df73SRoman Kurakin[yY]*)
403d339df73SRoman Kurakin	(cd ${TOP}/modules/${1}; make depend; make )
404d339df73SRoman Kurakin	;;
405d339df73SRoman Kurakin*)
406d339df73SRoman Kurakin#	exit
407d339df73SRoman Kurakin	;;
408d339df73SRoman Kurakinesac
409d339df73SRoman Kurakin
410d339df73SRoman Kurakinecho ""
411d339df73SRoman Kurakinecho -n "Do you want to build the '${UPPER}' kernel? [Y]"
412d339df73SRoman Kurakinread VAL
413d339df73SRoman Kurakinif [ "-z" "$VAL" ]; then
414d339df73SRoman Kurakin	VAL=YES
415d339df73SRoman Kurakinfi
416d339df73SRoman Kurakincase ${VAL} in
417d339df73SRoman Kurakin[yY]*)
418d339df73SRoman Kurakin	(
419d339df73SRoman Kurakin	 cd ${TOP}/i386/conf; \
420d339df73SRoman Kurakin	 config ${UPPER}; \
421d339df73SRoman Kurakin	 cd ${TOP}/i386/compile/${UPPER}; \
422d339df73SRoman Kurakin	 make depend; \
423d339df73SRoman Kurakin	 make; \
424d339df73SRoman Kurakin	)
425d339df73SRoman Kurakin	;;
426d339df73SRoman Kurakin*)
427d339df73SRoman Kurakin#	exit
428d339df73SRoman Kurakin	;;
429d339df73SRoman Kurakinesac
4305e176f9aSJulian Elischer
4315e176f9aSJulian Elischer#--------------end of script---------------
4325e176f9aSJulian Elischer#
4335e176f9aSJulian Elischer#edit to your taste..
4345e176f9aSJulian Elischer#
4355e176f9aSJulian Elischer#
436