lee@minnow.UUCP (Gene Lee ) (08/17/87)
This is a repost because I think the first one got lost.
If not, Sooorrrrry.
Enough people have sent me mail asking to see how a wrote
a xenix device driver I decided to post what I had. This is a collection
of all the steps and files I used. If I made a mistake or left something
out, please let me know. I dont know if this is applicable to IBM's
xenix.
***************************************************************************
***************************************************************************
*NOTE* this driver was written for SCO xenix
***************************************************************************
***************************************************************************
the following is a list of steps used to modify system
files:
1) add the deivces name to the xenixconf file
example:
.
.
.
scsi 1 /* this is an existing line */
prot 1 /* this is the one I added */
*NOTE prot is the same four chars on the
front of all my driver procedure names
2) add the device to the master file
example:
.
.
.
scsi 0 0137 014 ........../* this is an existing line */
prot 0 0137 104 prot 0 0 30 1 0 0 0 0 0
3) fix up the make file adding our proto.o to the CONF= line
example:
CONF= oemsup.o ........ {/path/}proto.o
4) edit the link_xenix file adding our proto.o to the ld line
example:
ld -Mm -D ........ {/path/}proto.o
5) make special file with mknod in the /dev directory
example:
mknod <filename>
6) type make
7) type hdinstall
8) reboot
***************************************************************************
***************************************************************************
this is the make file for proto.c (the device driver)
all: proto.o
touch all
CFLAGS = -K -M2em -O -DM_KERNEL -DNETWORK -UM_I86
proto.o: proto.c const.h
cc $(CFLAGS) -c proto.c
***************************************************************************
***************************************************************************
this is const.h . It is used by proto.c
#define ATOD 0x304
#define DTOA 0x308
#define PORTA 0x300
#define PORTB 0x301
#define PORTC 0x302
#define PORTCNTRL 0x303
#define ALLOUT 0x80
#define ALLIN 0x9B
#define IN_IN_OUT 0x9A
#define OUT_IN_OUT 0x8A
#define IN_OUT_OUT 0x98
#define dev_porta 0
#define dev_portb 1
#define dev_portc 2
#define dev_atod 3
#define dev_dtoa 4
***************************************************************************
***************************************************************************
this is proto.c . It is the device driver code
#include <sys/relsym86.h>
#include <sys/param.h>
#include <sys/dir.h>
#include <sys/user.h>
#include <sys/file.h>
#include <sys/conf.h>
#include <errno.h>
#include "const.h" /* constants which define hardware adresses */
/*
*NOTE* the value dev passed to the device driver is the
minor device number as defined by using the mknod
command
*/
protpoll(ps)
int ps;
{
/*
printf("In poll routime\n");
*/
}
/* ____________________________________________________________________ */
protopen(dev,flag)
int dev;
int flag;
{
/*
printf("In open routime\n");
*/
}
/* ____________________________________________________________________ */
protclose(dev)
int dev;
{
/*
printf("In close routime\n");
*/
}
/* ____________________________________________________________________ */
protread(dev)
int dev;
{
int x;
switch (dev) { /* what is the minor device number of the special file */
case dev_atod:
x =in(ATOD); /* read a byte from the card */
break;
case dev_porta:
x =in(PORTA);
break;
case dev_portb:
x =in(PORTB);
break;
case dev_portc:
x =in(PORTC);
break;
}
passc(x); /* return the byte read in from the card */
}
/* ____________________________________________________________________ */
protwrite(dev)
int dev;
{
int x;
x = cpass(); /* get the value passed by the user call */
switch(dev) {
case dev_dtoa:
out(DTOA, x); /* write the by to the card */
break;
case dev_atod:
out(ATOD, x);
break;
case dev_porta:
out(PORTA, x);
break;
case dev_portb:
out(PORTB, x);
break;
case dev_portc:
out(PORTC, x);
break;
}
}
/* ____________________________________________________________________ */
protparam(dev)
int dev;
{
printf("in proto param\n");
}
/* ____________________________________________________________________ */
protintr(vec)
int vec;
{
/*
printf("in proto intr\n");
*/
}
/* ____________________________________________________________________ */
protioctl(dev, request, arg)
int dev;
int request;
faddr_t arg;
{
printf("in proto ioctl %d, %d\n", dev, request);
}
/* ____________________________________________________________________ */
protinit()
{
out(PORTCNTRL, OUT_IN_OUT); /* set up the proto board's PIA */
out(PORTC, 0); /* select A-TO-D channel number = 0 */
in(ATOD); /* dummy read to latch in channel */
/* delay(Hz * 0.1); */ /* delay 100 ms */
printf("PROTO BOARD Initialized\n");
}
***************************************************************************
***************************************************************************
this is a half baked example of using the device driver
main()
{
int fp;
fp = open("/dev/{filename}" ,"rw");
read(fp, buffer, 1); /* do a inb() => buffer */
write(fp,buffer, 1); /* do a outb(buffer) */
close(fp);
}
***************************************************************************
********************************* THE END *********************************
--
Gene Lee UUCP: ...ihnp4!{meccts,dayton,rosevax}!ems!minnow!lee
UNISYS Corporation ATT: (612) 635-6334
If not for the courage of the fearless manager, the paycheck would be lost.