[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [microblaze-uclinux] FSLFIFO driver usage examples



Hi Hans/John,

I have a FSL link between two MB processors. I modified fslcat so that it becomes a receiver (fslrcv) on the processor. The code is attached. I am having trouble to get fslrcv working properly. Basically it does not terminate after completing the transfer. However I suspect the root cause is in the driver instead. It is not obvious to me how fsl_read() can tell when to quit hence causing the problem. Do you have suggestion how to fix this?

Thanks,

Simon

----- Original Message ----
From: Dr. Johann Pfefferl <j.pfefferl@xxxxxxxxx>
To: microblaze-uclinux@xxxxxxxxxxxxxx
Sent: Monday, January 28, 2008 1:21:01 AM
Subject: Re: [microblaze-uclinux] FSLFIFO driver usage examples

Hello,

some time ago I have written a "fslcat" application. It takes a file or
read from stdin and outputs the data to the fsl link.

Hope this helps,
  Hans

Simon Tam <simontam1234@xxxxxxxxx> wrote:
> Hi,
>
>    Does anyone have usage examples of the FSLFIFO driver or documentation?
>
> Thanks,
>
> Simon
>

--
Dr. Johann Pfefferl  ------------  mailto j.pfefferl at eubus dot net
Eubus GmbH          http://www.eubus.net ++++ http://www.ebmhydraxc.com
Gollierstr. 70
D-80339 Muenchen
Phone: +49 (0)89 45 22 578-67    Fax: +49 (0)89 45 22 578-55
Registergericht Muenchen HRB 145 336, Ust-Id Nr. DE 225 783 933
Geschaeftsfuehrer: Volker Ulrich, Peter Sibities
==
-o)  A computer program does what you tell it to do,
/\\        not what you want it to do.             
_\_v-                                               


-----Inline Attachment Follows-----

#include <stdio.h>
#include <unistd.h> /* close() */
#include <stdlib.h> /* EXIT_FAILURE */

#include <fcntl.h>
#include <asm/fslfifo_ioctl.h>
#include <sys/ioctl.h>

#define FIFO_DEVICE "/dev/fslfifo0"
#define BUF_SIZE 256

static void usage(char *prgname)
{
    fprintf(stderr, "Usage: %s [options] filename\n"
            "Following options are recognized:\n"
            "\t-d fsl_dev\tFSL device which should be handled (default: %s)\n"
            "\t-w width\tSet width of the FSL link: Valid values are 1, 2, 4\n"
            "\t-r\tReset the FSL device\n"
            "\t-s msecs\tSleep for the given number of milliseconds after transmitting %d bytes\n"
            "\t-h\tShow this help text\n"
            ,prgname, FIFO_DEVICE, BUF_SIZE);
    exit(1);
}

int main(int argc, char *argv[])
{
  unsigned long arg;
  int fsl_fd, rv, inp_fd;
  char *fsl_dev = FIFO_DEVICE;
  unsigned fsl_width = 4, fsl_reset = 0, send_delay = 0;

  while(0 <= (rv = getopt(argc, argv, "d:rs:w:h"))) {
    switch(rv) {
      case 'd':
        fsl_dev = optarg;
        break;
      case 'r':
        ++fsl_reset;
        break;
      case 's':
        send_delay = 1000 * strtoul(optarg, NULL, 0);
        break;
      case 'w':
        fsl_width = strtoul(optarg, NULL, 0);
        break;
      case 'h':
      default:
        usage(argv[0]);
        break;
    }
  }
  if(!(1 == fsl_width || 2 == fsl_width || 4 == fsl_width)) {
    fprintf(stderr, "Wrong FSL link width %d\n", fsl_width);
    usage(argv[0]);
  }

  fsl_fd = open(fsl_dev, O_RDWR);
  if(0 > fsl_fd) {
    perror(fsl_dev);
    return fsl_fd;
  }
  if(optind < argc) {
    inp_fd = open(argv[optind], O_RDONLY);
    if(0 > inp_fd) {
      perror(argv[optind]);
      return EXIT_FAILURE;
    }
  }
  else
    inp_fd = STDIN_FILENO;
  ++optind;

  // Set the FIFO width (1, 2, 4 bytes)
  arg = fsl_width;
  rv = ioctl(fsl_fd, FSLFIFO_IOCTWIDTH, arg);
  if(rv < 0) {
    perror("FSLFIFO_IOCTWIDTH");
    close(fsl_fd);
    return rv;
  }

  // Read back the FIFO width. "arg" is only dummy
  rv = 0;
  rv = ioctl(fsl_fd, FSLFIFO_IOCQWIDTH, arg);
  if(0 > rv || fsl_width != rv) {
    perror("FSLFIFO_IOCQWIDTH");
    close(fsl_fd);
    return rv;
  }

  // Reset FSL link
  if(fsl_reset) {
    fprintf(stderr, "Resetting device\n");
    arg = 0;
    rv = ioctl(fsl_fd, FSLFIFO_IOCRESET, arg);
    if(rv < 0) {
      perror("FSLFIFO_IOCRESET");
      close(fsl_fd);
      return rv;
    }
  }

  fprintf(stderr, "FSL link %s initialised successfully with width %d\n", fsl_dev, fsl_width);

  {
    static unsigned char buf[BUF_SIZE];
    while(1) {
      int n = read(inp_fd, buf, sizeof(buf));
      if(0 < n) {
        unsigned char *wdata = buf;
        do {
          rv = write(fsl_fd, wdata, n);
          if(0 <= rv) {
            //fprintf(stderr, "Written % 4d bytes to fsl link\n", rv);
            wdata += rv;
            n -= rv;
          }
          else {
            perror("FSL write");
            n = 0;
          }
        } while(n);
        if(send_delay)
          usleep(send_delay);
      }
      else if(!n)
        break;
      else {
        perror("STDIN_FILENO");
        return EXIT_FAILURE;
      }
    }
  }

  return EXIT_SUCCESS;
}

Attachment: fslrcv.c
Description: Binary data