11 struct fis_image_hdr
{
12 unsigned char name
[16];
18 } __attribute__((packed
));
20 struct fis_image_crc
{
23 } __attribute__((packed
));
25 struct fis_image_desc
{
26 struct fis_image_hdr hdr
;
27 char _pad
[256 - sizeof(struct fis_image_hdr
) - sizeof(struct fis_image_crc
)];
28 struct fis_image_crc crc
;
29 } __attribute__((packed
));
31 static int fis_fd
= -1;
32 static struct fis_image_desc
*fis_desc
;
33 static int fis_erasesize
= 0;
39 munmap(fis_desc
, fis_erasesize
);
48 static struct fis_image_desc
*
51 struct fis_image_desc
*desc
;
56 fis_fd
= mtd_check_open("FIS directory");
61 fis_fd
= mtd_open("FIS directory", true);
65 fis_erasesize
= erasesize
;
66 desc
= mmap(NULL
, erasesize
, PROT_READ
|PROT_WRITE
, MAP_SHARED
, fis_fd
, 0);
67 if (desc
== MAP_FAILED
)
79 fis_validate(struct fis_part
*old
, int n_old
, struct fis_part
*new, int n_new
)
81 struct fis_image_desc
*desc
;
90 for (i
= 0; i
< n_new
- 1; i
++) {
92 fprintf(stderr
, "FIS error: only the last partition can detect the size automatically\n");
99 end
= (char *) end
+ fis_erasesize
;
100 while ((void *) desc
< end
) {
101 if (!desc
->hdr
.name
[0] || (desc
->hdr
.name
[0] == 0xff))
104 for (i
= 0; i
< n_old
; i
++) {
105 if (!strncmp((char *) desc
->hdr
.name
, (char *) old
[i
].name
, sizeof(desc
->hdr
.name
))) {
126 fis_remap(struct fis_part
*old
, int n_old
, struct fis_part
*new, int n_new
)
128 struct fis_image_desc
*fisdir
= NULL
;
129 struct fis_image_desc
*redboot
= NULL
;
130 struct fis_image_desc
*first
= NULL
;
131 struct fis_image_desc
*last
= NULL
;
132 struct fis_image_desc
*desc
;
133 struct fis_part
*part
;
134 uint32_t offset
= 0, size
= 0;
143 fprintf(stderr
, "Updating FIS table... \n");
145 end
= (char *) desc
+ fis_erasesize
;
146 while ((char *) desc
< end
) {
147 if (!desc
->hdr
.name
[0] || (desc
->hdr
.name
[0] == 0xff))
150 if (!strcmp((char *) desc
->hdr
.name
, "FIS directory"))
153 if (!strcmp((char *) desc
->hdr
.name
, "RedBoot"))
156 for (i
= 0; i
< n_old
; i
++) {
157 if (!strncmp((char *) desc
->hdr
.name
, (char *) old
[i
].name
, sizeof(desc
->hdr
.name
))) {
158 size
+= desc
->hdr
.size
;
174 if (desc
&& (last
->hdr
.flash_base
< desc
->hdr
.flash_base
- last
->hdr
.size
))
175 size
+= (desc
->hdr
.flash_base
- last
->hdr
.flash_base
) - last
->hdr
.size
;
179 if (redboot
&& (desc
>= redboot
)) {
180 if (first
->hdr
.flash_base
- desc
->hdr
.size
> desc
->hdr
.flash_base
) {
181 int delta
= first
->hdr
.flash_base
- desc
->hdr
.size
- desc
->hdr
.flash_base
;
190 desc
= first
+ n_new
;
191 offset
= first
->hdr
.flash_base
;
199 memmove(desc
, last
, end
- tmp
);
201 tmp
= end
- (last
- desc
) * sizeof(struct fis_image_desc
);
202 memset(tmp
, 0xff, tmp
- end
);
206 for (part
= new, desc
= first
; desc
< first
+ n_new
; desc
++, part
++) {
207 memset(desc
, 0, sizeof(struct fis_image_desc
));
208 memcpy(desc
->hdr
.name
, part
->name
, sizeof(desc
->hdr
.name
));
212 desc
->hdr
.flash_base
= offset
;
213 desc
->hdr
.mem_base
= part
->loadaddr
;
214 desc
->hdr
.entry_point
= part
->loadaddr
;
215 desc
->hdr
.size
= (part
->size
> 0) ? part
->size
: size
;
216 desc
->hdr
.data_length
= desc
->hdr
.size
;
218 offset
+= desc
->hdr
.size
;
219 size
-= desc
->hdr
.size
;
222 msync(fis_desc
, fis_erasesize
, MS_SYNC
|MS_INVALIDATE
);