⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myapp.c

📁 plx9054图像卡驱动程序
💻 C
字号:
#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <unistd.h>#include <sys/mman.h>#include <linux/poll.h>#include <errno.h>#include <fcntl.h>#include <dirent.h>#include "myvalues.h"extern int errno;int fd = 0;struct FpgaRegister fr;int gv;int retvalue = 0;unsigned char *userBuf = NULL;unsigned long ulSendSize = 0x200000;unsigned long ulRecvSize = 0x100000 / 2;struct pollfd pfd;FILE *ifp = NULL, *ofp = NULL;char **iFilenameList, **oFilenameList;char ifn[200];size_t szFileCount = 0;voidFrameStart (){  // Frame start  fr.offset = 0;  fr.value = 0;  ioctl (fd, WR_FPGA_REGISTER, &fr);  printf ("frame start finished.\n");}voidSendImage (){  // set dma size first  ioctl (fd, SET_DMA_CH0_SIZE, &ulSendSize);  printf ("set dma size finished. dma send size = 0x%x\n", ulSendSize);  // begin the transfer  ioctl (fd, DMA_CH0_SEND_CTRL);  printf    ("dma send transfer began, now we should wait until interrupt occur.\n");  // wait until interrupt  memset (&pfd, 0, sizeof (pfd));  pfd.fd = fd;  pfd.events = POLLIN | POLLRDNORM;  retvalue = poll (&pfd, 1, -1);  if (retvalue == 1)    // wake up, say something    printf ("send over...\n");    {   //    read(PMC,baseaddr,length);    }  else if (retvalue == 0)    // this shouldn't happen    printf ("fuck me\n");  else    printf ("error occured\n");}voidRecvImage (){  // set dma size first  ioctl (fd, SET_DMA_CH0_SIZE, &ulRecvSize);  printf ("set dma size finished. dma receive size = 0x%x\n", ulRecvSize);  // begin the transfer  ioctl (fd, DMA_CH0_RECV_CTRL);  printf    ("dma receive transfer began, now we should wait until interrupt occur.\n");  // wait until interrupt  memset (&pfd, 0, sizeof (pfd));  pfd.fd = fd;  pfd.events = POLLOUT | POLLWRNORM;  retvalue = poll (&pfd, 1, -1);  if (retvalue == 1)    // wake up, say something    printf ("receive over...\n");  else if (retvalue == 0)    // this shouldn't happen    printf ("fuck me\n");  else    printf ("error occured\n");}voidReadGate (){  // read the fucking gate value out first  fr.offset = 8;  fr.value = 0;  ioctl (fd, RD_FPGA_REGISTER, &fr);  gv = fr.value;  printf ("gate value is : %d\n", fr.value);}voidoneFrame (const char *ifname, const char *ofname){  ifp = fopen (ifname, "rb");  if (ifp == NULL)    {      printf ("error open image file\n");      return;    }  fread (userBuf, 2, 1024 * 1024, ifp);  // Frame Start  FrameStart ();  // now we could start dma...send  SendImage ();  // send over, now receive  RecvImage ();  fclose (ifp);  // save to file  ofp = fopen (ofname, "wb");  if (ofp == NULL)    {      printf ("error open out file.\n");      return;    }  fwrite (userBuf, 1, ulRecvSize, ofp);  fclose (ofp);}intmain (int argc, char *argv[]){  DIR *pr;  struct dirent *pdr;  char ext[3] = "cod";  char predir[] = "/home/korn/src/pci9054/out/";  int i = 0;  size_t strsz = 0;  switch (argc)    {    case 1:      pr = opendir ("/home/korn/src/pci9054/images/");      if (pr == NULL)	{	  printf ("error open dir");	  return -1;	}      fd = open ("/dev/pci9054", O_RDWR);      if (fd == -1)	{	  printf ("open error: %s\n", strerror (errno));	  return -1;	}      break;    case 2:      pr = opendir (argv[1]);      if (pr == NULL)	{	  printf ("error open dir");	  return -1;	}      fd = open ("/dev/pci9054", O_RDWR);      if (fd == -1)	{	  printf ("open error: %s\n", strerror (errno));	  return -1;	}      break;    case 3:      pr = opendir (argv[1]);      if (pr == NULL)	{	  printf ("error open dir");	  return -1;	}      fd = open (argv[2], O_RDWR);      if (fd == -1)	{	  printf ("open error: %s\n", strerror (errno));	  return -1;	}      break;    default:      printf ("usage: myapp /image/path /device/file/path \n");      return 0;    }  // get memory bufffer first  userBuf =    mmap (NULL, MMT_BUF_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);  if (userBuf == MAP_FAILED)    {      printf ("mmap error: %s\n", strerror (errno));      return -1;    }  while (pdr = readdir (pr))    {      if (pdr->d_name[0] == '.')	continue;      szFileCount++;    }  closedir (pr);  iFilenameList = (char **) malloc (szFileCount * sizeof (char *));  oFilenameList = (char **) malloc (szFileCount * sizeof (char *));  for (i = 0; i < szFileCount; i++)    {      iFilenameList[i] = (char *) malloc (200 * sizeof (char));      oFilenameList[i] = (char *) malloc (200 * sizeof (char));      memset (iFilenameList[i], 0, 200 * sizeof (char));      memset (oFilenameList[i], 0, 200 * sizeof (char));    }  if (argc != 2)    pr = opendir ("/home/korn/src/pci9054/images/");  else    pr = opendir (argv[1]);  i = 0;  while (pdr = readdir (pr))    {      if (pdr->d_name[0] == '.')	continue;      strncpy (ifn, pdr->d_name, strlen (pdr->d_name));      strncpy (oFilenameList[i], predir, sizeof (predir));      strncat (oFilenameList[i], ifn, strlen (ifn) - 3);      strncat (oFilenameList[i], ext, sizeof (ext));      if (argc != 2)	strncpy (iFilenameList[i], "/home/korn/src/pci9054/images/", 31);      else	{	  strsz = strlen (argv[1]);	  strncpy (iFilenameList[i], argv[1], strsz);	}      strncat (iFilenameList[i], ifn, strlen (ifn));      oneFrame (iFilenameList[i], oFilenameList[i]);    }  retvalue = munmap (userBuf, MMT_BUF_SIZE);  if (retvalue != 0)    {      printf ("unmap error\n");      return -1;    }  close (fd);  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -