/alps/pcitool

To get this branch, use:
bzr branch http://suren.me/webbzr/alps/pcitool

« back to all changes in this revision

Viewing changes to pcilib/xml.c

  • Committer: Suren A. Chilingaryan
  • Date: 2015-10-19 13:58:46 UTC
  • Revision ID: csa@suren.me-20151019135846-nz3f6iobifx06xvq
Support computed (property-based) registers

Show diffs side-by-side

added added

removed removed

Lines of Context:
184
184
                desc->mode = PCILIB_REGISTER_W;
185
185
            } else if (!strcasecmp(value, "RW")) {
186
186
                desc->mode = PCILIB_REGISTER_RW;
187
 
            } else if (!strcasecmp(value, "W")) {
188
 
                desc->mode = PCILIB_REGISTER_W;
189
187
            } else if (!strcasecmp(value, "RW1C")) {
190
188
                desc->mode = PCILIB_REGISTER_RW1C;
191
189
            } else if (!strcasecmp(value, "W1C")) {
192
190
                desc->mode = PCILIB_REGISTER_W1C;
 
191
            } else if (!strcasecmp(value, "RW1I")) {
 
192
                desc->mode = PCILIB_REGISTER_RW1I;
 
193
            } else if (!strcasecmp(value, "W1I")) {
 
194
                desc->mode = PCILIB_REGISTER_W1I;
 
195
            } else if (!strcasecmp(value, "-")) {
 
196
                desc->mode = 0;
193
197
            } else {
194
198
                pcilib_error("Invalid access mode (%s) is specified in the XML register description", value);
195
199
                return PCILIB_ERROR_INVALID_DATA;
487
491
 
488
492
        if (!strcasecmp(name, "name")) {
489
493
                // Overriden by path
490
 
            if (!desc->name)
491
 
                desc->name = value;
 
494
            if (desc->name) continue;
 
495
            if (*value == '/')
 
496
                desc->flags |= PCILIB_VIEW_FLAG_PROPERTY;
 
497
            desc->name = value;
492
498
        } else if (!strcasecmp(name, "path")) {
493
499
            desc->name = value;
494
500
            desc->flags |= PCILIB_VIEW_FLAG_PROPERTY;
 
501
        } else if (!strcasecmp(name, "register")) {
 
502
            desc->regname = value;
 
503
            desc->flags |= PCILIB_VIEW_FLAG_REGISTER;
495
504
        } else if (!strcasecmp((char*)name, "description")) {
496
505
            desc->description = value;
497
506
        } else if (!strcasecmp((char*)name, "unit")) {
504
513
                pcilib_error("Invalid type (%s) of register view is specified in the XML bank description", value);
505
514
                return PCILIB_ERROR_INVALID_DATA;
506
515
            }
 
516
        } else if (!strcasecmp(name, "mode")) {
 
517
            if (!strcasecmp(value, "R")) {
 
518
                desc->mode = PCILIB_REGISTER_R;
 
519
            } else if (!strcasecmp(value, "W")) {
 
520
                desc->mode = PCILIB_REGISTER_W;
 
521
            } else if (!strcasecmp(value, "RW")) {
 
522
                desc->mode = PCILIB_REGISTER_RW;
 
523
            } else if (!strcasecmp(value, "-")) {
 
524
                desc->mode = 0;
 
525
            } else {
 
526
                pcilib_error("Invalid access mode (%s) is specified in the XML register description", value);
 
527
                return PCILIB_ERROR_INVALID_DATA;
 
528
            }
507
529
        }
508
530
    }
509
531
 
516
538
    const char *value, *name;
517
539
    pcilib_view_context_t *view_ctx;
518
540
 
 
541
    pcilib_access_mode_t mode = 0;
519
542
    pcilib_transform_view_description_t desc = {0};
520
543
 
521
544
    desc.base.api = &pcilib_transform_view_api;
522
545
    desc.base.type = PCILIB_TYPE_DOUBLE;
 
546
    desc.base.mode = PCILIB_ACCESS_RW;
523
547
 
524
548
    err = pcilib_xml_parse_view(ctx, xpath, doc, node, (pcilib_view_description_t*)&desc);
525
549
    if (err) return err;
540
564
                }
541
565
            }
542
566
            desc.read_from_reg = value;
543
 
            if ((value)&&(*value)) desc.base.mode |= PCILIB_ACCESS_R;
 
567
            if ((value)&&(*value)) mode |= PCILIB_ACCESS_R;
544
568
        } else if (!strcasecmp(name, "write_to_register")) {
545
569
            if (desc.base.flags&PCILIB_VIEW_FLAG_PROPERTY) {
546
570
                if (strstr(value, "$value")) {
549
573
                }
550
574
            }
551
575
            desc.write_to_reg = value;
552
 
            if ((value)&&(*value)) desc.base.mode |= PCILIB_ACCESS_W;
 
576
            if ((value)&&(*value)) mode |= PCILIB_ACCESS_W;
553
577
        } 
554
578
    }
555
579
 
 
580
    desc.base.mode &= mode;
 
581
 
556
582
    err = pcilib_add_views_custom(ctx, 1, (pcilib_view_description_t*)&desc, &view_ctx);
557
583
    if (err) return err;
558
584