Date: Wed, 05 May 1999 14:41:20 +0200 From: Jean-Michel DRICOT <jdricot@ulb.ac.be> To: FreeBSD Questions <freebsd-questions@FreeBSD.ORG> Subject: Writing directly to PC Parallel Port Message-ID: <37303C6F.2BAD8B47@ulb.ac.be>
next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------756DA81E787DAD3F32E73E6B Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit 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 --------------756DA81E787DAD3F32E73E6B Content-Type: text/plain; charset=us-ascii; name="led-stat.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="led-stat.txt" >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> --------------756DA81E787DAD3F32E73E6B-- 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?37303C6F.2BAD8B47>