Re: [PARPORT] read data using ppdev in EPP mode

From: Myunghyun Lee (mhyun@sollae.co.kr)
Date: Wed Mar 20 2002 - 20:53:45 EST

  • Next message: Stefan Riha: "RE: [PARPORT] mount a freecom portable CDRW"

    On Wed, 20 Mar 2002, Tim Waugh wrote:

    > On Wed, Mar 20, 2002 at 02:29:26PM +0900, Myunghyun Lee wrote:
    >
    > > mode = IEEE1284_DEVICEID;
    > > ioctl(fd, PPNEGOT, &mode);
    > >
    > > MFG:Winbond;MDL:W99200F;CLS:MEDIA;DES:WINBOND VIDEO ENCODER;
    >
    > Really you should use
    >
    > mode = IEEE1284_MODE_NIBBLE | IEEE1284_DEVICEID;
    >
    > (Device ID can be read in any reverse-capable mode.)
    >
    > > But I cannot read register value from W99200F.
    > > Following is a read sequence.
    > >
    > > I negotiated to EPP before.
    > >
    > > set data direction to OUTPUT
    > > set all control lines to HIGH
    > > output address
    > > set [Write] and [Address Strobe] to LOW
    > > wait until [Wait] is HIGH ------------> Wait isn't changed to HIGH
    > > set [Write] and [Address Strobe] to HIGH
    > >
    > > set data direction to OUTPUT
    > > set [Write] and [Data Strobe] to Low
    > > wait until [Wait] is HIGH ------------> Wait isn't changed to HIGH
    > > read data
    > > set [Write] and [Data Strobe] to HIGH
    >
    > How are you trying to do this? By hand, or with read()?
    >
    > Tim.
    > */
    >

    I will write my code in brief below:
    Is it OK?

    read_pp() is a read function.
    I thik that the problem is Wait never go to HIGH.

    Please give me your help.

    int pp_set_high(int fd, unsigned char sel)
    {
      struct ppdev_frob_struct frob;
      unsigned char byte;

      byte = ~sel;

      frob.mask = sel;
      frob.val = byte;
      if(ioctl(fd, PPFCONTROL, &frob) == -1)
      {
        perror("PPFCONTROL");
        return -1;
      }
      return sel;
    }
    int pp_set_low(int fd, unsigned char sel)
    {
      struct ppdev_frob_struct frob;

      frob.mask = sel;
      frob.val = sel;
      if(ioctl(fd, PPFCONTROL, &frob) == -1)
      {
        perror("PPFCONTROL");
        return -1;
      }

      return sel;
    }
    int pp_set_dir(int fd, unsigned char dir)
    {
      if(ioctl(fd, PPDATADIR, &dir) == -1)
      {
        perror("PPDATADIR");
        return -1;
      }
      return dir;
    }

    unsigned char read_pp(int fd, unsigned char addr)
    {
      pp_set_dir(fd, DIR_OUTPUT);
      pp_set_high(fd, PARPORT_CONTROL_STROBE+PARPORT_CONTROL_SELECT+PARPORT_CONTROL_AU
    TOFD);

    /* Results are same using write() and ioctl() */
      write(fd, &addr, 1);
      //ioctl(fd, PPWDATA, &addr);

    /* signal Write and Address Strobe to LOW */
      pp_set_low(fd, PARPORT_CONTROL_STROBE+PARPORT_CONTROL_SELECT);

    /************************************************/
    /******** Wait until Wait goes to HIGH **********/
    /******** But Wait never go to HIGH *************/
    /************************************************/
      cnt = 0;
      do{
        if(ioctl(fd, PPRSTATUS, &byte) == -1)
        {
          perror("PPFCONTROL");
          return 0;
        }
        if(cnt >= 100) printf("count over1.\n");
        cnt++;
      } while(!(byte & PARPORT_STATUS_BUSY));

      pp_set_high(fd, PARPORT_CONTROL_STROBE+PARPORT_CONTROL_SELECT);
      pp_set_dir(fd, DIR_INPUT);

      pp_set_low(fd, PARPORT_CONTROL_STROBE+PARPORT_CONTROL_AUTOFD);

    /************************************************/
    /******** Wait until Wait goes to HIGH **********/
    /******** But Wait never go to HIGH *************/
    /************************************************/
      cnt = 0;
      do{
        if(ioctl(fd, PPRSTATUS, &byte) == -1)
        {
          perror("PPFCONTROL");
          return 0;
        }
        if(cnt >= 100) printf("count over1.\n");
        cnt++;
      } while(!(byte & PARPORT_STATUS_BUSY));

      read(fd, &data, 1);
      //ioctl(fd, PPRDATA, &data);

    }

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
     Myunghyun Lee mailto:mhlee@eztcp.com
     Sollae Systems Co., Ltd. http://www.eztcp.com
     TEL:+82-32-437-2346, FAX:+82-32-437-2347
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

    -- 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 : Wed Mar 20 2002 - 21:15:26 EST