193
195
{"timeout", required_argument, 0, OPT_TIMEOUT },
194
196
{"iterations", required_argument, 0, OPT_ITERATIONS },
195
197
{"info", optional_argument, 0, OPT_INFO },
196
{"list", no_argument, 0, OPT_LIST },
198
{"list", optional_argument, 0, OPT_LIST },
197
199
{"reset", no_argument, 0, OPT_RESET },
198
200
{"benchmark", optional_argument, 0, OPT_BENCHMARK },
199
201
{"read", optional_argument, 0, OPT_READ },
258
260
" %s <mode> [options] [hex data]\n"
260
262
" -i [target] - Device or Register (target) Info\n"
261
" -l[l] - List (detailed) Data Banks & Registers\n"
263
" -l[l] [bank|/branch] - List (detailed) Data Banks & Registers\n"
262
264
" -r <addr|dmaX|reg[/unit]> - Read Data/Register\n"
263
265
" -w <addr|dmaX|reg[/unit]> - Write Data/Register\n"
264
266
" --benchmark <barX|dmaX> - Performance Evaluation\n"
411
void ListProperties(pcilib_t *handle, const char *branch, int details) {
413
pcilib_property_info_t *props;
415
props = pcilib_get_property_list(handle, branch, 0);
416
if (!props) Error("Error getting properties");
419
printf("Properties: \n");
421
for (i = 0; props[i].path; i++) {
425
switch (props[i].type) {
426
case PCILIB_TYPE_LONG:
429
case PCILIB_TYPE_DOUBLE:
432
case PCILIB_TYPE_STRING:
435
case PCILIB_TYPE_INVALID:
442
switch (props[i].mode) {
443
case PCILIB_ACCESS_RW:
446
case PCILIB_ACCESS_R:
449
case PCILIB_ACCESS_W:
457
printf(" (%s %s) ", type, mode);
461
if (props[i].flags&PCILIB_LIST_FLAG_CHILDS)
467
printf("%s", props[i].name);
468
if ((props[i].description)&&(props[i].description[0])) {
469
printf(": %s", props[i].description);
472
printf("%s", props[i].path);
479
pcilib_free_property_info(handle, props);
409
484
void List(pcilib_t *handle, const pcilib_model_description_t *model_info, const char *bank, int details) {
411
486
const pcilib_register_bank_description_t *banks;
1129
int ReadRegister(pcilib_t *handle, const pcilib_model_description_t *model_info, const char *bank, const char *reg, const char *unit) {
1206
int ReadRegister(pcilib_t *handle, const pcilib_model_description_t *model_info, const char *bank, const char *reg, const char *view, const char *unit) {
1132
1209
const char *format;
1139
1216
// Adding DMA registers
1140
1217
pcilib_get_dma_description(handle);
1143
pcilib_register_t regid = pcilib_find_register(handle, bank, reg);
1146
1221
pcilib_value_t val = {0};
1147
err = pcilib_read_register_view(handle, bank, reg, unit, &val);
1148
if (err) Error("Error reading view %s of register %s", unit, reg);
1223
err = pcilib_read_register_view(handle, bank, reg, view, &val);
1224
if (err) Error("Error reading view %s of register %s", view, reg);
1226
err = pcilib_get_property(handle, view, &val);
1227
if (err) Error("Error reading property %s", view);
1231
err = pcilib_convert_value_unit(handle, &val, unit);
1233
if (reg) Error("Error converting view %s of register %s to unit %s", view, reg, unit);
1234
else Error("Error converting property %s to unit %s", view, unit);
1150
1238
err = pcilib_convert_value_type(handle, &val, PCILIB_TYPE_STRING);
1151
if (err) Error("Error converting view %s of register %s to string", unit, reg);
1240
if (reg) Error("Error converting view %s of register %s to string", view);
1241
else Error("Error converting property %s to string", view);
1153
printf("%s = %s\n", reg, val.sval);
1244
printf("%s = %s", (reg?reg:view), val.sval);
1245
if ((val.unit)&&(strcasecmp(val.unit, "name")))
1246
printf(" %s", val.unit);
1249
pcilib_register_t regid = pcilib_find_register(handle, bank, reg);
1155
1250
bank_id = pcilib_find_register_bank_by_addr(handle, model_info->registers[regid].bank);
1156
1251
format = model_info->banks[bank_id].format;
1157
1252
if (!format) format = "%lu";
1365
int WriteRegister(pcilib_t *handle, const pcilib_model_description_t *model_info, const char *bank, const char *reg, const char *unit, char **data) {
1460
int WriteRegister(pcilib_t *handle, const pcilib_model_description_t *model_info, const char *bank, const char *reg, const char *view, const char *unit, char **data) {
1368
1463
pcilib_value_t val = {0};
1369
1464
pcilib_register_value_t value, verify;
1371
pcilib_register_t regid = pcilib_find_register(handle, bank, reg);
1372
if (regid == PCILIB_REGISTER_INVALID) Error("Can't find register (%s) from bank (%s)", reg, bank?bank:"autodetected");
1375
1468
pcilib_register_bank_t bank_id;
1384
1477
err = pcilib_set_value_from_static_string(handle, &val, *data);
1385
1478
if (err) Error("Error (%i) setting value", err);
1388
err = pcilib_write_register_view(handle, bank, reg, unit, &val);
1389
if (err) Error("Error writting view %s of register %s", unit, reg);
1390
printf("%s is written\n ", reg);
1485
err = pcilib_write_register_view(handle, bank, reg, view, &val);
1486
if (err) Error("Error writting view %s of register %s", view, reg);
1487
printf("%s is written\n ", reg);
1489
err = pcilib_set_property(handle, view, &val);
1490
if (err) Error("Error setting property %s", view);
1491
printf("%s is written\n ", view);
1494
pcilib_register_t regid = pcilib_find_register(handle, bank, reg);
1495
if (regid == PCILIB_REGISTER_INVALID) Error("Can't find register (%s) from bank (%s)", reg, bank?bank:"autodetected");
1392
1497
value = pcilib_get_value_as_register_value(handle, &val, &err);
1393
1498
if (err) Error("Error (%i) parsing data value (%s)", *data);
2767
2873
const char *use = NULL;
2768
2874
const char *lock = NULL;
2769
2875
const char *info_target = NULL;
2876
const char *list_target = NULL;
2770
2877
size_t block = (size_t)-1;
2771
2878
pcilib_irq_type_t irq_type = PCILIB_IRQ_TYPE_ALL;
2772
2879
pcilib_irq_hw_source_t irq_source = PCILIB_IRQ_SOURCE_DEFAULT;
2813
2920
if (mode == MODE_LIST) details++;
2814
2921
else if (mode != MODE_INVALID) Usage(argc, argv, "Multiple operations are not supported");
2923
if (optarg) list_target = optarg;
2924
else if ((optind < argc)&&(argv[optind][0] != '-')) list_target = argv[optind++];
2816
2926
mode = MODE_LIST;
2818
2928
case OPT_RESET:
3302
3412
num_offset = dma_channel + 3;
3307
3417
if (strncmp(num_offset, bank, itmp)) Usage(argc, argv, "Conflicting DMA channels are specified in mode parameter (%s) and bank parameter (%s)", dma_channel, bank);
3310
3420
if (!isnumber_n(num_offset, itmp))
3311
3421
Usage(argc, argv, "Invalid DMA channel (%s) is specified", dma_channel);
3313
3423
dma = atoi(num_offset);
3427
if (bank&&list_target) {
3428
if (strcmp(list_target, bank))
3429
Usage(argc, argv, "Conflicting banks are specified in list parameter (%s) and bank parameter (%s)", list_target, bank);
3317
3435
if (argc > optind) Usage(argc, argv, "Invalid non-option parameters are supplied");
3362
unit = strchr(addr, '/');
3363
if (!unit) unit = strchr(addr, ':');
3366
size_t reg_size = strlen(addr) - strlen(unit);
3367
reg_name = alloca(reg_size + 1);
3368
memcpy(reg_name, addr, reg_size);
3369
reg_name[reg_size] = 0;
3480
view = strchr(addr, '/');
3481
unit = strchr((view?view:addr), ':');
3484
size_t reg_size = strlen(addr) - strlen(view?view:unit);
3485
if (reg_size) reg = strndupa(addr, reg_size);
3488
if ((reg)&&(view)) view++;
3492
view = strndupa(view, strlen(view) - strlen(unit) - 1);
3493
} else if ((reg)&&(unit)) {
3376
if (pcilib_find_register(handle, bank, reg) == PCILIB_REGISTER_INVALID) {
3377
Usage(argc, argv, "Invalid address (%s) is specified", addr);
3502
if (pcilib_find_register(handle, bank, reg) == PCILIB_REGISTER_INVALID) {
3503
Usage(argc, argv, "Invalid address (%s) is specified", addr);
3458
3587
Info(handle, model_info, info_target);
3460
3589
case MODE_LIST:
3461
List(handle, model_info, bank, details);
3590
if ((list_target)&&(*list_target == '/'))
3591
ListProperties(handle, list_target, details);
3593
List(handle, model_info, list_target, details);
3463
3595
case MODE_BENCHMARK:
3464
3596
Benchmark(handle, amode, dma, bar, start, size_set?size:0, access, iterations);
3477
3609
case MODE_READ_REGISTER:
3478
if ((reg)||(!addr)) ReadRegister(handle, model_info, bank, reg, unit);
3610
case MODE_READ_PROPERTY:
3611
if ((reg)||(view)||(!addr)) ReadRegister(handle, model_info, bank, reg, view, unit);
3479
3612
else ReadRegisterRange(handle, model_info, bank, start, addr_shift, size, ofile);
3481
3614
case MODE_WRITE:
3482
3615
WriteData(handle, amode, dma, bar, start, size, access, endianess, data, verify);
3484
3617
case MODE_WRITE_REGISTER:
3485
if (reg) WriteRegister(handle, model_info, bank, reg, unit, data);
3618
case MODE_WRITE_PROPERTY:
3619
if (reg||view) WriteRegister(handle, model_info, bank, reg, view, unit, data);
3486
3620
else WriteRegisterRange(handle, model_info, bank, start, addr_shift, size, data);
3488
3622
case MODE_RESET: