| 1 | unit Globals;
|
|---|
| 2 |
|
|---|
| 3 | {$MODE Delphi}
|
|---|
| 4 |
|
|---|
| 5 | interface
|
|---|
| 6 |
|
|---|
| 7 | {$INCLUDE Options.inc}
|
|---|
| 8 |
|
|---|
| 9 | uses Dialogs, Forms;
|
|---|
| 10 |
|
|---|
| 11 | type
|
|---|
| 12 | TLPTpinout = packed record
|
|---|
| 13 | strobe1:byte; // out
|
|---|
| 14 | strobe2:byte; // out
|
|---|
| 15 | reset:byte; // out
|
|---|
| 16 | mosi:byte; // out
|
|---|
| 17 | sck:byte; // out
|
|---|
| 18 | miso:byte; // in
|
|---|
| 19 | led:byte; // out
|
|---|
| 20 | resetinv:boolean; // is RESET inverted
|
|---|
| 21 | end;
|
|---|
| 22 | PLPTpinout = ^TLPTpinout;
|
|---|
| 23 |
|
|---|
| 24 | const
|
|---|
| 25 | DataPort = 0; // offset from BASE
|
|---|
| 26 | StatusPort = 1; // offset from BASE
|
|---|
| 27 | ControlPort = 2; // offset from BASE
|
|---|
| 28 |
|
|---|
| 29 | // processor/memory types
|
|---|
| 30 | PROC_TYPE_AVR = 0; // AT90, ATmega, ATtiny
|
|---|
| 31 | PROC_TYPE_NEW51 = 1; // AT89[L]S51/52
|
|---|
| 32 | PROC_TYPE_OLD51 = 2; // AT89S53/8252
|
|---|
| 33 | PROC_TYPE_S8253 = 3; // AT89S8253
|
|---|
| 34 | PROC_TYPE_S2051 = 4; // AT89S2051/4051
|
|---|
| 35 | PROC_TYPE_DATAFLASH = 5; // AT25/26/45DB
|
|---|
| 36 | PROC_TYPE_SERIALFLASH = 6; // AT25F
|
|---|
| 37 | PROC_TYPE_I2C_BUS = 7; // I2C memories
|
|---|
| 38 |
|
|---|
| 39 | // ISP operations
|
|---|
| 40 | OP_READSIG = 1; // read signature
|
|---|
| 41 | OP_ERASE = 2; // erase device
|
|---|
| 42 | OP_BLANKCHECKFLASH = 4; // blank check Flash
|
|---|
| 43 | OP_BLANKCHECKEEPROM = 8; // blank check EEPROM
|
|---|
| 44 | OP_READFLASH = $10; // read Flash
|
|---|
| 45 | OP_WRITEFLASH = $20; // write Flash
|
|---|
| 46 | OP_VERIFYFLASH = $40; // verify Flash
|
|---|
| 47 | OP_READEEPROM = $80; // read EEPROM
|
|---|
| 48 | OP_WRITEEEPROM = $100; // write EEPROM
|
|---|
| 49 | OP_VERIFYEEPROM = $200; // verify EEPROM
|
|---|
| 50 | OP_READUSERSIG = $400; // read user signature
|
|---|
| 51 | OP_WRITEUSERSIG = $800; // write user signature
|
|---|
| 52 | OP_VERIFYUSERSIG = $1000;// verify user signature
|
|---|
| 53 | OP_READFUSE = $2000; // read fuse bits
|
|---|
| 54 | OP_WRITEFUSE = $4000; // write fuse bits
|
|---|
| 55 | OP_VERIFYFUSE = $8000; // verify fuse bits
|
|---|
| 56 | OP_READLOCK = $10000; // read lock bits
|
|---|
| 57 | OP_WRITELOCK = $20000; // write lock bits
|
|---|
| 58 | OP_VERIFYLOCK = $40000; // verify lock bits
|
|---|
| 59 |
|
|---|
| 60 | // LPT outputs
|
|---|
| 61 | LPT_OUT_STROBE = 0; // pin 1
|
|---|
| 62 | LPT_OUT_D0 = 1; // pin 2
|
|---|
| 63 | LPT_OUT_D1 = 2; // pin 3
|
|---|
| 64 | LPT_OUT_D2 = 3; // pin 4
|
|---|
| 65 | LPT_OUT_D3 = 4; // pin 5
|
|---|
| 66 | LPT_OUT_D4 = 5; // pin 6
|
|---|
| 67 | LPT_OUT_D5 = 6; // pin 7
|
|---|
| 68 | LPT_OUT_D6 = 7; // pin 8
|
|---|
| 69 | LPT_OUT_D7 = 8; // pin 9
|
|---|
| 70 | LPT_OUT_AUTOLF = 9; // pin 14
|
|---|
| 71 | LPT_OUT_INIT = 10; // pin 16
|
|---|
| 72 | LPT_OUT_SELECTIN = 11; // pin 17
|
|---|
| 73 | LPT_OUT_NOTUSED = 12;
|
|---|
| 74 |
|
|---|
| 75 | // LPT inputs
|
|---|
| 76 | LPT_IN_ACK = 0; // pin 10
|
|---|
| 77 | LPT_IN_BUSY = 1; // pin 11
|
|---|
| 78 | LPT_IN_PAPEREND = 2; // pin 12
|
|---|
| 79 | LPT_IN_SELECT = 3; // pin 13
|
|---|
| 80 | LPT_IN_ERROR = 4; // pin 15
|
|---|
| 81 |
|
|---|
| 82 | // cable pinouts
|
|---|
| 83 | LPT_PINOUT_ADD = 0;
|
|---|
| 84 | LPT_PINOUT_AECISP = 1;
|
|---|
| 85 | LPT_PINOUT_ALTERA = 2;
|
|---|
| 86 | LPT_PINOUT_ATPROG = 3;
|
|---|
| 87 | LPT_PINOUT_SIPROG = 4;
|
|---|
| 88 | LPT_PINOUT_STK200 = 5;
|
|---|
| 89 | LPT_PINOUT_UISP = 6;
|
|---|
| 90 | LPT_PINOUT_CUSTOM = 7;
|
|---|
| 91 |
|
|---|
| 92 | ISP_PINOUT_ADD:TLPTpinout = (
|
|---|
| 93 | strobe1:LPT_OUT_STROBE;
|
|---|
| 94 | strobe2:LPT_OUT_NOTUSED;
|
|---|
| 95 | reset:LPT_OUT_AUTOLF;
|
|---|
| 96 | mosi:LPT_OUT_INIT;
|
|---|
| 97 | sck:LPT_OUT_SELECTIN;
|
|---|
| 98 | miso:LPT_IN_ACK;
|
|---|
| 99 | led:LPT_OUT_NOTUSED;
|
|---|
| 100 | resetinv:false);
|
|---|
| 101 |
|
|---|
| 102 | ISP_PINOUT_AECISP:TLPTpinout = (
|
|---|
| 103 | strobe1:LPT_OUT_NOTUSED;
|
|---|
| 104 | strobe2:LPT_OUT_NOTUSED;
|
|---|
| 105 | reset:LPT_OUT_D4;
|
|---|
| 106 | mosi:LPT_OUT_D5;
|
|---|
| 107 | sck:LPT_OUT_D6;
|
|---|
| 108 | miso:LPT_IN_ACK;
|
|---|
| 109 | led:LPT_OUT_NOTUSED;
|
|---|
| 110 | resetinv:false);
|
|---|
| 111 |
|
|---|
| 112 | ISP_PINOUT_ALTERA:TLPTpinout = (
|
|---|
| 113 | strobe1:LPT_OUT_AUTOLF;
|
|---|
| 114 | strobe2:LPT_OUT_NOTUSED;
|
|---|
| 115 | reset:LPT_OUT_D1;
|
|---|
| 116 | mosi:LPT_OUT_D6;
|
|---|
| 117 | sck:LPT_OUT_D0;
|
|---|
| 118 | miso:LPT_IN_BUSY;
|
|---|
| 119 | led:LPT_OUT_NOTUSED;
|
|---|
| 120 | resetinv:false);
|
|---|
| 121 |
|
|---|
| 122 | ISP_PINOUT_ATPROG:TLPTpinout = (
|
|---|
| 123 | strobe1:LPT_OUT_NOTUSED;
|
|---|
| 124 | strobe2:LPT_OUT_NOTUSED;
|
|---|
| 125 | reset:LPT_OUT_D3;
|
|---|
| 126 | mosi:LPT_OUT_D0;
|
|---|
| 127 | sck:LPT_OUT_D1;
|
|---|
| 128 | miso:LPT_IN_ACK;
|
|---|
| 129 | led:LPT_OUT_NOTUSED;
|
|---|
| 130 | resetinv:false);
|
|---|
| 131 |
|
|---|
| 132 | ISP_PINOUT_SIPROG:TLPTpinout = (
|
|---|
| 133 | strobe1:LPT_OUT_D3;
|
|---|
| 134 | strobe2:LPT_OUT_D2;
|
|---|
| 135 | reset:LPT_OUT_D7;
|
|---|
| 136 | mosi:LPT_OUT_D5;
|
|---|
| 137 | sck:LPT_OUT_D4;
|
|---|
| 138 | miso:LPT_IN_ACK;
|
|---|
| 139 | led:LPT_OUT_NOTUSED;
|
|---|
| 140 | resetinv:false);
|
|---|
| 141 |
|
|---|
| 142 | ISP_PINOUT_STK200:TLPTpinout = (
|
|---|
| 143 | strobe1:LPT_OUT_D3;
|
|---|
| 144 | strobe2:LPT_OUT_D2;
|
|---|
| 145 | reset:LPT_OUT_D7;
|
|---|
| 146 | mosi:LPT_OUT_D5;
|
|---|
| 147 | sck:LPT_OUT_D4;
|
|---|
| 148 | miso:LPT_IN_ACK;
|
|---|
| 149 | led:LPT_OUT_D6;
|
|---|
| 150 | resetinv:false);
|
|---|
| 151 |
|
|---|
| 152 | ISP_PINOUT_UISP:TLPTpinout = (
|
|---|
| 153 | strobe1:LPT_OUT_NOTUSED;
|
|---|
| 154 | strobe2:LPT_OUT_NOTUSED;
|
|---|
| 155 | reset:LPT_OUT_INIT;
|
|---|
| 156 | mosi:LPT_OUT_D0;
|
|---|
| 157 | sck:LPT_OUT_STROBE;
|
|---|
| 158 | miso:LPT_IN_BUSY;
|
|---|
| 159 | led:LPT_OUT_NOTUSED;
|
|---|
| 160 | resetinv:false);
|
|---|
| 161 |
|
|---|
| 162 | devicenr:byte = 0;
|
|---|
| 163 |
|
|---|
| 164 | var
|
|---|
| 165 | proctype:byte; // processor type (AVR/51)
|
|---|
| 166 | lptno:integer; // LPT port number
|
|---|
| 167 | BASE:word; // LPT port base address
|
|---|
| 168 | pinout:TLPTpinout; // LPT->ISP cable pinout
|
|---|
| 169 | pinout_num:integer; // pinout type id
|
|---|
| 170 | flashsize:integer; // Flash size in bytes
|
|---|
| 171 | eepromsize:integer; // EEPROM size in bytes
|
|---|
| 172 | usersigsize:integer; // User Signature size in bytes
|
|---|
| 173 | MCUfreq:integer; // clock freq [Hz]
|
|---|
| 174 | tCLK_AVR:integer; // clock period in ns
|
|---|
| 175 | tCLK_8252:integer; // 40 clock periods in ns
|
|---|
| 176 | forcedev:boolean; // force device with name forcename
|
|---|
| 177 | forcename:string; // forced device name
|
|---|
| 178 | autoop:longword; // auto operations mask
|
|---|
| 179 |
|
|---|
| 180 | {$IFDEF Windows}
|
|---|
| 181 |
|
|---|
| 182 | function MessageDlgCenter(const Msg: string; DlgType: TMsgDlgType;
|
|---|
| 183 | Buttons: TMsgDlgButtons; HelpCtx: Longint; Form:TForm): Integer;
|
|---|
| 184 |
|
|---|
| 185 | function GetProgramVersionString:string;
|
|---|
| 186 | {$ENDIF}
|
|---|
| 187 |
|
|---|
| 188 | implementation
|
|---|
| 189 |
|
|---|
| 190 | {$IFDEF Windows}
|
|---|
| 191 |
|
|---|
| 192 | uses //Settings,
|
|---|
| 193 | SysUtils, LCLIntf, Windows;
|
|---|
| 194 |
|
|---|
| 195 | function MessageDlgCenter(const Msg: string; DlgType: TMsgDlgType;
|
|---|
| 196 | Buttons: TMsgDlgButtons; HelpCtx: Longint; Form:TForm): Integer;
|
|---|
| 197 | begin
|
|---|
| 198 | with CreateMessageDialog(Msg, DlgType, Buttons) do
|
|---|
| 199 | try
|
|---|
| 200 | HelpContext := HelpCtx;
|
|---|
| 201 | HelpFile := '';
|
|---|
| 202 | Left:=Form.Left + (Form.Width - Width) div 2;
|
|---|
| 203 | Top:=Form.Top + (Form.Height - Height) div 2;
|
|---|
| 204 | Position:=poDesigned;
|
|---|
| 205 | Result:=ShowModal;
|
|---|
| 206 | finally
|
|---|
| 207 | Free;
|
|---|
| 208 | end;
|
|---|
| 209 |
|
|---|
| 210 | end;
|
|---|
| 211 |
|
|---|
| 212 | function GetProgramVersionString:string;
|
|---|
| 213 | var
|
|---|
| 214 | filename:array[0..MAX_PATH-1] of char;
|
|---|
| 215 | zero:DWORD;
|
|---|
| 216 | infolen:DWORD;
|
|---|
| 217 | infobuf:pointer;
|
|---|
| 218 | verlen:UINT;
|
|---|
| 219 | ptr:pointer;
|
|---|
| 220 | verptr:PVSFixedFileInfo;
|
|---|
| 221 | begin
|
|---|
| 222 | Result:='';
|
|---|
| 223 | if GetModuleFileName(0, filename, MAX_PATH) > 0 then
|
|---|
| 224 | if StrLen(filename) > 0 then
|
|---|
| 225 | begin
|
|---|
| 226 | zero:=0;
|
|---|
| 227 | infolen:=GetFileVersionInfoSize(filename, zero);
|
|---|
| 228 | if infolen > 0 then
|
|---|
| 229 | begin
|
|---|
| 230 | infobuf:=AllocMem(infolen);
|
|---|
| 231 | if infobuf<>nil then
|
|---|
| 232 | begin
|
|---|
| 233 | ptr:=nil;
|
|---|
| 234 | verlen:=0;
|
|---|
| 235 | if GetFileVersionInfo(filename, 0, infolen, infobuf) then
|
|---|
| 236 | if VerQueryValue(infobuf, '\', ptr, verlen) then
|
|---|
| 237 | begin
|
|---|
| 238 | verptr:=ptr;
|
|---|
| 239 | Result:=
|
|---|
| 240 | IntToStr(HiWord(verptr^.dwFileVersionMS)) + '.' +
|
|---|
| 241 | IntToStr(LoWord(verptr^.dwFileVersionMS)) + '.' +
|
|---|
| 242 | IntToStr(HiWord(verptr^.dwFileVersionLS)) + '.' +
|
|---|
| 243 | IntToStr(LoWord(verptr^.dwFileVersionLS));
|
|---|
| 244 | end;
|
|---|
| 245 | FreeMem(infobuf);
|
|---|
| 246 | end;
|
|---|
| 247 | end;
|
|---|
| 248 | end;
|
|---|
| 249 | end;
|
|---|
| 250 |
|
|---|
| 251 | {$ENDIF}
|
|---|
| 252 |
|
|---|
| 253 | initialization
|
|---|
| 254 | //ReadSettingsFromRegistry(false, false, true);
|
|---|
| 255 |
|
|---|
| 256 | finalization
|
|---|
| 257 | //WriteSettingsToRegistry(false, false, true);
|
|---|
| 258 | end.
|
|---|
| 259 |
|
|---|