1*ba62d9d3SAndroid Build Coastguard Worker #include <dirent.h>
2*ba62d9d3SAndroid Build Coastguard Worker #include <sys/stat.h>
3*ba62d9d3SAndroid Build Coastguard Worker #include <cstring>
4*ba62d9d3SAndroid Build Coastguard Worker #include <list>
5*ba62d9d3SAndroid Build Coastguard Worker #include <stdio.h>
6*ba62d9d3SAndroid Build Coastguard Worker #include <cstdlib>
7*ba62d9d3SAndroid Build Coastguard Worker #include <string>
8*ba62d9d3SAndroid Build Coastguard Worker #include <algorithm>
9*ba62d9d3SAndroid Build Coastguard Worker
10*ba62d9d3SAndroid Build Coastguard Worker #define MAX_STRING_SIZE 4096
11*ba62d9d3SAndroid Build Coastguard Worker #define MAX_KERNEL_NAME_LENGTH 100
12*ba62d9d3SAndroid Build Coastguard Worker #define MAX_CACHE_STRING_LENGTH (MAX_KERNEL_NAME_LENGTH + 10)
13*ba62d9d3SAndroid Build Coastguard Worker
14*ba62d9d3SAndroid Build Coastguard Worker using namespace std;
15*ba62d9d3SAndroid Build Coastguard Worker
16*ba62d9d3SAndroid Build Coastguard Worker #define StrCmp strncasecmp
17*ba62d9d3SAndroid Build Coastguard Worker
main(int argc,char * argv[])18*ba62d9d3SAndroid Build Coastguard Worker int main(int argc, char *argv[])
19*ba62d9d3SAndroid Build Coastguard Worker {
20*ba62d9d3SAndroid Build Coastguard Worker
21*ba62d9d3SAndroid Build Coastguard Worker if (argc != 3)
22*ba62d9d3SAndroid Build Coastguard Worker {
23*ba62d9d3SAndroid Build Coastguard Worker fprintf(stderr, "Usage: GenDmyHex.exe <kernel hex dir> <kernel header file> \n");
24*ba62d9d3SAndroid Build Coastguard Worker exit(-1);
25*ba62d9d3SAndroid Build Coastguard Worker }
26*ba62d9d3SAndroid Build Coastguard Worker
27*ba62d9d3SAndroid Build Coastguard Worker struct dirent* ent = NULL;
28*ba62d9d3SAndroid Build Coastguard Worker
29*ba62d9d3SAndroid Build Coastguard Worker char dirkrnhex[MAX_STRING_SIZE];
30*ba62d9d3SAndroid Build Coastguard Worker FILE *pfkrnheader = NULL;
31*ba62d9d3SAndroid Build Coastguard Worker DIR *pHexDir = opendir(argv[1]);
32*ba62d9d3SAndroid Build Coastguard Worker
33*ba62d9d3SAndroid Build Coastguard Worker if (!pHexDir)
34*ba62d9d3SAndroid Build Coastguard Worker {
35*ba62d9d3SAndroid Build Coastguard Worker fprintf(stderr, "Open kernel hex dir failed!\n");
36*ba62d9d3SAndroid Build Coastguard Worker exit(-1);
37*ba62d9d3SAndroid Build Coastguard Worker }
38*ba62d9d3SAndroid Build Coastguard Worker
39*ba62d9d3SAndroid Build Coastguard Worker if(sprintf(dirkrnhex, "%s", argv[1]) < 0)
40*ba62d9d3SAndroid Build Coastguard Worker {
41*ba62d9d3SAndroid Build Coastguard Worker fprintf(stderr, "Copy kernel hex dir failed!\n");
42*ba62d9d3SAndroid Build Coastguard Worker exit(-1);
43*ba62d9d3SAndroid Build Coastguard Worker }
44*ba62d9d3SAndroid Build Coastguard Worker strcat(dirkrnhex, "/");
45*ba62d9d3SAndroid Build Coastguard Worker
46*ba62d9d3SAndroid Build Coastguard Worker if(!(pfkrnheader = fopen(argv[2], "r")))
47*ba62d9d3SAndroid Build Coastguard Worker {
48*ba62d9d3SAndroid Build Coastguard Worker fprintf(stderr, "Read kernel header file failed!\n");
49*ba62d9d3SAndroid Build Coastguard Worker exit(-1);
50*ba62d9d3SAndroid Build Coastguard Worker }
51*ba62d9d3SAndroid Build Coastguard Worker
52*ba62d9d3SAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////
53*ba62d9d3SAndroid Build Coastguard Worker //Get Full kernel list from pre-built kernele header file//
54*ba62d9d3SAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////
55*ba62d9d3SAndroid Build Coastguard Worker
56*ba62d9d3SAndroid Build Coastguard Worker list <string> KernelFullList;
57*ba62d9d3SAndroid Build Coastguard Worker char scache[MAX_CACHE_STRING_LENGTH];
58*ba62d9d3SAndroid Build Coastguard Worker
59*ba62d9d3SAndroid Build Coastguard Worker while (fgets(scache, MAX_CACHE_STRING_LENGTH, pfkrnheader))
60*ba62d9d3SAndroid Build Coastguard Worker {
61*ba62d9d3SAndroid Build Coastguard Worker string strcache(scache);
62*ba62d9d3SAndroid Build Coastguard Worker if (strcache.size() < 16)
63*ba62d9d3SAndroid Build Coastguard Worker {
64*ba62d9d3SAndroid Build Coastguard Worker continue;
65*ba62d9d3SAndroid Build Coastguard Worker }
66*ba62d9d3SAndroid Build Coastguard Worker string head = strcache.substr(8, 6);
67*ba62d9d3SAndroid Build Coastguard Worker if (!head.compare("IDR_VP"))
68*ba62d9d3SAndroid Build Coastguard Worker {
69*ba62d9d3SAndroid Build Coastguard Worker strcache.erase(0, 15);
70*ba62d9d3SAndroid Build Coastguard Worker strcache.erase(strcache.find(" "), strcache.size());
71*ba62d9d3SAndroid Build Coastguard Worker if (!strcache.compare("TOTAL_NUM_KERNELS") ||
72*ba62d9d3SAndroid Build Coastguard Worker !strcache.compare("KERNEL_NAMES") ||
73*ba62d9d3SAndroid Build Coastguard Worker !strcache.compare("LINKFILE_HEADER") ||
74*ba62d9d3SAndroid Build Coastguard Worker !strcache.compare("LINKFILE_VERSION") ||
75*ba62d9d3SAndroid Build Coastguard Worker !strcache.compare("LinkFile")
76*ba62d9d3SAndroid Build Coastguard Worker )
77*ba62d9d3SAndroid Build Coastguard Worker {
78*ba62d9d3SAndroid Build Coastguard Worker continue;
79*ba62d9d3SAndroid Build Coastguard Worker }
80*ba62d9d3SAndroid Build Coastguard Worker strcache.append(".hex");
81*ba62d9d3SAndroid Build Coastguard Worker KernelFullList.push_back(strcache);
82*ba62d9d3SAndroid Build Coastguard Worker }
83*ba62d9d3SAndroid Build Coastguard Worker }
84*ba62d9d3SAndroid Build Coastguard Worker
85*ba62d9d3SAndroid Build Coastguard Worker fclose(pfkrnheader);
86*ba62d9d3SAndroid Build Coastguard Worker
87*ba62d9d3SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////
88*ba62d9d3SAndroid Build Coastguard Worker // Remove a superset list of all the kernels according to generated kernel//
89*ba62d9d3SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////
90*ba62d9d3SAndroid Build Coastguard Worker
91*ba62d9d3SAndroid Build Coastguard Worker char dirNewfile[MAX_STRING_SIZE];
92*ba62d9d3SAndroid Build Coastguard Worker char dirOldfile[MAX_STRING_SIZE];
93*ba62d9d3SAndroid Build Coastguard Worker
94*ba62d9d3SAndroid Build Coastguard Worker while (NULL != (ent=readdir(pHexDir)))
95*ba62d9d3SAndroid Build Coastguard Worker {
96*ba62d9d3SAndroid Build Coastguard Worker int n = strlen(ent->d_name);
97*ba62d9d3SAndroid Build Coastguard Worker if (n < 4 || (StrCmp(ent->d_name + n - 4, ".hex", 4) != 0))
98*ba62d9d3SAndroid Build Coastguard Worker {
99*ba62d9d3SAndroid Build Coastguard Worker continue;
100*ba62d9d3SAndroid Build Coastguard Worker }
101*ba62d9d3SAndroid Build Coastguard Worker
102*ba62d9d3SAndroid Build Coastguard Worker //Rename kernel name which contains "Dscale" to "DScale" except for "P010_444Dscale16_Buf*"
103*ba62d9d3SAndroid Build Coastguard Worker string sfilename(ent->d_name);
104*ba62d9d3SAndroid Build Coastguard Worker size_t pos = sfilename.find("Dscale");
105*ba62d9d3SAndroid Build Coastguard Worker if (pos != string::npos)
106*ba62d9d3SAndroid Build Coastguard Worker {
107*ba62d9d3SAndroid Build Coastguard Worker string ssub = sfilename.substr(0, 9);
108*ba62d9d3SAndroid Build Coastguard Worker if (ssub.compare("P010_444D"))
109*ba62d9d3SAndroid Build Coastguard Worker {
110*ba62d9d3SAndroid Build Coastguard Worker sfilename.replace(pos, 6, "DScale");
111*ba62d9d3SAndroid Build Coastguard Worker strcpy(dirNewfile, dirkrnhex);
112*ba62d9d3SAndroid Build Coastguard Worker strcpy(dirOldfile, dirkrnhex);
113*ba62d9d3SAndroid Build Coastguard Worker strcat(dirOldfile, ent->d_name);
114*ba62d9d3SAndroid Build Coastguard Worker strcat(dirNewfile, sfilename.c_str());
115*ba62d9d3SAndroid Build Coastguard Worker if (rename(dirOldfile, dirNewfile))
116*ba62d9d3SAndroid Build Coastguard Worker {
117*ba62d9d3SAndroid Build Coastguard Worker fprintf(stderr, "Rename file %s to %s failed!\n", dirOldfile, dirNewfile);
118*ba62d9d3SAndroid Build Coastguard Worker exit(-1);
119*ba62d9d3SAndroid Build Coastguard Worker }
120*ba62d9d3SAndroid Build Coastguard Worker }
121*ba62d9d3SAndroid Build Coastguard Worker
122*ba62d9d3SAndroid Build Coastguard Worker }
123*ba62d9d3SAndroid Build Coastguard Worker
124*ba62d9d3SAndroid Build Coastguard Worker // Remove the generated kernel
125*ba62d9d3SAndroid Build Coastguard Worker list <string>::iterator iter = find(KernelFullList.begin(), KernelFullList.end(), sfilename);
126*ba62d9d3SAndroid Build Coastguard Worker if (iter != KernelFullList.end())
127*ba62d9d3SAndroid Build Coastguard Worker {
128*ba62d9d3SAndroid Build Coastguard Worker KernelFullList.erase(iter);
129*ba62d9d3SAndroid Build Coastguard Worker }
130*ba62d9d3SAndroid Build Coastguard Worker }
131*ba62d9d3SAndroid Build Coastguard Worker
132*ba62d9d3SAndroid Build Coastguard Worker closedir(pHexDir);
133*ba62d9d3SAndroid Build Coastguard Worker
134*ba62d9d3SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////
135*ba62d9d3SAndroid Build Coastguard Worker // Create a set of dummy kernel hex that are not included in the generated kernels//
136*ba62d9d3SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////
137*ba62d9d3SAndroid Build Coastguard Worker
138*ba62d9d3SAndroid Build Coastguard Worker while (!KernelFullList.empty())
139*ba62d9d3SAndroid Build Coastguard Worker {
140*ba62d9d3SAndroid Build Coastguard Worker string skernelhex = KernelFullList.front();
141*ba62d9d3SAndroid Build Coastguard Worker strcpy(dirNewfile, dirkrnhex);
142*ba62d9d3SAndroid Build Coastguard Worker strcat(dirNewfile, skernelhex.c_str());
143*ba62d9d3SAndroid Build Coastguard Worker FILE *pfkernelhex = NULL;
144*ba62d9d3SAndroid Build Coastguard Worker if (!(pfkernelhex = fopen(dirNewfile, "wb")))
145*ba62d9d3SAndroid Build Coastguard Worker {
146*ba62d9d3SAndroid Build Coastguard Worker fprintf(stderr, "Create dummy kernel hex file failed!\n");
147*ba62d9d3SAndroid Build Coastguard Worker exit(-1);
148*ba62d9d3SAndroid Build Coastguard Worker }
149*ba62d9d3SAndroid Build Coastguard Worker else
150*ba62d9d3SAndroid Build Coastguard Worker {
151*ba62d9d3SAndroid Build Coastguard Worker fclose(pfkernelhex);
152*ba62d9d3SAndroid Build Coastguard Worker }
153*ba62d9d3SAndroid Build Coastguard Worker KernelFullList.pop_front();
154*ba62d9d3SAndroid Build Coastguard Worker }
155*ba62d9d3SAndroid Build Coastguard Worker
156*ba62d9d3SAndroid Build Coastguard Worker fprintf(stdout, "Create dummy kernel hex files successfully!\n");
157*ba62d9d3SAndroid Build Coastguard Worker return 0;
158*ba62d9d3SAndroid Build Coastguard Worker }
159