6b13f685e
김민수
BSP 최초 추가
|
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
struct boot_file_head {
uint32_t b_instruction;
uint8_t magic[8];
uint32_t check_sum;
uint32_t length;
uint8_t pad[12];
};
#define BOOT0_MAGIC "eGON.BT0"
#define STAMP_VALUE 0x5F0A6C39
int gen_check_sum(struct boot_file_head *head_p)
{
uint32_t length;
uint32_t *buf;
uint32_t loop;
uint32_t i;
uint32_t sum;
length = le32_to_cpu(head_p->length);
if ((length & 0x3) != 0)
return -1;
buf = (uint32_t *)head_p;
head_p->check_sum = cpu_to_le32(STAMP_VALUE);
loop = length >> 2;
for (i = 0, sum = 0; i < loop; i++)
sum += le32_to_cpu(buf[i]);
head_p->check_sum = cpu_to_le32(sum);
return 0;
}
#define ALIGN(x, a) __ALIGN_MASK((x), (typeof(x))(a)-1)
#define __ALIGN_MASK(x, mask) (((x)+(mask))&~(mask))
#define SUN4I_SRAM_SIZE 0x7600 /* 0x7748+ is used by BROM */
#define SRAM_LOAD_MAX_SIZE (SUN4I_SRAM_SIZE - sizeof(struct boot_file_head))
#define BLOCK_SIZE 512
struct boot_img {
struct boot_file_head header;
char code[SRAM_LOAD_MAX_SIZE];
char pad[BLOCK_SIZE];
};
int main(int argc, char *argv[])
{
int fd_in, fd_out;
struct boot_img img;
unsigned file_size;
int count;
if (argc < 2) {
printf("\tThis program makes an input bin file to sun4i " \
"bootable image.
" \
"\tUsage: %s input_file out_putfile
", argv[0]);
return EXIT_FAILURE;
}
fd_in = open(argv[1], O_RDONLY);
if (fd_in < 0) {
perror("Open input file");
return EXIT_FAILURE;
}
memset(img.pad, 0, BLOCK_SIZE);
file_size = lseek(fd_in, 0, SEEK_END);
if (file_size > SRAM_LOAD_MAX_SIZE) {
fprintf(stderr, "ERROR: File too large!
");
return EXIT_FAILURE;
}
fd_out = open(argv[2], O_WRONLY | O_CREAT, 0666);
if (fd_out < 0) {
perror("Open output file");
return EXIT_FAILURE;
}
lseek(fd_in, 0, SEEK_SET);
count = read(fd_in, img.code, file_size);
if (count != file_size) {
perror("Reading input image");
return EXIT_FAILURE;
}
img.header.b_instruction =
0xEA000000 |
((sizeof(struct boot_file_head) / sizeof(int) - 2)
& 0x00FFFFFF);
memcpy(img.header.magic, BOOT0_MAGIC, 8);
img.header.length =
ALIGN(file_size + sizeof(struct boot_file_head), BLOCK_SIZE);
img.header.b_instruction = cpu_to_le32(img.header.b_instruction);
img.header.length = cpu_to_le32(img.header.length);
gen_check_sum(&img.header);
count = write(fd_out, &img, le32_to_cpu(img.header.length));
if (count != le32_to_cpu(img.header.length)) {
perror("Writing output");
return EXIT_FAILURE;
}
close(fd_in);
close(fd_out);
return EXIT_SUCCESS;
}
|