hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
 * Copyright (C) 2011 Samsung Electronics
 *
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
 
#define BUFSIZE            (16*1024)
#define IMG_SIZE        (16*1024)
#define SPL_HEADER_SIZE        16
#define FILE_PERM        (S_IRUSR | S_IWUSR | S_IRGRP \
               | S_IWGRP | S_IROTH | S_IWOTH)
#define SPL_HEADER        "S5PC210 HEADER  "
/*
* Requirement:
* IROM code reads first 14K bytes from boot device.
* It then calculates the checksum of 14K-4 bytes and compare with data at
* 14K-4 offset.
*
* This function takes two filenames:
* IN  "u-boot-spl.bin" and
* OUT "$(BOARD)-spl.bin as filenames.
* It reads the "u-boot-spl.bin" in 16K buffer.
* It calculates checksum of 14K-4 Bytes and stores at 14K-4 offset in buffer.
* It writes the buffer to "$(BOARD)-spl.bin" file.
*/
 
int main(int argc, char **argv)
{
   int i, len;
   unsigned char buffer[BUFSIZE] = {0};
   int ifd, ofd;
   unsigned int checksum = 0, count;
 
   if (argc != 3) {
       printf(" %d Wrong number of arguments\n", argc);
       exit(EXIT_FAILURE);
   }
 
   ifd = open(argv[1], O_RDONLY);
   if (ifd < 0) {
       fprintf(stderr, "%s: Can't open %s: %s\n",
           argv[0], argv[1], strerror(errno));
       exit(EXIT_FAILURE);
   }
 
   ofd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, FILE_PERM);
   if (ofd < 0) {
       fprintf(stderr, "%s: Can't open %s: %s\n",
           argv[0], argv[2], strerror(errno));
       if (ifd)
           close(ifd);
       exit(EXIT_FAILURE);
   }
 
   len = lseek(ifd, 0, SEEK_END);
   lseek(ifd, 0, SEEK_SET);
 
   memcpy(&buffer[0], SPL_HEADER, SPL_HEADER_SIZE);
 
   count = (len < (IMG_SIZE - SPL_HEADER_SIZE))
       ? len : (IMG_SIZE - SPL_HEADER_SIZE);
 
   if (read(ifd, buffer + SPL_HEADER_SIZE, count) != count) {
       fprintf(stderr, "%s: Can't read %s: %s\n",
           argv[0], argv[1], strerror(errno));
 
       if (ifd)
           close(ifd);
       if (ofd)
           close(ofd);
 
       exit(EXIT_FAILURE);
   }
 
   for (i = 0; i < IMG_SIZE - SPL_HEADER_SIZE; i++)
       checksum += buffer[i+16];
 
   *(unsigned long *)buffer ^= 0x1f;
   *(unsigned long *)(buffer+4) ^= checksum;
 
   for (i = 1; i < SPL_HEADER_SIZE; i++)
       buffer[i] ^= buffer[i-1];
 
   if (write(ofd, buffer, BUFSIZE) != BUFSIZE) {
       fprintf(stderr, "%s: Can't write %s: %s\n",
           argv[0], argv[2], strerror(errno));
 
       if (ifd)
           close(ifd);
       if (ofd)
           close(ofd);
 
       exit(EXIT_FAILURE);
   }
 
   if (ifd)
       close(ifd);
   if (ofd)
       close(ofd);
 
   return EXIT_SUCCESS;
}