A program to insert Valid User Code checksums

Dependencies:   mbed

Committer:
chris
Date:
Wed Oct 17 13:18:31 2012 +0000
Revision:
0:f125b9cfab7b
First commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chris 0:f125b9cfab7b 1 #include "mbed.h"
chris 0:f125b9cfab7b 2
chris 0:f125b9cfab7b 3 LocalFileSystem fs ("fs");
chris 0:f125b9cfab7b 4 DigitalOut led1(LED1);
chris 0:f125b9cfab7b 5 DigitalOut led4(LED4);
chris 0:f125b9cfab7b 6
chris 0:f125b9cfab7b 7 int main() {
chris 0:f125b9cfab7b 8
chris 0:f125b9cfab7b 9 int ctr=32; // 32 because the fixed size of the vector table
chris 0:f125b9cfab7b 10
chris 0:f125b9cfab7b 11 printf("File patcher\n");
chris 0:f125b9cfab7b 12
chris 0:f125b9cfab7b 13 FILE *f1 = fopen("/fs/file.unp","rb"); // read binary
chris 0:f125b9cfab7b 14 FILE *f2 = fopen("/fs/file.pat","wb"); // write binary
chris 0:f125b9cfab7b 15
chris 0:f125b9cfab7b 16 if (f1 == NULL) {
chris 0:f125b9cfab7b 17 printf("Cant open file for reading\n");
chris 0:f125b9cfab7b 18 while (1) {
chris 0:f125b9cfab7b 19 led1 = !led1;
chris 0:f125b9cfab7b 20 wait(0.2);
chris 0:f125b9cfab7b 21 }
chris 0:f125b9cfab7b 22 }
chris 0:f125b9cfab7b 23
chris 0:f125b9cfab7b 24 else {
chris 0:f125b9cfab7b 25
chris 0:f125b9cfab7b 26 unsigned int vector [8]; // storage for the vector table
chris 0:f125b9cfab7b 27 unsigned int sum = 0; //
chris 0:f125b9cfab7b 28
chris 0:f125b9cfab7b 29 // read first 7 words (28 bytes) into an array
chris 0:f125b9cfab7b 30 for (int i = 0; i < 8; i++) {
chris 0:f125b9cfab7b 31 vector[i] = 0; // zero the vector location
chris 0:f125b9cfab7b 32 for (int j = 0; j < 4; j++) {
chris 0:f125b9cfab7b 33 char c = fgetc(f1); // read char from file
chris 0:f125b9cfab7b 34 vector[i] |= (c << (8*j)); // shift to byte location
chris 0:f125b9cfab7b 35 }
chris 0:f125b9cfab7b 36 sum += vector[i]; // keep a running total
chris 0:f125b9cfab7b 37 }
chris 0:f125b9cfab7b 38
chris 0:f125b9cfab7b 39
chris 0:f125b9cfab7b 40 // calculate the 2's compliment, for vector[7]
chris 0:f125b9cfab7b 41 vector[7] = (~sum) + 1;
chris 0:f125b9cfab7b 42
chris 0:f125b9cfab7b 43 for (int i = 0; i < 8; i++) {
chris 0:f125b9cfab7b 44 printf("Vector[%d] = 0x%08x\n",i,vector[i]);
chris 0:f125b9cfab7b 45 }
chris 0:f125b9cfab7b 46
chris 0:f125b9cfab7b 47 printf("Sum vector = 0x%08x\n",sum);
chris 0:f125b9cfab7b 48
chris 0:f125b9cfab7b 49
chris 0:f125b9cfab7b 50 // write out patched vector table
chris 0:f125b9cfab7b 51 // read first 7 words (28 bytes) into an array
chris 0:f125b9cfab7b 52 for (int i = 0; i < 8; i++) {
chris 0:f125b9cfab7b 53 for (int j = 0; j < 4; j++) {
chris 0:f125b9cfab7b 54 char c = ( vector[i] >> (8*j)) & 0xFF;
chris 0:f125b9cfab7b 55 fputc(c,f2); // read char from file
chris 0:f125b9cfab7b 56 }
chris 0:f125b9cfab7b 57 }
chris 0:f125b9cfab7b 58
chris 0:f125b9cfab7b 59 // read in and write remaining bytes of source binary
chris 0:f125b9cfab7b 60 while (!feof(f1)) {
chris 0:f125b9cfab7b 61 char c = fgetc (f1); // read char from file
chris 0:f125b9cfab7b 62 fputc(c,f2); // write byte to file
chris 0:f125b9cfab7b 63 ctr++;
chris 0:f125b9cfab7b 64 }
chris 0:f125b9cfab7b 65
chris 0:f125b9cfab7b 66 }
chris 0:f125b9cfab7b 67
chris 0:f125b9cfab7b 68 fclose(f1);
chris 0:f125b9cfab7b 69 fclose(f2);
chris 0:f125b9cfab7b 70
chris 0:f125b9cfab7b 71 printf("Done! %d bytes processed\n",ctr);
chris 0:f125b9cfab7b 72 while (1) {
chris 0:f125b9cfab7b 73 led4 = !led4;
chris 0:f125b9cfab7b 74 wait(0.2);
chris 0:f125b9cfab7b 75 }
chris 0:f125b9cfab7b 76
chris 0:f125b9cfab7b 77
chris 0:f125b9cfab7b 78 }