// Firmware und Seriennummer brennen #define WIN32_LEAN_AND_MEAN #define STRICT #define WINVER 0x0500 #include #pragma comment(linker, "/NOD /OPT:NOWIN98 /ALIGN:4096 /RELEASE") // Compilerschalter "/GZ" entfernen! #include #include #include "C:/Programme/cypress/usb/Drivers/ezusbdrv/ezusbsys.h" #define elemof(x) (sizeof(x)/sizeof(*(x))) #define T(x) TEXT(x) #define nobreak typedef enum {false,true} bool; typedef const TCHAR *PCTSTR,FAR*LPCTSTR,NEAR*NPCTSTR; HANDLE hStdIn, hStdOut, hStdErr; HANDLE hAccess; #define IICFILE T("USB2LPT2.IIC") // (AN2131: USB2LPT.IIC) #define MAGICBYTE 0xC2 // erstes Byte der IIC-Datei (AN2131: 0xB2) #define DATASTART 8 // Start der Daten in IIC-Datei (AN2131: 7) #define RESETADDR 0xE600 // Resetbyte-Adresse (AN2131: 0x7F92) void _cdecl printf(const char*t,...){ TCHAR buf[256]; DWORD len; len=wvsprintf(buf,t,(va_list)(&t+1)); CharToOemBuff(buf,buf,len); WriteConsole(hStdOut,buf,len,&len,NULL); } int JaNein(void){ char c; DWORD len,OldMode; GetConsoleMode(hStdIn,&OldMode); SetConsoleMode(hStdIn,0); ReadConsole(hStdIn,&c,1,&len,NULL); printf("%c\n",c); SetConsoleMode(hStdIn,OldMode); switch (c){ case 'J': case 'j': case 'Y': case 'y': return IDYES; case 'N': case 'n': return IDNO; } return 0; } #define IICLEN 0x2000 BYTE IicData[IICLEN]; DWORD IicLen; //IIC-Datei einlesen bool LoadIic(void) { HANDLE f; bool ret=false; f=CreateFile(T("A51/")IICFILE,GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING,0,0); if (f==INVALID_HANDLE_VALUE) { printf("Konnte IIC-Datei nicht öffnen!\n"); }else{ if (!ReadFile(f,IicData,IICLEN,&IicLen,NULL)) { printf("Konnte IIC-Datei nicht lesen!\n"); }else if (IicData[0]!=0xC2 && IicData[0]!=0xB2) { printf("Datei ist keine IIC-Datei!\n"); }else ret=true; } CloseHandle(f); return ret; } // Daten ins 8051-XRAM laden, via ezusb.sys bool WriteRam(WORD adr, BYTE*data, DWORD len) { DWORD written; if (!DeviceIoControl(hAccess,IOCTL_EZUSB_ANCHOR_DOWNLOAD, &adr,sizeof(adr), data,len, &written,NULL)) return false; //klappt nicht! if (written!=len) return false; return true; } // IIC-Daten in RAM laden bool LoadRam(void) { bool ret=false; BYTE Reset8051=1; BYTE*p=IicData+DATASTART; if (!WriteRam(RESETADDR,&Reset8051,1)) goto ende; for (;;) { WORD len=MAKEWORD(p[1],p[0]); WORD adr=MAKEWORD(p[3],p[2]); if (adr==RESETADDR) break; p+=4; if (!WriteRam(adr,p,len)) goto ende; p+=len; } Reset8051=0; if (!WriteRam(RESETADDR,&Reset8051,1)) goto ende; ret=true; ende: if (!ret) printf("Fehler beim RAM-Schreiben!\n"); return ret; } // Seriennummer von Konsole eingeben und dann brennen bool NeueSeriennummer(void) { DWORD sn,len; WORD adr=0xFFFC; TCHAR Number[12]; ReadConsole(hStdIn,Number,elemof(Number)-1,&len,NULL); Number[len]=0; sn=StrToInt(Number); if (!sn) return false; if (!DeviceIoControl(hAccess, CTL_CODE(FILE_DEVICE_UNKNOWN,0x08A2,METHOD_IN_DIRECT,FILE_ANY_ACCESS), &adr,sizeof(adr), &sn,sizeof(sn),&len,NULL)) return false; // if (len!=sizeof(sn)) return false; printf("Seriennummer gebrannt.\n"); return true; } int _cdecl mainCRTStartup(){ int i,j; WORD adr; DWORD sn,br; hStdIn =GetStdHandle(STD_INPUT_HANDLE); hStdOut=GetStdHandle(STD_OUTPUT_HANDLE); hStdErr=GetStdHandle(STD_ERROR_HANDLE); printf("Lese IIC-Datei...\n"); if (!LoadIic()) goto ende; do{ printf("Verbinde zu ...\n"); // Suche von hinten, um eventuelle Treiberleichen auszulassen for (i=9; i>=0; i--){ TCHAR DevName[12]; wsprintf(DevName,"\\\\.\\EZUSB-%d",i); hAccess=CreateFile(DevName, GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); if (hAccess!=INVALID_HANDLE_VALUE) break; } if (hAccess==INVALID_HANDLE_VALUE) { printf("Kein EZUSB-Gerät gefunden.\n"); goto ende; } printf("Lade IIC-Daten in RAM und starte neu...\n"); if (!LoadRam()) goto ende; CloseHandle(hAccess); hAccess=INVALID_HANDLE_VALUE; printf("Warte Renumeration ab, verbinde zu ...\n"); for (j=20; j; j--){ Sleep(500); // max. 10 Sekunden suchen printf("."); // Programm arbeitet noch:-) // usb2lpt.sys erzeugt LPTx-Geräte, die hinter den "normalen" LPT-Nummern // liegen. Deshalb von hinten her suchen, um möglichst kein "normales" // LPT (oder Treiberleichen) zu erwischen. for (i=9; i>0; i--){ TCHAR DevName[12]; wsprintf(DevName,"\\\\.\\LPT%d",i); hAccess=CreateFile(DevName, GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); if (hAccess!=INVALID_HANDLE_VALUE) break; } // Höchstmögliches LPTx geöffnet, ist es auch ein USB2LPT? // Dazu Seriennummer lesen. Wenn's nicht klappt, weiter abwarten. adr=0xFFFC; // Seriennummer-Position if (DeviceIoControl(hAccess, CTL_CODE(FILE_DEVICE_UNKNOWN,0x08A2,METHOD_OUT_DIRECT,FILE_ANY_ACCESS), &adr,sizeof(adr), &sn,sizeof(sn),&br,NULL)) break; CloseHandle(hAccess); hAccess=INVALID_HANDLE_VALUE; // nur normales LPT: schließen } printf("\n"); if (hAccess==INVALID_HANDLE_VALUE) { printf("Kein (USB2)LPT-Gerät gefunden.\n"); goto ende; } if (sn==0xFFFFFFFFUL) { printf("Keine Seriennummer im EEPROM, neu eingeben: "); if (!NeueSeriennummer()) goto ende; }else{ if (!(~sn&0xFFFFFF)) sn>>=24; // Seriennummer im MSB (altes Format) printf("Seriennummer: %u, neu eingeben?",sn); if (JaNein()==IDYES && !NeueSeriennummer()) goto ende; } printf("Brenne Firmware...\n"); adr=0; DeviceIoControl(hAccess, CTL_CODE(FILE_DEVICE_UNKNOWN,0x08A2,METHOD_IN_DIRECT,FILE_ANY_ACCESS), &adr,sizeof(adr), IicData,IicLen,&br,NULL); printf("Fertig.\n"); ende: if (hAccess!=INVALID_HANDLE_VALUE) CloseHandle(hAccess); printf("\nBeliebige Taste zum Programmende drücken (J für Wiederholung)..."); }while (JaNein()==IDYES); return 0; }