--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rombuild/r_srec.cpp Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include "r_rom.h"
+#include "r_obey.h"
+
+#include <e32std.h>
+#include <e32std_private.h>
+
+#if defined(__MSVCDOTNET__) || defined(__TOOLS2__)
+#include <iostream>
+#include <fstream>
+#else //!__MSVCDOTNET__
+#include <iostream.h>
+#include <fstream.h>
+#endif //__MSVCDOTNET__
+
+#include <string.h>
+
+const TInt KSRecBytesPerLine=32; // max line = 1+1+2+8 + (32*2) + 2 = 78
+
+LOCAL_C TInt enchex(TUint nibble)
+//
+// Return ascii hex character corresponding to nibble
+//
+ {
+
+ nibble&=0xf;
+ return(nibble<=9 ? '0'+nibble : 'A'-10+nibble);
+ }
+
+GLDEF_C TUint putbhx(TUint8 *buf,TUint byte)
+//
+// Write byte to buffer as two hex digits
+//
+ {
+
+ *buf++ = (TUint8)enchex(byte>>4);
+ *buf++ = (TUint8)enchex(byte);
+ return byte&0xff;
+ }
+
+GLDEF_C TInt putmot(TUint8 *mcode, TUint8 *mdata,TUint mlen,TUint addr)
+//
+// Write SREC or S19 format to buffer at mcode from mlen bytes of binary data
+// stored in buffer mdata. The code is given address addr.
+// Returns the number of bytes written to mcode.
+//
+ {
+ TUint8 *p,*q,*qend;
+ TUint sum,byte;
+
+ p=mcode;
+ *p='S';
+#ifdef ALLOW_S_RECORD_THREE_BYTE_ADDRESSES
+ // This is an optimisation which is useful for S-Record downloads over serial cable
+ // but some S-Record tools don't support it, so it's off by default.
+ if ((TUint)((addr>>24)&0xff) == 0)
+ {
+ *(p+1)='2'; // 3-byte address field
+ sum=putbhx(p+=2,3+mlen+1);
+ }
+ else
+#endif
+ {
+ *(p+1)='3'; // 4-byte address field
+ sum=putbhx(p+=2,4+mlen+1);
+ sum+=putbhx(p+=2,(TUint)((addr>>24)&0xff));
+ }
+ sum+=putbhx(p+=2,(TUint)((addr>>16)&0xff));
+ sum+=putbhx(p+=2,(TUint)((addr>>8)&0xff));
+ sum+=putbhx(p+=2,(TUint)addr);
+ q=mdata;
+ qend=mdata+mlen;
+ for (q=mdata;q<qend;q++)
+ {
+ byte=(*q);
+ sum+=putbhx(p+=2,byte);
+ }
+ putbhx(p+=2,~sum);
+ return((TUint)(p-mcode+2));
+ }
+
+void E32Rom::WriteSRecord(ofstream &of)
+//
+// Write the rom to a file in S record format and return its check sum.
+//
+ {
+
+ TInt i;
+ TUint8 sBuf[256];
+ of << "S00600004844521B\n";
+ TInt size=iObey->iRomSize;
+ TUint8 *ptr=(TUint8 *)iHeader;
+ for (i=0; i<size; i+=KSRecBytesPerLine)
+ {
+ TInt len;
+ if ((i+KSRecBytesPerLine)>size)
+ len=size-i;
+ else
+ len=KSRecBytesPerLine;
+ TUint8 *pS=ptr+i;
+ TInt l=putmot(sBuf,pS,len,i+iObey->iSRecordBase);
+ of.write(reinterpret_cast<char *>(sBuf), l);
+ of<<endl;
+ }
+ of << "S70500000000FA\n"; // Fixed address! - would need to compute the checksum
+ }
+