Date: Wed, 5 May 1999 19:18:10 -0400 From: "Mark Turpin" <mturpin@spel.com> To: "Jean-Michel DRICOT" <jdricot@ulb.ac.be> Cc: <questions@freebsd.org> Subject: Re: Writing directly to PC Parallel Port Message-ID: <006101be974d$8ae9b2c0$8227e2d0@spel.com> References: <37303C6F.2BAD8B47@ulb.ac.be>
next in thread | previous in thread | raw e-mail | index | archive | help
you'll need to open /dev/io then outb should work. like this.... open("/dev/io",O_RDWR); outb(0x378, 0xFF); ----- Original Message ----- From: Jean-Michel DRICOT <jdricot@ulb.ac.be> To: FreeBSD Questions <freebsd-questions@FreeBSD.ORG> Sent: Wednesday, May 05, 1999 8:41 AM Subject: Writing directly to PC Parallel Port > Hello, > I found this small code (see attachement) on the Web. It is for Linux > and I tried compiling it. > I get first error from "ioperm" function that BSD know how to handle. > I fired it and tried aganin. This time it compiled but didn't run (core > dumped :-) ). > > I wonder thus how to write directly to ports with FreeBSD. I'd like to > write bits directly to the port. Assembly code like "outb" and so > doesn't seem to be enough... > > Any idea ? > > Thanks > > jim > > ________________________________________________________________________ > > "Unix IS user friendly. It's just selective about who it's friends are." > > Dricot Jean-Michel > 3eme Annee du grade d'Ingenieur Civil Informaticien > Universite Libre de Bruxelles - Ecole Polytechnique > > URL: http://student.ulb.ac.be/~jdricot > e-mail: jdricot@ulb.ac.be > > ---------------------------------------------------------------------------- ---- > >From joev@mikasa.WPI.EDU Sun Jan 1 18:34:40 EST 1995 > Article: 144 of comp.os.linux.development.system > Path: bigblue.oit.unc.edu!concert!gatech!bloom-beacon.mit.edu!news2.near.net!news. mathworks.com!bigboote.WPI.EDU!mikasa.WPI.EDU!joev > From: joev@mikasa.WPI.EDU (Joseph W. Vigneau) > Newsgroups: comp.os.linux.development.system > Subject: My LED performance meter thing... > Date: 1 Jan 1995 23:18:28 GMT > Organization: Worcester Polytechnic Institute > Lines: 147 > Message-ID: <3e7d84$or5@bigboote.WPI.EDU> > NNTP-Posting-Host: mikasa.wpi.edu > > Last week, someone wrote here asking about robotic contol via Linux... I > responded explaining how I used the parallel port to control a sort-of > "performance meter". I've recieved a lot of requests on how I did this. > Here's the story: > > Last year, at school (WPI), Silicon Graphics brought this huge 18-wheel > truck that is basically a demonstrationmobile. Inside it had Indys, > Crimsons, and some of their big machines like a couple of Onyxes and an > *monsterous* Power Challenge.. I'm relatively young (17 at the time), and > I'd never seen a computer this big before: It looked like an oversized > refrigerator, with cooling ducts running in and out of it! On the front of > this beast, was a little LCD backlit readout about the size of my HP-48G's > display. It was labeled "CPU Activity", and had a little bar chart showing > how hard each processor was working. I thought it would be cool to have one > of these mounted on my Linux box :) > > I finally got a computer of my own this past November, and finally got to run > Linux on my own, instead of administering it for a number of people on my > floor. I had a Shack attack, and went to Radio Shack, and picked up the > following items: a breadboard, a 10-bar LED, breadboard wires, and a > package of assorted resistors. [Side note: While at the Shack with a few of > my suitemates, we were way in back in the component section (the only good > part of the store any more), and were approached by a lady who thought we > were employees there :). Back to the project.] > > It was wired up like this, via the parallel port: > > pin 20 (ground) > | > 150ohm LED | > pin 2 (D0) ----/\/\/------|>|-----+ > | > pin 3 (D1) ----/\/\/------|>|-----+ > | > pin 4 (D2) ----/\/\/------|>|-----+ > > [...] > | > pin 9 (D7) ----/\/\/------|>|-----+ > > Note: 2 of the LEDs weren't connected. > > Now, the software part: > > Two files were used: the first is a routine written by a roomate > (damianf@wpi.edu) used to blast raw bytes at a port, and read them. Please > contact him for more info, or if you want to use it in a progrm of your own. > > static inline int port_in( int port ) > { > unsigned char value; > __asm__ volatile ("inb %1,%0" > : "=a" (value) > : "d" ((unsigned short)port)); > return value; > } > > static inline void port_out( unsigned short int port, unsigned char val ) > { > __asm__ volatile ( > "outb %0,%1\n" > : > : "a" (val), "d" (port) > ); > } > > I originally wanted to use the load average to determine how many of the > LEDs lit up, but realized that it was only updated every minute.. I wanted a > display similar to xload or xosview, but I really coun't figure out how they > were determined.. What I ended up doing was reading the output of 'ps aux', > and summing up the %CPU column. I then converted that into a number > representing how many LEDs should light, and blast it at the printer port. > > NOTE: I wrote and built this thing in a bout 90 minutes, so it's quick and > dirty, and not at all as elegant as I hoped it to be. > > Here's the program: > > /* meter.c by Joseph W. Vigneau (joev@wpi.edu) (c)1994. > This program is covered under the GNU copyleft agreement. > */ > > #include <stdio.h> > #include <unistd.h> > #include <errno.h> > #include <time.h> > #include "port.h" > > float loadavg(void) > { > FILE *f; > char line[80]; > float cpu = 0.0, totalcpu = 0.0; > > if((f = popen("/bin/ps -aux","r"))==NULL) { > fprintf(stderr,"Couldn't fork /bin/ps.\n"); > exit(1); > } > > fgets(line, 80, f); > while(!feof(f)) { > sscanf(line,"%*s %*d %f",&cpu); > totalcpu += cpu; > fgets(line, 80, f); > } > /* printf("TOTAL: %f\n",totalcpu); */ > pclose(f); > return totalcpu/100.0; > } > > > main() > { > unsigned char lights; > float ave; > char dir = 0; > char foo[10]; > register unsigned char numlights, i; > > if(ioperm(0x378,1,1)) { > fprintf(stderr,"ioperm error.\n"); > exit(1); > } > > while(1) { > ave = loadavg(); > numlights = (int)(ave*8.0); > /* printf("ave = %f, numlights = %d\n",ave, numlights); */ > > lights = 0; > for(i=0;i<numlights;i++) > lights |= (1<<i); > > port_out(0x378, lights); > usleep(750000L); > } > } > > This program has to be suid root, due to the ioperm call. > > Good luck, and have fun! Your mileage may vary.. If this makes your computer > explode or something, I'm not responsible, etc.. If you improve upon this, > post it here, so everyone else can see! > > -- > joev@wpi.edu WPI Computer Science '97 Linux! > <a href="http://www.wpi.edu/~joev"> Click Here! </a> > > > To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?006101be974d$8ae9b2c0$8227e2d0>