bool MemoryAreaBase::sendWithChainInfo(HalExecElement * elem, HalExecCommand * cmd) { HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); el->appendInputData16(static_cast<uint16_t>(this->devHandle->getDevChainInfo()->getBusId())); cmd->elements.push_back(el); /* this transfers one object to cmd.elements */ cmd->elements.push_back(elem); if (!this->devHandle->send(*cmd)) { return false; } return true; }
bool MemoryAreaBase::sendWithChainInfo(boost::ptr_vector<HalExecElement> * elem, HalExecCommand * cmd) { HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); el->appendInputData16(static_cast<uint16_t>(this->devHandle->getDevChainInfo()->getBusId())); cmd->elements.push_back(el); /* this transfers all object from given elements to cmd.elements */ cmd->elements.transfer(cmd->elements.end(), *elem); if (!this->devHandle->send(*cmd)) { this->elements.transfer(elem->end(), cmd->elements); return false; } return true; }
bool RandomMemoryAccess::doWrite (uint32_t address, uint32_t* buffer, size_t count) { if (count > this->getSize()) return false; uint32_t start_val = 0; const uint32_t end_adr = address + count; size_t paddedCount = count; if(address & 1) { ++paddedCount; if( !doRead(address - 1, &start_val, 1) || !sync() ) return false; } uint32_t end_val = 0; if(end_adr & 1) { ++paddedCount; if( !doRead(end_adr, &end_val, 1) || !sync() ) return false; } HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_WriteMemWords)); address += getStart(); el->appendInputData32(static_cast<uint32_t>(address & 0xfffffffe)); el->appendInputData32(static_cast<uint32_t>(paddedCount / 2)); if(address & 1) { el->appendInputData8(static_cast<uint8_t>(start_val)); } for (size_t i = 0; i < count; ++i) { el->appendInputData8(static_cast<uint8_t>(buffer[i])); } if (end_adr & 1) { el->appendInputData16(static_cast<uint8_t>(end_val)); } el->setInputMinSize(8); // at least address and size (4+4) this->elements.push_back(el); return true; }
/** each buffer element contains one _byte_ */ bool RandomMemoryAccess::writeWords (uint32_t address, uint32_t* buffer, size_t count) { if (address & 0x1) return false; HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_WriteMemWords)); el->appendInputData32(this->getStart() + address); el->appendInputData32(static_cast<uint32_t>(count/2)); for (size_t i = 0; i+1 < count; i += 2) { if (buffer[i] > 0xFF || buffer[i+1] > 0xFF) { delete el; return false; } el->appendInputData16(static_cast<uint16_t>(buffer[i] | (buffer[i+1] << 8))); } el->setInputMinSize(10); this->elements.push_back(el); return true; }
bool FramMemoryAccessBaseFR57<MPU>::erase(uint32_t start, uint32_t end, uint32_t block_size, int type) { using boost::shared_ptr; using boost::bind; // check if valid erase type is used if ((type != ERASE_SEGMENT) && (type != ERASE_MAIN)) { return false; } if (block_size < 1) { return false; } // if the MPU is enabled, disable it to enable memory erase if(!mpu.readMpuSettings() || !mpu.disableMpu()) { return false; } // get Device RAM parameters for funclet upload MemoryArea* ram = mm->getMemoryArea("system", 0); if (!ram) { return false; } if ( !uploadFunclet(FuncletCode::ERASE) ) { return false; } shared_ptr<void> restoreRamOnExit(static_cast<void*>(0), bind(&FramMemoryAccessBaseFR57<MPU>::restoreRam, this)); //Note the erase on an FRAM device is just a dummy write with 0xFFFF to the device FRAm int32_t erase_address = start; const FuncletCode& funclet = devHandle->getFunclet(FuncletCode::ERASE); const uint32_t eraseType = 0; const uint32_t eraseLength = end - start + 1; const uint16_t flags = 0x0; const uint16_t programStartAddress = ram->getStart() + funclet.programStartOffset(); HalExecCommand cmd; cmd.setTimeout(10000); // overwrite 3 sec default with 10 sec HalExecElement* el = new HalExecElement(ID_SetDeviceChainInfo); el->appendInputData16(static_cast<uint16_t>(this->devHandle->getDevChainInfo()->getBusId())); cmd.elements.push_back(el); el = new HalExecElement(this->devHandle->checkHalId(ID_ExecuteFunclet)); el->appendInputData16(static_cast<uint16_t>(ram->getStart() & 0xFFFF)); el->appendInputData16(static_cast<uint16_t>(ram->getSize() & 0xFFFF)); el->appendInputData16(programStartAddress); el->appendInputData32(static_cast<uint32_t>(erase_address)); el->appendInputData32(eraseLength); el->appendInputData16(eraseType); el->appendInputData16(flags); el->appendInputData16(devHandle->getClockCalibration()->getCal0()); el->appendInputData16(devHandle->getClockCalibration()->getCal1()); //Dummy data to trigger execution of erase funclet el->appendInputData32(0xDEADBEEF); // set value for return length el->setOutputSize(2); cmd.elements.push_back(el); if (!this->devHandle->send(cmd)) { return false; } return true; }
bool DebugManagerV3::run (uint16_t controlMask, DebugEventTarget * cb, bool releaseJtag) { MemoryManager* mm = this->parent->getMemoryManager(); MemoryArea* cpu = mm->getMemoryArea("CPU"); if (!cpu) { return false; } lpm5WakeupDetected = false; if(cb!=0) { cbx=cb; } uint32_t pc, sr; cpu->read(0, &pc, 1); cpu->read(2, &sr, 1); if(mm->flushAll()==false) { return false; } cycleCounter_.reset(); ConfigManager *cm = parent->getFetHandle()->getConfigManager(); const uint16_t mdb = parent->getEmulationManager()->getSoftwareBreakpoints()->getSwbpManager()->getInstructionAt(pc); if (mdb != 0) { mdbPatchValue = mdb; } HalExecElement* el = new HalExecElement(this->parent->checkHalId(ID_RestoreContext_ReleaseJtag)); this->parent->getWatchdogControl()->addParamsTo(el); el->appendInputData32(pc); el->appendInputData16(sr); el->appendInputData16(controlMask!=0? 0x0007: 0x0006); // eem control bits el->appendInputData16(mdbPatchValue); // mdb el->appendInputData16(releaseJtag ? 1 : 0); el->appendInputData16(cm->ulpDebugEnabled() ? 1 : 0); mdbPatchValue = 0; HalExecCommand cmd; cmd.elements.push_back(el); if (!this->parent->send(cmd)) { return false; } // handle lpmx5 polling if (releaseJtag) { pausePolling(); } else { this->resumePolling(); } if (controlMask!=0 && !releaseJtag) { if (!activatePolling(controlMask)) { return false; } } resetCycleCounterBeforeNextStep = true; return true; }