LCOV - code coverage report
Current view: top level - backend/devices - device.cpp (source / functions) Hit Total Coverage
Test: "6f9243f" Lines: 168 192 87.5 %
Date: 2024-02-24 14:58:06 Functions: 34 44 77.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // ---------------------------------------------------------------------------
       2             : // USB EPROM/Flash Programmer
       3             : //
       4             : // Copyright (2023) Robson Martins
       5             : //
       6             : // This work is licensed under a Creative Commons Attribution-NonCommercial-
       7             : // ShareAlike 4.0 International License.
       8             : // ---------------------------------------------------------------------------
       9             : /**
      10             :  * @ingroup Software
      11             :  * @file backend/devices/device.cpp
      12             :  * @brief Implementation of the Base class of a Device.
      13             :  *
      14             :  * @author Robson Martins (https://www.robsonmartins.com)
      15             :  */
      16             : // ---------------------------------------------------------------------------
      17             : 
      18             : #include <QMap>
      19             : #include <QTextStream>
      20             : #include <QLoggingCategory>
      21             : 
      22             : #include "backend/devices/device.hpp"
      23             : 
      24             : // ---------------------------------------------------------------------------
      25             : // Logging
      26             : 
      27        1062 : Q_LOGGING_CATEGORY(device, "device")
      28             : 
      29             : #define DEBUG qCDebug(device)
      30             : #define INFO qCInfo(device)
      31             : #define WARNING qCWarning(device)
      32             : #define CRITICAL qCCritical(device)
      33             : #define FATAL qCFatal(device)
      34             : 
      35             : // ---------------------------------------------------------------------------
      36             : 
      37             : // clang-format off
      38             : /* @brief List of Manufacturers. */
      39             : const QMap<uint8_t, QString> kManufacturerList = {
      40             :     {0x01, "AMD"                    },
      41             :     {0x02, "Macronix"               },
      42             :     {0x04, "Fujitsu"                },
      43             :     {0x07, "Maxwell"                },
      44             :     {0x0C, "Microchip"              },
      45             :     {0x29, "Microchip"              },
      46             :     {0x15, "NXP/Philips/Signetics"  },
      47             :     {0x1C, "EON"                    },
      48             :     {0x1E, "Atmel"                  },
      49             :     {0x1F, "Atmel"                  },
      50             :     {0x20, "ST"                     },
      51             :     {0x31, "Catalyst"               },
      52             :     {0x37, "AMIC"                   },
      53             :     {0x38, "Winbond"                },
      54             :     {0x40, "SyncMOS"                },
      55             :     {0x42, "SyncMOS"                },
      56             :     {0x49, "Toshiba"                },
      57             :     {0x4A, "Macronix/MXIC"          },
      58             :     {0xC2, "Macronix/MXIC"          },
      59             :     {0x50, "Spansion"               },
      60             :     {0x7F, "Adesto"                 },
      61             :     {0x89, "Intel/Texas Instruments"},
      62             :     {0x8F, "Fairchild/National"     },
      63             :     {0x9D, "Xicor"                  },
      64             :     {0xAD, "Hyundai"                },
      65             :     {0xB0, "Sharp"                  },
      66             :     {0xBF, "SST/Sanyo"              },
      67             :     {0xC8, "GigaDevice"             },
      68             :     {0xDA, "ASD/WinBond"            },
      69             :     {0xEF, "ISSI"                   }
      70             : };
      71             : // clang-format on
      72             : 
      73             : // ---------------------------------------------------------------------------
      74             : 
      75           1 : TDeviceID::TDeviceID() : manufacturer(0), device(0) {}
      76             : 
      77         256 : QString TDeviceID::getManufacturerName(void) const {
      78         256 :     if (!kManufacturerList.contains(manufacturer)) {
      79         226 :         return Device::tr("Unknown");
      80             :     }
      81          30 :     return kManufacturerList.value(manufacturer);
      82             : }
      83             : 
      84             : // ---------------------------------------------------------------------------
      85             : 
      86          13 : TDeviceCapabilities::TDeviceCapabilities()
      87          13 :     : hasProgram(false),
      88          13 :       hasVerify(false),
      89          13 :       hasErase(false),
      90          13 :       hasGetId(false),
      91          13 :       hasRead(false),
      92          13 :       hasBlankCheck(false),
      93          13 :       hasUnprotect(false),
      94          13 :       hasProtect(false),
      95          13 :       hasSectorSize(false),
      96          13 :       hasFastProg(false),
      97          13 :       hasSkipFF(false),
      98          13 :       hasVDD(false),
      99          13 :       hasVPP(false) {}
     100             : 
     101             : // ---------------------------------------------------------------------------
     102             : 
     103          13 : TDeviceInformation::TDeviceInformation()
     104          13 :     : deviceType(kDeviceParallelMemory), name("") {}
     105             : 
     106          44 : QString TDeviceInformation::toString() const {
     107          44 :     QString result;
     108          44 :     QTextStream ts(&result);
     109          44 :     ts << "Name: " << name;
     110          44 :     ts << "; Type: ";
     111          44 :     switch (deviceType) {
     112          44 :         case kDeviceParallelMemory:
     113          44 :             ts << "Parallel Memory";
     114          44 :             break;
     115           0 :         case kDeviceSerialMemory:
     116           0 :             ts << "Serial Memory";
     117           0 :             break;
     118           0 :         default:
     119           0 :             ts << "Unknown";
     120           0 :             break;
     121             :     }
     122          44 :     ts << "; Capabilities: [";
     123          44 :     ts << "hasProgram=" << (capability.hasProgram ? 1 : 0);
     124          44 :     ts << ", hasVerify=" << (capability.hasVerify ? 1 : 0);
     125          44 :     ts << ", hasErase=" << (capability.hasErase ? 1 : 0);
     126          44 :     ts << ", hasGetId=" << (capability.hasGetId ? 1 : 0);
     127          44 :     ts << ", hasRead=" << (capability.hasRead ? 1 : 0);
     128          44 :     ts << ", hasBlankCheck=" << (capability.hasBlankCheck ? 1 : 0);
     129          44 :     ts << ", hasUnprotect=" << (capability.hasUnprotect ? 1 : 0);
     130          44 :     ts << ", hasProtect=" << (capability.hasProtect ? 1 : 0);
     131          44 :     ts << ", hasSectorSize=" << (capability.hasSectorSize ? 1 : 0);
     132          44 :     ts << ", hasFastProg=" << (capability.hasFastProg ? 1 : 0);
     133          44 :     ts << ", hasSkipFF=" << (capability.hasSkipFF ? 1 : 0);
     134          44 :     ts << ", hasVDD=" << (capability.hasVDD ? 1 : 0);
     135          44 :     ts << ", hasVPP=" << (capability.hasVPP ? 1 : 0);
     136          44 :     ts << "]";
     137          88 :     return result;
     138          44 : }
     139             : 
     140             : // ---------------------------------------------------------------------------
     141             : 
     142          13 : Device::Device(QObject *parent)
     143             :     : QObject(parent),
     144          13 :       maxAttemptsProg_(1),
     145          13 :       canceling_(false),
     146          13 :       size_(0),
     147          13 :       twp_(1),
     148          13 :       twc_(1),
     149          13 :       vddRd_(5.0f),
     150          13 :       vddWr_(5.0f),
     151          13 :       vpp_(12.0f),
     152          13 :       vee_(12.0f),
     153          13 :       skipFF_(false),
     154          13 :       fastProg_(false),
     155          13 :       sectorSize_(0),
     156          13 :       algo_(kCmdDeviceAlgorithmUnknown),
     157          13 :       runner_(this) {
     158          13 :     info_.deviceType = kDeviceParallelMemory;
     159          13 :     info_.name = "Device";
     160          13 :     info_.capability.hasProgram = false;
     161          13 :     info_.capability.hasVerify = false;
     162          13 :     info_.capability.hasErase = false;
     163          13 :     info_.capability.hasGetId = false;
     164          13 :     info_.capability.hasRead = false;
     165          13 :     info_.capability.hasBlankCheck = false;
     166          13 :     info_.capability.hasUnprotect = false;
     167          13 :     info_.capability.hasProtect = false;
     168          13 :     info_.capability.hasSectorSize = false;
     169          13 :     info_.capability.hasFastProg = false;
     170          13 :     info_.capability.hasSkipFF = false;
     171          13 :     info_.capability.hasVDD = true;
     172          13 :     info_.capability.hasVPP = false;
     173          13 :     flags_.skipFF = false;
     174          13 :     flags_.progWithVpp = false;
     175          13 :     flags_.vppOePin = false;
     176          13 :     flags_.pgmCePin = false;
     177          13 :     flags_.pgmPositive = false;
     178          13 :     flags_.is16bit = false;
     179          13 : }
     180             : 
     181          13 : Device::~Device() {}
     182             : 
     183           0 : bool Device::is16Bit() const {
     184           0 :     return flags_.is16bit;
     185             : }
     186             : 
     187          40 : void Device::setPort(const QString &path) {
     188          40 :     if (port_ == path) return;
     189          13 :     port_ = path;
     190             : }
     191             : 
     192          40 : QString Device::getPort() const {
     193          40 :     return port_;
     194             : }
     195             : 
     196         520 : uint8_t Device::getBufferSize() const {
     197         520 :     return runner_.getBufferSize();
     198             : }
     199             : 
     200          40 : void Device::setBufferSize(uint8_t value) {
     201          40 :     runner_.setBufferSize(value);
     202          40 : }
     203             : 
     204          41 : void Device::setSize(uint32_t value) {
     205          41 :     if (size_ != value) {
     206          27 :         if (value) size_ = value;
     207             :     }
     208          82 :     DEBUG << "Size: " << QString("%1").arg(size_);
     209          41 : }
     210             : 
     211          40 : uint32_t Device::getSize() const {
     212          40 :     return size_;
     213             : }
     214             : 
     215          40 : void Device::setTwp(uint32_t us) {
     216          40 :     if (twp_ != us) {
     217          12 :         if (us) twp_ = us;
     218             :     }
     219          80 :     DEBUG << "tWP: " << QString("%1").arg(twp_);
     220          40 : }
     221             : 
     222          40 : uint32_t Device::getTwp() const {
     223          40 :     return twp_;
     224             : }
     225             : 
     226          40 : void Device::setTwc(uint32_t us) {
     227          40 :     if (twc_ != us) {
     228          12 :         if (us) twc_ = us;
     229             :     }
     230          80 :     DEBUG << "tWC: " << QString("%1").arg(twc_);
     231          40 : }
     232             : 
     233          40 : uint32_t Device::getTwc() const {
     234          40 :     return twc_;
     235             : }
     236             : 
     237          40 : void Device::setVddRd(float value) {
     238          40 :     if (vddRd_ != value) {
     239          13 :         if (value >= 0.0f) vddRd_ = value;
     240             :     }
     241          80 :     DEBUG << "VDD Read: " << QString("%1").arg(vddRd_, 4, 'f', 2);
     242          40 : }
     243             : 
     244          40 : float Device::getVddRd() const {
     245          40 :     return vddRd_;
     246             : }
     247             : 
     248          40 : void Device::setVddWr(float value) {
     249          40 :     if (vddWr_ != value) {
     250          13 :         if (value >= 0.0f) vddWr_ = value;
     251             :     }
     252          80 :     DEBUG << "VDD Prog: " << QString("%1").arg(vddWr_, 4, 'f', 2);
     253          40 : }
     254             : 
     255          40 : float Device::getVddWr() const {
     256          40 :     return vddWr_;
     257             : }
     258             : 
     259          40 : void Device::setVpp(float value) {
     260          40 :     if (vpp_ != value) {
     261          13 :         if (value >= 0.0f) vpp_ = value;
     262             :     }
     263          80 :     DEBUG << "VPP: " << QString("%1").arg(vpp_, 4, 'f', 2);
     264          40 : }
     265             : 
     266          40 : float Device::getVpp() const {
     267          40 :     return vpp_;
     268             : }
     269             : 
     270          40 : void Device::setVee(float value) {
     271          40 :     if (vee_ != value) {
     272          13 :         if (value >= 0.0f) vee_ = value;
     273             :     }
     274          80 :     DEBUG << "VEE: " << QString("%1").arg(vee_, 4, 'f', 2);
     275          40 : }
     276             : 
     277          40 : float Device::getVee() const {
     278          40 :     return vee_;
     279             : }
     280             : 
     281          80 : void Device::setSkipFF(bool value) {
     282          80 :     if (skipFF_ != value) skipFF_ = value;
     283         160 :     DEBUG << "Skip 0xFF: " << QString("%1").arg(skipFF_ ? 1 : 0);
     284          80 : }
     285             : 
     286          40 : bool Device::getSkipFF() const {
     287          40 :     return skipFF_;
     288             : }
     289             : 
     290          86 : void Device::setFastProg(bool value) {
     291          86 :     if (fastProg_ != value) fastProg_ = value;
     292         172 :     DEBUG << "Fast Prog/Erase: " << QString("%1").arg(fastProg_ ? 1 : 0);
     293          86 : }
     294             : 
     295          40 : bool Device::getFastProg() const {
     296          40 :     return fastProg_;
     297             : }
     298             : 
     299          84 : void Device::setSectorSize(uint16_t value) {
     300          84 :     if (sectorSize_ != value) sectorSize_ = value;
     301         168 :     DEBUG << "Sector Size: " << QString("%1").arg(sectorSize_);
     302          84 : }
     303             : 
     304          40 : uint16_t Device::getSectorSize() const {
     305          40 :     return sectorSize_;
     306             : }
     307             : 
     308          40 : TDeviceInformation Device::getInfo() const {
     309          40 :     return info_;
     310             : }
     311             : 
     312          40 : void Device::cancel() {
     313          40 :     if (canceling_) return;
     314          40 :     canceling_ = true;
     315             : }
     316             : 
     317           0 : bool Device::getId(TDeviceID &result) {
     318             :     (void)result;
     319           0 :     return false;
     320             : }
     321             : 
     322           0 : bool Device::read(QByteArray &buffer) {
     323             :     (void)buffer;
     324           0 :     return false;
     325             : }
     326             : 
     327           0 : bool Device::program(const QByteArray &buffer, bool verify) {
     328             :     (void)buffer;
     329             :     (void)verify;
     330           0 :     return false;
     331             : }
     332             : 
     333           0 : bool Device::verify(const QByteArray &buffer) {
     334             :     (void)buffer;
     335           0 :     return false;
     336             : }
     337             : 
     338           0 : bool Device::erase(bool check) {
     339             :     (void)check;
     340           0 :     return false;
     341             : }
     342             : 
     343           0 : bool Device::blankCheck() {
     344           0 :     return false;
     345             : }
     346             : 
     347           0 : bool Device::unprotect() {
     348           0 :     return false;
     349             : }
     350             : 
     351           0 : bool Device::protect() {
     352           0 :     return false;
     353             : }

Generated by: LCOV version 1.14