2 * FIS table updating code for mtd
4 * Copyright (C) 2009 Felix Fietkau <nbd@openwrt.org>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License v2
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
25 struct fis_image_hdr
{
26 unsigned char name
[16];
32 } __attribute__((packed
));
34 struct fis_image_crc
{
37 } __attribute__((packed
));
39 struct fis_image_desc
{
40 struct fis_image_hdr hdr
;
41 char _pad
[256 - sizeof(struct fis_image_hdr
) - sizeof(struct fis_image_crc
)];
42 struct fis_image_crc crc
;
43 } __attribute__((packed
));
45 static int fis_fd
= -1;
46 static struct fis_image_desc
*fis_desc
;
47 static int fis_erasesize
= 0;
53 munmap(fis_desc
, fis_erasesize
);
62 static struct fis_image_desc
*
65 struct fis_image_desc
*desc
;
70 fis_fd
= mtd_check_open("FIS directory");
75 fis_fd
= mtd_open("FIS directory", true);
79 fis_erasesize
= erasesize
;
80 desc
= mmap(NULL
, erasesize
, PROT_READ
|PROT_WRITE
, MAP_SHARED
, fis_fd
, 0);
81 if (desc
== MAP_FAILED
)
93 fis_validate(struct fis_part
*old
, int n_old
, struct fis_part
*new, int n_new
)
95 struct fis_image_desc
*desc
;
104 for (i
= 0; i
< n_new
- 1; i
++) {
106 fprintf(stderr
, "FIS error: only the last partition can detect the size automatically\n");
113 end
= (char *) end
+ fis_erasesize
;
114 while ((void *) desc
< end
) {
115 if (!desc
->hdr
.name
[0] || (desc
->hdr
.name
[0] == 0xff))
118 for (i
= 0; i
< n_old
; i
++) {
119 if (!strncmp((char *) desc
->hdr
.name
, (char *) old
[i
].name
, sizeof(desc
->hdr
.name
))) {
140 fis_remap(struct fis_part
*old
, int n_old
, struct fis_part
*new, int n_new
)
142 struct fis_image_desc
*fisdir
= NULL
;
143 struct fis_image_desc
*redboot
= NULL
;
144 struct fis_image_desc
*first
= NULL
;
145 struct fis_image_desc
*last
= NULL
;
146 struct fis_image_desc
*desc
;
147 struct fis_part
*part
;
148 uint32_t offset
= 0, size
= 0;
157 fprintf(stderr
, "Updating FIS table... \n");
159 end
= (char *) desc
+ fis_erasesize
;
160 while ((char *) desc
< end
) {
161 if (!desc
->hdr
.name
[0] || (desc
->hdr
.name
[0] == 0xff))
164 if (!strcmp((char *) desc
->hdr
.name
, "FIS directory"))
167 if (!strcmp((char *) desc
->hdr
.name
, "RedBoot"))
170 for (i
= 0; i
< n_old
; i
++) {
171 if (!strncmp((char *) desc
->hdr
.name
, (char *) old
[i
].name
, sizeof(desc
->hdr
.name
))) {
172 size
+= desc
->hdr
.size
;
188 if (desc
&& (last
->hdr
.flash_base
< desc
->hdr
.flash_base
- last
->hdr
.size
))
189 size
+= (desc
->hdr
.flash_base
- last
->hdr
.flash_base
) - last
->hdr
.size
;
193 if (redboot
&& (desc
>= redboot
)) {
194 if (first
->hdr
.flash_base
- desc
->hdr
.size
> desc
->hdr
.flash_base
) {
195 int delta
= first
->hdr
.flash_base
- desc
->hdr
.size
- desc
->hdr
.flash_base
;
204 desc
= first
+ n_new
;
205 offset
= first
->hdr
.flash_base
;
213 memmove(desc
, last
, end
- tmp
);
215 tmp
= end
- (last
- desc
) * sizeof(struct fis_image_desc
);
216 memset(tmp
, 0xff, tmp
- end
);
220 for (part
= new, desc
= first
; desc
< first
+ n_new
; desc
++, part
++) {
221 memset(desc
, 0, sizeof(struct fis_image_desc
));
222 memcpy(desc
->hdr
.name
, part
->name
, sizeof(desc
->hdr
.name
));
226 desc
->hdr
.flash_base
= offset
;
227 desc
->hdr
.mem_base
= part
->loadaddr
;
228 desc
->hdr
.entry_point
= part
->loadaddr
;
229 desc
->hdr
.size
= (part
->size
> 0) ? part
->size
: size
;
230 desc
->hdr
.data_length
= desc
->hdr
.size
;
232 offset
+= desc
->hdr
.size
;
233 size
-= desc
->hdr
.size
;
236 msync(fis_desc
, fis_erasesize
, MS_SYNC
|MS_INVALIDATE
);
This page took 0.053796 seconds and 5 git commands to generate.