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

100 lines
3.5 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 <QString>
#include "types.h"
#include "e2awinfo.h"
#include "e24xx-5.h" // Header file
#include "errcode.h"
#include "eeptypes.h"
E24xx5::E24xx5(e2AppWinInfo *wininfo, BusIO *busp)
: E24xx(wininfo, busp, 128)
{
// writepage_size = E2Profile::GetI2CPageWrite();
// E2Profile::SetI2CPageWrite(writepage_size);
writepage_size = 32;
base_addr = 0x00; // 24C325 or 24C645 use non standard I2C Bus address, Probe() will try ALL possible I2C Adresses from 0x00 to 0xFE
}
E24xx5::~E24xx5()
{
}
int E24xx5::Write(int probe, int type)
{
E24xx5::Probe(0);
if (type & PROG_TYPE)
{
//Enable writing
uint8_t buffer[4];
buffer[0] = 0xFF; //last address (Write protect register)
buffer[1] = 0x02; //set WEL bit
if (GetBus()->StartWrite(eeprom_addr[n_bank - 1], buffer, 2) != 2)
{
return GetBus()->Error();
}
buffer[0] = 0xFF; //last address (Write protect register)
buffer[1] = 0x06; //set RWEL+WEL bit
if (GetBus()->StartWrite(eeprom_addr[n_bank - 1], buffer, 2) != 2)
{
return GetBus()->Error();
}
buffer[0] = 0xFF; //last address (Write protect register)
buffer[1] = 0x02; //reset WPEN, BP1, BP0 (disable any write protection)
if (GetBus()->Write(eeprom_addr[n_bank - 1], buffer, 2) != 2)
{
return GetBus()->Error();
}
//Ack polling
int k;
for (k = timeout_loop; k > 0 && GetBus()->Read(eeprom_addr[0], buffer, 1) != 1; k--)
{
qApp->processEvents();
}
if (k == 0)
{
return E2P_TIMEOUT;
}
}
return E24xx::Write(probe);
}