From owner-freebsd-questions Mon Apr 22 16:09:54 1996 Return-Path: owner-questions Received: (from root@localhost) by freefall.freebsd.org (8.7.3/8.7.3) id QAA24706 for questions-outgoing; Mon, 22 Apr 1996 16:09:54 -0700 (PDT) Received: from pina1.telecom.at (pina1.telecom.at [194.37.252.41]) by freefall.freebsd.org (8.7.3/8.7.3) with SMTP id QAA24692 for ; Mon, 22 Apr 1996 16:09:50 -0700 (PDT) Received: from async2.pinrt6.telecom.at (async2.pinrt6.telecom.at [194.118.12.102]) by pina1.telecom.at (8.6.10/8.6.6) with SMTP id BAA123184; Tue, 23 Apr 1996 01:08:08 +0200 Message-Id: <199604222308.BAA123184@pina1.telecom.at> Comments: Authenticated sender is From: "Franz Hollerer" To: kuku@gilberto.physik.rwth-aachen.de, Gabor Zahemszky Date: Tue, 23 Apr 1996 01:01:43 +0000 Subject: Re: How can I read/write from/to an I/O-port? CC: freebsd-questions@freebsd.org Priority: normal X-mailer: Pegasus Mail for Windows (v2.01) Sender: owner-questions@freebsd.org X-Loop: FreeBSD.org Precedence: bulk > > > I have a little problem. So I hope someone can help > > > me: > > > > > > Under Linux a /dev/port exits to write/read to/from an I/O-port. > > > Does a similar /dev/??? exits under FreeBSD or must I write > > > a little device driver for this? > > > > Under FreeBSD there is /dev/io. > > > > Do an open("/dev/io",flags,mode) on it and you can access i/o > > ports using in/out instructions. > > OK. How? What does flags mean? How can I use the fd, I get from open? > (A little example please....) Hi, I did not exactly understand why it works, but it works! I have looked at the code too. It really seams that port-io will change (Linux like). So I give you the example for Linux and SCO too. For SCO I wrote a little device driver which behaves like /dev/port under Linux. Please notice that the example is a fragment of a library. Franz /* ============================================================ */ /* read /write from/to an io-port: inp(), outp() 22.04.96 Franz Hollerer */ #include #include #include #include #if defined FreeBSD # include #endif #include #include "decl.h" /* ============================================================ */ int prnterr PARAMS((const char *fmt, ...)); char *getprgname PARAMS(()); void outp PARAMS((int addr, u_char b)); u_char inp PARAMS(()); /* ============================================================ */ #if defined LINUX || defined SCO /* output byte from port */ void outp(addr, b) /* Linux || SCO */ int addr; u_char b; { static int fd=-1; if (fd==-1 && (fd=open("/dev/port", O_WRONLY))==-1) { prnterr("%s: cannot open '/dev/port'\n", getprgname()); exit(1); } lseek(fd, addr, SEEK_SET); write(fd, &b, 1); } /* eof outp */ #endif /* LINUX */ #if defined FreeBSD /* output byte from port */ void outp(addr, b) /* FreeBSD */ int addr; u_char b; { static int fd=-1; if (fd==-1 && (fd=open("/dev/io", O_WRONLY))==-1) { prnterr("%s: cannot open '/dev/io'\n", getprgname()); exit(1); } outbv(addr, b); } /* eof outp */ #endif /* FreeBSD */ #if !defined LINUX && !defined FreeBSD && !defined SCO # warning "outp() not implemented!" #endif /* !LINUX && !FreeBSD */ /* ============================================================ */ #if defined LINUX || SCO /* input byte from port */ u_char inp(addr) /* Linux || SCO */ int addr; { static int fd=-1; u_char b; if (fd==-1 && (fd=open("/dev/port", O_RDONLY))==-1) { prnterr("%s: cannot open '/dev/port'\n", getprgname()); exit(1); } lseek(fd, addr, SEEK_SET); read(fd, &b, 1); return(b); } /* eof inp */ #endif /* LINUX */ #if defined FreeBSD /* input byte from port */ u_char inp(addr) /* FreeBSD */ int addr; { static int fd=-1; u_char b; if (fd==-1 && (fd=open("/dev/io", O_RDONLY))==-1) { prnterr("%s: cannot open '/dev/io'\n", getprgname()); exit(1); } b=inbv(addr); return(b); } /* eof inp */ #endif /* FreeBSD */ #if !defined LINUX && !defined FreeBSD && !defined SCO # warning: "inp() not implemented!" #endif /* !LINUX && !FreeBSD */ EEG, Hard&Software Development Austria We have no kangaroos.