Skip to content
Snippets Groups Projects
  • Whitney Armstrong's avatar
    be5d40e5
    Initial commit · be5d40e5
    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
    be5d40e5
    History
    Initial commit
    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
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;
  }
}