/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 dma/nwl_register.c

  • Committer: Suren A. Chilingaryan
  • Date: 2015-04-20 20:01:04 UTC
  • Revision ID: csa@suren.me-20150420200104-b5xny65io8lvoz3w
Big redign of model structures

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#define _PCILIB_NWL_REGISTER_C 
2
 
 
3
 
#include <stdio.h>
4
 
#include <stdlib.h>
5
 
#include <string.h>
6
 
#include <unistd.h>
7
 
#include <sys/time.h>
8
 
 
9
 
#include "pcilib.h"
10
 
 
11
 
#include "pci.h"
12
 
#include "error.h"
13
 
#include "tools.h"
14
 
 
15
 
#include "nwl_private.h"
16
 
#include "nwl_register.h"
17
 
 
18
 
int nwl_add_registers(nwl_dma_t *ctx) {
19
 
    int err;
20
 
    size_t n, i, j;
21
 
    int length;
22
 
    const char *names[NWL_MAX_DMA_ENGINE_REGISTERS];
23
 
    uintptr_t addr[NWL_MAX_DMA_ENGINE_REGISTERS];
24
 
    
25
 
        // We don't want DMA registers
26
 
    if (pcilib_find_bank_by_addr(ctx->pcilib, PCILIB_REGISTER_BANK_DMA) == PCILIB_REGISTER_BANK_INVALID) return 0;
27
 
    
28
 
    err = pcilib_add_registers(ctx->pcilib, 0, nwl_dma_registers);
29
 
    if (err) return err;
30
 
 
31
 
    if (ctx->type == PCILIB_DMA_MODIFICATION_DEFAULT) {
32
 
        err = pcilib_add_registers(ctx->pcilib, 0, nwl_xrawdata_registers);
33
 
        if (err) return err;
34
 
    }
35
 
 
36
 
    
37
 
    for (n = 0; nwl_dma_engine_registers[n].bits; n++) {
38
 
        names[n] = nwl_dma_engine_registers[n].name;
39
 
        addr[n] = nwl_dma_engine_registers[n].addr;
40
 
    }
41
 
 
42
 
    if (ctx->n_engines > 9) length = 2;
43
 
    else length = 1;
44
 
 
45
 
    
46
 
    for (i = 0; i < ctx->n_engines; i++) {
47
 
        for (j = 0; nwl_dma_engine_registers[j].bits; j++) {
48
 
            const char *direction;
49
 
            nwl_dma_engine_registers[j].name = nwl_dma_engine_register_names[i * NWL_MAX_DMA_ENGINE_REGISTERS + j];
50
 
            nwl_dma_engine_registers[j].addr = addr[j] + (ctx->engines[i].base_addr - ctx->base_addr);
51
 
//          printf("%lx %lx\n", (ctx->engines[i].base_addr - ctx->base_addr), nwl_dma_engine_registers[j].addr);
52
 
            
53
 
            switch (ctx->engines[i].desc.direction) {
54
 
                case PCILIB_DMA_FROM_DEVICE:
55
 
                    direction =  "r";
56
 
                break;
57
 
                case PCILIB_DMA_TO_DEVICE:
58
 
                    direction = "w";
59
 
                break;
60
 
                default:
61
 
                    direction = "";
62
 
            }
63
 
            
64
 
            sprintf((char*)nwl_dma_engine_registers[j].name, names[j], length, ctx->engines[i].desc.addr, direction);
65
 
        }
66
 
        
67
 
        err = pcilib_add_registers(ctx->pcilib, n, nwl_dma_engine_registers);
68
 
        if (err) return err;
69
 
    }
70
 
    
71
 
    for (n = 0; nwl_dma_engine_registers[n].bits; n++) {
72
 
        nwl_dma_engine_registers[n].name = names[n];
73
 
        nwl_dma_engine_registers[n].addr = addr[n];
74
 
    }
75
 
    
76
 
    return 0;
77
 
}