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