Reverse Engineering att emulera bläckpatroner för skrivare Epson (7 / 8 steg)
Steg 7: Emulering kod rutiner
Nu roligt del!Jag behöver skrivaren att tänka att det finns fyra bläckpatronerna, för att göra detta måste vi genomföra vissa emulering funktioner först. Igen från tidigare kunskaper har jag fördefinierade dessa i huvudet:
• #define epsnCartReady() (_ecRST)
• extern unsigned char espnCartGetAddr(void);
• extern void epsnCartOut (unsigned char data);
• extern unsigned char epsnCartIn (unsigned char data);
epsnCartReady är ett makro som används kontrollera om skrivaren har RST högt.
epsnCartGetAddr returnerar adressen som skrivarhuvudet begär.
epsnCartOut används för att skicka data till den mottagande flygledaren
epsnCartIn används för att ta emot data från värden när det är att skriva
Så den här gången, istället för att kontrollera SCK gå högt eller lågt, vi behöver det för att vänta för att det ska gå högt eller lågt, men om Återställ går låg, sedan stoppa allt och tillbaka:
unsigned char espnCartGetAddr(void) { medan ((i<4) & & _ecRST) {/ / Loop medan jag < 4 och RST är hög IF(_ecRST == 0) {
char jag = 0;
char temp = 0x00;
Temp >> = 1; Höger Skift Temp av en
While((!_ecSCK) & & (_ecRST)); Vänta på klockan för att gå högt
IF(_ecSDA) {/ / endast om SDA är hög
Temp | = 0x08; Ange sedan den 4: e lite
}
While((_ecSCK) & & (_ecRST)) ;// vänta på klockan för att gå lågt
i ++; ökar värdet för räknaren
}
returnera 0xFF; //if RST gick låg, medel värd dödade signalen
}
returnera härda; returnera adressen och den läsa/skriva lite
}
Och funktionen ut:
void epsnCartOut (unsigned char data) { _ecSDATRIS = 0; ställa in SDA till utgång medan ((i<8) & & _ecRST) {/ / Loop medan jag < 8 och första är hög medan (_ecSCK & & _ecRST); Vänta på SCK gå låg
char jag = 0;
char temp = data;
_ecSDALat = 0; lågt satt SDA
medan (! _ecSCK & & _ecRST); Vänta på SCK gå höga
_ecSDALat = temp & 0x01; Ställa in SDA hög eller låg enligt den första biten
Temp >> = 1; Högerskift data av en
i ++; ökas räknaren med ett
}
_ecSDATRIS = 1; Ställ in SDA till en utgång
_ecSDA = 1; inte säker på om detta är nödvändigt
}
Och slutligen i funktionen:
unsigned char epsnCartIn(void) { medan ((i<8) & & _ecRST) {/ / Loop medan jag < 8 och första är hög medan (_ecSCK & & _ecRST) ;// vänta på SCK gå låg
unsigned char jag = 0;
char temp = 0x00;
Temp >> = 1; Högerskift temp av en
medan (! _ecSCK & & _ecRST); Vänta på SCK gå högt
IF(_ecSDA) {//only id SDA är hög
Temp | = 0x80; Ange 8 bit
}
i ++; Ökas räknaren med ett
}
returnera härda; gå tillbaka vad vi har fått
}