Esempio n. 1
0
        /// <summary>
        /// Выполняет загрузку Eprom с файла
        /// </summary>
        /// <param name="filePath">Путь к файлу</param>
        /// <param name="format">Формат в котором сохранен Eprom</param>
        /// <returns></returns>
        public Eprom LoadEpromFromFile(string filePath, FileFormat format)
        {
            IEFLoader ldr   = null;
            Eprom     eprom = new Eprom();

            switch (format)
            {
            case FileFormat.EF1TXT:

                ldr = platform.GetEFLoader(FileFormat.EF1TXT);
                break;

            case FileFormat.EF2XMLOLD:

                ldr = platform.GetEFLoader(FileFormat.EF2XMLOLD);
                break;

            case FileFormat.EF2XML:

                ldr = platform.GetEFLoader(FileFormat.EF2XML);
                break;
            }
            eprom = ldr.Load(filePath);
            return(eprom);
        }
Esempio n. 2
0
        /// <summary>
        /// Analyzes the result of a ZIF-socket read.
        /// </summary>
        /// <param name="results">The array of results.</param>
        /// <param name="eprom">The eprom.</param>
        /// <param name="address">The address.</param>
        /// <param name="result">
        /// If <see cref="ReadSoundness.SeemsToBeAOkay"/> is returned,
        /// this result can be trusted.
        /// </param>
        /// <returns>The result of the analyzis.</returns>
        public static ReadSoundness AnalyzeEpromReadSoundness(
            ZIFSocket[] results,
            Eprom eprom,
            int address,
            out ZIFSocket result)
        {
            result = null;
            var refLenght  = results.Length;
            var revResults = results.Reverse().ToArray();

            var withCorrectAddresses = revResults.TakeWhile(x => eprom.GetAddress(x) == address).ToArray();

            if (withCorrectAddresses.Length == 0)
            {
                return(ReadSoundness.TryRewrite);
            }
            if (withCorrectAddresses.Length != refLenght)
            {
                return(ReadSoundness.TryReread);
            }

            var refData     = eprom.GetData(revResults[0]);
            var withRefData = revResults.TakeWhile(x => eprom.GetData(x).SequenceEqual(refData)).ToArray();

            if (withRefData.Length != refLenght)
            {
                return(ReadSoundness.TryReread);
            }

            result = revResults[0];
            return(ReadSoundness.SeemsToBeAOkay);
        }
Esempio n. 3
0
        /// <summary>
        /// Сохраняет таблицу калибровки в указанный eprom
        /// </summary>
        /// <param name="table">Таблица калибровки, которую необходимо сохранить</param>
        /// <param name="eprom">Eprom в который необходимо сохранить таблицу калибровки</param>
        public void SaveCalibrationTableToFile(CalibrationTable table, Eprom eprom)
        {
            int[] Indices = { 0x0400, 0x0430, 0x0460, 0x0490, 0x04C0, 0x04F0, 0x0520, 0x0550 };
            foreach (int index in Indices)
            {
                if (eprom.GetByte(index) == table.Name)
                {
                    byte size = (byte)(table.Parameters.Count * 4);
                    eprom.SetByte(index + 3, size);

                    int offset = index + 4;
                    foreach (Parameter parameter in table.Parameters)
                    {
                        eprom.SetByte(offset++, (byte)(parameter.Physical >> 8));
                        eprom.SetByte(offset++, (byte)parameter.Physical);

                        eprom.SetByte(offset++, (byte)(parameter.Calibrated >> 8));
                        eprom.SetByte(offset++, (byte)parameter.Calibrated);
                    }
                    if (table.Parameters.Count < 11)
                    {
                        eprom.SetByte(offset++, 0xff);
                        eprom.SetByte(offset++, 0xff);

                        eprom.SetByte(offset++, 0xff);
                        eprom.SetByte(offset++, 0xff);
                    }
                    return;
                }
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Вычисляет CRC16 Eprom устройства
        /// </summary>
        /// <param name="eprom">Eprom устройства для которого необходимо вычислить контрольную сумму</param>
        /// <returns>Контрольная сумма</returns>
        public ushort CalculateCRC16(Eprom eprom)
        {
            ushort[] Crc16Table =
            {
                0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
                0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
                0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
                0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
                0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
                0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
                0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
                0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
                0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
                0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
                0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
                0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
                0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
                0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
                0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
                0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
                0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
                0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
                0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
                0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
                0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
                0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
                0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
                0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
                0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
                0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
                0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
                0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
                0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
                0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
                0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
                0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
            };

            ushort crc = 0xffff;

            for (int page = 0; page < 3; page++)
            {
                for (int offset = 0; offset < 256; offset++)
                {
                    crc = (ushort)((crc >> 8) ^ Crc16Table[(crc & 0xff) ^ eprom[page][offset]]);
                }
            }

            byte[] crc_bytes = BitConverter.GetBytes(crc);

            byte b = crc_bytes[1];

            crc_bytes[1] = crc_bytes[0];
            crc_bytes[1] = b;
            return(BitConverter.ToUInt16(crc_bytes, 0));

            //return crc;
        }
Esempio n. 5
0
        /// <summary>
        /// Сохраняет тблицу калибровки в файл
        /// </summary>
        /// <param name="filePath">Путь к файлу</param>
        /// <param name="table">Таблица калибровки, которую необходимо сохранить</param>
        /// <param name="eprom">Eprom в который необходимо сохранить данную таблицу калибровки</param>
        public void SaveEpromToFile(string filePath, CalibrationTable table, Eprom eprom)
        {
            IEFSaver svr = null;

            svr = platform.GetEFSaver(FileFormat.EF2XML);

            SaveCalibrationTableToFile(table, eprom);
            svr.Save(filePath, eprom);
        }
Esempio n. 6
0
 public override void Initialize(string sha1, byte[] prg_dump, byte[] chr_dump, byte[] trainer_dump, MyNes.Core.Mirroring defaultMirroring)
 {
     base.Initialize(sha1, prg_dump, chr_dump, trainer_dump, defaultMirroring);
     if (BoardType.ToLower().Contains("24c01"))// mapper 159
     {
         eprom = new Eprom(128);
     }
     else
     {
         eprom = new Eprom(base.MapperNumber == 16 ? 256 : 128);
     }
 }
Esempio n. 7
0
 public override void Initialize(string sha1, byte[] prg_dump, byte[] chr_dump, byte[] trainer_dump, MyNes.Core.Mirroring defaultMirroring)
 {
     base.Initialize(sha1, prg_dump, chr_dump, trainer_dump, defaultMirroring);
     if (BoardType.ToLower().Contains("24c01"))// mapper 159
     {
         eprom = new Eprom(128);
     }
     else
     {
         eprom = new Eprom(base.MapperNumber == 16 ? 256 : 128);
     }
 }
Esempio n. 8
0
        private void InitBlockCommonOptions(Block block, Eprom eprom)
        {
            for (int i = 0; i < 8; i++)
            {
                CmdOpros cmd = new CmdOpros();

                cmd.Address    = eprom[0][0xf0 + i * 2];
                cmd.SizeBuffer = eprom[0][0xf0 + ((i * 2) + 1)];

                block.Cmds.Add(cmd);
            }
        }
Esempio n. 9
0
        public void LoadDefault(HandleIO handle)
        {
            Eprom eprom = new Eprom(0x00);

            for (int by = 0; by < 256; by++)
            {
                eprom[0][by] = 0xff;
            }
            handle.Eprom       = eprom;
            handle.VisionBlock = CreateBlock(eprom);

            handle.ProgrammVersion = new Version(0, 0, 0, 0);
        }
Esempio n. 10
0
        public static string TestEpromSpecification(Eprom eprom)
        {
            var translator = eprom.GetPinTranslator(Top2005PlusZIFType);

            return(TestPins(translator, eprom.VccPins, Top2005PlusValidVccPins, "Vcc")
                   .Concat(TestPins(translator, eprom.VppPins, Top2005PlusValidVppPins, "Vpp"))
                   .Concat(TestPins(translator, eprom.GndPins, Top2005PlusValidGndPins, "Gnd"))
                   .Concat(TestPins(translator, eprom.Program, Top2005PlusValidSignalPins, "Pgm"))
                   .Concat(TestPins(translator, eprom.OutputEnable, Top2005PlusValidSignalPins, "OE"))
                   .Concat(TestPins(translator, eprom.DataPins, Top2005PlusValidSignalPins, "Data"))
                   .Concat(TestPins(translator, eprom.ChipEnable, Top2005PlusValidSignalPins, "CE"))
                   .Concat(TestPins(translator, eprom.AddressPins, Top2005PlusValidSignalPins, "Address"))
                   .Aggregate("", (a, e) => a + Environment.NewLine + e));
        }
Esempio n. 11
0
        public void LoadFromFile(string filePath, HandleIO handle, FileFormat format)
        {
            IEFLoader ldr   = platform.GetEFLoader(format);
            Eprom     eprom = new Eprom();

            eprom = ldr.Load(filePath);
            if (eprom != null)
            {
                handle.Eprom       = eprom;
                handle.VisionBlock = CreateBlock(eprom);

                if (handle.VisionBlock != null)
                {
                    handle.CRC16           = CalculateCRC16(eprom);
                    handle.ProgrammVersion = new Version(0, 0, 0, 0);
                }
            }
        }
Esempio n. 12
0
        /// <summary>
        /// Получить массив описателей калибровочных параметров
        /// </summary>
        /// <param name="eprom">EPROM устройства из которого необходимо извлеч данные</param>
        /// <returns>Массив описателй калибровочных параметров</returns>
        public CalibrationTableHandle[] CreateCalibrationTableHandles(Eprom eprom)
        {
            if (eprom != null)
            {
                CalibrationTableHandle[] handles = new CalibrationTableHandle[20];
                for (int index = 0; index < handles.Length; index++)
                {
                    int baseOffset = calibrationTableHandlesBaseOffset + (index * CalibrationTableHandle.SizeInTable);

                    byte name   = eprom[calibrationTableHandlesPageNumber][baseOffset];
                    byte offset = eprom[calibrationTableHandlesPageNumber][baseOffset + 1];

                    handles[index] = new CalibrationTableHandle(name, offset);
                }
                return(handles);
            }
            else
            {
                throw new ArgumentNullException("eprom", "Не может принимать значение null");
            }
        }
Esempio n. 13
0
        /// <summary>
        /// Возвращяет таблицу калибровки
        /// </summary>
        /// <param name="eprom">EPROM устройства из которого необходимо извлеч данные</param>
        /// <param name="CalibrationParameterName">Имя калибровочного параметра</param>
        /// <returns>Таблица калибровки</returns>
        public LastError GetCalibrationTable(Eprom eprom, CalibrationTableHandle calibrationHandle)
        {
            int[] Indices = { 0x0400, 0x0430, 0x0460, 0x0490, 0x04C0, 0x04F0, 0x0520, 0x0550 };
            foreach (int index in Indices)
            {
                if (eprom.GetByte(index) == calibrationHandle.Name)
                {
                    byte             size  = eprom.GetByte(index + 3);
                    CalibrationTable table = new CalibrationTable(calibrationHandle.Name, size);

                    int offset = index + 4;         // смещение по которому начинаются калибровочные значения
                    if ((size % 4) != 0)
                    {
                        return(LastError.Error);
                    }

                    for (int i = 0; i < size / 4; i++)
                    {
                        byte[] physical   = new byte[2];
                        byte[] calibrated = new byte[2];

                        physical[1] = eprom.GetByte(offset++);
                        physical[0] = eprom.GetByte(offset++);

                        calibrated[1] = eprom.GetByte(offset++);
                        calibrated[0] = eprom.GetByte(offset++);

                        Parameter param = new Parameter();

                        param.Physical   = (ushort)BitConverter.ToInt16(physical, 0);
                        param.Calibrated = (ushort)BitConverter.ToInt16(calibrated, 0);

                        table.Parameters.Add(param);
                    }
                    calibrationHandle.CalibrationTable = table;
                    return(LastError.Success);
                }
            }
            return(LastError.Error);
        }
Esempio n. 14
0
 /// <summary>
 /// Основная процедура чтения данных с устройства
 /// </summary>
 void ReadCFG()
 {
     try
     {
         Eprom eprom = pBios.LoadEprom();
         if (eprom != null)
         {
             hio.Eprom       = eprom;
             hio.VisionBlock = pBios.CreateBlock(eprom);
             if (hio.VisionBlock != null)
             {
                 hio.CRC16           = pBios.CalculateCRC16(eprom);
                 hio.ProgrammVersion = pBios.GetVersionOfProgramm();
             }
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message, "Ошибка во время загрузки конфигурации",
                         MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
     }
 }
Esempio n. 15
0
        /// <summary>
        /// NOT WORKING YET!
        /// </summary>
        /// <param name="eprom"></param>
        /// <param name="bytes"></param>
        public void WriteEpromFast(Eprom eprom, IList <byte> bytes)
        {
            if (eprom.VppPins.Any(p => eprom.OutputEnable.Any(q => p.Number == q.Number)))
            {
                throw new U2PaException("Fast Programming Algoritm can't by used for this EPROM (yet)");
            }
            var totalNumberOfAdresses = eprom.AddressPins.Length == 0 ? 0 : 1 << eprom.AddressPins.Length;
            var translator            = eprom.GetPinTranslator(ZIFType);

            {
                var zif = new ZIFSocket(ZIFType);
                zif.SetAll(true);
                zif.Disable(eprom.Program, translator.ToZIF);

                WriteZIF(zif, "Apply 1 to all pins");
                SetVccLevel(eprom.VccLevel);
                SetVppLevel(eprom.VppLevel);
                ApplyGnd(translator.ToZIF, eprom.GndPins);
                ApplyVcc(translator.ToZIF, eprom.VccPins);
                ApplyVpp(translator.ToZIF, eprom.VppPins);
            }

            using (var progress = new ProgressBar(Shouter, totalNumberOfAdresses))
            {
                progress.Init();
                foreach (var address in Enumerable.Range(0, totalNumberOfAdresses))
                {
                    var pulse = 1;
                    while (pulse <= 32)
                    {
                        // Writing
                        var writerZif = new ZIFSocket(40);
                        writerZif.SetAll(true);
                        writerZif.Disable(eprom.GndPins, translator.ToZIF);
                        writerZif.Enable(eprom.Constants, translator.ToZIF);
                        writerZif.Disable(eprom.ChipEnable, translator.ToZIF);
                        writerZif.Disable(eprom.OutputEnable, translator.ToZIF);
                        writerZif.Disable(eprom.Program, translator.ToZIF);

                        eprom.SetAddress(writerZif, address);

                        var data = eprom.DataPins.Length > 8
              ? new[] { bytes[2 * address], bytes[2 * address + 1] }
              : new[] { bytes[address] };
                        eprom.SetData(writerZif, data);

                        WriteZIF(writerZif, "Write address & d ata to ZIF");
                        writerZif.Enable(eprom.ChipEnable, translator.ToZIF);
                        writerZif.Enable(eprom.Program, translator.ToZIF);
                        WriteZIF(writerZif, "Start pulse E");
                        writerZif.Disable(eprom.ChipEnable, translator.ToZIF);
                        writerZif.Disable(eprom.Program, translator.ToZIF);
                        BulkDevice.Delay(pulse);
                        WriteZIF(writerZif, "End pulse E");

                        // Reading
                        var addressZif = new ZIFSocket(40);
                        addressZif.SetAll(true);
                        addressZif.Disable(eprom.GndPins, translator.ToZIF);
                        addressZif.Enable(eprom.Constants, translator.ToZIF);
                        addressZif.Enable(eprom.ChipEnable, translator.ToZIF);
                        addressZif.Enable(eprom.OutputEnable, translator.ToZIF);
                        addressZif.Disable(eprom.Program, translator.ToZIF);
                        eprom.SetAddress(addressZif, address);

                        WriteZIF(addressZif, "Write address");
                        var       dataZifs = ReadZIF("Read data");
                        ZIFSocket resultZif;
                        if (Tools.AnalyzeEpromReadSoundness(dataZifs, eprom, address, out resultZif) == ReadSoundness.SeemsToBeAOkay)
                        {
                            if (eprom.GetData(resultZif).SequenceEqual(data))
                            {
                                // Data validates; now we overprogram
                                writerZif.Enable(eprom.ChipEnable, translator.ToZIF);
                                writerZif.Enable(eprom.Program, translator.ToZIF);
                                WriteZIF(writerZif, "Overprogram");
                                BulkDevice.Delay(3 * pulse);
                                writerZif.Disable(eprom.ChipEnable, translator.ToZIF);
                                writerZif.Disable(eprom.Program, translator.ToZIF);
                                WriteZIF(writerZif, "End pulse E");
                                break;
                            }
                            else
                            {
                                Console.WriteLine("Pulse: {0}", pulse);
                                Console.WriteLine("Address: {0}", address.ToString("X4"));
                                Console.WriteLine(eprom.GetData(writerZif).First());
                                Console.WriteLine(eprom.GetData(resultZif).First());
                            }
                        }


                        pulse *= 2;
                    }
                    if (pulse > 32)
                    {
                        progress.Shout("Address {0} doesn't validate! }};-(", address.ToString("X4"));
                    }
                    progress.Progress();
                }
            }
        }
Esempio n. 16
0
        /// <summary>
        /// Инициализирует блок отображения
        /// </summary>
        /// <param name="eprom">Eprom устройства из которого необходимо выделить конфигурацию блока отображения</param>
        /// <returns>Блок отображения</returns>
        public Block CreateBlock(Eprom eprom)
        {
            Block block = new Block();

            for (int i = 0; i < 16; i++)
            {
                Indicator indicator = new Indicator();

                indicator.Jack = GetJackFromIndex(i + 1);

                indicator.Con     = eprom[1][i * 16 + 0];
                indicator.Address = eprom[1][i * 16 + 1];

                indicator.Offset = eprom[1][i * 16 + 2];
                indicator.OffsetThr.TotalOffset = eprom[1][i * 16 + 3];

                indicator.OffsetPp.TotalOffset = eprom[1][i * 16 + 5];
                indicator.PointPosition        = eprom[1][i * 16 + 6];

                switch (eprom[1][i * 16 + 7])
                {
                case 1: indicator.IndicatorType = IndicatorType.Column32; break;

                case 2: indicator.IndicatorType = IndicatorType.Column32Bipolar; break;

                case 3: indicator.IndicatorType = IndicatorType.ThreeDigit; break;

                case 4: indicator.IndicatorType = IndicatorType.FourDigit; break;

                case 5: indicator.IndicatorType = IndicatorType.FiveDigit; break;

                case 6: indicator.IndicatorType = IndicatorType.Clock; break;
                }

                byte[] factArray          = new byte[4];
                byte[] CorrectoffsetArray = new byte[4];

                byte[] minArray = new byte[4];
                byte[] maxArray = new byte[4];

                for (int ind = 0; ind < 4; ind++)
                {
                    factArray[ind]          = eprom[2][i * 16 + ind];
                    CorrectoffsetArray[ind] = eprom[2][(i * 16) + (ind + 4)];

                    minArray[ind] = eprom[2][(i * 16) + (ind + 8)];
                    maxArray[ind] = eprom[2][(i * 16) + (ind + 12)];
                }

                ReverseBytes(factArray);
                float fact = BitConverter.ToSingle(factArray, 0);

                ReverseBytes(CorrectoffsetArray);
                int correct = BitConverter.ToInt32(CorrectoffsetArray, 0);

                ReverseBytes(minArray);
                int min = BitConverter.ToInt32(minArray, 0);

                ReverseBytes(maxArray);
                int max = BitConverter.ToInt32(maxArray, 0);

                indicator.Fact          = fact;
                indicator.CorrectOffset = correct;

                indicator.Thr_MIN = min;
                indicator.Thr_MAX = max;

                block.Indicators.Add(indicator);
            }

            block.Address             = eprom[0][0x18];
            block.Speed               = eprom[0][0x10];
            block.TypeCRC             = eprom[0][0x11];
            block.SpeedOpros          = eprom[0][0xe0];
            block.NumbersOfIndicators = eprom[0][0xd0];

            InitBlockCommonOptions(block, eprom);
            return(block);
        }
Esempio n. 17
0
        /// <summary>
        /// Writes an EPROM using the Classic Algorithm
        /// </summary>
        /// <param name="eprom">The EPROM type.</param>
        /// <param name="bytes">The bytes to write.</param>
        /// <param name="patch">Not used yet!</param>
        public void WriteEpromClassic(Eprom eprom, IList <byte> bytes, IList <int> patch = null)
        {
            var totalNumberOfAdresses = eprom.AddressPins.Length == 0 ? 0 : 1 << eprom.AddressPins.Length;
            var translator            = eprom.GetPinTranslator(ZIFType);

            SetVccLevel(eprom.VccLevel);
            ApplyGnd(translator.ToZIF, eprom.GndPins);
            ApplyVcc(translator.ToZIF, eprom.VccPins);

            var initZif = new ZIFSocket(ZIFType);

            initZif.SetAll(true);
            initZif.Disable(eprom.GndPins, translator.ToZIF);
            initZif.Enable(eprom.Constants, translator.ToZIF);
            initZif.Disable(eprom.ChipEnable, translator.ToZIF);
            initZif.Disable(eprom.OutputEnable, translator.ToZIF);
            initZif.Disable(eprom.Program, translator.ToZIF);
            WriteZIF(initZif, "Apply 1 to all data and address pins");

            SetVppLevel(eprom.VppLevel);
            ApplyVpp(translator.ToZIF, eprom.VppPins);
            PullUpsEnable(true);

            using (var progress = new ProgressBar(Shouter, totalNumberOfAdresses))
            {
                progress.Init();
                foreach (var address in Enumerable.Range(0, totalNumberOfAdresses))
                {
                    //if(patch != null)
                    //{
                    //  if(!patch.Contains(address))
                    //    continue;
                    //  progress.Shout("Now patching address {0}", address);
                    //}

                    var zif = new ZIFSocket(40);

                    // Pull up all pins
                    zif.SetAll(true);

                    zif.Disable(eprom.GndPins, translator.ToZIF);
                    zif.Enable(eprom.Constants, translator.ToZIF);
                    zif.Disable(eprom.Program, translator.ToZIF);
                    zif.Disable(eprom.ChipEnable, translator.ToZIF);
                    zif.Disable(eprom.OutputEnable, translator.ToZIF);

                    // Set address and data
                    eprom.SetAddress(zif, address);
                    var data = eprom.DataPins.Length > 8
            ? new[] { bytes[2 * address], bytes[2 * address + 1] }
            : new[] { bytes[address] };
                    eprom.SetData(zif, data);

                    // Prepare ZIF without programming in order to let it stabilize
                    // TODO: Do we really need to do this?
                    WriteZIF(zif, "Write address & data to ZIF");

                    // In order to let the boost converter for manual Vcc
                    // spin up to full output voltage.
                    if (address == 0 && eprom.InitialProgDelay != 0)
                    {
                        BulkDevice.Delay(eprom.InitialProgDelay);
                    }

                    // Enter programming mode
                    zif.Enable(eprom.Program, translator.ToZIF);
                    zif.Enable(eprom.ChipEnable, translator.ToZIF);
                    WriteZIF(zif, "Start pulse E");

                    // Exit programming mode after at least <pulse> ms
                    zif.Disable(eprom.Program, translator.ToZIF);
                    zif.Disable(eprom.ChipEnable, translator.ToZIF);
                    BulkDevice.Delay(eprom.ProgPulse);
                    WriteZIF(zif, "End pulse E");

                    progress.Progress();
                }
            }
        }
Esempio n. 18
0
        public Eprom LoadEprom()
        {
            int[] pages = { 1, 2, 3, 4 };
            Eprom eprom = new Eprom();

            for (int page = 0; page < pages.Length; page++)
            {
                for (int line = 0; line < 16; line++)
                {
                    string          data   = platformIO.Read(platformIO.Options.Device, pages[page], line * 16, 16);
                    ResultOperation Result = platformIO.LastOperation;

                    switch (Result)
                    {
                    case ResultOperation.Succes:

                        if (data.Length == 32)
                        {
                            for (int i = 0; i < 16; i++)
                            {
                                string ch = data.Substring(i * 2, 2);
                                eprom[pages[page] - 1][line * 16 + i] = byte.Parse(ch, NumberStyles.AllowHexSpecifier);
                            }
                        }
                        else
                        {
                            throw new Exception("Произошла ошибка при передаче данных приложению!");
                        }

                        lock (sync) if (eCompleteReadEpromLine != null)
                            {
                                eCompleteReadEpromLine(this, new EventArgs());
                            }
                        break;

                    case ResultOperation.Timeout:

                        if (eTimeoutReadEpromLine != null)
                        {
                            eTimeoutReadEpromLine(this, new EventArgs());
                        }
                        return(null);

                    case ResultOperation.MorePopit:

                        if (eMorePopitReadEpromLine != null)
                        {
                            eMorePopitReadEpromLine(this, new EventArgs());
                        }
                        return(null);

                    default:

                        return(null);
                    }

                    Thread.Sleep(platformIO.Options.TimeoutBetweenAttemptsToReadWrite);
                    lock (sync)
                    {
                        if (toBreak)
                        {
                            toBreak = false;
                            return(null);
                        }
                    }
                }
            }
            return(eprom);
        }
Esempio n. 19
0
        /// <summary>
        /// Сохранить таблицу калибровки в файл
        /// </summary>
        /// <param name="table">Таблица калибровки, которую необходимо сохранить</param>
        /// <param name="eprom">Виртуальный eprom устройства</param>
        public void SaveCalibrationTableToDevice(CalibrationTable table, Eprom eprom)
        {
            try
            {
                int[] Indices = { 0x0400, 0x0430, 0x0460, 0x0490, 0x04C0, 0x04F0, 0x0520, 0x0550 };
                foreach (int index in Indices)
                {
                    if (eprom.GetByte(index) == table.Name)
                    {
                        string protectStart = "@JOB#000#" + string.Format("{0:X2}", platformIO.Options.Device) +
                                              platformIO.Options.ProtectionStart + "$";
                        platform.SendPacket(new Packet(protectStart, DateTime.Now, null));

                        for (int line = 0; line < calibrationTableCountLines; line++)
                        {
                            int offset = index + (line * 16);

                            int pageNumber = (int)(offset / 256);
                            int offsetPage = (int)(offset % 256);

                            string data = string.Empty;
                            for (int byteIndex = 0; byteIndex < calibrationLineByteCount; byteIndex++)
                            {
                                data += string.Format("{0:X2}", eprom.GetByte(offset++));
                            }

                            platformIO.Write(platformIO.Options.Device, pageNumber, offsetPage, 16, data);
                            switch (platformIO.LastOperation)
                            {
                            case ResultOperation.Succes:

                                if (eSaveCompleteReadEpromLine != null)
                                {
                                    eSaveCompleteReadEpromLine(this, new EventArgs());
                                }
                                break;

                            case ResultOperation.Timeout:

                                if (eSaveTimeoutReadEpromLine != null)
                                {
                                    eSaveTimeoutReadEpromLine(this, new EventArgs());
                                }
                                return;

                            case ResultOperation.MorePopit:

                                if (eSaveMorePopitReadEpromLine != null)
                                {
                                    eSaveMorePopitReadEpromLine(this, new EventArgs());
                                }
                                return;

                            default:

                                return;
                            }
                        }
                    }
                }
            }
            finally
            {
                string protectEnd = "@JOB#000#" + string.Format("{0:X2}", platformIO.Options.Device) +
                                    platformIO.Options.ProtectionEnd + "$";
                platform.SendPacket(new Packet(protectEnd, DateTime.Now, null));
            }
        }
Esempio n. 20
0
        /// <summary>
        /// Reads an EPROM.
        /// </summary>
        /// <param name="eprom">The EPROM type.</param>
        /// <param name="progressBar">The progress bar.</param>
        /// <param name="bytes">The list that accumulates the read bytes.</param>
        /// <param name="fromAddress">Start reading this address.</param>
        /// <param name="totalNumberOfAdresses">The total number of adesses.</param>
        /// <returns>The next adress to be read.</returns>
        public int ReadEprom(
            Eprom eprom,
            ProgressBar progressBar,
            IList <byte> bytes,
            int fromAddress,
            int totalNumberOfAdresses)
        {
            const int rewriteCount = 5;
            const int rereadCount  = 5;

            Shouter.ShoutLine(2, "Reading EPROM{0}", eprom.Type);
            SetVccLevel(eprom.VccLevel);
            var translator = eprom.GetPinTranslator(ZIFType);

            ApplyVcc(translator.ToZIF, eprom.VccPins);
            ApplyGnd(translator.ToZIF, eprom.GndPins);
            PullUpsEnable(true);

            var zif           = new ZIFSocket(ZIFType);
            var returnAddress = fromAddress;

            Shouter.ShoutLine(2, "Now reading bytes...");
            progressBar.Init();
            foreach (var address in Enumerable.Range(fromAddress, totalNumberOfAdresses - fromAddress))
            {
                zif.SetAll(true);
                zif.Disable(eprom.GndPins, translator.ToZIF);
                zif.Enable(eprom.Constants, translator.ToZIF);
                zif.Enable(eprom.ChipEnable, translator.ToZIF);
                zif.Enable(eprom.OutputEnable, translator.ToZIF);

                eprom.SetAddress(zif, returnAddress = address);


                ZIFSocket resultZIF = null;
                var       result    = ReadSoundness.TryRewrite;

                for (var i = 0; i < rewriteCount; i++)
                {
                    if (result == ReadSoundness.SeemsToBeAOkay)
                    {
                        break;
                    }

                    if (result == ReadSoundness.TryRewrite)
                    {
                        if (i > 0)
                        {
                            progressBar.Shout("A: {0}; WS: {1}ms", address.ToString("X4"), 100 * i);
                        }
                        WriteZIF(zif, String.Format("A: {0}", address.ToString("X4")));
                        if (i > 0)
                        {
                            Thread.Sleep(100 * i);
                        }
                        result = ReadSoundness.TryReread;
                    }

                    for (var j = 0; j < rereadCount; j++)
                    {
                        if (result != ReadSoundness.TryReread)
                        {
                            break;
                        }

                        if (j > 0)
                        {
                            progressBar.Shout("A: {0}; WS: {1}ms; RS: {2}ms", address.ToString("X4"), 100 * i, 100 * (j * i));
                            Thread.Sleep(100 * (j * i));
                        }
                        var readZifs = ReadZIF(String.Format("for address {0}", address.ToString("X4")));
                        result = Tools.AnalyzeEpromReadSoundness(readZifs, eprom, address, out resultZIF);
                        if (j == rereadCount - 1)
                        {
                            result = ReadSoundness.TryRewrite;
                        }
                        if (result == ReadSoundness.SeemsToBeAOkay && j > 0)
                        {
                            progressBar.Shout("Address: {0} read }};-P", address.ToString("X4"));
                        }
                    }
                }

                if (result != ReadSoundness.SeemsToBeAOkay)
                {
                    return(returnAddress);
                }

                foreach (var b in eprom.GetData(resultZIF))
                {
                    bytes.Add(b);
                }

                progressBar.Progress();
            }
            return(returnAddress + 1);
        }