xref: /utopia/UTPA2-700.0.x/projects/version/versionembadder.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
2*53ee8cc1Swenshuai.xi //
3*53ee8cc1Swenshuai.xi // Copyright (c) 2006-2007 MStar Semiconductor, Inc.
4*53ee8cc1Swenshuai.xi // All rights reserved.
5*53ee8cc1Swenshuai.xi //
6*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
7*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
8*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
9*53ee8cc1Swenshuai.xi // (¡§MStar Confidential Information¡¨) by the recipient.
10*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
11*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
12*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
13*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
14*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
17*53ee8cc1Swenshuai.xi 
18*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
19*53ee8cc1Swenshuai.xi ///
20*53ee8cc1Swenshuai.xi /// file    main.c
21*53ee8cc1Swenshuai.xi /// @brief  main entry point of the application program
22*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
23*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
24*53ee8cc1Swenshuai.xi 
25*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
26*53ee8cc1Swenshuai.xi //  Include Files
27*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
28*53ee8cc1Swenshuai.xi #include <stdio.h>
29*53ee8cc1Swenshuai.xi #include <stdlib.h>
30*53ee8cc1Swenshuai.xi #include <string.h>
31*53ee8cc1Swenshuai.xi 
32*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
33*53ee8cc1Swenshuai.xi // Local Defines
34*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
35*53ee8cc1Swenshuai.xi #define VERSIONEMBADDER_ERROR(fmt, args...)           printf("[VERSION_EMBADDER ERR][%06d]     " fmt, __LINE__, ## args)
36*53ee8cc1Swenshuai.xi #define VERSIONEMBADDER_DEBUG(fmt, args...)           //printf("[VERSION_EMBADDER DEBUG][%06d]     " fmt, __LINE__, ## args)
37*53ee8cc1Swenshuai.xi #define STRLEN 32
38*53ee8cc1Swenshuai.xi #define CHNAGEINDX 9
39*53ee8cc1Swenshuai.xi 
40*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
41*53ee8cc1Swenshuai.xi // Macros
42*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
43*53ee8cc1Swenshuai.xi 
44*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
45*53ee8cc1Swenshuai.xi // Global Variables
46*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
47*53ee8cc1Swenshuai.xi static char UtopiaVersionStr[]="UTOPIA_VERSION_2.0";
48*53ee8cc1Swenshuai.xi static char UtopiaChangeListStr[]="$Change:";
49*53ee8cc1Swenshuai.xi 
50*53ee8cc1Swenshuai.xi typedef struct _MS_SW_VERSION_NUM
51*53ee8cc1Swenshuai.xi {
52*53ee8cc1Swenshuai.xi     char    UtopiaBspVersion[STRLEN];
53*53ee8cc1Swenshuai.xi     int     UtopiaVerNum;
54*53ee8cc1Swenshuai.xi }MS_SW_VERSION_NUM;
55*53ee8cc1Swenshuai.xi 
56*53ee8cc1Swenshuai.xi struct version_node
57*53ee8cc1Swenshuai.xi {
58*53ee8cc1Swenshuai.xi     char* pVer;
59*53ee8cc1Swenshuai.xi     struct version_node *next;
60*53ee8cc1Swenshuai.xi };
61*53ee8cc1Swenshuai.xi 
62*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
63*53ee8cc1Swenshuai.xi // Local functions
64*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
push(struct version_node ** pHead,char * pVer)65*53ee8cc1Swenshuai.xi int push(struct version_node **pHead, char* pVer)
66*53ee8cc1Swenshuai.xi {
67*53ee8cc1Swenshuai.xi     struct version_node *pNode = (struct version_node *)malloc(sizeof(struct version_node));
68*53ee8cc1Swenshuai.xi 
69*53ee8cc1Swenshuai.xi     if(!pNode)
70*53ee8cc1Swenshuai.xi     {
71*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_ERROR("pNode creation failed\n");
72*53ee8cc1Swenshuai.xi         return 1;
73*53ee8cc1Swenshuai.xi     }
74*53ee8cc1Swenshuai.xi 
75*53ee8cc1Swenshuai.xi     pNode->pVer = pVer;
76*53ee8cc1Swenshuai.xi     pNode->next = *pHead;
77*53ee8cc1Swenshuai.xi     *pHead = pNode;
78*53ee8cc1Swenshuai.xi 
79*53ee8cc1Swenshuai.xi     return 0;
80*53ee8cc1Swenshuai.xi }
81*53ee8cc1Swenshuai.xi 
pop(struct version_node ** pHead)82*53ee8cc1Swenshuai.xi char* pop(struct version_node **pHead)
83*53ee8cc1Swenshuai.xi {
84*53ee8cc1Swenshuai.xi     char* pVer;
85*53ee8cc1Swenshuai.xi     struct version_node *pPreHead;
86*53ee8cc1Swenshuai.xi 
87*53ee8cc1Swenshuai.xi     if((*pHead)==NULL)
88*53ee8cc1Swenshuai.xi     {
89*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_DEBUG("pHead is empty\n");
90*53ee8cc1Swenshuai.xi         return NULL;
91*53ee8cc1Swenshuai.xi     }
92*53ee8cc1Swenshuai.xi 
93*53ee8cc1Swenshuai.xi     pPreHead = *pHead;
94*53ee8cc1Swenshuai.xi     pVer = (*pHead)->pVer;
95*53ee8cc1Swenshuai.xi     *pHead = (*pHead)->next;
96*53ee8cc1Swenshuai.xi     free(pPreHead);
97*53ee8cc1Swenshuai.xi 
98*53ee8cc1Swenshuai.xi     return pVer;
99*53ee8cc1Swenshuai.xi }
100*53ee8cc1Swenshuai.xi 
101*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
102*53ee8cc1Swenshuai.xi // Memory dump
103*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
memdump(char * ptr,size_t size)104*53ee8cc1Swenshuai.xi void memdump(char*ptr, size_t size)
105*53ee8cc1Swenshuai.xi {
106*53ee8cc1Swenshuai.xi     long count;
107*53ee8cc1Swenshuai.xi 
108*53ee8cc1Swenshuai.xi     for(count=0; count < size; count++)
109*53ee8cc1Swenshuai.xi     {
110*53ee8cc1Swenshuai.xi         printf("%x ", *(ptr+count));
111*53ee8cc1Swenshuai.xi         if((count%16) == 15)
112*53ee8cc1Swenshuai.xi         {
113*53ee8cc1Swenshuai.xi            printf("\n");
114*53ee8cc1Swenshuai.xi         }
115*53ee8cc1Swenshuai.xi     }
116*53ee8cc1Swenshuai.xi 
117*53ee8cc1Swenshuai.xi     printf("\n");
118*53ee8cc1Swenshuai.xi }
119*53ee8cc1Swenshuai.xi 
120*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
121*53ee8cc1Swenshuai.xi // Main function
122*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
main(int argc,char * argv[])123*53ee8cc1Swenshuai.xi int main(int argc, char* argv[])
124*53ee8cc1Swenshuai.xi {
125*53ee8cc1Swenshuai.xi     struct version_node *pVesList = NULL;
126*53ee8cc1Swenshuai.xi     FILE* pFileLibR = NULL;
127*53ee8cc1Swenshuai.xi     FILE* pFileLibW = NULL;
128*53ee8cc1Swenshuai.xi     FILE* pFileVerR = NULL;
129*53ee8cc1Swenshuai.xi     size_t LibRSize;
130*53ee8cc1Swenshuai.xi     size_t VerRSize;
131*53ee8cc1Swenshuai.xi     char* pbufLibR;
132*53ee8cc1Swenshuai.xi     char* pbufVerR;
133*53ee8cc1Swenshuai.xi     char* pbuf;
134*53ee8cc1Swenshuai.xi     size_t result;
135*53ee8cc1Swenshuai.xi     long count;
136*53ee8cc1Swenshuai.xi     unsigned int* pLibVer;
137*53ee8cc1Swenshuai.xi     unsigned int changelist;
138*53ee8cc1Swenshuai.xi 
139*53ee8cc1Swenshuai.xi     pFileLibR = fopen(argv[1], "rb");
140*53ee8cc1Swenshuai.xi     pFileLibW = fopen(argv[2], "wb");
141*53ee8cc1Swenshuai.xi     pFileVerR = fopen(argv[3], "rb");
142*53ee8cc1Swenshuai.xi 
143*53ee8cc1Swenshuai.xi     /* obtain files */
144*53ee8cc1Swenshuai.xi     if(NULL == pFileLibR)
145*53ee8cc1Swenshuai.xi     {
146*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_ERROR("fopen(%s) error!!!\n", argv[1]);
147*53ee8cc1Swenshuai.xi         return 0;
148*53ee8cc1Swenshuai.xi     }
149*53ee8cc1Swenshuai.xi 
150*53ee8cc1Swenshuai.xi     if(NULL == pFileLibW)
151*53ee8cc1Swenshuai.xi     {
152*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_ERROR("fopen(%s) error!!!\n", argv[2]);
153*53ee8cc1Swenshuai.xi         return 0;
154*53ee8cc1Swenshuai.xi     }
155*53ee8cc1Swenshuai.xi 
156*53ee8cc1Swenshuai.xi     if(NULL == pFileVerR)
157*53ee8cc1Swenshuai.xi     {
158*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_ERROR("fopen(%s) error!!!\n", argv[3]);
159*53ee8cc1Swenshuai.xi         return 0;
160*53ee8cc1Swenshuai.xi     }
161*53ee8cc1Swenshuai.xi 
162*53ee8cc1Swenshuai.xi     /* obtain original library file size */
163*53ee8cc1Swenshuai.xi     fseek (pFileLibR , 0 , SEEK_END);
164*53ee8cc1Swenshuai.xi     LibRSize = ftell(pFileLibR);
165*53ee8cc1Swenshuai.xi     rewind (pFileLibR);
166*53ee8cc1Swenshuai.xi 
167*53ee8cc1Swenshuai.xi     fseek (pFileVerR , 0 , SEEK_END);
168*53ee8cc1Swenshuai.xi     VerRSize = ftell(pFileVerR);
169*53ee8cc1Swenshuai.xi     rewind (pFileVerR);
170*53ee8cc1Swenshuai.xi 
171*53ee8cc1Swenshuai.xi     /* allocate memory to contain the whole file */
172*53ee8cc1Swenshuai.xi     pbufLibR = (char*) malloc ((size_t)LibRSize);
173*53ee8cc1Swenshuai.xi     if(pbufLibR == NULL)
174*53ee8cc1Swenshuai.xi     {
175*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_ERROR("malloc error!!!\n");
176*53ee8cc1Swenshuai.xi         return 0;
177*53ee8cc1Swenshuai.xi     }
178*53ee8cc1Swenshuai.xi 
179*53ee8cc1Swenshuai.xi     pbufVerR = (char*) malloc ((size_t)VerRSize);
180*53ee8cc1Swenshuai.xi     if(pbufVerR == NULL)
181*53ee8cc1Swenshuai.xi     {
182*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_ERROR("malloc error!!!\n");
183*53ee8cc1Swenshuai.xi         return 0;
184*53ee8cc1Swenshuai.xi     }
185*53ee8cc1Swenshuai.xi 
186*53ee8cc1Swenshuai.xi     /* copy the file into the buffer */
187*53ee8cc1Swenshuai.xi     result = fread (pbufLibR, 1, LibRSize, pFileLibR);
188*53ee8cc1Swenshuai.xi     if (result != LibRSize)
189*53ee8cc1Swenshuai.xi     {
190*53ee8cc1Swenshuai.xi         fclose(pFileLibR);
191*53ee8cc1Swenshuai.xi         fclose(pFileLibW);
192*53ee8cc1Swenshuai.xi         fclose(pFileVerR);
193*53ee8cc1Swenshuai.xi         free(pbufLibR);
194*53ee8cc1Swenshuai.xi         free(pbufVerR);
195*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_ERROR ("fread(%s) error!!! with result:%ld\n", argv[1], result);
196*53ee8cc1Swenshuai.xi         return 0;
197*53ee8cc1Swenshuai.xi     }
198*53ee8cc1Swenshuai.xi 
199*53ee8cc1Swenshuai.xi     result = fread (pbufVerR, 1, VerRSize, pFileVerR);
200*53ee8cc1Swenshuai.xi     if (result != VerRSize)
201*53ee8cc1Swenshuai.xi     {
202*53ee8cc1Swenshuai.xi         fclose(pFileLibR);
203*53ee8cc1Swenshuai.xi         fclose(pFileLibW);
204*53ee8cc1Swenshuai.xi         fclose(pFileVerR);
205*53ee8cc1Swenshuai.xi         free(pbufLibR);
206*53ee8cc1Swenshuai.xi         free(pbufVerR);
207*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_ERROR ("fread(%s) error!!! with result:%ld\n", argv[3], result);
208*53ee8cc1Swenshuai.xi         return 0;
209*53ee8cc1Swenshuai.xi     }
210*53ee8cc1Swenshuai.xi 
211*53ee8cc1Swenshuai.xi     VERSIONEMBADDER_DEBUG("###### version info in original utopia lib ######\n");
212*53ee8cc1Swenshuai.xi 
213*53ee8cc1Swenshuai.xi     /* in utopia library, find out where "UtopiaVersionStr" is */
214*53ee8cc1Swenshuai.xi     pbuf = NULL;
215*53ee8cc1Swenshuai.xi 
216*53ee8cc1Swenshuai.xi     for(count=0; count < LibRSize; count++)
217*53ee8cc1Swenshuai.xi     {
218*53ee8cc1Swenshuai.xi         if (strncmp(pbufLibR+count, UtopiaVersionStr, sizeof(UtopiaVersionStr)) == 0)
219*53ee8cc1Swenshuai.xi         {
220*53ee8cc1Swenshuai.xi             pbuf = pbufLibR+count;
221*53ee8cc1Swenshuai.xi             VERSIONEMBADDER_DEBUG("pbuf: %s\n", pbuf);
222*53ee8cc1Swenshuai.xi             VERSIONEMBADDER_DEBUG("offset_in_file: 0x%lx\n", count);
223*53ee8cc1Swenshuai.xi             push(&pVesList, pbuf + STRLEN);
224*53ee8cc1Swenshuai.xi 
225*53ee8cc1Swenshuai.xi         }
226*53ee8cc1Swenshuai.xi     }
227*53ee8cc1Swenshuai.xi 
228*53ee8cc1Swenshuai.xi     if(pbuf == NULL)
229*53ee8cc1Swenshuai.xi     {
230*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_ERROR("%s no found!!!\n", UtopiaVersionStr);
231*53ee8cc1Swenshuai.xi         fwrite (pbufLibR , sizeof(char), LibRSize, pFileLibW);
232*53ee8cc1Swenshuai.xi         fclose(pFileLibR);
233*53ee8cc1Swenshuai.xi         fclose(pFileLibW);
234*53ee8cc1Swenshuai.xi         fclose(pFileVerR);
235*53ee8cc1Swenshuai.xi         free(pbufLibR);
236*53ee8cc1Swenshuai.xi         free(pbufVerR);
237*53ee8cc1Swenshuai.xi         return 0;
238*53ee8cc1Swenshuai.xi     }
239*53ee8cc1Swenshuai.xi 
240*53ee8cc1Swenshuai.xi     VERSIONEMBADDER_DEBUG("###### version info in version_info ######\n");
241*53ee8cc1Swenshuai.xi 
242*53ee8cc1Swenshuai.xi     /* in version_info, find change list number*/
243*53ee8cc1Swenshuai.xi     pbuf = NULL;
244*53ee8cc1Swenshuai.xi     for(count = 0; count < VerRSize; count++)
245*53ee8cc1Swenshuai.xi     {
246*53ee8cc1Swenshuai.xi         if (strncmp(pbufVerR + count, UtopiaChangeListStr, sizeof(UtopiaChangeListStr) - 1) == 0)
247*53ee8cc1Swenshuai.xi         {
248*53ee8cc1Swenshuai.xi             pbuf = pbufVerR+count;
249*53ee8cc1Swenshuai.xi             VERSIONEMBADDER_DEBUG("pbuf: %s\n", pbuf);
250*53ee8cc1Swenshuai.xi             VERSIONEMBADDER_DEBUG("offset_in_file: 0x%lx\n", count);
251*53ee8cc1Swenshuai.xi         }
252*53ee8cc1Swenshuai.xi     }
253*53ee8cc1Swenshuai.xi 
254*53ee8cc1Swenshuai.xi     if(!pbuf)
255*53ee8cc1Swenshuai.xi     {
256*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_ERROR("can not find %s in %s\n", UtopiaChangeListStr, argv[3]);
257*53ee8cc1Swenshuai.xi         fclose(pFileLibR);
258*53ee8cc1Swenshuai.xi         fclose(pFileLibW);
259*53ee8cc1Swenshuai.xi         fclose(pFileVerR);
260*53ee8cc1Swenshuai.xi         free(pbufLibR);
261*53ee8cc1Swenshuai.xi         free(pbufVerR);
262*53ee8cc1Swenshuai.xi         return 0;
263*53ee8cc1Swenshuai.xi     }
264*53ee8cc1Swenshuai.xi 
265*53ee8cc1Swenshuai.xi     pbuf = pbuf + CHNAGEINDX;
266*53ee8cc1Swenshuai.xi     changelist = strtol(pbuf, NULL, 10);
267*53ee8cc1Swenshuai.xi     VERSIONEMBADDER_DEBUG("changelist: %d\n", changelist);
268*53ee8cc1Swenshuai.xi 
269*53ee8cc1Swenshuai.xi     /* update UtopiaVerNum in utopia library */
270*53ee8cc1Swenshuai.xi     while((pLibVer = (unsigned int* )pop(&pVesList)) != NULL)
271*53ee8cc1Swenshuai.xi     {
272*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_DEBUG("pLibVer=0x%x\n", pLibVer);
273*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_DEBUG("UtopiaVerNum = 0x%x\n", *pLibVer);
274*53ee8cc1Swenshuai.xi         *pLibVer = changelist;
275*53ee8cc1Swenshuai.xi     }
276*53ee8cc1Swenshuai.xi 
277*53ee8cc1Swenshuai.xi     /* copy the buffer into the file */
278*53ee8cc1Swenshuai.xi     result = fwrite (pbufLibR , sizeof(char), LibRSize, pFileLibW);
279*53ee8cc1Swenshuai.xi     if (result != LibRSize)
280*53ee8cc1Swenshuai.xi     {
281*53ee8cc1Swenshuai.xi         fclose(pFileLibR);
282*53ee8cc1Swenshuai.xi         fclose(pFileLibW);
283*53ee8cc1Swenshuai.xi         fclose(pFileVerR);
284*53ee8cc1Swenshuai.xi         free(pbufLibR);
285*53ee8cc1Swenshuai.xi         free(pbufVerR);
286*53ee8cc1Swenshuai.xi         VERSIONEMBADDER_ERROR ("fwrite error!!! with result:%ld\n",result);
287*53ee8cc1Swenshuai.xi         return 0;
288*53ee8cc1Swenshuai.xi     }
289*53ee8cc1Swenshuai.xi 
290*53ee8cc1Swenshuai.xi     /* terminate */
291*53ee8cc1Swenshuai.xi     fclose(pFileLibR);
292*53ee8cc1Swenshuai.xi     fclose(pFileLibW);
293*53ee8cc1Swenshuai.xi     fclose(pFileVerR);
294*53ee8cc1Swenshuai.xi     free(pbufLibR);
295*53ee8cc1Swenshuai.xi     free(pbufVerR);
296*53ee8cc1Swenshuai.xi 
297*53ee8cc1Swenshuai.xi     return 0;
298*53ee8cc1Swenshuai.xi }
299