75
79
{"access", required_argument, 0, OPT_ACCESS },
76
80
{"endianess", required_argument, 0, OPT_ENDIANESS },
77
81
{"size", required_argument, 0, OPT_SIZE },
82
{"size", required_argument, 0, OPT_OUTPUT },
78
83
{"info", no_argument, 0, OPT_INFO },
79
84
{"list", no_argument, 0, OPT_LIST },
85
{"reset", no_argument, 0, OPT_RESET },
80
86
{"benchmark", no_argument, 0, OPT_BENCHMARK },
81
87
{"read", optional_argument, 0, OPT_READ },
82
88
{"write", optional_argument, 0, OPT_WRITE },
89
{"grab", optional_argument, 0, OPT_GRAB },
83
90
{"help", no_argument, 0, OPT_HELP },
108
115
" -p - Performance Evaluation\n"
109
116
" -r <addr|reg> - Read Data/Register\n"
110
117
" -w <addr|reg> - Write Data/Register\n"
118
" -g <event> - Grab Event\n"
119
" --reset - Reset board\n"
111
120
" --help - Help message\n"
121
130
" -s <size> - Number of words (default: 1)\n"
122
131
" -a <bitness> - Bits per word (default: 32)\n"
123
132
" -e <l|b> - Endianess Little/Big (default: host)\n"
133
" -o <file> - Output to file (default: stdout)\n"
126
136
" Data can be specified as sequence of hexdecimal number or\n"
570
int Grab(pcilib_t *handle, const char *output) {
574
size_t size, written;
578
err = pcilib_grab(handle, PCILIB_ALL_EVENTS, &size, &data, NULL);
580
Error("Grabbing event is failed");
584
o = fopen(output, "w");
586
Error("Failed to open file \"%s\"", output);
589
printf("Writting %i bytes into %s...\n", size, output);
592
written = fwrite(data, 1, size, o);
593
if (written != size) {
594
if (written > 0) Error("Write failed, only %z bytes out of %z are stored", written, size);
595
else Error("Write failed");
598
if (o != stdout) fclose(o);
561
603
int main(int argc, char **argv) {
571
613
const char *reg = NULL;
572
614
const char *bank = NULL;
573
615
char **data = NULL;
616
const char *event = NULL;
575
618
uintptr_t start = -1;
577
620
access_t access = 4;
579
622
int endianess = 0;
623
const char *output = NULL;
581
625
pcilib_t *handle;
583
while ((c = getopt_long(argc, argv, "hilpr::w::d:m:b:a:s:e:", long_options, NULL)) != (unsigned char)-1) {
627
while ((c = getopt_long(argc, argv, "hilpr::w::d:m:b:a:s:e:g:", long_options, NULL)) != (unsigned char)-1) {
584
628
extern int optind;
615
664
if (optarg) addr = optarg;
616
665
else if ((optind < argc)&&(argv[optind][0] != '-')) addr = argv[optind++];
668
if (mode != MODE_INVALID) Usage(argc, argv, "Multiple operations are not supported");
671
if (optarg) event = optarg;
672
else if ((optind < argc)&&(argv[optind][0] != '-')) event = argv[optind++];
619
675
fpga_device = optarg;
652
708
} else Usage(argc, argv, "Invalid endianess is specified (%s)", optarg);
656
715
Usage(argc, argv, "Unknown option (%s)", argv[optind]);
674
733
if (!addr) Usage(argc, argv, "The address is not specified");
675
734
if (((argc - optind) == 1)&&(*argv[optind] == '*')) {
676
735
int vallen = strlen(argv[optind]);
677
data = (char**)malloc(size * (vallen + sizeof(char*)));
678
if (!data) Error("Error allocating memory for data array");
679
for (i = 0; i < size; i++) {
680
data[i] = ((char*)data) + size * sizeof(char*) + i * vallen;
681
strcpy(data[i], argv[optind] + 1);
737
data = (char**)malloc(size * (vallen + sizeof(char*)));
738
if (!data) Error("Error allocating memory for data array");
740
for (i = 0; i < size; i++) {
741
data[i] = ((char*)data) + size * sizeof(char*) + i * vallen;
742
strcpy(data[i], argv[optind] + 1);
745
data = (char**)malloc(size * (9 + sizeof(char*)));
746
if (!data) Error("Error allocating memory for data array");
748
for (i = 0; i < size; i++) {
749
data[i] = ((char*)data) + size * sizeof(char*) + i * 9;
750
sprintf(data[i], "%x", i);
683
753
} else if ((argc - optind) == size) data = argv + optind;
684
754
else Usage(argc, argv, "The %i data values is specified, but %i required", argc - optind, size);
757
827
if (reg) WriteRegister(handle, model, bank, reg, data);
758
828
else WriteRegisterRange(handle, model, bank, start, size, data);
831
pcilib_reset(handle);
834
Grab(handle, output);
762
838
pcilib_close(handle);