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(®s_, 0, sizeof(regs_));
|
memset(®s_, 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 *>(®s_);
|
uint8_t *m = reinterpret_cast<uint8_t *>(®s_);
|
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);
|