static struct option const long_opts[] =
{
{"device", required_argument, NULL, 'd'},
{"address", required_argument, NULL, 'a'},
{"size", required_argument, NULL, 's'},
{"offset", required_argument, NULL, 'o'},
{"count", required_argument, NULL, 'c'},
{"file", required_argument, NULL, 'f'},
{"verbose", no_argument, NULL, 'v'},
{"help", no_argument, NULL, 'h'},
{0, 0, 0, 0}
};
static void usage(const char* name)
{
int i = 0;
printf("%s\n\n", name);
printf("usage: %s [OPTIONS]\n\n", name);
printf("Write using SGDMA, optionally read input from a binary input file.\n\n");
printf(" -%c (--%s) device (defaults to %s)\n", long_opts[i].val, long_opts[i].name, DEVICE_NAME_DEFAULT); i++;
printf(" -%c (--%s) address of the start address on the AXI bus\n", long_opts[i].val, long_opts[i].name); i++;
printf(" -%c (--%s) size of a single transfer\n", long_opts[i].val, long_opts[i].name); i++;
printf(" -%c (--%s) page offset of transfer\n", long_opts[i].val, long_opts[i].name); i++;
printf(" -%c (--%s) number of transfers\n", long_opts[i].val, long_opts[i].name); i++;
printf(" -%c (--%s) filename to read/write the data of the transfers\n", long_opts[i].val, long_opts[i].name); i++;
printf(" -%c (--%s) be more verbose during test\n", long_opts[i].val, long_opts[i].name); i++;
printf(" -%c (--%s) print usage help and exit\n", long_opts[i].val, long_opts[i].name); i++;
}
static uint32_t getopt_integer(char *optarg)
{
int rc;
uint32_t value;
rc = sscanf(optarg, "0x%x", &value);
if (rc <= 0)
rc = sscanf(optarg, "%ul", &value);
printf("sscanf() = %d, value = 0x%08x\n", rc, (unsigned int)value);
return value;
}
int main(int argc, char* argv[])
{
int cmd_opt;
char *device = DEVICE_NAME_DEFAULT;
uint32_t address = 0;
uint32_t size = 32;
uint32_t offset = 0;
uint32_t count = 1;
char *filename = NULL;
while ((cmd_opt = getopt_long(argc, argv, "vhc:f:d:a:s:o:", long_opts, NULL)) != -1)
{
switch (cmd_opt)
{
case 0:
/* long option */
break;
case 'v':
verbosity++;
break;
/* device node name */
case 'd':
//printf("'%s'\n", optarg);
device = strdup(optarg);
break;
/* RAM address on the AXI bus in bytes */
case 'a':
address = getopt_integer(optarg);
break;
/* RAM size in bytes */
case 's':
size = getopt_integer(optarg);
break;
case 'o':
offset = getopt_integer(optarg) & 4095;
break;
/* count */
case 'c':
count = getopt_integer(optarg);
break;
/* count */
case 'f':
filename = strdup(optarg);
break;
/* print usage help and exit */
case 'h':
default:
usage(argv[0]);
exit(0);
break;
}
}
printf("device = %s, address = 0x%08x, size = 0x%08x, offset = 0x%08x, count = %u\n", device, address, size, offset, count);
}
Refer: Xilinx XDMA Source Code
https://blog.csdn.net/qq_33850438/article/details/80172275