Unix PC /dev/vidram device driver (sources)

Mike "Ford" Ditto ford at kenobi.UUCP
Thu May 26 03:03:22 AEST 1988


Since everyone's talking about direct video access these days, I put
together a device driver just for that purpose.  "/dev/vidram" is a
character device that lets you use seek/read/write to access the
**RAW** video memory.  I think this is a much lower level access than
anyone will want; for example, if the screen-blanker is active
(blanking the screen) you will just read zeroes from this device.  But
I'll send it out so all you people can see if you have some use for
it.


"vidram.shar" is after my signature.

					-=] Ford [=-

"Once there were parking lots,		(In Real Life:  Mike Ditto)
now it's a peaceful oasis.		ford%kenobi at crash.CTS.COM
This was a Pizza Hut,			...!sdcsvax!crash!kenobi!ford
now it's all covered with daisies." -- Talking Heads

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	vidram.doc
#	Makefile
#	Size
#	Install
#	Name
#	Remove
#	Files
#	INSTALL
# This archive created: Tue May 24 23:44:09 1988
export PATH; PATH=/bin:$PATH
echo shar: extracting "'vidram.doc'" '(2985 characters)'
if test -f 'vidram.doc'
then
	echo shar: will not over-write existing file "'vidram.doc'"
else
cat << \SHAR_EOF > 'vidram.doc'
Ha!  You expect documentation for a program I wrote in 10 minutes and
give away free?!?!  Well, I guess I can do something...

The "/dev/vidram" driver allows file-like access to the Unix PC video
bitmap memory.  This is a very low-level way to access the display,
and I don't recommend it, but it's an interesting thing to experiment
with.  Use it at your own risk.

To use it, just open(2) "/dev/vidram" and lseek(2) to the position you
want to access.  The video display is arranged in 16-bit words, and
the leftmost 16 pixels on the top line are at lseek offset 0.  The
leftmost pixel is the least significant bit (bit 0) of this word, and
the rightmost pixel of that group of 16 is the most significant bit
(bit 15) of the word.  This can be confusing if you think in Motorola
Byte Order, but that's your problem anyway.  You may read(2) or
write(2) the bytes to/from the display after seeking to the position
you want.

Note that the driver makes things look like just a bunch of bytes; you
only have to think of the 16-bit words if you want to visualize how
all these bits would appear on the screen.  Because Unix works in
bytes, and the screen hardware works in words, the driver is not
incredibly efficient.  But it is somewhat interesting, so I wrote it.

The driver is currently set up so that only super-user can write to
the screen (anyone can read).  It is pretty obvious how to change this
in the source if you want to just use the file permissions to regulate
/dev/vidram access.


To make the driver, just type "make" (as root).  You can also type
"make installable" to create a "vid+IN" that J. Random Luser can
install on his machine, or "make floppy" to make an Installable Floppy
that you can send to J. Random Luser if he doesn't have a uucp
connection.  Note that this doesn't physically create a floppy disk
where there wasn't one, it just writes on a disk that you supply,
despite the misleading command name and my misleading description
above.  The installable packages don't include source; if you want to
give that to someone, just send the shar file you got it in.


In case anyone's interested, here's a breakdown of how long it took me
to write this driver:


	10 minutes  to write the code.  It compiled the first time (weird!).
	10 minutes  to steal the installation package from another driver.
	10 minutes  to test it a bit and discover that the hardware only
		    allows word-wide access, and modify the code to do this.
	10 minutes  for the machine to crash and reboot, since there was a
		    slight bug in that last change.
	10 minutes  to fix the bug, recompile and test a bit more.
	10 minutes  to write this silly file.


Anyway, let me know if you find this program useful, educational, or
broken.

					-=] Ford [=-

"Once there were parking lots,		(In Real Life:  Mike Ditto)
now it's a peaceful oasis.		ford%kenobi at crash.CTS.COM
This was a Pizza Hut,			...!sdcsvax!crash!kenobi!ford
now it's all covered with daisies." -- Talking Heads
SHAR_EOF
if test 2985 -ne "`wc -c < 'vidram.doc'`"
then
	echo shar: error transmitting "'vidram.doc'" '(should have been 2985 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'Makefile'" '(360 characters)'
if test -f 'Makefile'
then
	echo shar: will not over-write existing file "'Makefile'"
else
cat << \SHAR_EOF > 'Makefile'
D=-O
CFLAGS= $D
DRIVER=vid

install : $(DRIVER).o
	./INSTALL

all : $(DRIVER)+IN

installable : $(DRIVER)+IN

$(DRIVER)+IN : $(DRIVER).o
	cpio -oBc < Files > $(DRIVER)+IN

floppy : $(DRIVER)+IN
	echo "Insert a formatted floppy disk and press return"; read foo
	dd if=$(DRIVER)+IN of=/dev/rfp021 bs=16384

clean: 
	rm $(DRIVER).o $(DRIVER)+IN

clobber : clean

SHAR_EOF
if test 360 -ne "`wc -c < 'Makefile'`"
then
	echo shar: error transmitting "'Makefile'" '(should have been 360 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'Size'" '(3 characters)'
if test -f 'Size'
then
	echo shar: will not over-write existing file "'Size'"
else
cat << \SHAR_EOF > 'Size'
42
SHAR_EOF
if test 3 -ne "`wc -c < 'Size'`"
then
	echo shar: error transmitting "'Size'" '(should have been 3 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'Install'" '(250 characters)'
if test -f 'Install'
then
	echo shar: will not over-write existing file "'Install'"
else
cat << \SHAR_EOF > 'Install'
# Install script for /dev/vidram driver

DRIVER=vid

./INSTALL || exit 1

cd /etc/lddrv

# put an entry in InstDrv for ${DRIVER}
cat >> InstDrv << EOF
Name=/dev/vidram driver
File=${DRIVER}
EOF


echo "The /dev/vidram driver is now installed"
exit 0
SHAR_EOF
if test 250 -ne "`wc -c < 'Install'`"
then
	echo shar: error transmitting "'Install'" '(should have been 250 characters)'
fi
chmod +x 'Install'
fi # end of overwriting check
echo shar: extracting "'Name'" '(42 characters)'
if test -f 'Name'
then
	echo shar: will not over-write existing file "'Name'"
else
cat << \SHAR_EOF > 'Name'
/dev/vidram driver by Ford Prefect (M.D.)
SHAR_EOF
if test 42 -ne "`wc -c < 'Name'`"
then
	echo shar: error transmitting "'Name'" '(should have been 42 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'Remove'" '(167 characters)'
if test -f 'Remove'
then
	echo shar: will not over-write existing file "'Remove'"
else
cat << \SHAR_EOF > 'Remove'
rm -f /dev/vidram

cd /etc/lddrv
./lddrv -dv vid
echo '/^vid$/d
w' | ed - drivers
rm -f ifile.vid vid vid.o

/etc/masterupd -d vid


echo "/dev/vidram driver REMOVED"
SHAR_EOF
if test 167 -ne "`wc -c < 'Remove'`"
then
	echo shar: error transmitting "'Remove'" '(should have been 167 characters)'
fi
chmod +x 'Remove'
fi # end of overwriting check
echo shar: extracting "'Files'" '(45 characters)'
if test -f 'Files'
then
	echo shar: will not over-write existing file "'Files'"
else
cat << \SHAR_EOF > 'Files'
Size
Install
Name
Remove
Files
INSTALL
vid.o
SHAR_EOF
if test 45 -ne "`wc -c < 'Files'`"
then
	echo shar: error transmitting "'Files'" '(should have been 45 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'INSTALL'" '(918 characters)'
if test -f 'INSTALL'
then
	echo shar: will not over-write existing file "'INSTALL'"
else
cat << \SHAR_EOF > 'INSTALL'
set -e		# exit if there anything goes wrong

DRIVER=vid

if [ ! -f ${DRIVER}.o ]
then
	echo "you must make ${DRIVER}.o before running INSTALL" 1>&2
	exit 1
fi


if [ ! -c /dev/vidram ]
then
	/etc/masterupd -a char release open close read write ${DRIVER}

	# get the assigned device number
	MAJOR=`/etc/masterupd -c ${DRIVER}`
	if [ $? -ne 0 ]
	then
		echo "${DRIVER} cannot be added to the /etc/master file" 1>&2
		exit 1
	fi

	rm -f /dev/vidram > /dev/null 2>&1
	/etc/mknod /dev/vidram c $MAJOR 0
fi

cp ${DRIVER}.o /etc/lddrv/

cd /etc/lddrv

# remove the driver if it's already running

./lddrv -q ${DRIVER} && ./lddrv -d ${DRIVER}

# allocate and load the module

if ./lddrv -a ${DRIVER}
then
	echo "Driver ${DRIVER} successfully loaded"
else
	echo "Error: Driver ${DRIVER} failed loading stage" 1>&2
	exit 1
fi

# load the driver at boot time

grep "^${DRIVER}\$" drivers > /dev/null || echo ${DRIVER} >> drivers
SHAR_EOF
if test 918 -ne "`wc -c < 'INSTALL'`"
then
	echo shar: error transmitting "'INSTALL'" '(should have been 918 characters)'
fi
chmod +x 'INSTALL'
fi # end of overwriting check
#	End of shell archive
exit 0



More information about the Comp.sys.att mailing list