📄 myapp.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 + -