Experimental Physics and
| |||||||||||||||
|
Hi Michael,
Raj
From: Michael Davidsaver
[EXTERNAL] This email originated from outside of FRIB
On 12/7/20 8:24 AM, Kunjir, Shriraj via Tech-talk wrote: > Hello, > > We have a design based on Xilinx ZYNQ Ultrascale plus FPGA. We have compiled EPICS base on the PS Linux side of the FPGA by following the tips mentioned here https://epics.anl.gov/tech-talk/2016/msg00632.php <https://epics.anl.gov/tech-talk/2016/msg00632.php>. We can read/write firmware PL side registers using busybox devmem from PS Linux and we are developing an application to read/write firmware PL registers from EPICS. Essentially, we are looking to run IOC on the Linux side of the FPGA. Are there any EPICS drivers that can do this ? > Can devlib2 do this ? At present, only if your FPGA logic appears to Linux as a PCI device. Adding support for platform devices (or other non-discoverable) device should be possible, but hasn't yet been done. > Below is C code to read and write firmware registers (if not using busybox devmem) > > > > *C code to read firmware registers from Linux – * > > > > > > /#include <stdio.h>/ > > /#include <stdlib.h>/ > > /#include <unistd.h>/ > > /#include <sys/mman.h>/ > > /#include <fcntl.h>/ > > / / > > /void usage(char *prog)/ > > /{/ > > / printf("usage: %s ADDR\n",prog);/ > > / printf("\n");/ > > / printf("ADDR may be specified as hex values\n");/ > > /}/ > > / / > > / / > > /int main(int argc, char *argv[])/ > > /{/ > > / int fd;/ > > / void *ptr;/ > > / unsigned addr, page_addr, page_offset;/ > > / unsigned page_size=sysconf(_SC_PAGESIZE);/ > > / / > > / if(argc!=2) {/ > > / usage(argv[0]);/ > > / exit(-1);/ > > / }/ > > / / > > / fd=open("/dev/mem",O_RDONLY);/ > > / if(fd<1) {/ > > / perror(argv[0]);/ > > / exit(-1);/ > > / }/ > > / / > > / addr=strtoul(argv[1],NULL,0);/ > > / page_addr=(addr & ~(page_size-1));/ > > / page_offset=addr-page_addr;/ > > / / > > / ptr=mmap(NULL,page_size,PROT_READ,MAP_SHARED,fd,(addr & ~(page_size-1)));/ > > / if((int)ptr==-1) {/ > > / perror(argv[0]);/ > > / exit(-1);/ > > / }/ > > / / > > / printf("0x%08x\n",*((unsigned *)(ptr+page_offset)));/ > > / return 0;/ > > /}/ > > > > *C code to write firmware registers from Linux - * > > > > / / > > /#include <stdio.h>/ > > /#include <stdlib.h>/ > > /#include <unistd.h>/ > > /#include <sys/mman.h>/ > > /#include <fcntl.h>/ > > / / > > /void usage(char *prog)/ > > /{/ > > / printf("usage: %s ADDR VAL\n",prog);/ > > / printf("\n");/ > > / printf("ADDR and VAL may be specified as hex values\n");/ > > /}/ > > / / > > /int main(int argc, char *argv[])/ > > /{/ > > / int fd;/ > > / void *ptr;/ > > / unsigned val;/ > > / unsigned addr, page_addr, page_offset;/ > > / unsigned page_size=sysconf(_SC_PAGESIZE);/ > > / / > > / fd=open("/dev/mem",O_RDWR);/ > > / if(fd<1) {/ > > / perror(argv[0]);/ > > / exit(-1);/ > > / }/ > > / / > > / if(argc!=3) {/ > > / usage(argv[0]);/ > > / exit(-1);/ > > / }/ > > / / > > / addr=strtoul(argv[1],NULL,0);/ > > / val=strtoul(argv[2],NULL,0);/ > > / / > > / page_addr=(addr & ~(page_size-1));/ > > / page_offset=addr-page_addr;/ > > / / > > / ptr=mmap(NULL,page_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,(addr & ~(page_size-1)));/ > > / / > > / if((int)ptr==-1) {/ > > / perror(argv[0]);/ > > / exit(-1);/ > > / }/ > > / / > > / *((unsigned *)(ptr+page_offset))=val;/ > > / return 0;/ > > /}/ > > > > > > *Raj K* > > Facility for Rare Isotope Beams > > > > * * > > > > >
| ||||||||||||||
ANJ, 07 Dec 2020 |
·
Home
·
News
·
About
·
Base
·
Modules
·
Extensions
·
Distributions
·
Download
·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing · |