diff ostc4pack/src/checksum_final_add_fletcher.cpp @ 49:1e707b34667e

add o4pack files
author heinrichsweikamp
date Mon, 30 Jul 2018 11:31:20 +0200
parents
children 01f40cb1057e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ostc4pack/src/checksum_final_add_fletcher.cpp	Mon Jul 30 11:31:20 2018 +0200
@@ -0,0 +1,134 @@
+#include <iostream>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+void fletcher16(unsigned char *result1, unsigned char *result2, unsigned char const *data, size_t bytes )
+{
+        unsigned short sum1 = 0xff, sum2 = 0xff;
+        size_t tlen;
+ 
+        while (bytes) {
+                tlen = bytes >= 20 ? 20 : bytes;
+                bytes -= tlen;
+                do {
+                        sum2 += sum1 += *data++;
+                } while (--tlen);
+                sum1 = (sum1 & 0xff) + (sum1 >> 8);
+                sum2 = (sum2 & 0xff) + (sum2 >> 8);
+        }
+        /* Second reduction step to reduce sums to 8 bits */
+        sum1 = (sum1 & 0xff) + (sum1 >> 8);
+        sum2 = (sum2 & 0xff) + (sum2 >> 8);
+        *result2 = (sum2 & 0xff);
+        *result1 = (sum1 & 0xff);
+//        return sum2 << 8 | sum1;
+}
+
+
+// This is a variant of fletcher16 with a 16 bit sum instead of an 8 bit sum,
+// and modulo 2^16 instead of 2^16-1
+void
+hw_ostc3_firmware_checksum (unsigned char *result1, unsigned char *result2, unsigned char *result3, unsigned char *result4, unsigned char const *data, size_t bytes )
+{
+	unsigned short low = 0;
+	unsigned short high = 0;
+	for (unsigned int i = 0; i < bytes; i++) {
+		low  += data[i];
+		high += low;
+	}
+        *result1 = (low & 0xff);
+        *result2 = (low/256 & 0xff);
+        *result3 = (unsigned char)(high & 0xff);
+        *result4 = (unsigned char)((high/256) & 0xff);
+//	return (((unsigned int)high) << 16) + low;
+}
+
+
+int main(int argc, char** argv) {
+	
+	
+	FILE *fp, * fpout;
+	size_t lenTotal,lenTemp;
+	unsigned char buf[2000000];
+	char *file = argv[1];
+	char *file2 =  argv[2];
+	char *file3 =  argv[3];
+	unsigned int pruefsumme;
+	unsigned char buf2[4];
+
+   	printf("1: %s\n",  file);
+   	printf("2: %s\n",  file2);
+   	printf("3: %s\n",  file3);
+   	printf("\n");
+     
+	
+		//write File with length and cheksum
+	char filename[500], filenameout[510] ;
+	sprintf(filename,"%s",file);
+	int filelength = strlen(filename);
+	filename[filelength -4] = 0;
+	
+	lenTotal = 0;
+	if (NULL == (fp = fopen(file, "rb")))
+	{
+	    printf("Unable to open %s for reading\n", file);
+	    return -1;
+	}
+	lenTemp = fread(&buf[lenTotal], sizeof(char), sizeof(buf), fp);
+//	lenTemp = fread(buf, sizeof(char), sizeof(buf), fp);
+	lenTotal = lenTemp;
+	printf("%d bytes read (hex: %#x )\n", lenTemp,lenTemp);
+	fclose(fp);
+
+	if(file2)
+	{
+		if (NULL == (fp = fopen(file2, "rb")))
+		{
+		    printf("Unable to open %s for reading\n", file2);
+		    return -1;
+		}
+		lenTemp = fread(&buf[lenTotal], sizeof(char), sizeof(buf)-lenTotal, fp);
+		lenTotal += lenTemp;
+		printf("%d bytes read (hex: %#x )\n", lenTemp,lenTemp);
+		fclose(fp);
+	}
+	if(file3)
+	{
+		if (NULL == (fp = fopen(file3, "rb")))
+		{
+		    printf("Unable to open %s for reading\n", file3);
+		    return -1;
+		}
+		lenTemp = fread(&buf[lenTotal], sizeof(char), sizeof(buf)-lenTotal, fp);
+		lenTotal += lenTemp;
+		printf("%d bytes read (hex: %#x )\n", lenTemp,lenTemp);
+		fclose(fp);
+	}
+
+   	printf("\n");
+	printf("%d bytes read (hex: %#x ) total \n", lenTotal,lenTotal);
+
+	time_t rawtime;
+	time (&rawtime);
+	struct tm *timeinfo;
+	timeinfo = localtime(&rawtime);
+	
+//	sprintf(filenameout,"fwupdate_%s.bin",ctime(&rawtime));
+	sprintf(filenameout,"OSTC4update_%02u%02u%02u.bin",timeinfo->tm_year-100,timeinfo->tm_mon+1,timeinfo->tm_mday);
+
+    fpout = fopen(filenameout, "wb");     
+    for(int i = 0;i <lenTotal;i++)
+    {
+    	if(fwrite(&buf[i],1,1,fpout) != 1)
+     	printf("error writing\n");
+	}
+	
+	hw_ostc3_firmware_checksum(&buf2[0],&buf2[1],&buf2[2],&buf2[3],buf,lenTotal);
+	printf("checksum  %#x %#x %#x %#x\n", buf2[0],buf2[1], buf2[2], buf2[3]);
+   	if(fwrite(&buf2[0],1,4,fpout) != 4)
+    	printf("error writing checksum\n");
+    ;
+	fclose(fpout);
+}