bool MainMemoryAccessBase::doRead(uint32_t address, uint32_t* buffer, size_t count) { MemoryArea* cpu = mm->getMemoryArea("CPU"); if (!cpu) return false; uint32_t pc = 0; cpu->read(0, &pc, 1); bool omitFirst = (address & 0x1); if (omitFirst) { --address; ++count; } bool omitLast = (count & 1); if (omitLast) { ++count; } const hal_id readMacro = devHandle->supportsQuickMemRead() ? ID_ReadMemQuick : ID_ReadMemWords; HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(readMacro)); el->appendInputData32(this->getStart() + address); el->appendInputData32(static_cast<uint32_t>(count/2)); el->appendInputData32(pc); el->setOutputSize(count); ReadElement r(buffer, count, omitFirst, omitLast, 0); this->readMap[this->elements.size()] = r; this->elements.push_back(el); return true; }
bool BootcodeRomAccess::doRead (uint32_t address, uint32_t* buffer, size_t count) { bool omitFirst = (address & 0x1); if (omitFirst) { --address; ++count; } bool omitLast = (count & 1); if (omitLast) { ++count; } HalExecElement* el = new HalExecElement(this->devHandle->checkHalId(ID_ReadMemQuick)); el->appendInputData32(this->getStart() + address); el->appendInputData32(static_cast<uint32_t>(count/2)); el->setOutputSize(count); ReadElement r(buffer, count, omitFirst, omitLast, 0); this->readMap[this->elements.size()] = r; 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 FetControl::resetCommunication() { std::vector<uint8_t> data; data.push_back(0x03); data.push_back(0x92); data.push_back(0x00); data.push_back(0x00); this->sendData(data); // reset connection boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(100)); HalExecElement* el = new HalExecElement(ID_Zero); el->appendInputData8(STREAM_CORE_ZERO_VERSION); el->setOutputSize(12); HalExecCommand cmd; cmd.elements.push_back(el); const bool success = send(cmd); if(success) { fetSwVersion.push_back(el->getOutputAt8(0)); fetSwVersion.push_back(el->getOutputAt8(1)); fetSwVersion.push_back(el->getOutputAt8(2)); fetSwVersion.push_back(el->getOutputAt8(3)); fetHwVersion.push_back(el->getOutputAt8(4)); fetHwVersion.push_back(el->getOutputAt8(5)); fetHwVersion.push_back(el->getOutputAt8(6)); fetHwVersion.push_back(el->getOutputAt8(7)); unsigned char major=fetSwVersion.at(1); uint8_t minor = (major & 0x3f); uint8_t patch = fetSwVersion.at(0); uint16_t flavor = (fetSwVersion.at(3) << 8) + fetSwVersion.at(2); VersionInfo HalVersion((((major & 0xC0) >> 6) + 1), minor, patch, flavor); // this is the minimum hal version number for new eZ-FET or MSP-FET if (HalVersion.get() >= 30300000 || (fetSwVersion[0] == 0xAA && fetSwVersion[1] == 0xAA && fetSwVersion[2] == 0xAA && fetSwVersion[3] == 0xAA) || /*eZ-FET*/ (fetSwVersion[0] == 0xCC && fetSwVersion[1] == 0xCC && fetSwVersion[2] == 0xCC && fetSwVersion[3] == 0xCC) || /*MSP-FET UIF*/ (fetSwVersion[0] == 0xAA && fetSwVersion[1] == 0xAB && fetSwVersion[2] == 0xAA && fetSwVersion[3] == 0xAB)) /*eZ-FET no DCDC*/ { fetToolId = (el->getOutputAt16(8)); fetCoreVersion = (el->getOutputAt16(10)); fetHilVersion = (el->getOutputAt16(12)); fetDcdcLayerVersion = (el->getOutputAt16(14)); fetDcdcSubMcuVersion = (el->getOutputAt16(16)); fetComChannelVersion = (el->getOutputAt16(18)); fetHilCrc = (el->getOutputAt16(20)); fetHalCrc = (el->getOutputAt16(22)); fetDcdcCrc = (el->getOutputAt16(24)); fetCoreCrc = (el->getOutputAt16(26)); fetComChannelCrc = (el->getOutputAt16(28)); if((fetSwVersion[0] != 0xAA && fetSwVersion[1] != 0xAA && fetSwVersion[2] != 0xAA && fetSwVersion[3] != 0xAA) && /*eZ-FET*/ (fetSwVersion[0] != 0xCC && fetSwVersion[1] != 0xCC && fetSwVersion[2] != 0xCC && fetSwVersion[3] != 0xCC) && /*MSP-FET UIF*/ (fetSwVersion[0] != 0xAA && fetSwVersion[1] != 0xAB && fetSwVersion[2] != 0xAA && fetSwVersion[3] != 0xAB)) /*eZ-FET no DCDC*/ { // reset global vars HalExecCommand ResetCmd; HalExecElement* el = new HalExecElement(ID_ResetStaticGlobalVars); ResetCmd.elements.push_back(el); this->send(ResetCmd); } } else if(HalVersion.get() <= 30300000 && HalVersion.get() >= 30000000) // this handles an older verion of MSP-FET430UIF { fetToolId = 0xCCCC; fetCoreVersion = (el->getOutputAt16(8)); fetSafeCoreVersion = (el->getOutputAt16(10)); } else { fetToolId = 0x1111; } } return success; }