Эх сурвалжийг харах

2020.05.19 / TC Hsu

Actions: Add header check funtion for CCS upgrade module, which check the model name, image length and CRC value is correct or not.

Image version    : N/A
Image checksum   : N/A

Hardware PWB P/N : N/A
Hardware Version : N/A

Files:

	modified:   Module_Upgrade.c
	modified:   Module_Upgrade.h
TC_Hsu 4 жил өмнө
parent
commit
a642ee2366

+ 78 - 22
EVSE/Modularization/Module_Upgrade.c

@@ -986,20 +986,92 @@ int Upgrade_CAN(int canfd,unsigned int Type,unsigned char TargetAddr,char *Sourc
 //================================================
 // CCS update function
 //================================================
-int Check_CCS_image_exist(char *SourcePath)
+int Check_CCS_image_header(unsigned int Type,char *SourcePath,char *ModelName)
 {
+    long int MaxLen=48*1024*1024, ImageLen=0;
+    unsigned int ImageCRC=0;
     int fd;
+    // space max size set
 
     fd = open(SourcePath, O_RDONLY);
-
     if(fd < 0)
     {
         DEBUG_ERROR("Update CCS NG - can not open upgrade image\n");
         return FAIL;
     }
+
+    switch(Type)
+    {
+        case CCS_BOARD_BOOTLOADER:
+            MaxLen = 1*1024*1024;
+            DEBUG_INFO("Prepare to upgrade CCS BOOTLOADER\n");
+            break;
+        case CCS_BOARD_KERNEL_CONFIGURATION:
+            MaxLen = 0.5*1024*1024;
+            DEBUG_INFO("Prepare to upgrade CCS KERNEL CONFIGURATION\n");
+            break;
+        case CCS_BOARD_KERNEL_IMAGE:
+            MaxLen = 10*1024*1024;
+            DEBUG_INFO("Prepare to upgrade CCS KERNEL\n");
+            break;
+        case CCS_BOARD_FILE_SYSTEM:
+            MaxLen = 48*1024*1024;
+            DEBUG_INFO("Prepare to upgrade CCS FILE SYSTEM\n");
+            break;
+        default:
+            DEBUG_ERROR("Wrong image type for CCS upgrade\n");
+            return FAIL;
+            break;
+    }
+
+    unsigned char *ptr = malloc(MaxLen);
+    memset(ptr,0xFF,MaxLen);
+
+    //get the image length
+    ImageLen = read(fd,ptr,MaxLen);
+    close(fd);
+    //read out the header
+    int i;
+    for(i=0;i<16;i++)
+    {
+        if(ModelName[i] != ptr[i])
+        {
+            DEBUG_ERROR("Model name mismatch.\r\n");
+            return FAIL;
+        }
+    }
+
+    // check if the firmware type is correct
+    if(Type == (((unsigned int)ptr[16])<<24 | ((unsigned int)ptr[17])<<16 | ((unsigned int)ptr[18])<<8 | ((unsigned int)ptr[19])))
+    {
+        if((ImageLen-48) == (((unsigned int)ptr[20])<<24 | ((unsigned int)ptr[21])<<16 | ((unsigned int)ptr[22])<<8 | ((unsigned int)ptr[23])))
+        {
+            // get CRC in the header
+            ImageCRC = ((unsigned int)ptr[34])<<24 | ((unsigned int)ptr[35])<<16 | ((unsigned int)ptr[36])<<8 | ((unsigned int)ptr[37]);
+
+            // calculate the image CRC
+            DEBUG_INFO("CRC32 in CCS image: 0x%08X\r\n",ImageCRC);
+            DEBUG_INFO("CRC32 by calculation: 0x%08X\r\n",crc32(ptr,ImageLen));
+            if(crc32(ptr,ImageLen) == ImageCRC)
+            {
+                return PASS;
+            }
+            else
+            {
+                DEBUG_ERROR("Firmware image CRC32 mismatch.\r\n");
+                return FAIL;
+            }
+        }
+        else
+        {
+            DEBUG_ERROR("Firmware image length mismatch.\r\n");
+            return FAIL;
+        }
+    }
     else
     {
-        return PASS;
+        DEBUG_ERROR("Firmware image type mismatch.\r\n");
+        return FAIL;
     }
 }
 
@@ -1026,6 +1098,7 @@ int Put_CCS_image(char *SourcePath, unsigned char TargetAddr)
     }
     else
     {
+        DEBUG_INFO("FTP put %s to CCS board %d finish\n", SourcePath, TargetAddr);
         return PASS;
     }
 }
@@ -1070,26 +1143,9 @@ int Send_CCS_download_finish(int canfd,unsigned int Slave_Addr)
     }
 }
 
-int Upgrade_CCS(int canfd,unsigned int Type,unsigned char TargetAddr,char *SourcePath)
+int Upgrade_CCS(int canfd,unsigned int Type,unsigned char TargetAddr,char *SourcePath,char *ModelName)
 {
-    if(Type == CCS_BOARD_BOOTLOADER)
-    {
-        DEBUG_INFO("Upgrade CCS BOOTLOADER to CCS board %d, file name: %s.\n", TargetAddr, SourcePath);
-    }
-    else if(Type == CCS_BOARD_KERNEL_CONFIGURATION)
-    {
-        DEBUG_INFO("Upgrade CCS KERNEL CONFIGURATION to CCS board %d, file name: %s.\n", TargetAddr, SourcePath);
-    }
-    else if(Type == CCS_BOARD_KERNEL_IMAGE)
-    {
-        DEBUG_INFO("Upgrade CCS KERNEL to CCS board %d, file name: %s.\n", TargetAddr, SourcePath);
-    }
-    else if(Type == CCS_BOARD_FILE_SYSTEM)
-    {
-        DEBUG_INFO("Upgrade CCS FILE SYSTEM to CCS board %d, file name: %s.\n", TargetAddr, SourcePath);
-    }
-
-    if(Check_CCS_image_exist(SourcePath) == FAIL)
+    if(Check_CCS_image_header(Type, SourcePath, ModelName) == FAIL)
     {
         return FAIL;
     }

+ 1 - 1
EVSE/Modularization/Module_Upgrade.h

@@ -110,6 +110,6 @@ enum Uart_Command
 int Upgrade_Flash(unsigned int Type,char *SourcePath,char *ModelName);
 int Upgrade_UART(unsigned char uartfd,unsigned int Type,unsigned char TargetAddr,char *SourcePath,char *ModelName);
 int Upgrade_CAN(int canfd,unsigned int Type,unsigned char TargetAddr,char *SourcePath,char *ModelName);
-int Upgrade_CCS(int canfd,unsigned int Type,unsigned char TargetAddr,char *SourcePath);
+int Upgrade_CCS(int canfd,unsigned int Type,unsigned char TargetAddr,char *SourcePath,char *ModelName);
 
 #endif /* MODULE_UPGRADE_H_ */