-
Whitney Armstrong authored
Changes to be committed: new file: Makefile new file: fpga_io.c new file: fpga_io.h new file: maroc_io.c new file: maroc_io.h new file: message.txt new file: pmt_scalers.c new file: setup.txt
Whitney Armstrong authoredChanges to be committed: new file: Makefile new file: fpga_io.c new file: fpga_io.h new file: maroc_io.c new file: maroc_io.h new file: message.txt new file: pmt_scalers.c new file: setup.txt
fpga_io.c 2.68 KiB
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
#include "fpga_io.h"
int sockfd_reg = 0;
int sockfd_event = 0;
typedef struct
{
int len;
int type;
int wrcnt;
int addr;
int flags;
int vals[1];
} write_struct;
typedef struct
{
int len;
int type;
int rdcnt;
int addr;
int flags;
} read_struct;
typedef struct
{
int len;
int type;
int rdcnt;
int data[1];
} read_rsp_struct;
void rich_write32(void *addr, int val)
{
write_struct ws;
ws.len = 16;
ws.type = 4;
ws.wrcnt = 1;
ws.addr = (int)((long)addr);
ws.flags = 0;
ws.vals[0] = val;
write(sockfd_reg, &ws, sizeof(ws));
}
unsigned int rich_read32(void *addr)
{
read_struct rs;
read_rsp_struct rs_rsp;
int len;
rs.len = 12;
rs.type = 3;
rs.rdcnt = 1;
rs.addr = (int)((long)addr);
rs.flags = 0;
write(sockfd_reg, &rs, sizeof(rs));
len = read(sockfd_reg, &rs_rsp, sizeof(rs_rsp));
if(len != sizeof(rs_rsp))
printf("Error in %s: socket read failed...\n", __FUNCTION__);
return rs_rsp.data[0];
}
void rich_read32_n(int n, void *addr, unsigned int *buf)
{
read_struct rs;
read_rsp_struct rs_rsp;
int len, i;
for(i = 0; i < n; i++)
{
rs.len = 12;
rs.type = 3;
rs.rdcnt = 1;
rs.addr = (int)((long)addr);
rs.flags = 0;
write(sockfd_reg, &rs, sizeof(rs));
}
for(i = 0; i < n; i++)
{
len = read(sockfd_reg, &rs_rsp, sizeof(rs_rsp));
if(len != sizeof(rs_rsp))
printf("Error in %s: socket read failed...\n", __FUNCTION__);
buf[i] = rs_rsp.data[0];
}
}
int open_socket(int port)
{
struct sockaddr_in serv_addr;
int sockfd = 0;
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Error : Could not create socket \n");
exit(1);
}
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);
if(inet_pton(AF_INET, FPGA_IP_ADDR, &serv_addr.sin_addr)<=0)
{
printf("\n inet_pton error occured\n");
exit(1);
}
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\n Error : Connect Failed \n");
exit(1);
}
return sockfd;
}
void open_register_socket()
{
int n, val;
sockfd_reg = open_socket(6102);
/* Send endian test header */
val = 0x12345678;
write(sockfd_reg, &val, 4);
val = 0;
n = read(sockfd_reg, &val, 4);
printf("n = %d, val = 0x%08X\n", n, val);
}
void open_event_socket()
{
sockfd_event = open_socket(6103);
}
void close_register_socket()
{
if(sockfd_reg)
{
close(sockfd_reg);
sockfd_reg = 0;
}
}
void close_event_socket()
{
if(sockfd_event)
{
close(sockfd_event);
sockfd_event = 0;
}
}