OpenCores
URL https://opencores.org/ocsvn/riscv_vhdl/riscv_vhdl/trunk

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [socsim_plugin/] [gnss_stub.cpp] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 sergeykhbr
/**
2
 * @file
3
 * @copyright  Copyright 2016 GNSS Sensor Ltd. All right reserved.
4
 * @author     Sergey Khabarov - sergeykhbr@gmail.com
5
* @brief      GNSS stub module functional model.
6
 */
7
 
8
#include "api_core.h"
9
#include "gnss_stub.h"
10
 
11
namespace debugger {
12
 
13
GNSSStub::GNSSStub(const char *name)  : IService(name) {
14
    registerInterface(static_cast<IMemoryOperation *>(this));
15
    registerInterface(static_cast<IClockListener *>(this));
16
    registerAttribute("BaseAddress", &baseAddress_);
17
    registerAttribute("Length", &length_);
18
    registerAttribute("IrqLine", &irqLine_);
19
    registerAttribute("IrqControl", &irqctrl_);
20
    registerAttribute("ClkSource", &clksrc_);
21
 
22
    baseAddress_.make_uint64(0);
23
    length_.make_uint64(0);
24
    irqLine_.make_uint64(0);
25
    irqctrl_.make_string("");
26
    clksrc_.make_string("");
27
 
28
    memset(&regs_, 0, sizeof(regs_));
29
 
30
    regs_.misc.GenericChanCfg = 12;       // [4:0] gps
31
    regs_.misc.GenericChanCfg |= 12 << 5; // [8:5] glo
32
    regs_.misc.GenericChanCfg |= 2 << 9;  // [10:9] sbas
33
    regs_.misc.GenericChanCfg |= 6 << 11; // [14:11] gal
34
}
35
 
36
GNSSStub::~GNSSStub() {
37
}
38
 
39
void GNSSStub::postinitService() {
40
    iclk_ = static_cast<IClock *>(
41
        RISCV_get_service_iface(clksrc_.to_string(), IFACE_CLOCK));
42
    if (!iclk_) {
43
        RISCV_error("Can't find IClock interface %s", clksrc_.to_string());
44
    }
45
 
46
    iwire_ = static_cast<IWire *>(
47
        RISCV_get_service_iface(irqctrl_.to_string(), IFACE_WIRE));
48
    if (!iwire_) {
49
        RISCV_error("Can't find IWire interface %s", irqctrl_.to_string());
50
    }
51
}
52
 
53
void GNSSStub::b_transport(Axi4TransactionType *trans) {
54
    uint64_t mask = (length_.to_uint64() - 1);
55
    uint64_t off = ((trans->addr - getBaseAddress()) & mask);
56
    trans->response = MemResp_Valid;
57
    if (trans->action == MemAction_Write) {
58
        for (uint64_t i = 0; i < trans->xsize/4; i++) {
59
            if (((trans->wstrb >> 4*i) & 0xf) == 0) {
60
                continue;
61
            }
62
            if (regs_.tmr.rw_MsLength == 0 && trans->wpayload.b32[i] != 0) {
63
                iclk_->registerStepCallback(
64
                    static_cast<IClockListener *>(this),
65
                    iclk_->getStepCounter() + trans->wpayload.b32[i]);
66
            }
67
            regs_.tmr.rw_MsLength = trans->wpayload.b32[i];
68
            if ((off + 4*i) == OFFSET(&regs_.tmr.rw_MsLength)) {
69
                RISCV_info("Set rw_MsLength = %d", regs_.tmr.rw_MsLength);
70
            }
71
        }
72
    } else {
73
        uint8_t *m = reinterpret_cast<uint8_t *>(&regs_);
74
        memcpy(trans->rpayload.b8, &m[off], trans->xsize);
75
    }
76
}
77
 
78
void GNSSStub::stepCallback(uint64_t t) {
79
    iwire_->raiseLine(irqLine_.to_int());
80
    if (regs_.tmr.rw_MsLength) {
81
        regs_.tmr.rw_tow++;
82
        regs_.tmr.rw_tod++;
83
        iclk_->registerStepCallback(static_cast<IClockListener *>(this),
84
                                    t + regs_.tmr.rw_MsLength);
85
    }
86
}
87
 
88
}  // namespace debugger
89
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.