#include #include #include #include #include #include #include #include #define MAX_STRING_SIZE 4096 #define MAX_KERNEL_NAME_LENGTH 100 #define MAX_CACHE_STRING_LENGTH (MAX_KERNEL_NAME_LENGTH + 10) using namespace std; #define StrCmp strncasecmp int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, "Usage: GenDmyHex.exe \n"); exit(-1); } struct dirent* ent = NULL; char dirkrnhex[MAX_STRING_SIZE]; FILE *pfkrnheader = NULL; DIR *pHexDir = opendir(argv[1]); if (!pHexDir) { fprintf(stderr, "Open kernel hex dir failed!\n"); exit(-1); } if(sprintf(dirkrnhex, "%s", argv[1]) < 0) { fprintf(stderr, "Copy kernel hex dir failed!\n"); exit(-1); } strcat(dirkrnhex, "/"); if(!(pfkrnheader = fopen(argv[2], "r"))) { fprintf(stderr, "Read kernel header file failed!\n"); exit(-1); } /////////////////////////////////////////////////////////// //Get Full kernel list from pre-built kernele header file// /////////////////////////////////////////////////////////// list KernelFullList; char scache[MAX_CACHE_STRING_LENGTH]; while (fgets(scache, MAX_CACHE_STRING_LENGTH, pfkrnheader)) { string strcache(scache); if (strcache.size() < 16) { continue; } string head = strcache.substr(8, 6); if (!head.compare("IDR_VP")) { strcache.erase(0, 15); strcache.erase(strcache.find(" "), strcache.size()); if (!strcache.compare("TOTAL_NUM_KERNELS") || !strcache.compare("KERNEL_NAMES") || !strcache.compare("LINKFILE_HEADER") || !strcache.compare("LINKFILE_VERSION") || !strcache.compare("LinkFile") ) { continue; } strcache.append(".hex"); KernelFullList.push_back(strcache); } } fclose(pfkrnheader); //////////////////////////////////////////////////////////////////////////// // Remove a superset list of all the kernels according to generated kernel// //////////////////////////////////////////////////////////////////////////// char dirNewfile[MAX_STRING_SIZE]; char dirOldfile[MAX_STRING_SIZE]; while (NULL != (ent=readdir(pHexDir))) { int n = strlen(ent->d_name); if (n < 4 || (StrCmp(ent->d_name + n - 4, ".hex", 4) != 0)) { continue; } //Rename kernel name which contains "Dscale" to "DScale" except for "P010_444Dscale16_Buf*" string sfilename(ent->d_name); size_t pos = sfilename.find("Dscale"); if (pos != string::npos) { string ssub = sfilename.substr(0, 9); if (ssub.compare("P010_444D")) { sfilename.replace(pos, 6, "DScale"); strcpy(dirNewfile, dirkrnhex); strcpy(dirOldfile, dirkrnhex); strcat(dirOldfile, ent->d_name); strcat(dirNewfile, sfilename.c_str()); if (rename(dirOldfile, dirNewfile)) { fprintf(stderr, "Rename file %s to %s failed!\n", dirOldfile, dirNewfile); exit(-1); } } } // Remove the generated kernel list ::iterator iter = find(KernelFullList.begin(), KernelFullList.end(), sfilename); if (iter != KernelFullList.end()) { KernelFullList.erase(iter); } } closedir(pHexDir); //////////////////////////////////////////////////////////////////////////////////// // Create a set of dummy kernel hex that are not included in the generated kernels// //////////////////////////////////////////////////////////////////////////////////// while (!KernelFullList.empty()) { string skernelhex = KernelFullList.front(); strcpy(dirNewfile, dirkrnhex); strcat(dirNewfile, skernelhex.c_str()); FILE *pfkernelhex = NULL; if (!(pfkernelhex = fopen(dirNewfile, "wb"))) { fprintf(stderr, "Create dummy kernel hex file failed!\n"); exit(-1); } else { fclose(pfkernelhex); } KernelFullList.pop_front(); } fprintf(stdout, "Create dummy kernel hex files successfully!\n"); return 0; }