#include "stdafx.h" #include "util_firmware.h" #include "util.hpp" #include "util_convert.hpp" // path(in) - Æß¿þ¾î ÆÄÀÏ °æ·Î // sVersion(out) - Æß¿þ¾î¿¡ ¸í½ÃµÇÀÖ´Â ¹öÁ¯(ex> Linux image HW1.3 KR423) // fw_ver(out) - 423 // ¹Ýȯ°ª: // 1 : ¼º°ø // -1 : ÆÄÀÏÀ» ¿­¼ö ¾ø´Ù. // -2 : ÆÄÀÏÀÇ Å©±â°¡ ÀÛÀº °æ¿ì(90¹ÙÀÌÆ® ¹Ì¸¸) // -3 : À߸øµÈ ÆÄÀÏÀÌ´Ù(¹öÁ¯Á¤º¸°¡ ¾ø´Â °æ¿ì) int get_fw_version(const char* path, char* type) { /* iFVersion : Çϵå¿þ¾î ¸®ºñÁ¯ ¹öÁ¯(rev52) Device Name : NVE4000rev50 Æß¿þ¾î ¾ÕÂÊ 40¹ÙÀÌÆ®¿¡ 32¹ø° À§Ä¡ºÎÅÍ Linux image HW1.3 KR423 ¿Í °°Àº Æß¿þ¾î ¹öÁ¯ÀÌ ÀÖÀ½ rev³Ñ¹ö°¡ 30ÀÌ»óÀÌ°í HW1.3À̸é ÀûÇÕ(buf[16] = 3À̸é) rev³Ñ¹ö°¡ 30ÀÌÇÏÀÌ°í HW1.1À̸é ÀûÇÕ(buf[16] = 1À̸é) */ char buf[1024]; memset(buf, 0x00, sizeof(buf)); FILE *fifo = fopen(path, "rb"); if(fifo == NULL) { // can not open file return -1; } int readCnt = fread(buf, 1, sizeof(buf), fifo); if(readCnt <= 90) { // ÆÄÀÏÀ» Àоî¿Ã ¼ö ¾ø´Ù.(Å©±â°¡ ÀÛ´Ù) return -2; } memcpy(type, buf+32, 32); // Linux image HW1.3 KR571 // Linux image HW1.3 KR640r10656 <- ¿ä·± Çü½Ä. // Áß°£¿¡ rÀ» .À¸·Î ¹Ù²ãÁØ´Ù. // .´ë½Å rÀ» ¾´ ÀÌÀ¯´Â AdminTool ±¸¹öÁ¯ÀÌ .À» Á¦´ë·Î ÀνÄÇÏÁö ¸øÇϱ⠶§¹® replace_char(type, 'r', '.'); //strcpy(type, buf); // if(strncmp(buf, "Linux image HW", 14) != 0) // if(strncmp(buf, "u-boot.bin", 10) != 0) // { // return -3; // } // result // strcpy(sVersion, buf); fclose(fifo); return 1; } int get_fw_version_n(const char* sVersion) { // sVersion - Linux image HW1.3 KR423 // buf[20]ºÎÅÍ 3ÀÚ¸®´Â 423 // char ver[10]; // strncpy(ver, sVersion+20, 3); int nn = atoi(sVersion+20); //int nn strncpy(ver, sVersion+20, 3); return nn; } /* -- ÀÌÁ¦´Â µÎ°³ÀÇ ÇÔ¼ö¸¦ ¸ðµÎ ¾Æ·¡ÀÇ get_firm_versionÀ¸·Î ÅëÀÏÇÕ´Ï´Ù. -- ÀÌÁ¦ºÎÅÍ´Â get_firm_version¸¸ »ç¿ëÇÕ´Ï´Ù. // FW V1.5.439 -> 439¼ýÀÚ·Î ¹ÝȯÇØÁØ´Ù. // XXXX FW V1.5.439 -> 1050439 ¼ýÀÚ·Î ¹ÝȯÇØÁØ´Ù. int fw_version_n(const char* firm) { char ver[10]; strncpy(ver, firm+8, 3); ver[3] = 0; return atoi(ver); } */ // [FW V1.5.499]Çü½ÄÀÇ ¹®ÀÚ¿­¿¡¼­ ¸¶Áö¸· Æß¿þ¾î ¹öÁ¯ 499¸¸ ¾ò¾î¿É´Ï´Ù. // -- ´Ü ÇÏÀ§ ȣȯ¼º ¹®Á¦·Î ¹öÁ¯±ÔÄ¢À» °­È­ÇÒ¼ö´Â ¾ø½À´Ï´Ù. int get_firm_version(const char* firmware) { // firmware : FW V1.5.400 int len = strlen(firmware); int i = len-1; for(; i >= 0; --i) { if(is_num(firmware[i])) continue; if(firmware[i] == '.') { return atoi(firmware+i+1); } else { // error break; } } // error return 0; } void test_get_firm_version() { int n; n = get_firm_version("FW V1.5.509"); ASSERT(n == 509); n = get_firm_version("FW V1.5.5k09"); ASSERT(n == 0); n = get_firm_version("FW V1.5.5587"); ASSERT(n == 5587); n = get_firm_version(""); ASSERT(n == 0); } int check_valid_upgrade(const char* sVersion, int iFVersion) { // ¼­¹ö¿Í Æß¿þ¾î ¹öÁ¯ üũ // buf´Â Linux image HW1.3 KR423 // buf[16] = 3 if(iFVersion >= 30 && sVersion[16] == '3') { // rev30 ÀÌ»óÀÌ°í Æß¿þ¾î¹öÁ¯ÀÌ HW1.3ÀÌ¸é ¸ÅÄ¡ //TRACE("mfind %s, %s\n", path, &sVersion[32]); } else if(iFVersion < 30 && sVersion[16] == '1') { // rev30 º¸´Ù ÇÏÀ§±âÁ¾ÀÌ°í Æß¿þ¾î°¡ HW1.1ÀÌ¸é ¸ÅÄ¡ //TRACE("find %s, %s\n", path, &sVersion[32]); } else { // Æß¿þ¾î ¹öÁ¯°ú ¼­¹ö ¹öÁ¯ÀÌ ¸ÂÁú ¾Ê´Â´Ù. return -1; } return 1; }