ed316b2365e4acb891223d05294c649048645a1c
[rapper.git] / bitbucket_lpc1768 / lpcrc / lpcrc.c
1 /*
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2010, Roel Verdult
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  * 1. Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  * 3. Neither the name of the copyright holders nor the
15  * names of its contributors may be used to endorse or promote products
16  * derived from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
22  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  *
29  */
30
31 #include <stdio.h>
32 #include <stdint.h>
33
34 #define BLOCK_COUNT 7
35 #define BLOCK_LENGTH 4
36 #define BLOCK_TOTAL (BLOCK_COUNT*BLOCK_LENGTH)
37
38 typedef unsigned char byte_t;
39
40 int main(int argc, char *argv[])
41 {
42   FILE* pf;
43   byte_t buf[BLOCK_TOTAL];
44   uint32_t crc = 0;
45   uint32_t block;
46   
47   // Check for required arguments
48   if (argc < 2)
49   {
50     printf("syntax: lpcrc <firmware.bin>\n");
51     return 1;
52   }
53   
54   // Try to open the supplied firmware
55   if ((pf = fopen(argv[1],"rb+")) == NULL)
56   {
57     printf("error: could not open file [%s] with write access\n",argv[1]);
58     return 1;
59   }
60
61   // Read out the data blocks used for crc calculation
62   if (fread(buf,1,BLOCK_TOTAL,pf) != BLOCK_TOTAL)
63   {
64     printf("error: could not read required bytes\n");
65     fclose(pf);
66     return 1;
67   }
68
69   // Compute the crc value
70   for (block=0; block<BLOCK_COUNT; block++)
71   {
72     crc += *((uint32_t*)(buf+(block*BLOCK_LENGTH)));
73   }
74   crc = (~crc) + 1;
75   
76   // Reposition the file stream indicator to switch between read and write
77   if (fseek(pf,0,SEEK_CUR) != 0)
78   {
79     printf("error: could not switch from read to write mode\n");
80     fclose(pf);
81     return 1;
82   }
83   
84   // Write the crc back to the file
85   if (fwrite((byte_t*)&crc,1,BLOCK_LENGTH,pf) != BLOCK_LENGTH)
86   {
87     printf("error: could not write crc back to file\n");
88     fclose(pf);
89     return 1;
90   }
91
92   printf("succesfully updated crc to: %08x\n",crc);
93   fclose(pf);
94   
95   return 0;
96 }
97