ponyprog/SrcPony/e2401.cpp
Claudio Lanconelli 1ea8c14e75 fix year
2020-02-05 17:23:29 +01:00

211 lines
4.7 KiB
C++

//=========================================================================//
// //
// PonyProg - Serial Device Programmer //
// //
// Copyright (C) 1997-2020 Claudio Lanconelli //
// //
// http://ponyprog.sourceforge.net //
// //
//-------------------------------------------------------------------------//
// //
// 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 version2 of //
// the License, or (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU //
// General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program (see LICENSE); if not, write to the //
// Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. //
// //
//=========================================================================//
#include "types.h"
#include "e2awinfo.h"
#include "e2401.h" // Header file
#include "errcode.h"
#include "eeptypes.h"
#include <QDebug>
mE2401::mE2401(e2AppWinInfo *wininfo, BusIO *busp, int def_banksize)
: Device(wininfo, busp, def_banksize),
timeout_loop(200),
sequential_read(1), // lettura di un banco alla volta
writepage_size(1) // scrittura di un byte alla volta (no page write)
{
}
//Determina a quali indirizzi I2C si mappa, e
// se probe_size == 1 anche la dimensione (numero di banchi)
int mE2401::Probe(int probe_size)
{
int retval = 1;
uint8_t ch;
qDebug() << "mE2401::Probe(" << probe_size << ") - IN";
if (GetBus()->Read(0, &ch, 1) != 1)
{
retval = GetBus()->Error();
if (retval == IICERR_NOADDRACK)
{
retval = 0;
}
}
qDebug() << "mE2401::Probe(" << probe_size << ") - OUT";
return retval;
}
int mE2401::Read(int probe, int type)
{
long size = GetSize();
int error = Probe(probe);
if (error < 0)
{
return error;
}
GetBus()->ReadStart();
if (type & PROG_TYPE)
{
if (sequential_read)
{
if (GetBus()->Read(0, GetBufPtr(), size) < size)
{
return GetBus()->Error();
}
}
else
{
int k;
for (k = 0; k < size; k++)
{
if (GetBus()->Read(k, GetBufPtr() + k, 1) != 1)
{
return GetBus()->Error();
}
if (GetBus()->ReadProgress((k + 1) * 100 / size))
{
return OP_ABORTED;
}
}
}
}
GetBus()->ReadEnd();
return size;
}
int mE2401::Write(int probe, int type)
{
long size = GetSize();
int error = Probe(probe);
if (error < 0)
{
return error;
}
GetBus()->WriteStart();
if (type & PROG_TYPE)
{
int j;
uint8_t ch;
for (j = 0; j < size; j += writepage_size)
{
if (GetBus()->Write(j, GetBufPtr() + j, writepage_size) != writepage_size)
{
return GetBus()->Error();
}
int k;
for (k = timeout_loop; k > 0 && GetBus()->Read(j, &ch, 1) != 1; k--)
;
if (k == 0)
{
return E2P_TIMEOUT;
}
if (GetBus()->WriteProgress((j + 1) * 100 / size))
{
return OP_ABORTED;
}
}
}
GetBus()->WriteEnd();
return size;
}
int mE2401::Verify(int type)
{
Probe();
long size = GetSize();
unsigned char *localbuf = new unsigned char[size];
GetBus()->ReadStart();
int rval = 1;
if (type & PROG_TYPE)
{
if (sequential_read)
{
if (GetBus()->Read(0, localbuf, size) < size)
{
return GetBus()->Error();
}
}
else
{
int k;
for (k = 0; k < size; k++)
{
if (GetBus()->Read(k, localbuf + k, 1) != 1)
{
rval = GetBus()->Error();
break;
}
if (GetBus()->ReadProgress((k + 1) * 100 / size))
{
rval = OP_ABORTED;
break;
}
}
}
if (memcmp(GetBufPtr(), localbuf, size) != 0)
{
rval = 0;
}
}
GetBus()->ReadEnd();
delete[] localbuf;
return rval;
}