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

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [socsim_plugin/] [pnp.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      Plug'n'Play device functional model.
6
 */
7
 
8
#include "api_core.h"
9
#include "pnp.h"
10
#include "types_amba.h"
11
 
12
namespace debugger {
13
 
14
PNP::PNP(const char *name)  : IService(name) {
15
    registerInterface(static_cast<IMemoryOperation *>(this));
16
    registerAttribute("Tech", &tech_);
17
    registerAttribute("AdcDetector", &adc_detector_);
18
 
19
    tech_.make_uint64(0);
20
    adc_detector_.make_uint64(0);
21
 
22
    memset(&regs_, 0, sizeof(regs_));
23
    iter_.buf = regs_.cfg_table;
24
    regs_.hwid = 0x20170313;
25
    regs_.fwid = 0xdeadcafe;
26
    regs_.tech.bits.tech = TECH_INFERRED;
27
    regs_.tech.bits.mst_total = 0;
28
    regs_.tech.bits.slv_total = 0;
29
 
30
    addMaster(0, VENDOR_GNSSSENSOR, RISCV_RIVER_CPU);
31
    addMaster(1, VENDOR_GNSSSENSOR, MST_DID_EMPTY);
32
    addMaster(2, VENDOR_GNSSSENSOR, GAISLER_ETH_MAC_MASTER);
33
    addMaster(3, VENDOR_GNSSSENSOR, GAISLER_ETH_EDCL_MASTER);
34
 
35
    addSlave(0, 8*1024, 0, VENDOR_GNSSSENSOR, GNSSSENSOR_BOOTROM);
36
    addSlave(0x00100000, 256*1024, 0, VENDOR_GNSSSENSOR, GNSSSENSOR_FWIMAGE);
37
    addSlave(0x10000000, 512*1024, 0, VENDOR_GNSSSENSOR, GNSSSENSOR_SRAM);
38
    addSlave(0x80000000, 4*1024, 0, VENDOR_GNSSSENSOR, GNSSSENSOR_GPIO);
39
    addSlave(0x80001000, 4*1024, 1, VENDOR_GNSSSENSOR, GNSSSENSOR_UART);
40
    addSlave(0x80002000, 4*1024, 0, VENDOR_GNSSSENSOR, GNSSSENSOR_IRQCTRL);
41
    addSlave(0x80003000, 4*1024, 5, VENDOR_GNSSSENSOR, GNSSSENSOR_ENGINE_STUB);
42
    addSlave(0x80004000, 4*1024, 0, VENDOR_GNSSSENSOR, GNSSSENSOR_RF_CONTROL);
43
    addSlave(0x80005000, 4*1024, 3, VENDOR_GNSSSENSOR, GNSSSENSOR_GPTIMERS);
44
    addSlave(0x80006000, 4*1024, 2, VENDOR_GNSSSENSOR, GNSSSENSOR_ETHMAC);
45
    addSlave(0x80007000, 4*1024, 0, VENDOR_GNSSSENSOR, GNSSSENSOR_DSU);
46
    addSlave(0x80008000, 4*1024, 0, VENDOR_GNSSSENSOR, GNSSSENSOR_FSE_V2_GPS);
47
    addSlave(0xfffff000, 4*1024, 0, VENDOR_GNSSSENSOR, GNSSSENSOR_PNP);
48
}
49
 
50
PNP::~PNP() {
51
}
52
 
53
void PNP::addMaster(unsigned idx, unsigned vid, unsigned did) {
54
    regs_.tech.bits.mst_total++;
55
    iter_.item->mst.vid = vid;
56
    iter_.item->mst.did = did;
57
    iter_.item->mst.descr.bits.descrtype = PNP_CFG_TYPE_MASTER;
58
    iter_.item->mst.descr.bits.descrsize = sizeof(MasterConfigType);
59
    iter_.buf += sizeof(MasterConfigType);
60
}
61
 
62
void PNP::addSlave(uint64_t addr, uint64_t size, unsigned irq, unsigned vid, unsigned did) {
63
    regs_.tech.bits.slv_total++;
64
    iter_.item->slv.vid = vid;
65
    iter_.item->slv.did = did;
66
    iter_.item->slv.descr.bits.descrtype = PNP_CFG_TYPE_SLAVE;
67
    iter_.item->slv.descr.bits.descrsize = sizeof(SlaveConfigType);
68
    iter_.item->slv.descr.bits.bar_total = 1;
69
    iter_.item->slv.descr.bits.irq_idx = irq;
70
    iter_.item->slv.xaddr = static_cast<uint32_t>(addr);
71
    iter_.item->slv.xmask = static_cast<uint32_t>(~(size - 1));
72
    iter_.buf += sizeof(SlaveConfigType);
73
}
74
 
75
void PNP::postinitService() {
76
    regs_.tech.bits.tech = static_cast<uint8_t>(tech_.to_uint64());
77
    regs_.tech.bits.adc_detect =
78
        static_cast<uint8_t>(adc_detector_.to_uint64());
79
}
80
 
81
ETransStatus PNP::b_transport(Axi4TransactionType *trans) {
82
    uint64_t mask = (length_.to_uint64() - 1);
83
    uint64_t off = ((trans->addr - getBaseAddress()) & mask);
84
    uint8_t *mem_ = reinterpret_cast<uint8_t *>(&regs_);
85
    if (trans->action == MemAction_Write) {
86
        for (uint64_t i = 0; i < trans->xsize; i++) {
87
            if ((trans->wstrb & (1 << i)) == 0) {
88
                continue;
89
            }
90
            mem_[off + i] = trans->wpayload.b8[i];
91
        }
92
    } else {
93
        for (uint64_t i = 0; i < trans->xsize; i++) {
94
            trans->rpayload.b8[i] = mem_[off + i];
95
        }
96
    }
97
    return TRANS_OK;
98
}
99
 
100
}  // namespace debugger
101
 

powered by: WebSVN 2.1.0

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