Reverse Engineering att emulera bläckpatroner för skrivare Epson (3 / 8 steg)
Steg 3: Grundläggande koden rutiner
Vad jag ville göra var läste ut Rom från bläck vagnar och sedan använda dem att försöka efterlikna saknade bläckpatronen jag inte har. Detta innebär att skapa ett bibliotek som fungerar som en värd att läsa data men kan också användas för att emulera en bläckpatron.Med tidigare kunskap från att skapa programvara baserat protokoll har skapat jag en header-fil med dessa funktioner:
• extern void epsnCartInit(void);
• extern void epsnCartStart (unsigned char addr, unsigned char skriva);
• extern void epsnCartStop(void);
• extern void epsnCartWrite (unsigned char data);
• extern unsigned char epsnCartRead(void);
Jag skapade också följande definitioner som hjälper till med att komma ihåg vilka stift var vad:
För du mikrokontroller måste du ändra dessa värden för att passa din ansökan
#define _ecSCKTRIS TRISCbits.TRISC0 #define _ecSCKLat LATCbits.LATC0 #define _ecSCK PORTCbits.RC0 #define wait() DelayUS(50)
#define _ecSDATRIS TRISCbits.TRISC1
#define _ecRSTTRIS TRISCbits.TRISC2
#define _ecVDDTRIS TRISBbits.TRISB1
#define _ecSDALat LATCbits.LATC1
#define _ecRSTLat LATCbits.LATC2
#define _ecVDDLat LATBbits.LATB0
#define _ecSDA PORTCbits.RC1
#define _ecRST PORTCbits.RC2
#define _ecVDD PORTBbits.RB1
Obs: Jag använde en PIC18F och används spärrarna för att ställa utgångarna, det är bara min preferens i valet. Du är välkommen att använda en mikrokontroller som du är bekant med.
void epsnCartInit() { _epsnCartSCK = 0; _epsnCartSCKLat = 0;
_epsnCartSCKTRIS = 0;
_epsnCartSDATRIS = 0;
_epsnCartRSTTRIS = 0;
_epsnCartVDDTRIS = 0;
_epsnCartSDA = 0;
_epsnCartRST = 0;
_epsnCartVDD = 0;
_epsnCartSCKLat = 0;
_epsnCartSCKLat = 0;
_epsnCartSCKLat = 0;
}
Funktionen start drar VDD hög, väntar, sedan sätter SDA enligt adress bit samt SCK. Väntar, drar SCK låg, väntar ännu en gång och sedan drar SDA hög följaktligen till adressen. Detta upprepas 2 gånger utom på den 4: e gången, SDA ligger lågt för att vi vill läsa data i EEPROMs inte skriva.
void epsnCartStart (unsigned char addr, unsigned char skriva) { _ecVDDLat = 1; Ställa in VDD hög tmp = addr; Kopiera adressen till variabeln temp While(i<4) { wait(); Vänta ungefär 50uS
char jag = 0; Används för att räkna
röding tmp = 0; / / Temp lagring variabel
DelayMS(1); Vänta på EEPROMs redo
_ecRSTLat = 1; Aktivera EEPROMs för kommunikation
IF(Write) {/ / om vi vill skriva
Temp | = 0x08; Ange den 4: e lite höga (' |' betyder eller)
}
_ecSDALat = (tmp & 0x01); Inställd SDA hög eller låg enligt LSB
_ecSCKLat = 1; Set Clock hög
wait(); Vänta en annan 50uS
_ecSCKLat = 0; Ställa in klockan låg
wait(); Vänta en annan 50uS
tmp >> = 1; Just flytta alla bitar i tmp av en
i ++; ökas räknaren med ett
}
}
Nästa funktion att genomföra är stopp:
void epsnCartStop() {
_ecRSTLat = 0; Ange första låg
DelayMS(1); Vänta lite
_ecVDDLat = 0; Stäng av EEPROMS
}
Och slutligen funktionen Läs: While(i<8) { i ++; Ökas räknaren med 1
unsigned char epsnCartRead() {
char jag = 0;
char temp = 0x00;
Temp >> = 1; Högerskift variabeln temp av en
_ecSCKLat = 1; SCK högt
wait(); Vänta ungefär 50uS
IF(_ecSDA) {/ / om SDA är hög
Temp | = 0x80; Sedan lite set 7 hög
}
_ecSCKLat = 0; Föra SCK låg igen
wait(); vänta en annan 50uS
}
returnera härda; Gå tillbaka vad vi har läst
}
Nu har vi de grundläggande funktionerna som vi behöver för att läsa data från bläckpatronerna, låter vår microcontroller och angett resultaten.