/*************************************************************************
* Filename: fpga_test.c
* Author: Kung
* Description: Test FPGA : 1.Test unchanged data;
2.Test randam data;
3.Test I/O;
* Version: Formal
* Date: 2012-03-29
* History: none
*************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <termios.h>
#include <assert.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define FPGA_VERSION_ADDR 0x7003
#define INPUT_PORT_STATUE 0x7ffe
#define OUTPUT_TEST_ADDR 0x0003
#define RANDAM_DATA_IN 0x0000 //test randam number
#define RANDAM_DATA_OUT 0x7fff
#define TEST_RANGE 0xffff
#define IO_DATA_IN 0x0003
#define IO_DATA_OUT 0x7ffe
#define UNCHANGED_DATA_ADDR 0x7018 //store 4 unchanged-datas to four sequntial address. this is the first unchanged-data address at where you can read 0x1234.
#define UNCHANGED_DATA1 0x1234
#define UNCHANGED_DATA2 0x5678
#define UNCHANGED_DATA3 0x90ab
#define UNCHANGED_DATA4 0xcdef
#define FPGA_INTERCON_ADDR 0X0001
#define FPGA_CONFIG_ADDR 0X0002
#define FPGA_INTERCON 0X0001
#define FPGA_CONFIG 0x007c
#define FPGA_CONFIG_ADDR_READ 0X7002
#define FPGA_INTERCONT_ADDR_READ 0X7004
void write_fpga(int fd,unsigned short address,unsigned short data)
{
write(fd, &address, 1); //write write-address
write(fd, &data, 1); //write data
}
void read_fpga(int fd,unsigned short address,unsigned short *data)
{
write(fd, &address, 1); //write read-address
read(fd, data, 1); //read data
}
int main(void)
{
int fpga_fd;
unsigned int count = 0;
unsigned int i,j;
unsigned int test_unchagned_data_success_times = 0;
unsigned int test_random_data_success_times = 0;
unsigned int test_io_data_success_times = 0;
unsigned int unchanged_data[4] = {UNCHANGED_DATA1, UNCHANGED_DATA2, UNCHANGED_DATA3, UNCHANGED_DATA4};
unsigned short write_addr,read_addr;
unsigned short write_data, read_data = 0;
char scan_buf[20];
if ((fpga_fd = open("/dev/fpga0", O_RDWR)) < 0) //open fpga
{
perror("Open fpga\n");
exit(1);
}
usleep(100);
#if 1 //read fpga version
read_addr = FPGA_VERSION_ADDR;
read_fpga(fpga_fd, read_addr,&read_data);
printf("FPGA version : %x\n", read_data);
#endif
#if 1 //test unchanged data
read_data = 0;
printf("Read unchanged data");
for (i = 0; i < 4; ++i)
{
read_addr = UNCHANGED_DATA_ADDR + i;
read_fpga(fpga_fd, read_addr,&read_data);
if (read_data == unchanged_data[i])
{
test_unchagned_data_success_times++;
printf("0x%x ", read_data);
}
}
printf("\n");
#endif
#if 1 //test random data
write_addr = RANDAM_DATA_IN;
read_addr = RANDAM_DATA_OUT;
for (i = 0; i < 16; i++)
{
write_data = i<<i;
write_fpga(fpga_fd, write_addr, write_data);
read_fpga(fpga_fd, read_addr,&read_data);
if (write_data == read_data)
test_random_data_success_times++;
// else printf("FPGA & ARM data wire have problem at : %2d\n",i);
}
for (i = 0; i < 16; i++)
{
write_data = ~(i<<i);
write_fpga(fpga_fd, write_addr, write_data);
read_fpga(fpga_fd, read_addr,&read_data);
if (write_data == read_data)
test_random_data_success_times++;
// else printf("FPGA & ARM data wire have problem at : %2d\n",i);
}
#endif
//test IO data, configure the fpga before test IO
for(i = 0; i < 3; i++) //set interrupt control information
{
write_addr = FPGA_INTERCON_ADDR;
read_addr = FPGA_INTERCONT_ADDR_READ;
write_data = FPGA_INTERCON;
write_fpga(fpga_fd,write_addr,write_data);
read_fpga(fpga_fd,read_addr,&read_data);
// printf("Read interrupt control configure : %d\n",read_data);
if(read_data == FPGA_INTERCON)
break;
sleep(1);
}
if(3 == i)
printf("FPGA EEROR : set interrupt control failed!\n");
for(j = 0; j < 3; j++) //set FPGA configuration
{
write_addr = FPGA_CONFIG_ADDR;
read_addr = FPGA_CONFIG_ADDR_READ;
write_data = FPGA_CONFIG;
write_fpga(fpga_fd,write_addr,write_data);
read_fpga(fpga_fd,read_addr,&read_data);
// printf("Read fpga system configre : %d\n",read_data);
if(read_data == FPGA_CONFIG)
break;
}
if(3 == j)
printf("FPGA EEROR : set system control failed!\n");
if (3 == i || 3 == j)
goto RESULT;
#if 1
/* begin test IO port */
write_addr = IO_DATA_IN;
read_addr = IO_DATA_OUT;
printf("Please connect fpga output port wire!(ADDR0-4-->AD0-4)\n");
printf("Are you ready ?(Y) : ");
scanf("%s",scan_buf);
while(strcasecmp(scan_buf,"y"))
{
printf("EEROR :invalid input!\n");
scanf("%s",scan_buf);
}
for(i = 0; i < 5; i++)
{
write_data = 1<<i;
write_fpga(fpga_fd,write_addr,write_data);
read_fpga(fpga_fd,read_addr,&read_data);
if(write_data == read_data)
{
test_io_data_success_times++;
//printf("read_data = %d\n",read_data);
}
else
{
printf("FPGA & AD WIRE have problem at AD%d--ADDR%d\n ",i,i);
printf("write data is %d,read data is %d\n",write_data,read_data);
}
}
for(i = 0; i < 5; i++)
{
write_data = (0x1f)&(~(1<<i));
write_fpga(fpga_fd, write_addr, write_data);
read_fpga(fpga_fd, read_addr, &read_data);
if(write_data == read_data)
test_io_data_success_times++;
else
{
printf("FPGA & AD WIRE have problem at AD%d--ADDR%d\n ",i,i);
printf("write data is %x,read data is %x\n",write_data,read_data);
}
}
#endif
printf("\nPlease connect fpga output port wire!(ADDR0-4-->AD5-9)\n");
printf("Are you ready ?(Y) : ");
scanf("%s",scan_buf);
while(strcasecmp(scan_buf,"y"))
{
printf("EEROR :invalid input!\n");
scanf("%s",scan_buf);
}
for(i = 0;i < 5; i++)
{
write_data = 1<<i;
write_fpga(fpga_fd, write_addr, write_data);
read_fpga(fpga_fd, read_addr, &read_data);
switch(i)
{
case 0:
write_data = 0x20;
break;
case 1:
write_data = 0x40;
break;
case 2:
write_data = 0x80;
break;
case 3:
write_data = 0x100;
break;
case 4:
write_data = 0x600;
break;
default:
break;
}
if(write_data != read_data)
{
printf("FPGA & AD WIRE have problem in AD%d--ADDR%d\n ",i+5,i+5);
printf("write data is %x,read data is %x\n",write_data,read_data);
}
else test_io_data_success_times++;
}
for(i = 0; i < 5; i++)
{
write_data = ~(1<<i);
write_fpga(fpga_fd,write_addr,write_data);
read_fpga(fpga_fd,read_addr,&read_data);
switch(i)
{
case 0:
write_data = 0x7c0;
break;
case 1:
write_data = 0x7a0;
break;
case 2:
write_data = 0x760;
break;
case 3:
write_data = 0x6e0;
break;
case 4:
write_data = 0x1e0;
break;
default:
break;
}
if(write_data != read_data)
{
printf("FPGA & AD WIRE have problem expect AD%d--ADDR%d\n ",i+5,i+5);
printf("write data is %x,read data is %x\n",write_data,read_data);
}
else test_io_data_success_times++;
}
RESULT:
#if 1 //test result
printf("\n\nTest result :\n");
count = 0;
if (4 == test_unchagned_data_success_times)
{
printf("Test unchanged data success!\n");
count++;
}
else
printf("Test unchanged data failed!\n");
if (32 == test_random_data_success_times)
{
printf("Test random data success!\n");
count++;
}
else
printf("Test random data failed!\n");
if (20 == test_io_data_success_times)
{
printf("Test IO port success!\n");
count++;
}
else
printf("Test IO port failed!\n");
if (3 == count)
{
printf("**********************FPGA is OK!!*************************\n");
}
else
printf("********************BAD FPGA************************\n");
#endif
close(fpga_fd);
return 0;
}
FPGA test
最新推荐文章于 2023-12-09 14:46:28 发布