Skip to content
Snippets Groups Projects
Select Git revision
  • 5bb8503353d6ac043286b8d05f6e48f919b0e442
  • master default protected
  • 12-revise-part5-with-new-data-model-eic-to-eicd-etc
  • gatsby-update
  • npm-install-deps-fix
  • fix
  • oops
  • readme_2
8 results

codeblock.md

Blame
  • 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;
      }
    }