From 54241d310860d2028b293b16782d1757fd765a42 Mon Sep 17 00:00:00 2001 From: Frank Voorburg Date: Fri, 27 Nov 2015 11:44:01 +0000 Subject: [PATCH] - Added support up to COM30 (Microboot) - Added COM port disconnect/connect during backdoor entry (Microboot). git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@120 5dc33758-31d5-4daf-9ae8-b24bf3d40d73 --- .../MicroBoot/interfaces/uart/XcpSettings.dfm | Bin 11359 -> 11515 bytes .../interfaces/uart/XcpTransport.pas | 10 ++++++++++ .../interfaces/uart/openblt_uart.dpr | 16 ++++++++++++---- Host/openblt_uart.dll | Bin 392704 -> 393216 bytes 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Host/Source/MicroBoot/interfaces/uart/XcpSettings.dfm b/Host/Source/MicroBoot/interfaces/uart/XcpSettings.dfm index 6dbb16c1b919e39b522dc736de11be283306f098..7b2a21eb1815a65fad84af2c95c69f48d702df4d 100644 GIT binary patch delta 175 zcmXZUPYOUl07mgF%mFA$DMy(3{GGKe*>W0Ja1}X_oWn*ut6#mvJLh}ZlHl6YI$BNG tPh;VYd2#mFec1_0sGx=hTIj%k$O0E}5f^b07v*fkMr_2Uw8s#|*#kDwBo6=p delta 17 Ycmewzc|T%;7^CY(aZ{nqFNB1p07It+VE_OC diff --git a/Host/Source/MicroBoot/interfaces/uart/XcpTransport.pas b/Host/Source/MicroBoot/interfaces/uart/XcpTransport.pas index d19b30bc..78650c39 100644 --- a/Host/Source/MicroBoot/interfaces/uart/XcpTransport.pas +++ b/Host/Source/MicroBoot/interfaces/uart/XcpTransport.pas @@ -218,6 +218,16 @@ begin // init the return value result := false; + // during high burst I/O the USB/RS232 emulated COM-ports sometimes have problems + // processing all the data. therefore, add a small delay time between packet I/O. + // exclude the CONNECT command because of the default small backdoor time of the + // bootloader + if packetData[0] <> $FF then + begin + Application.ProcessMessages; + Sleep(5); + end; + // prepare the packet. length goes in the first byte followed by the packet data SetLength(msgData, packetLen+1); msgData[0] := packetLen; diff --git a/Host/Source/MicroBoot/interfaces/uart/openblt_uart.dpr b/Host/Source/MicroBoot/interfaces/uart/openblt_uart.dpr index bb41c3e7..6efe0a0e 100644 --- a/Host/Source/MicroBoot/interfaces/uart/openblt_uart.dpr +++ b/Host/Source/MicroBoot/interfaces/uart/openblt_uart.dpr @@ -287,9 +287,17 @@ begin sessionStartResult := kProgSessionGenericError; while sessionStartResult <> kProgSessionStarted do begin - sessionStartResult := loader.StartProgrammingSession; - Application.ProcessMessages; - Sleep(5); + // disconnect COM-port for board that have on board FTDI type chip that powers down + // during power cycling + loader.Disconnect; + // reconnect COM-port. no need to check the return value because it might fail when + // an FTDI type chip is on board while it is cycling power. + if loader.Connect then + begin + sessionStartResult := loader.StartProgrammingSession; + Application.ProcessMessages; + Sleep(5); + end; // don't retry if the error was caused by not being able to unprotect the programming resource if sessionStartResult = kProgSessionUnlockError then begin @@ -561,7 +569,7 @@ end; //*** end of MbiDescription *** //*************************************************************************************** function MbiVersion : Longword; stdcall; begin - Result := 10000; // v1.00.00 + Result := 10001; // v1.00.01 end; //*** end of MbiVersion *** diff --git a/Host/openblt_uart.dll b/Host/openblt_uart.dll index 6fde1e8f9e2c13be819686c592ff0f3cad583e9e..96a88ff44fb06d30a4ca713a2d872169740786b5 100644 GIT binary patch delta 13640 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 a_!jNyE!wR)b5W