@@ -25,7 +25,7 @@ int requestFirmware(int fd);
2525int 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
3131int readAnswer (int fd , long msec );
@@ -37,7 +37,7 @@ int readEprom(int fd, e_rom_type romtype, char* filename, long msec);
3737int 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
4343int 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