Skip to content

Commit b4c4043

Browse files
committed
paged write, enable disable sdp working ok
1 parent b9df948 commit b4c4043

File tree

5 files changed

+188
-83
lines changed

5 files changed

+188
-83
lines changed

Arduino/AT28C_Programmer/AT28C.cpp

Lines changed: 83 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414
//******************************************************************************************************************//
1515
void setDataBusMode(int mode)
1616
{
17-
if (mode == INPUT || mode == OUTPUT) {
18-
for (int i = 0; i < 8; i++) {
19-
pinMode(dataPins[i], mode);
20-
}
21-
}
17+
if (mode == INPUT || mode == OUTPUT) {
18+
for (int i = 0; i < 8; i++) {
19+
pinMode(dataPins[i], mode);
20+
}
21+
}
2222
}
2323

2424
//******************************************************************************************************************//
@@ -28,7 +28,7 @@ byte readByte(unsigned int address) {
2828

2929
// Imposta il bus dati in input
3030
setDataBusMode(INPUT);
31-
31+
3232
digitalWrite(EEPROM_CE_PIN, HIGH);
3333
digitalWrite(EEPROM_OE_PIN, HIGH);
3434
digitalWrite(EEPROM_WE_PIN, HIGH);
@@ -68,20 +68,18 @@ byte writeByte(unsigned int address, byte value)
6868
digitalWrite(EEPROM_CE_PIN, HIGH);
6969
digitalWrite(EEPROM_OE_PIN, HIGH);
7070
digitalWrite(EEPROM_WE_PIN, HIGH);
71-
delayMicroseconds(1);
7271

7372
// Imposta il bus di dati in output
74-
setDataBusMode(OUTPUT);
73+
setDataBusMode(OUTPUT);
7574

7675
// Imposta indirizzo
7776
addressWrite(address);
7877

7978
// Scrittura pins D2/D9 (Bus Dati)
80-
for (int i = 0; i < 8; i++)
81-
{
82-
//int a = (value & (1 << i)) > 0;
83-
digitalWrite(dataPins[i], bitRead(value, i));
84-
}
79+
for (int i = 0; i < 8; i++)
80+
{
81+
digitalWrite(dataPins[i], bitRead(value, i));
82+
}
8583
delayMicroseconds(1);
8684

8785
digitalWrite(EEPROM_CE_PIN, LOW);
@@ -93,9 +91,43 @@ byte writeByte(unsigned int address, byte value)
9391
digitalWrite(EEPROM_WE_PIN, HIGH);
9492
delayMicroseconds(1);
9593

94+
digitalWrite(EEPROM_CE_PIN, HIGH);
95+
delayMicroseconds(1);
96+
97+
return value;
98+
}
99+
100+
//******************************************************************************************************************//
101+
//* Scrittura di una pagina di 64 byte all'indirizzo selezionato
102+
//******************************************************************************************************************//
103+
byte writePage(unsigned int address, byte* page, unsigned int size)
104+
{
105+
digitalWrite(EEPROM_CE_PIN, HIGH);
106+
digitalWrite(EEPROM_OE_PIN, HIGH);
107+
digitalWrite(EEPROM_WE_PIN, HIGH);
108+
109+
// Imposta il bus di dati in output
110+
setDataBusMode(OUTPUT);
111+
112+
byte value; // valore da scrivere, ultimo valore scritto
113+
for (unsigned int idx = 0; idx < size; idx++) {
114+
value = writeByte(address + idx, page[idx]);
115+
}
116+
117+
return value;
118+
}
119+
120+
//******************************************************************************************************************//
121+
//* Attende il termine della scrittura di un byte e ne verifica la corretta valorizzazione
122+
//******************************************************************************************************************//
123+
byte waitAndCheckWrite(byte value)
124+
{
96125
// Imposta il bus dati in input
97126
setDataBusMode(INPUT);
98127

128+
digitalWrite(EEPROM_CE_PIN, LOW);
129+
delayMicroseconds(1);
130+
99131
digitalWrite(EEPROM_OE_PIN, LOW);
100132
delayMicroseconds(1);
101133

@@ -118,6 +150,7 @@ byte writeByte(unsigned int address, byte value)
118150

119151
digitalWrite(EEPROM_OE_PIN, HIGH);
120152
delayMicroseconds(1);
153+
121154
digitalWrite(EEPROM_CE_PIN, HIGH);
122155
delayMicroseconds(1);
123156

@@ -128,29 +161,12 @@ byte writeByte(unsigned int address, byte value)
128161
//* Lettura della EEPROM
129162
//******************************************************************************************************************//
130163
void readEEPROM(unsigned int size) {
131-
//Serial.println("START DUMP (" + (String)size + " byte)");
132-
133164
unsigned int addr = 0;
134165

135-
// Azzera lo shift register
136-
//addressWrite(0x0000);
137-
138-
// byte buffer[256];
139-
// int index = 0;
140166
for (int i = 0; i < size; i++) {
141167
byte bval = readByte(addr + i);
142-
// buffer[index] = bval;
143-
// index ++;
144-
//Serial.println(bval, DEC);
145-
146-
// if (index == 256) {
147-
// Serial.write(buffer, 1);
148-
// index = 0;
149-
// }
150-
Serial.write(&bval, 1);
168+
Serial.write(&bval, 1);
151169
}
152-
153-
//Serial.println("END DUMP");
154170
}
155171

156172
//******************************************************************************************************************//
@@ -159,16 +175,48 @@ void readEEPROM(unsigned int size) {
159175
void writeEEPROM(unsigned int size)
160176
{
161177
unsigned int address = 0;
162-
//for (unsigned int i = 1; i <= size; i++)
178+
163179
while (address < size)
164180
{
181+
// single byte write
165182
byte val = 0;
166183
if (Serial.available() > 0) {
167184
val = Serial.read();
168-
byte wval = writeByte(address, val);
185+
writeByte(address, val);
186+
byte wval = waitAndCheckWrite(val);
169187
Serial.write(&wval, 1);
170188
address++;
171-
}
189+
}
190+
}
191+
}
192+
193+
//******************************************************************************************************************//
194+
//* Scrittura della EEPROM in modo paginato
195+
//******************************************************************************************************************//
196+
void writePagedEEPROM(unsigned int size, unsigned int pagesize)
197+
{
198+
unsigned int address = 0;
199+
200+
while (address < size)
201+
{
202+
// page write
203+
unsigned int idx = 0;
204+
#define PAGE_SIZE 64
205+
byte page[PAGE_SIZE];
206+
while (idx < PAGE_SIZE) {
207+
if (Serial.available() > 0) {
208+
page[idx++] = Serial.read();
209+
}
210+
}
211+
byte val = writePage(address, page, PAGE_SIZE);
212+
byte wval = waitAndCheckWrite(val);
213+
// feedback al programmatore dei bytes letti da EPROM
214+
idx = 0;
215+
while (idx < PAGE_SIZE) {
216+
byte val = readByte(address + idx++);
217+
Serial.write(&val, 1);
218+
}
219+
address += PAGE_SIZE;
172220
}
173221
}
174222

@@ -193,4 +241,4 @@ void enableSDP()
193241
writeByte(0x5555, 0xaa);
194242
writeByte(0x2aaa, 0x55);
195243
writeByte(0x5555, 0xa0);
196-
}
244+
}

Arduino/AT28C_Programmer/AT28C.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ byte writeByte(unsigned int address, byte value);
2222
//******************************************************************************************************************//
2323
void writeEEPROM(unsigned int size);
2424

25+
//******************************************************************************************************************//
26+
//* Scrittura della EEPROM in modo paginato
27+
//******************************************************************************************************************//
28+
void writePagedEEPROM(unsigned int size, unsigned int pagesize);
29+
2530
//******************************************************************************************************************//
2631
//* Lettura della EEPROM
2732
//******************************************************************************************************************//

Arduino/AT28C_Programmer/AT28C_Programmer.ino

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,11 @@ void ParseComands(String s) {
132132
GetComandParams(s, params);
133133
// Serial.println("PARAM: " + params[0]);
134134
if (params[0] != "") {
135-
writeEEPROM(params[0].toInt());
135+
if (params[1] != "") {
136+
writePagedEEPROM(params[0].toInt(), params[1].toInt());
137+
} else {
138+
writeEEPROM(params[0].toInt());
139+
}
136140
//Serial.println("+++");
137141
}
138142
}

Linux/AT28CProgrammer/AT28CProgrammer.c

Lines changed: 70 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ int requestFirmware(int fd);
2525
int requestRead(int fd, e_rom_type romtype);
2626

2727
// invia il comando di richiesta scrittura della memoria
28-
int requestWrite(int fd, e_rom_type romtype);
28+
int requestWrite(int fd, e_rom_type romtype, bool paged);
2929

3030
// legge e visualizza la risposta dal programmatore
3131
int readAnswer(int fd, long msec);
@@ -37,7 +37,7 @@ int readEprom(int fd, e_rom_type romtype, char* filename, long msec);
3737
int verifyEprom(int fd, e_rom_type romtype, char* filename, long msec);
3838

3939
// invia al prorammatore i dati da scrivere leggendoli dal file indicato, per ogni byte attende al massimo msecforbyte millisecondi
40-
int writeEprom(int fd, e_rom_type romtype, char* filename, long msecforbyte);
40+
int writeEprom(int fd, e_rom_type romtype, bool paged, char* filename, long msecforbyte);
4141

4242
// setup Software Data Protection
4343
int setupSDP(int fd, bool enable, long msec);
@@ -56,6 +56,9 @@ int main (int argc, char **argv) {
5656
// indicatore operazione
5757
char operation = 0;
5858

59+
// indicatore operazione paginata
60+
bool paged = false;
61+
5962
// nome del device seriale a cui è collegato il programmatore
6063
char *device = NULL;
6164

@@ -92,6 +95,10 @@ int main (int argc, char **argv) {
9295
// opzione per la scrittura della memoria
9396
if (optarg[0] == 'w') {
9497
operation = 'w';
98+
// opzione per la scrittura della memoria paginata
99+
if (optarg[1] == 'p') {
100+
paged = true;
101+
}
95102
// opzione per la verifica della memoria
96103
} else if (optarg[0] == 'v') {
97104
operation = 'v';
@@ -266,13 +273,13 @@ int main (int argc, char **argv) {
266273
}
267274
} else {
268275
// invia il comando di richiesta scrittura della memoria selezionata
269-
if (requestWrite(fd, romtype) == -1) {
276+
if (requestWrite(fd, romtype, paged) == -1) {
270277
close(fd);
271278
printf("error request write eprom\n");
272279
return -1;
273280
}
274281
// invia il contenuto del file da scrivere, per ogny byte scritto attende al massimo 10 ms per la scrittura
275-
if (writeEprom(fd, romtype, filename, 100) == -1) {
282+
if (writeEprom(fd, romtype, paged, filename, 100) == -1) {
276283
close(fd);
277284
printf("error write eprom\n");
278285
return -1;
@@ -350,15 +357,25 @@ int requestRead(int fd, e_rom_type romtype) {
350357
}
351358

352359
// invia il comando di richiesta scrittura della memoria
353-
int requestWrite(int fd, e_rom_type romtype) {
360+
int requestWrite(int fd, e_rom_type romtype, bool paged) {
354361
tcflush(fd, TCIOFLUSH);
355362

356-
const char* cmdWriteAT28C64 = "WRITEEEPROM=8192\r";
357-
const char* cmdWriteAT28C256 = "WRITEEEPROM=32768\r";
358363
if (romtype == AT28C64) {
359-
return write(fd, cmdWriteAT28C64, strlen(cmdWriteAT28C64));
364+
if (paged) {
365+
const char* cmdWrite = "WRITEEEPROM=8192,64\r";
366+
return write(fd, cmdWrite, strlen(cmdWrite));
367+
} else {
368+
const char* cmdWrite = "WRITEEEPROM=8192\r";
369+
return write(fd, cmdWrite, strlen(cmdWrite));
370+
}
360371
} else if (romtype == AT28C256) {
361-
return write(fd, cmdWriteAT28C256, strlen(cmdWriteAT28C256));
372+
if (paged) {
373+
const char* cmdWrite = "WRITEEEPROM=32768,64\r";
374+
return write(fd, cmdWrite, strlen(cmdWrite));
375+
} else {
376+
const char* cmdWrite = "WRITEEEPROM=32768\r";
377+
return write(fd, cmdWrite, strlen(cmdWrite));
378+
}
362379
}
363380
return -1;
364381
}
@@ -556,9 +573,9 @@ int verifyEprom(int fd, e_rom_type romtype, char* filename, long msec) {
556573
}
557574

558575
// invia al prorammatore i dati da scrivere leggendoli dal file indicato, per ogni byte attende al massimo msecforbyte millisecondi
559-
int writeEprom(int fd, e_rom_type romtype, char* filename, long msecforbyte) {
560-
int totalbytes = 0;
561-
int written = 0;
576+
int writeEprom(int fd, e_rom_type romtype, bool paged, char* filename, long msecforbyte) {
577+
size_t totalbytes = 0;
578+
size_t written = 0;
562579
int lastperc = -1;
563580
if (romtype == AT28C64) {
564581
totalbytes = 8192;
@@ -572,36 +589,52 @@ int writeEprom(int fd, e_rom_type romtype, char* filename, long msecforbyte) {
572589
return -1;
573590
}
574591
char c;
575-
while (read(readfd, &c, 1) == 1) {
576-
write(fd, &c, 1);
577-
578-
fd_set rfds;
579-
struct timeval tv;
580-
int retval;
581-
582-
FD_ZERO(&rfds);
583-
FD_SET(fd, &rfds);
584-
585-
tv.tv_sec = (msecforbyte * 1000) / 1000000;
586-
tv.tv_usec = (msecforbyte * 1000) % 1000000;
592+
size_t blocksize = paged ? 64 : 1;
593+
unsigned char buf[blocksize];
594+
while (read(readfd, buf, blocksize) == blocksize) {
595+
write(fd, buf, blocksize);
596+
597+
size_t recvd = 0;
598+
unsigned char rbuf[blocksize];
599+
while (recvd < blocksize) {
600+
fd_set rfds;
601+
struct timeval tv;
602+
int retval;
603+
604+
FD_ZERO(&rfds);
605+
FD_SET(fd, &rfds);
606+
607+
tv.tv_sec = (msecforbyte * 1000) / 1000000;
608+
tv.tv_usec = (msecforbyte * 1000) % 1000000;
609+
610+
retval = select(fd + 1, &rfds, NULL, NULL, &tv);
611+
if (retval == -1) {
612+
printf("error select\n");
613+
return -1;
614+
} else if (retval > 0) {
615+
char rc;
616+
recvd += read(fd, rbuf + recvd, blocksize - recvd);
617+
} else {
618+
// timeout attesa risposta scrittura byte
619+
printf("write timeout\n");
620+
break;
621+
}
622+
}
587623

588-
retval = select(fd + 1, &rfds, NULL, NULL, &tv);
589-
if (retval == -1) {
590-
printf("error select\n");
591-
return -1;
592-
} else if (retval > 0) {
593-
char rc;
594-
read(fd, &rc, 1);
595-
if (rc != c) {
596-
printf("-> written byte: 0x%02X, read byte: 0x%02X\r", (unsigned char)c, (unsigned char)rc);
597-
break;
624+
bool err = false;
625+
for (size_t idx = 0; idx < blocksize; idx++) {
626+
if (rbuf[idx] != buf[idx]) {
627+
printf("\n-> written byte: 0x%02X, read byte: 0x%02X\n", buf[idx], rbuf[idx]);
628+
err = true;
629+
break;
598630
}
599-
} else {
600-
// timeout attesa risposta scrittura byte
631+
}
632+
633+
if (err) {
601634
break;
602635
}
603636

604-
written++;
637+
written += blocksize;
605638
int perc = written * 100 / totalbytes;
606639
if (perc != lastperc) {
607640
printf("-> write percent: %d%%\r", perc);

0 commit comments

Comments
 (0)