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] - Diff between revs 2 and 4

Show entire file | Details | Blame | View Log

Rev 2 Rev 4
Line 11... Line 11...
namespace debugger {
namespace debugger {
 
 
GNSSStub::GNSSStub(const char *name)  : IService(name) {
GNSSStub::GNSSStub(const char *name)  : IService(name) {
    registerInterface(static_cast<IMemoryOperation *>(this));
    registerInterface(static_cast<IMemoryOperation *>(this));
    registerInterface(static_cast<IClockListener *>(this));
    registerInterface(static_cast<IClockListener *>(this));
    registerAttribute("BaseAddress", &baseAddress_);
 
    registerAttribute("Length", &length_);
 
    registerAttribute("IrqLine", &irqLine_);
 
    registerAttribute("IrqControl", &irqctrl_);
    registerAttribute("IrqControl", &irqctrl_);
    registerAttribute("ClkSource", &clksrc_);
    registerAttribute("ClkSource", &clksrc_);
 
 
    baseAddress_.make_uint64(0);
 
    length_.make_uint64(0);
 
    irqLine_.make_uint64(0);
 
    irqctrl_.make_string("");
 
    clksrc_.make_string("");
 
 
 
    memset(&regs_, 0, sizeof(regs_));
    memset(&regs_, 0, sizeof(regs_));
 
 
    regs_.misc.GenericChanCfg = 12;       // [4:0] gps
    regs_.misc.GenericChanCfg = 12;       // [4:0] gps
    regs_.misc.GenericChanCfg |= 12 << 5; // [8:5] glo
    regs_.misc.GenericChanCfg |= 12 << 5; // [8:5] glo
    regs_.misc.GenericChanCfg |= 2 << 9;  // [10:9] sbas
    regs_.misc.GenericChanCfg |= 2 << 9;  // [10:9] sbas
Line 42... Line 33...
    if (!iclk_) {
    if (!iclk_) {
        RISCV_error("Can't find IClock interface %s", clksrc_.to_string());
        RISCV_error("Can't find IClock interface %s", clksrc_.to_string());
    }
    }
 
 
    iwire_ = static_cast<IWire *>(
    iwire_ = static_cast<IWire *>(
        RISCV_get_service_iface(irqctrl_.to_string(), IFACE_WIRE));
        RISCV_get_service_port_iface(irqctrl_[0u].to_string(),
 
                                     irqctrl_[1].to_string(),
 
                                     IFACE_WIRE));
    if (!iwire_) {
    if (!iwire_) {
        RISCV_error("Can't find IWire interface %s", irqctrl_.to_string());
        RISCV_error("Can't find IWire interface %s", irqctrl_[0u].to_string());
    }
    }
}
}
 
 
void GNSSStub::b_transport(Axi4TransactionType *trans) {
ETransStatus GNSSStub::b_transport(Axi4TransactionType *trans) {
    uint64_t mask = (length_.to_uint64() - 1);
    uint64_t mask = (length_.to_uint64() - 1);
    uint64_t off = ((trans->addr - getBaseAddress()) & mask);
    uint64_t off = ((trans->addr - getBaseAddress()) & mask);
    trans->response = MemResp_Valid;
    trans->response = MemResp_Valid;
    if (trans->action == MemAction_Write) {
    if (trans->action == MemAction_Write) {
        for (uint64_t i = 0; i < trans->xsize/4; i++) {
        for (uint64_t i = 0; i < trans->xsize/4; i++) {
Line 71... Line 64...
        }
        }
    } else {
    } else {
        uint8_t *m = reinterpret_cast<uint8_t *>(&regs_);
        uint8_t *m = reinterpret_cast<uint8_t *>(&regs_);
        memcpy(trans->rpayload.b8, &m[off], trans->xsize);
        memcpy(trans->rpayload.b8, &m[off], trans->xsize);
    }
    }
 
    return TRANS_OK;
}
}
 
 
void GNSSStub::stepCallback(uint64_t t) {
void GNSSStub::stepCallback(uint64_t t) {
    iwire_->raiseLine(irqLine_.to_int());
    iwire_->raiseLine();
    if (regs_.tmr.rw_MsLength) {
    if (regs_.tmr.rw_MsLength) {
        regs_.tmr.rw_tow++;
        regs_.tmr.rw_tow++;
        regs_.tmr.rw_tod++;
        regs_.tmr.rw_tod++;
        iclk_->registerStepCallback(static_cast<IClockListener *>(this),
        iclk_->registerStepCallback(static_cast<IClockListener *>(this),
                                    t + regs_.tmr.rw_MsLength);
                                    t + regs_.tmr.rw_MsLength);

powered by: WebSVN 2.1.0

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