#include#include /* ioperm() */ #include #include #include #define NANOS #define MICROS *1000 #define MILLIS *1000000 int portbase = 0; int position = 0; #define MAXPOS 4 int posmask[MAXPOS] = { 1,2,4,8 }; int halfstep = 0; long delaytime = 10 MILLIS; static void delay(long nanos) { struct timespec req = { 0,nanos }; nanosleep(&req,NULL); } void singlerotate(int dir) { int maxpos = halfstep ? (MAXPOS*2) : MAXPOS; if (dir) { /* right */ position++; if (position>=maxpos) position = 0; } else { /* left */ position--; if (position < 0) position = maxpos-1; } /* strobe off, choose multiplexer line A0 */ outb(2,portbase+2); delay(delaytime); /* datalines */ if (!halfstep) outb(~posmask[position],portbase); else { if (position & 1) { /* position is odd */ int pos1 = position/2; int pos2 = pos1+1; int mask; if (pos2 >= MAXPOS) pos2 = 0; mask = posmask[pos1] | posmask[pos2]; outb(~mask,portbase); } else { /* position is even */ outb(~posmask[position/2],portbase); } } delay(delaytime); /* strobe on */ outb(1+2,portbase+2); delay(delaytime); /* strobe off */ outb(0,portbase+2); delay(delaytime); } void rotate(int dir,int steps) { /* If user just says 'l' or 'r', steps==0 */ if (steps == 0) steps = 1; while (steps > 0) { steps--; singlerotate(dir); } } int main(int argc,char **argv) { char keybuff[80]; while (!portbase) { puts("Choose parallel port: 0 lp0\t1 lpt1\t 2 lpt2"); gets(keybuff); switch(keybuff[0]) { case '0': portbase = 0x3bc; break; case '1': portbase = 0x378; break; case '2': portbase = 0x278; break; } } printf("Using port base 0x%x\n",portbase); if (ioperm(portbase,3,1)) { perror("partest: trying to get port"); puts("Check if you are root."); return 10; } { struct sched_param par = { 50 }; /* priority */ sched_setscheduler(0, SCHED_RR, &par); } while (1) { int iterate = 0; int i; puts("Command?"); puts("\tl/r left/right 1 step; #l/#r left/right # steps (e.g. 10l)"); puts("\t#n #u #m\t delay time # nanos/micros/millis"); puts("\tf fullstep\t\th halfstep"); puts("\tQ quit"); printf("delaytime %ld nanos; ",delaytime); puts(halfstep ? "halfstep" : "fullstep"); fflush(stdout); gets(keybuff); for (i = 0; keybuff[i]; i++) { switch(keybuff[i]) { case 'n': delaytime = iterate NANOS; break; case 'u': delaytime = iterate MICROS; break; case 'm': delaytime = iterate MILLIS; break; case 'l': rotate(0,iterate); break; case 'r': rotate(1,iterate); break; case 'f': halfstep = 0; break; case 'h': halfstep = 1; break; case 'q': case 'Q': return 0; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': iterate *= 10; iterate += (keybuff[i]) - '0'; break; default: printf("I don't understand command '%c'\n",keybuff[0]); break; } } } }
Text file Source (historic): geocities.com/g1tv/linuxpar
geocities.com/g1tv(to report bad content: archivehelp @ gmail)
|
|
|
|
|