|
@@ -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;
|
|
|
}
|