[PARPORT] inb (problems)

From: Samuel Ace Winchenbach (swinchen@eece.maine.edu)
Date: Thu Apr 06 2000 - 22:24:34 EDT

  • Next message: Petter Reinholdtsen: "[PARPORT] Parport IRQ triggering (rising or falling)?"

    Hello, I have been having troubles reading values from the control port
    (base + 2 == 0x37A) the following code sets all the pins on the control
    port high. I do this by "poking" the value 4 to 0x37A. Seeing the two
    least significant and the last bit are all inverted, to set the line high
    you poke a zero. bit 2 is non-inverted so to set the pin high, set the bit
    to 1 (which happens to be 4). Then I put it in an infinite loop... waiting
    for an external device to pull a pin low. Seeing that the control port has
    read/write access I should be able to tell when something pulls the line
    low. Can anyone help me with this?

    Thank you.

    #include <unistd.h>
    #include <sys/io.h>
    #include <stdlib.h>
    #include <stdio.h>

    #define BASE_PORT 0x378

    int main(int argc, char * argv[])
    {
      //Give Permissons
      ioperm(BASE_PORT + 2,1,1);

      //Set BASE_PORT + 2 to 0100 = 0x4 (I,N,I,I)
      outb(0x4,BASE_PORT + 2);

      //Set up i and last state. These two will be compared
      //to determine if the bits have changed.
      int i;
      int laststate = inb(BASE_PORT + 2)&0xF;

      //display that everything is set... and the current
      //value of the port.
      printf("\nReady: %d\n", laststate);

      //infinite loop.
      while(1)
      {
        //get the 4 least signifigant bits of 0x37A
        i = inb(BASE_PORT + 2)&0xF;

        //If all the bits are being pulled low ...
        if (i == 11)
        {
          //close permissions...
          ioperm(BASE_PORT + 2,1,0);
          //and exit.
          return (0);
        }
        //determine if anything has changed.
        if (i != laststate)
          printf("Something has changed!");
        if ((i & 1) != (laststate & 1))
          printf("\nBit 0 changed!\n");
        if ((i & 2) != (laststate & 2))
          printf("\nBit 1 changed!\n");
        if ((i & 4) != (laststate & 4))
          printf("\nBit 2 changed!\n");
        if ((i & 8) != (laststate & 8))
          printf("\nBit 3 changed!\n");

        //set last state equal to i.
        laststate = i;
      }
    }

    //==========================
    // Samuel Ace Winchenbach
    // University of Maine
    // Electrical Engineering
    // (207) 571-7535
    //==========================

    -- To unsubscribe, send mail to: linux-parport-request@torque.net --
    -- with the single word "unsubscribe" in the body of the message. --



    This archive was generated by hypermail 2b29 : Thu Apr 06 2000 - 22:40:52 EDT