/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/property.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:
15
15
#include "tools.h"
16
16
#include "error.h"
17
17
 
18
 
int pcilib_add_register_properties(pcilib_t *ctx, size_t n, const pcilib_register_bank_t *banks, const pcilib_register_description_t *registers) {
 
18
 
 
19
int pcilib_add_registers_from_properties(pcilib_t *ctx, size_t n, pcilib_view_context_t* const *view_ctx, pcilib_view_description_t* const *v) {
 
20
    pcilib_view_t i;
 
21
    pcilib_register_t pos = 0;
 
22
    pcilib_register_description_t regs[n];
 
23
 
 
24
    for (i = 0; i < n; i++) {
 
25
        if ((v[i]->flags&PCILIB_VIEW_FLAG_REGISTER) == 0) continue;
 
26
 
 
27
        regs[pos++] = (pcilib_register_description_t){
 
28
            .addr = view_ctx[i]->view,
 
29
            .bits = 8 * sizeof(pcilib_register_value_t),
 
30
            .mode = v[i]->mode,
 
31
            .type = PCILIB_REGISTER_PROPERTY,
 
32
            .bank = PCILIB_REGISTER_BANK_PROPERTY,
 
33
            .name = (v[i]->regname?v[i]->regname:v[i]->name),
 
34
            .description = v[i]->description
 
35
        };
 
36
    }
 
37
 
 
38
    if (pos)
 
39
        return pcilib_add_registers(ctx, 0, pos, regs, NULL);
 
40
 
 
41
    return 0;
 
42
}
 
43
 
 
44
 
 
45
int pcilib_add_properties_from_registers(pcilib_t *ctx, size_t n, const pcilib_register_bank_t *banks, const pcilib_register_description_t *registers) {
19
46
    int err;
20
47
 
21
48
    pcilib_register_t i;
26
53
 
27
54
 
28
55
    for (i = 0; i < n; i++) {
 
56
        char *view_name;
29
57
        pcilib_access_mode_t mode = 0;
30
58
 
31
59
        pcilib_register_view_description_t v;
32
60
        pcilib_register_bank_description_t *b = &ctx->banks[banks[i]];
33
61
 
34
 
        char *view_name = malloc(strlen(registers[i].name) + strlen(b->name) + 13);
 
62
        if (registers[i].type == PCILIB_REGISTER_PROPERTY) continue;
 
63
 
 
64
        view_name = malloc(strlen(registers[i].name) + strlen(b->name) + 13);
35
65
        if (!view_name) {
36
66
            pcilib_clean_views(ctx, cur_view);
37
67
            return PCILIB_ERROR_MEMORY;