blob: fb65265bbe2cd7f19c44f755d720b8af5a2d2503 [file] [log] [blame]
b.liua76c9612025-03-28 13:58:09 +08001#include <stdio.h>
2#include <string.h>
3
4#define FOTA_FBFVERSION_IMAGEID 0x464F5456 //"FOTV"
5
6#if 0
7static int get_fota_version(const char *fname, char *mversion, size_t msize)
8{
9 FILE *fp;
10 int ret;
11 fp = fopen(fname, "rb");
12 if (fp == NULL)
13 {
14 perror("fopen");
15 return 1;
16 }
17 ret = 0;
18 do
19 {
20 int num_img;
21 size_t sz;
22 char buf[64];
23 sz = fread(buf, 1, 32, fp);
24 if (sz < 32 || strncmp(buf, "Marvell_FBF", 11)) /* check FBF magic */
25 {
26 ret = 2;
27 break;
28 }
29 sz = fread(buf, 1, 2, fp);
30 if (sz < 2 || buf[0] != 11 || buf[1] != 0) /* check format version */
31 {
32 ret = 3;
33 break;
34 }
35 ret = fseek(fp, 0x13C, SEEK_SET);
36 if (ret)
37 {
38 perror("fseek");
39 ret = 1;
40 break;
41 }
42 sz = fread(&num_img, 1, 4, fp);
43 if (sz < 4 || num_img <= 0) /* check number of images */
44 {
45 ret = 4;
46 break;
47 }
48 ret = 5; /* not found */
49 while (num_img--)
50 {
51 sz = fread(buf, 1, 52, fp);
52 if (sz < 52) /* check ImageStruct_11 size */
53 {
54 ret = 6;
55 break;
56 }
57 if (*(int *)buf == FOTA_FBFVERSION_IMAGEID) /* check image ID */
58 {
59 unsigned offset = ((int *)buf)[5];
60 offset <<= 13; /* 8KB sectors */
61 ret = fseek(fp, offset, SEEK_SET);
62 if (ret)
63 {
64 perror("fseek");
65 ret = 1;
66 break;
67 }
68 sz = fread(mversion, 1, msize, fp);
69 if (sz < msize || strnlen(mversion, sz) == sz) /* check ASCIIZ */
70 {
71 ret = 7;
72 break;
73 }
74 if (strncmp(mversion, "OTA", 3)) /* check prefix */
75 {
76 /* treat as successful */
77 }
78 else
79 {
80 char *p;
81 switch (mversion[3])
82 {
83 case '0': /* FOTA */
84 p = strchr(mversion, ';');
85 if (p)
86 {
87 sz = p - mversion - 4;
88 memmove(mversion, mversion + 4, sz);
89 mversion[sz] = '\0';
90 }
91 else
92 {
93 ret = 8;
94 }
95 break;
96 case '4': /* DFOTA */
97 p = strchr(mversion, ';');
98 if (p)
99 {
100 char *q = p + 1;
101 p = strchr(q, ';');
102 if (p)
103 {
104 sz = p - q;
105 memmove(mversion, q, sz);
106 mversion[sz] = '\0';
107 }
108 else
109 {
110 ret = 9;
111 }
112 }
113 else
114 {
115 ret = 8;
116 }
117 break;
118 default:
119 ret = 7;
120 break;
121 }
122 }
123 break;
124 }
125 }
126 } while (0);
127 fclose(fp);
128 return ret;
129}
130#endif