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

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [socsim_plugin/] [gpio.cpp] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 sergeykhbr
/**
2
 * @file
3
 * @copyright  Copyright 2016 GNSS Sensor Ltd. All right reserved.
4
 * @author     Sergey Khabarov - sergeykhbr@gmail.com
5
 * @brief      GPIO functional model.
6
 */
7
 
8
#include "api_core.h"
9
#include "gpio.h"
10
 
11
namespace debugger {
12
 
13
GPIO::GPIO(const char *name)  : IService(name) {
14
    registerInterface(static_cast<IMemoryOperation *>(this));
15
    registerInterface(static_cast<IWire *>(this));
16
    registerAttribute("DIP", &dip_);
17
 
18
    memset(&regs_, 0, sizeof(regs_));
19
}
20
 
21
GPIO::~GPIO() {
22
}
23
 
24
void GPIO::postinitService() {
25
    regs_.dip = static_cast<uint32_t>(dip_.to_uint64());
26
}
27
 
28
ETransStatus GPIO::b_transport(Axi4TransactionType *trans) {
29
    uint64_t mask = (length_.to_uint64() - 1);
30
    uint64_t off = ((trans->addr - getBaseAddress()) & mask) / 4;
31
    uint32_t *mem_ = reinterpret_cast<uint32_t *>(&regs_);
32
    trans->response = MemResp_Valid;
33
    if (trans->action == MemAction_Write) {
34
        for (uint64_t i = 0; i < trans->xsize/4; i++) {
35
            if (trans->wstrb & (0xf << 4*i)) {
36
                mem_[off + i] = trans->wpayload.b32[i];
37
            }
38
 
39
            if (off + i == (reinterpret_cast<uint64_t>(&regs_.led)
40
                          - reinterpret_cast<uint64_t>(&regs_))) {
41
                /*ISignalListener *ilistener;
42
                for (unsigned n = 0; n < listOfListerners_.size(); n++) {
43
                    ilistener = static_cast<ISignalListener *>(
44
                                    listOfListerners_[n].to_iface());
45
                    ilistener->updateSignal(0, 8, regs_.led & 0xFF);
46
                }*/
47
            }
48
        }
49
    } else {
50
        for (uint64_t i = 0; i < trans->xsize/4; i++) {
51
            trans->rpayload.b32[i] = mem_[i + off];
52
        }
53
    }
54
    return TRANS_OK;
55
}
56
 
57
/*void GPIO::setLevel(int start, int width, uint64_t value) {
58
    uint64_t t = value >> start;
59
    uint64_t msk = (1LL << width) - 1;
60
    uint64_t prev = dip_.to_uint64() & ~(msk << start);
61
    t &= msk;
62
    dip_.make_uint64(prev | (t << start));
63
    RISCV_info("set level pins[%d:%d] <= %" RV_PRI64 "x", start - 1, width, t);
64
}*/
65
 
66
}  // namespace debugger

powered by: WebSVN 2.1.0

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