📄 unit1.pas
字号:
end;
procedure Tform1.revalue(address: pointer; value: cardinal);
begin
asm
mov ecx,address
mov eax, value
mov edx, eax
mov byte ptr [ecx], al
inc ecx
shr edx, 8
mov byte ptr [ecx], dl
mov edx, eax
inc ecx
shr edx, $10
shr eax, $18
mov byte ptr [ecx], dl
mov byte ptr [ecx+1], al
end;
end;
procedure tform1.SetTimeout(RI, RM, RC, WM, WC: integer);
begin
siport.Timeouts.ReadInterval := RI; //RI 读取间隙
siport.Timeouts.ReadTotalMultiplier := RM; //RM 读多倍
siport.Timeouts.ReadTotalConstant := RC; //RC 读总常量 000
siport.Timeouts.WriteTotalMultiplier := WM; //WM 写多倍
siport.Timeouts.WriteTotalConstant := WC; //WC 写总常量 0000
end;
procedure TForm1.Open_btnClick(Sender: TObject);
begin
if opendialog1.Execute then
edit1.Text := opendialog1.FileName;
end;
procedure TForm1.Write_btnClick(Sender: TObject);
var
mem: tmemorystream;
filemem: tmemorystream;
writebuf: array[0..8192] of byte;
readbuf: byte;
size: cardinal;
i: dword;
num: integer;
begin
CX_Exit := false;
richedit1.Clear;
if not fileexists(edit1.Text) then
begin
shows := langs.ReadString('Hint', 'H0', '您选择的字库资料不存在!');
showtext(clred, shows);
exit;
end;
if not gl_cnndongle^ then exit;
shows := langs.ReadString('Hint', 'H15', '请一直按住开机键,直到引导下载完成...');
showtext(clred, shows);
try
siport.BaudRate := br115200;
siport.Port := sibox.Text; {设置com口}
siport.DataBits := dbeight; {8个数据位}
siport.Connected := true;
SetTimeout(0, 1, 3000, 1, 3000);
siport.ClearBuffer(true, true);
mem := tmemorystream.Create;
mem.LoadFromStream(gl_boot);
size := mem.Size;
EnabledBtn(false);
filemem := tmemorystream.Create;
filemem.LoadFromFile(edit1.Text);
if not gl_cnndongle^ then exit;
shows := langs.ReadString('Hint', 'H14', '正在下载引导程序...');
showtext(clblue, shows);
for i := 1 to 160 do
begin
mem.Read(writebuf, 128);
siport.Write(writebuf, 128);
sleep(30);
if CX_Exit = true then
begin
shows := langs.ReadString('Hint', 'H1', '用户手动退出!');
showtext(clred, shows);
exit;
end;
gauge1.Progress := (i * 100) div 160;
application.ProcessMessages;
end;
mem.Read(writebuf, 85);
siport.Write(writebuf, 85);
sleep(30);
siport.BaudRate := br230400;
siport.ClearBuffer(true, true);
writebuf[0] := $41;
siport.Write(writebuf, 1);
sleep(50);
num := siport.Read(readbuf, 1);
if num = 0 then
begin
shows := langs.ReadString('Hint', 'H2', '下载BOOT失败!');
showtext(clred, shows);
exit;
end;
if readbuf <> $41 then
begin
shows := langs.ReadString('Hint', 'H3', '下载boot失败,请检查定义然后重新操作!');
showtext(clred, shows);
exit;
end;
gauge1.Progress := 100;
shows := langs.ReadString('Hint', 'H4', '下载boot成功!');
showtext(clgreen, shows);
gauge1.Progress := 0;
sleep(300);
writebuf[0] := $05;
siport.Write(writebuf, 1);
sleep(30);
num := siport.Read(readbuf, 1);
if num = 0 then
begin
shows := langs.ReadString('Hint', 'H5', '通信错误05!');
showtext(clred, shows);
exit;
end;
sleep(300);
writebuf[0] := $03;
siport.Write(writebuf, 1);
sleep(30);
num := siport.Read(readbuf, 1);
if num = 0 then
begin
shows := langs.ReadString('Hint', 'H6', '通信错误03!');
showtext(clred, shows);
exit;
end;
sleep(300);
writebuf[0] := $04;
siport.Write(writebuf, 1);
filemem.Read(readbuf, 1);
if readbuf <> 03 then
begin
shows := langs.ReadString('Hint', 'H7', '调入的字库资料不正确!');
showtext(clred, shows);
exit;
end;
if not gl_cnndongle^ then exit;
size := filemem.Size;
case size of
$00800000..$008FFFFF: size := $00800000;
$01000000..$01FFFFFF: size := $01000000;
else
begin
shows := langs.ReadString('Hint', 'H8', '调入的资料不完整!');
showtext(clred, shows);
exit;
end;
end;
writebuf[0] := 00;
writebuf[1] := 00;
writebuf[2] := 00;
writebuf[3] := $90;
revalue(@writebuf[4], size);
siport.Write(writebuf, 8);
sleep(30);
i := 0;
while true do
begin
siport.Read(readbuf, 1);
sleep(10);
inc(i);
if (i <= $13) and (readbuf = $04) then break;
if i >= $14 then
begin
shows := langs.ReadString('Hint', 'H9', '通信出错。');
showtext(clred, shows);
exit;
end;
end;
if not gl_cnndongle^ then exit;
writebuf[0] := 01;
siport.Write(writebuf, 1);
sleep(30);
num := siport.Read(readbuf, 1);
if num = 0 then
begin
shows := langs.ReadString('Hint', 'H10', '通信出错...');
showtext(clred, shows);
exit;
end;
if not gl_cnndongle^ then exit;
filemem.Position := 0;
shows := langs.ReadString('Hint', 'H11', '手机字库写入中,请稍后..');
showtext(clgreen, shows);
i := 0;
SetTimeout(0, 1, 3000, 1, 3000);
Gauge1.ForeColor := clBlue;
repeat
filemem.Read(writebuf, $2000);
sleep(50);
num := siport.Write(writebuf, $2000);
if num <> $2000 then
begin
shows := langs.ReadString('Hint', 'H12', '通信中断..');
showtext(clred, shows + inttostr(num));
exit;
end;
i := i + $2000;
gauge1.Progress := (i * 100) div size;
if CX_Exit = true then
begin
shows := langs.ReadString('Hint', 'H1', '用户手动退出!');
showtext(clred, shows);
exit;
end;
application.ProcessMessages;
until i >= size;
shows := langs.ReadString('Hint', 'H13', '手机字库写完毕!');
showtext(clgreen, shows);
finally
EnabledBtn(True);
gauge1.Progress := 0;
siport.Connected := false;
mem.Free;
filemem.Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var MySysPath: pchar;
rtcom: byte;
begin
richedit1.Clear;
gl_boot := TResourceStream.Create(Hinstance, 'TLDLL', 'boot');
// langs := Tinifile.Create('langs.ini');
gl_format := TResourceStream.Create(Hinstance, 'TLDLL', 'format');
gl_read := TResourceStream.Create(HInstance, 'TLDLL', 'gl_read');
GetMem(MySysPath, 255);
Getsystemdirectory(MySysPath, 255);
gl_path := extractfilepath(paramstr(0));
langs := Tinifile.Create((gl_path + 'langs.ini'));
gl_dllfile := 'c:\sivess.dll';
if not fileexists(gl_dllfile) then
ExtractRes('dll_file', 'TLDLL', gl_dllfile);
if fileexists(gl_path + 'langs.ini') then
begin
form1.Caption := 'VE-SI4904 Flasher V2.1';
LABEL3.Caption := 'BaudRate:';
LABEL4.Caption := 'Flash Size:';
label1.Caption := 'flash file:';
groupbox1.Caption := 'setup';
groupbox2.Caption := 'Info: (www.ve100.com www.xintel.com.cn)';
Write_btn.Caption := 'Flash';
Stop_btn.Caption := 'Stop';
Format_btn.caption := 'Format';
Readpwd_btn.Caption := 'Rd/PWD';
Read_btn.Caption := 'Read';
end;
formcaption := Form1.Caption;
if check_pl2303(rtcom) then
begin
showText(clblue, 'PL2303 USB2COM : COM' + inttostr(rtcom));
sibox.Text := 'COM' + inttostr(rtcom);
end;
end;
procedure TForm1.Stop_btnClick(Sender: TObject);
begin
CX_Exit := true;
end;
procedure TForm1.FormActivate(Sender: TObject);
var
Status, ri, xi: integer;
RegName: array[0..255] of char;
regsn: string;
regdg: cardinal;
btbuf: array[0..$FF] of byte;
i: integer;
btxor: byte;
begin
EnabledBtn(false);
gl_cnndongle^ := false;
shows := langs.ReadString('Hint', 'G35', '正在查找可用加密狗...');
showText(clBlue, shows);
gl_QTDongle := 0;
if gl_QTDongle = 0 then
if not QT_Dongle then
begin
shows := langs.ReadString('Hint', 'G36', '没有找到惟易加密狗!');
showText(clRed, shows);
// exit;
end;
EnabledBtn(True);
gl_cnndongle^ := true;
shows := 'Define: VCC:4,5 GND:2,7,17 ' + #13#10 + ' RXD:13(Hight) TXD:11 NBoot:6(low)';
showtext(clblack, shows);
end;
procedure TForm1.Format_btnClick(Sender: TObject);
var
mem: TmemoryStream;
size, i: cardinal;
writebuf: array[0..8192] of byte;
begin
try
EnabledBtn(false);
CX_Exit := false;
//richedit1.Clear;
siport.BaudRate := br115200;
siport.Port := sibox.Text; {设置com口}
siport.DataBits := dbeight; {8个数据位}
siport.Connected := true;
SetTimeout(0, 1, 3000, 1, 3000);
siport.ClearBuffer(true, true);
mem := tmemorystream.Create;
mem.LoadFromStream(gl_boot);
size := mem.Size;
if not gl_cnndongle^ then exit;
shows := langs.ReadString('Hint', 'H15', '提示:请一直按住开机键,直到引导下载完成...');
showtext(clred, shows);
if not Cnn then exit;
shows := langs.ReadString('Hint', 'H18', '已联接到手机.');
showText(clGreen, shows);
shows := langs.ReadString('Hint', 'H14', '正在下载引导程序...');
showtext(clblue, shows);
for i := 1 to 160 do
begin
mem.Read(writebuf, 128);
siport.Write(writebuf, 128);
sleep(30);
if CX_Exit = true then
begin
shows := langs.ReadString('Hint', 'H1', '用户手动退出!');
showtext(clred, shows);
exit;
end;
gauge1.Progress := (i * 100) div 160;
application.ProcessMessages;
end;
mem.Read(writebuf, 85);
siport.Write(writebuf, 85); //写引导完毕
sleep(30);
gauge1.Progress := 0;
siport.ClearBuffer(true, true);
case combobox1.ItemIndex of //设置波特率
0:
siport.BaudRate := br921600;
1:
siport.BaudRate := br460800;
2:
siport.BaudRate := br230400;
3:
siport.BaudRate := br115200;
end;
sleep(30);
writebuf[0] := $41;
siport.Write(writebuf, 1);
sleep(30);
i := siport.Read(writebuf, 1);
if i = 0 then
begin
shows := langs.ReadString('Hint', 'F1', 'error04!');
showtext(clred, shows);
exit;
end;
sleep(30);
for i := 0 to 9 do
writebuf[i] := 0;
writebuf[0] := 04;
writebuf[4] := $90;
case combobox2.ItemIndex of
1:
begin
size := $E0000;
writebuf[3] := $F0; //16M
writebuf[7] := $0E;
end;
0:
begin
size := $70000;
writebuf[3] := $78; //8M
writebuf[7] := $07;
end;
end;
siport.Write(writebuf, 9);
sleep(30);
i := siport.Read(writebuf, 1);
if i = 0 then
begin
shows := langs.ReadString('Hint', 'F1', 'error09!');
showtext(clred, shows);
exit;
end;
writebuf[0] := $01;
siport.Write(writebuf, 1);
sleep(30);
i := siport.Read(writebuf, 1);
if i = 0 then
begin
shows := langs.ReadString('Hint', 'F1', 'error01!');
showtext(clred, shows);
exit;
end;
for i := 0 to 8192 do
writebuf[i] := $FF;
shows := langs.ReadString('Hint', 'H16', '正在格式化...!');
showtext(clgreen, shows);
SetTimeout(0, 1, 4000, 1, 4000);
case size of
$E0000:
begin
for i := 0 to 69 do
begin
siport.Write(writebuf, 8192);
sleep(50); //16m
gauge1.Progress := (i * 100) div $69;
application.ProcessMessages;
end;
end;
$70000:
begin
for i := 0 to $37 do
begin
siport.Write(writebuf, 8192);
sleep(50); //8M
gauge1.Progress := (i * 100) div $37;
application.ProcessMessages;
end;
end;
end;
shows := langs.ReadString('Hint', 'H17', '格式化完毕!');
showtext(clgreen, shows);
finally
EnabledBtn(True);
gauge1.Progress := 0;
mem.Free;
end;
end;
procedure TForm1.EnabledBtn(ok: Boolean);
begin
Write_btn.Enabled := ok;
Read_btn.Enabled := ok;
Format_btn.Enabled := ok;
Readpwd_btn.Enabled := ok;
Open_btn.Enabled := ok;
end;
procedure TForm1.Readpwd_btnClick(Sender: TObject);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -