You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
6.5 KiB
165 lines
6.5 KiB
/***************************************************************************
|
|
* Copyright (C) 2005-2006 Nicolas Hadacek <hadacek@kde.org> *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
***************************************************************************/
|
|
#ifndef GENERIC_PROG_H
|
|
#define GENERIC_PROG_H
|
|
|
|
#include "common/global/log.h"
|
|
#include "common/global/pfile.h"
|
|
#include "common/common/version_data.h"
|
|
#include "common/port/port_base.h"
|
|
#include "common/global/progress_monitor.h"
|
|
#include "devices/base/generic_device.h"
|
|
#include "devices/base/generic_memory.h"
|
|
#include "prog_specific.h"
|
|
namespace Debugger { class Base; }
|
|
namespace Device { class MemoryRange; }
|
|
|
|
namespace Programmer
|
|
{
|
|
enum Mode { NormalMode, BootloadMode };
|
|
enum State { NotConnected = 0, Stopped, Running, Halted };
|
|
class Hardware;
|
|
class Group;
|
|
class DeviceSpecific;
|
|
extern const double UNKNOWN_VOLTAGE;
|
|
|
|
enum VerifyAction { NormalVerify = 0, BlankCheckVerify = 1,
|
|
IgnoreProtectedVerify = 2, OnlyProgrammedVerify = 4 };
|
|
TQ_DECLARE_FLAGS(VerifyActions, VerifyAction)
|
|
TQ_DECLARE_OPERATORS_FOR_FLAGS(VerifyActions)
|
|
class VerifyData {
|
|
public:
|
|
VerifyData(VerifyActions pactions, const Device::Memory &pmemory) : actions(pactions), memory(pmemory) {}
|
|
VerifyActions actions;
|
|
AddressRangeVector protectedRanges;
|
|
const Device::Memory &memory;
|
|
};
|
|
|
|
enum ResultType { Pass = 0, Low, High, Fail, Nb_ResultTypes };
|
|
extern const char * const RESULT_TYPE_LABELS[Nb_ResultTypes+1];
|
|
|
|
class HardwareDescription {
|
|
public:
|
|
Port::Description port;
|
|
TQString name;
|
|
};
|
|
|
|
BEGIN_DECLARE_ENUM(Task)
|
|
Read = 0, Write, Verify, Erase, BlankCheck
|
|
END_DECLARE_ENUM_STD(Task)
|
|
|
|
BEGIN_DECLARE_ENUM(FirmwareVersionType)
|
|
Min, Max, Recommended
|
|
END_DECLARE_ENUM_NO_DATA(FirmwareVersionType)
|
|
|
|
//-----------------------------------------------------------------------------
|
|
class Base : public TQObject, public Log::Base
|
|
{
|
|
TQ_OBJECT
|
|
|
|
public:
|
|
Base(const Group &group, const Device::Data *data, const char *name);
|
|
virtual ~Base();
|
|
|
|
virtual void log(Log::LineType type, const TQString &message);
|
|
virtual void log(Log::DebugLevel level, const TQString &message);
|
|
void init(bool targetSelfPowered, Hardware *hardware, DeviceSpecific *deviceSpecific);
|
|
const Device::Data *device() const { return _device; }
|
|
const Group &group() const { return _group; }
|
|
Hardware *hardware() { return _hardware; }
|
|
ProgressMonitor &progressMonitor() { return _progressMonitor; }
|
|
::Debugger::Base *debugger() { return _debugger; }
|
|
virtual uint maxNbBreakpoints() const { return 1; }
|
|
virtual uint runUpdateWait() const { return 300; }
|
|
|
|
bool simpleConnectHardware();
|
|
bool connectHardware();
|
|
void disconnectHardware();
|
|
bool connectDevice();
|
|
bool setTargetPowerOn(bool on);
|
|
bool isTargetPowerOn() const { return _targetPowerOn; }
|
|
bool isTargetSelfPowered() const { return _targetSelfPowered; }
|
|
void setFirmwareDirectory(const PURL::Directory &dir) { _firmwareDirectory = dir; }
|
|
const VersionData &firmwareVersion() const { return _firmwareVersion; }
|
|
virtual bool readFirmwareVersion() { return true; }
|
|
bool uploadFirmware(const PURL::Url &url);
|
|
virtual bool readVoltages() { return true; }
|
|
virtual bool selfTest(bool ask) { Q_UNUSED(ask); return true; }
|
|
void appendTask(Task task, const Device::MemoryRange *range = 0);
|
|
|
|
bool erase(const Device::MemoryRange &range);
|
|
bool read(Device::Memory &memory, const Device::MemoryRange &range);
|
|
bool program(const Device::Memory &memory, const Device::MemoryRange &range);
|
|
bool verify(const Device::Memory &memory, const Device::MemoryRange &range);
|
|
bool blankCheck(const Device::MemoryRange &range);
|
|
bool run();
|
|
bool stop();
|
|
State state() const { return _state; }
|
|
void setState(State state) { _state = state; }
|
|
bool isConnected() const { return ( _state!=NotConnected ); }
|
|
bool isActive() const { return ( _state==Halted || _state==Running ); }
|
|
bool enterMode(Mode mode);
|
|
bool doConnectDevice();
|
|
virtual void clear();
|
|
|
|
signals:
|
|
void actionMessage(const TQString &message);
|
|
|
|
protected:
|
|
Hardware *_hardware;
|
|
DeviceSpecific *_specific;
|
|
const Device::Data *_device;
|
|
::Debugger::Base *_debugger;
|
|
State _state;
|
|
bool _targetPowerOn;
|
|
const Group &_group;
|
|
PURL::Directory _firmwareDirectory;
|
|
VersionData _firmwareVersion;
|
|
Mode _mode;
|
|
bool _targetSelfPowered;
|
|
ProgressMonitor _progressMonitor;
|
|
|
|
PURL::Directory firmwareDirectory();
|
|
virtual bool setupFirmware() { return true; }
|
|
virtual VersionData firmwareVersion(FirmwareVersionType type) const { Q_UNUSED(type); return VersionData(); }
|
|
virtual VersionData mplabVersion(FirmwareVersionType type) const { Q_UNUSED(type); return VersionData(); }
|
|
virtual bool checkFirmwareVersion();
|
|
virtual bool setTarget() { return true; }
|
|
virtual bool internalSetupHardware() { return true; }
|
|
virtual bool verifyDeviceId() = 0;
|
|
virtual uint nbSteps(Task task, const Device::MemoryRange *range) const = 0;
|
|
virtual bool doUploadFirmware(PURL::File &);
|
|
virtual bool internalUploadFirmware(PURL::File &) { return false; }
|
|
virtual bool internalEnterMode(Mode) { return false; }
|
|
|
|
virtual bool checkErase() = 0;
|
|
virtual bool internalErase(const Device::MemoryRange &range) = 0;
|
|
bool checkCanRead();
|
|
virtual bool checkRead() = 0;
|
|
virtual bool internalRead(Device::Memory *memory, const Device::MemoryRange &range, const VerifyData *vdata) = 0;
|
|
virtual bool checkProgram(const Device::Memory &memory) = 0;
|
|
virtual bool internalProgram(const Device::Memory &memory, const Device::MemoryRange &range) = 0;
|
|
virtual bool internalRun() { return false; }
|
|
virtual bool internalStop() { return false; }
|
|
|
|
void endProgramming();
|
|
bool doErase(const Device::MemoryRange &range);
|
|
bool doRead(Device::Memory &memory, const Device::MemoryRange &range);
|
|
bool doVerify(const Device::Memory &memory, const Device::MemoryRange &range);
|
|
bool doVerify(VerifyAction action, const Device::MemoryRange &range, const Device::Memory *memory);
|
|
bool doBlankCheck(const Device::MemoryRange &range);
|
|
virtual bool doProgram(const Device::Memory &memory, const Device::MemoryRange &range);
|
|
|
|
friend class DeviceSpecific;
|
|
};
|
|
|
|
} // namespace
|
|
|
|
#endif
|