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/parallel/eprom.cpp 12 : * @brief Implementation of the Parallel EPROM. 13 : * 14 : * @author Robson Martins (https://www.robsonmartins.com) 15 : */ 16 : // --------------------------------------------------------------------------- 17 : 18 : #include <QLoggingCategory> 19 : #include "eprom.hpp" 20 : 21 : // --------------------------------------------------------------------------- 22 : // Logging 23 : 24 20 : Q_LOGGING_CATEGORY(deviceParEprom, "device.parallel.eprom") 25 : 26 : #define DEBUG qCDebug(deviceParEprom) 27 : #define INFO qCInfo(deviceParEprom) 28 : #define WARNING qCWarning(deviceParEprom) 29 : #define CRITICAL qCCritical(deviceParEprom) 30 : #define FATAL qCFatal(deviceParEprom) 31 : 32 : // --------------------------------------------------------------------------- 33 : 34 4 : EPROM::EPROM(QObject *parent) : ParDevice(parent) { 35 4 : info_.name = "EPROM"; 36 4 : info_.capability.hasRead = true; 37 4 : info_.capability.hasProgram = true; 38 4 : info_.capability.hasVerify = true; 39 4 : info_.capability.hasBlankCheck = true; 40 4 : info_.capability.hasGetId = true; 41 4 : info_.capability.hasVDD = true; 42 4 : info_.capability.hasVPP = true; 43 4 : skipFF_ = true; 44 4 : twp_ = 600; 45 4 : twc_ = 8; 46 4 : vddRd_ = 5.0f; 47 4 : vddWr_ = 6.0f; 48 4 : vpp_ = 13.0f; 49 4 : vee_ = 13.0f; 50 4 : size_ = 2048; 51 4 : maxAttemptsProg_ = 25; 52 4 : flags_.skipFF = true; 53 4 : flags_.progWithVpp = true; 54 4 : flags_.pgmPositive = true; 55 4 : flags_.pgmCePin = true; 56 4 : algo_ = kCmdDeviceAlgorithmEPROM; 57 8 : DEBUG << info_.toString(); 58 4 : } 59 : 60 4 : EPROM::~EPROM() {} 61 : 62 13 : void EPROM::setSize(uint32_t value) { 63 13 : ParDevice::setSize(value); 64 : // set device flags 65 13 : switch (size_) { 66 4 : case 0x001000: // 4KB 67 : case 0x010000: // 64KB 68 : case 0x100000: // 1MB 69 : case 0x400000: // 4MB 70 : // ~OE/VPP Pin 71 4 : flags_.vppOePin = true; 72 4 : break; 73 9 : default: 74 : // ~OE and VPP Pin are separated 75 9 : flags_.vppOePin = false; 76 9 : break; 77 : } 78 13 : if (size_ == 0x800) { // 2KB 79 : // Positive prog pulse (HI) 80 4 : flags_.pgmPositive = true; 81 : } else { 82 : // Normal negative prog pulse (LO) 83 9 : flags_.pgmPositive = false; 84 : } 85 13 : switch (size_) { 86 4 : case 0x02000: // 8KB 87 : case 0x04000: // 16KB 88 : case 0x20000: // 128KB 89 : case 0x40000: // 256KB 90 : // ~CE and ~PGM Pin are separated 91 4 : flags_.pgmCePin = false; 92 4 : break; 93 9 : default: 94 : // ~CE/PGM Pin 95 9 : flags_.pgmCePin = true; 96 9 : break; 97 : } 98 13 : } 99 : 100 : // --------------------------------------------------------------------------- 101 : 102 1 : EPROM27::EPROM27(QObject *parent) : EPROM(parent) { 103 1 : info_.name = "EPROM 27 (NMOS)"; 104 1 : twp_ = 50000; 105 1 : twc_ = 50; 106 1 : vddRd_ = 5.0f; 107 1 : vddWr_ = 5.0f; 108 1 : vpp_ = 25.0f; 109 1 : vee_ = 12.0f; 110 2 : DEBUG << info_.toString(); 111 1 : } 112 : 113 2 : EPROM27::~EPROM27() {} 114 : 115 : // --------------------------------------------------------------------------- 116 : 117 3 : EPROM27C::EPROM27C(QObject *parent) : EPROM(parent) { 118 3 : info_.name = "EPROM 27C"; 119 3 : twp_ = 500; 120 3 : twc_ = 8; 121 3 : vddRd_ = 5.0f; 122 3 : vddWr_ = 6.0f; 123 3 : vpp_ = 13.0f; 124 3 : vee_ = 12.0f; 125 6 : DEBUG << info_.toString(); 126 3 : } 127 : 128 4 : EPROM27C::~EPROM27C() {} 129 : 130 : // --------------------------------------------------------------------------- 131 : 132 1 : EPROM27C16Bit::EPROM27C16Bit(QObject *parent) : EPROM27C(parent) { 133 1 : info_.name = "EPROM 27C (16Bit)"; 134 1 : flags_.is16bit = true; 135 2 : DEBUG << info_.toString(); 136 1 : } 137 : 138 2 : EPROM27C16Bit::~EPROM27C16Bit() {} 139 : 140 : // --------------------------------------------------------------------------- 141 : 142 1 : EPROM27E::EPROM27E(QObject *parent) : EPROM27C(parent) { 143 1 : info_.name = "EPROM W27C/27E/27SF"; 144 1 : info_.capability.hasErase = true; 145 1 : info_.capability.hasFastProg = true; 146 1 : fastProg_ = true; 147 1 : twp_ = 100; 148 1 : twc_ = 15; 149 1 : vddRd_ = 5.0f; 150 1 : vddWr_ = 5.0f; 151 1 : vpp_ = 12.0f; 152 1 : vee_ = 14.0f; 153 2 : DEBUG << info_.toString(); 154 1 : } 155 : 156 2 : EPROM27E::~EPROM27E() {}