PCIE-MSI中断LINUX应用-gdma_app.c
2025-07-16
0
0
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include "gdma_app.h"
#include <sys/ioctl.h>
#include <poll.h>
#define GDMA_TEST_DEV_NAME "gdma_test"
int main(int argc, char **argv)
{
int fd;
int ret;
int cmd_in;
unsigned int tdq_id;
unsigned int tde_ctl;
unsigned int dwVal;
unsigned int en;
unsigned int size;
unsigned long src, dst;
///< open device
fd = open("/dev/gdma_test", O_RDWR);
if (fd < 0)
{
printf("can't open /dev/gdma_test!\n");
exit(1);
}
printf("open /dev/gdma_test = %d!\n", fd);
printf("1 -- submit 1 normal TDE\n");
printf("2 -- submit 1 ctrl TDE\n");
printf("3 -- configure 1 HW TDE\n");
printf("83 -- configure n HW TDEs\n");
printf("4 -- submit tdq tail\n");
printf("10 -- start/stop timer\n");
printf("11 -- modify timer type\n");
printf("12 -- modify timer ms\n");
printf("20 -- modify TDQ size\n");
printf("21 -- modify TCQ size\n");
printf("22 -- TDQ Clear\n");
printf("23 -- TDQ Abort\n");
printf("24 -- TDQ Reset\n");
printf("25 -- TCQ Reset\n");
printf("30 -- modify Test mem Src\n");
printf("31 -- modify Test mem Des\n");
printf("-----------------------\n");
///< input dst_ntid and request size, request mapping address
while (1) {
//msleep(20);
printf("cmd > ");
scanf("%d", &cmd_in); ///< 端口号输入
switch(cmd_in)
{
case 1:
printf("TDQ > ");
scanf("%x", &tdq_id);
if (tdq_id <= 3)
ioctl(fd, GDMA_TEST_IOC_SUBMIT, &tdq_id);
break;
case 2:
printf("TDQ > ");
scanf("%x", &tdq_id);
printf("TDE ctl \n");
printf("0-normal; 2-MSI; 4-ro; 8-drop\n > ");
scanf("%x", &tde_ctl);
dwVal = (tdq_id<<16) | tde_ctl;
ioctl(fd, GDMA_TEST_IOC_SUBMIT_CTL, &dwVal);
break;
case 3:
{
gdma_user_tde_s tde;
printf("TDQ > ");
scanf("%x", &tde.tdq_id);
printf("pos(hex) >");
scanf("%lx", &tde.pos);
printf("len(hex) >");
scanf("%x", &tde.len);
printf("ctl(18:drop,17:ro,16:int_en) >");
scanf("%x", &tde.ctrl.uint);
ioctl(fd, GDMA_TEST_IOC_TDE_HW, &tde);
}
break;
case 4:
printf("TDQ > ");
scanf("%x", &tdq_id);
if (tdq_id <= 3)
ioctl(fd, GDMA_TEST_IOC_SUBMIT_TAIL, &tdq_id);
printf("Then clear\n");
//ioctl(fd, GDMA_TEST_IOC_TDQ_CLEAR, &tdq_id);
ioctl(fd, GDMA_TEST_IOC_TDQ_ABORT, &tdq_id);
break;
case 83:
{
gdma_user_tde_s tde;
unsigned int num, i;
unsigned long pos;
printf("TDQ > ");
scanf("%x", &tde.tdq_id);
printf("pos(hex) >");
scanf("%lx", &pos);
printf("len(hex) >");
scanf("%x", &tde.len);
printf("ctl(18:drop,17:ro,16:int_en) >");
scanf("%x", &tde.ctrl.uint);
printf("num(hex) >");
scanf("%x", &num);
for (i = 0; i < num; i++){
tde.pos = pos + i * tde.len;
ioctl(fd, GDMA_TEST_IOC_TDE_HW, &tde);
}
}
break;
case 10:
printf("Timer Enable > ");
scanf("%x", &dwVal);
ioctl(fd, GDMA_TEST_IOC_START_TIMER, &dwVal);
break;
case 11:
printf("Timer type \n");
printf("0-normal; 1-drop; 2-msi; > ");
scanf("%x", &dwVal);
ioctl(fd, GDMA_TEST_IOC_TIMER_TYPE, &dwVal);
break;
case 12:
printf("Timer ms >");
scanf("%d", &dwVal);
ioctl(fd, GDMA_TEST_IOC_TIMER_MS, &dwVal);
break;
case 20:
printf("TDQ > ");
scanf("%x", &tdq_id);
printf("size >");
scanf("%x", &size);
printf("en >");
scanf("%x", &en);
if((tdq_id > 3) || (size > 7) || (en > 1))
{
printf("tdq info err\n");
}
else{
dwVal = (tdq_id<<16) | (en<<8) | (size);
ioctl(fd, GDMA_TEST_IOC_TDQ_INFO, &dwVal);
}
break;
case 21:
printf("TCQ size > ");
scanf("%x", &dwVal);
if (size > 0xF){
printf("tcq size error\n");
}
else
ioctl(fd, GDMA_TEST_IOC_TCQ_SIZE, &dwVal);
break;
case 22:
printf("TDQ > ");
scanf("%x", &tdq_id);
if (tdq_id <= 3)
ioctl(fd, GDMA_TEST_IOC_TDQ_CLEAR, &tdq_id);
break;
case 23:
printf("TDQ > ");
scanf("%x", &tdq_id);
if (tdq_id <= 3)
ioctl(fd, GDMA_TEST_IOC_TDQ_ABORT, &tdq_id);
break;
case 24:
printf("TDQ > ");
scanf("%x", &tdq_id);
if (tdq_id <= 3)
ioctl(fd, GDMA_TEST_IOC_TDQ_RESET, &tdq_id);
break;
case 25:
ioctl(fd, GDMA_TEST_IOC_TCQ_RESET, &tdq_id);
break;
case 30:
printf("Src > ");
scanf("%lx", &src);
printf("mem src:0x%lx\n", src);
ioctl(fd, GDMA_TEST_IOC_TEST_SRC, &src);
break;
case 31:
printf("Dst > ");
scanf("%lx", &dst);
ioctl(fd, GDMA_TEST_IOC_TEST_DST, &dst);
break;
default:
goto END;
break;
}
}
END:
close(fd);
printf("close /dev/gdma!\n");
return 0;
}