| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 | 
							- /*******************************************************************************
 
- * Copyright 2011-2012, Cypress Semiconductor Corporation.  All rights reserved.
 
- * You may use this file only in accordance with the license, terms, conditions, 
 
- * disclaimers, and limitations in the end user license agreement accompanying 
 
- * the software package with which this file was provided.
 
- ********************************************************************************/
 
- #include <string.h>
 
- #include "cybtldr_parse.h"
 
- #include "cybtldr_command.h"
 
- #include "cybtldr_api.h"
 
- #include "cybtldr_api2.h"
 
- unsigned char g_abort;
 
- int CyBtldr_RunAction(CyBtldr_Action action, const char* file, CyBtldr_CommunicationsData* comm, CyBtldr_ProgressUpdate* update)
 
- {
 
-     const unsigned long BL_VER_SUPPORT_VERIFY = 0x010214; /* Support for full flash verify added in v2.20 of cy_boot */
 
-     const unsigned char INVALID_APP = 0xFF;
 
-     unsigned long blVer = 0;
 
-     unsigned long siliconId = 0;
 
-     unsigned short rowNum = 0;
 
-     unsigned short bufSize = 0;
 
-     unsigned char siliconRev = 0;
 
-     unsigned char chksumtype = SUM_CHECKSUM;
 
-     unsigned char checksum = 0;
 
-     unsigned char checksum2 = 0;
 
-     unsigned char arrayId = 0;
 
-     unsigned char appId;
 
-     unsigned char isValid;
 
-     unsigned char isActive;
 
-     unsigned char buffer[MAX_BUFFER_SIZE];
 
-     char line[MAX_BUFFER_SIZE];
 
-     unsigned int lineLen;
 
-     char * app;
 
-     int err;
 
- 	
 
-     g_abort = 0;
 
-     err = CyBtldr_OpenDataFile(file);
 
-     if (CYRET_SUCCESS == err)
 
-     {
 
-         err = CyBtldr_ReadLine(&lineLen, line);
 
-         if (CYRET_SUCCESS == err)
 
-             err = CyBtldr_ParseHeader(lineLen, line, &siliconId, &siliconRev, &chksumtype);
 
-         if (CYRET_SUCCESS == err)
 
-         {
 
-             CyBtldr_SetCheckSumType(chksumtype);
 
-             err = CyBtldr_StartBootloadOperation(comm, siliconId, siliconRev, &blVer);
 
-         }
 
-         app = strrchr(file, '_');
 
-         appId = (app != NULL && '.' == app[2])
 
-             ? (CyBtldr_FromHex(app[1]) - 1)
 
-             : INVALID_APP;
 
-         if (CYRET_SUCCESS == err && INVALID_APP != appId)
 
-         {
 
- 			/* NB: This block of code will still run for single app if file */ 
 
- 			/* name format follows same as multi app (e.g. myfile_1.cyacd)  */
 
- 			/* This will return error if bootloader is for single app */
 
-             err = CyBtldr_GetApplicationStatus(appId, &isValid, &isActive);
 
-             /* Active app can be verified, but not programmed or erased */
 
-             if (CYRET_SUCCESS == err && VERIFY != action && isActive)
 
- 			{
 
- 				/* This is multi app */
 
- 				err = CYRET_ERR_ACTIVE;
 
- 			}
 
- 			else if (CYBTLDR_STAT_ERR_CMD == (err ^ (int)CYRET_ERR_BTLDR_MASK))
 
- 			{
 
- 				/* Single app - restore previous CYRET_SUCCESS */
 
- 				err = CYRET_SUCCESS;
 
- 			}
 
-         }
 
-         if (CYRET_SUCCESS == err)
 
-         {
 
-             while (CYRET_SUCCESS == err)
 
-             {
 
-                 if (g_abort)
 
-                 {
 
-                     err = CYRET_ABORT;
 
-                     break;
 
-                 }
 
-                 err = CyBtldr_ReadLine(&lineLen, line);
 
-                 if (CYRET_SUCCESS == err)
 
-                     err = CyBtldr_ParseRowData(lineLen, line, &arrayId, &rowNum, buffer, &bufSize, &checksum);
 
-                 if (CYRET_SUCCESS == err)
 
-                 {
 
-                     switch (action)
 
-                     {
 
-                         case ERASE:
 
-                             err = CyBtldr_EraseRow(arrayId, rowNum);
 
-                             break;
 
-                         case PROGRAM:
 
-                             err = CyBtldr_ProgramRow(arrayId, rowNum, buffer, bufSize);
 
-                             if (CYRET_SUCCESS != err)
 
-                                 break;
 
-                             /* Continue on to verify the row that was programmed */
 
-                         case VERIFY:
 
-                             checksum2 = (unsigned char)(checksum + arrayId + rowNum + (rowNum >> 8) + bufSize + (bufSize >> 8));
 
-                             err = CyBtldr_VerifyRow(arrayId, rowNum, checksum2);
 
-                             break;
 
-                     }
 
-                     if (CYRET_SUCCESS == err && NULL != update)
 
-                         update(arrayId, rowNum);
 
-                 }
 
-                 else if (CYRET_ERR_EOF == err)
 
-                 {
 
-                     err = CYRET_SUCCESS;
 
-                     break;
 
-                 }
 
-             }
 
-             if (CYRET_SUCCESS == err)
 
-             {
 
-                 /* Set the active application to what was just programmed */
 
-                 if (PROGRAM == action && INVALID_APP != appId)
 
-                 {
 
-                     err = CyBtldr_GetApplicationStatus(appId, &isValid, &isActive);
 
-                     if (CYRET_SUCCESS == err)
 
-                     {
 
-                         /* If valid set the active application to what was just programmed */
 
- 						/* This is multi app */
 
-                         err = (0 == isValid)
 
-                             ? CyBtldr_SetApplicationStatus(appId)
 
-                             : CYRET_ERR_CHECKSUM;
 
-                     }
 
- 					else if (CYBTLDR_STAT_ERR_CMD == (err ^ (int)CYRET_ERR_BTLDR_MASK))
 
- 					{
 
- 						/* Single app - restore previous CYRET_SUCCESS */
 
- 						err = CYRET_SUCCESS;
 
- 					}
 
-                 }
 
-                 /* Verify that the entire application is valid */
 
-                 else if ((PROGRAM == action || VERIFY == action) && (blVer >= BL_VER_SUPPORT_VERIFY))
 
-                     err = CyBtldr_VerifyApplication();
 
-             }
 
-             CyBtldr_EndBootloadOperation();
 
-         }
 
-         else if (CYRET_ERR_COMM_MASK != (CYRET_ERR_COMM_MASK & err))
 
-             CyBtldr_EndBootloadOperation();
 
-         CyBtldr_CloseDataFile();
 
-     }
 
-     return err;
 
- }
 
- int CyBtldr_Program(const char* file, CyBtldr_CommunicationsData* comm, CyBtldr_ProgressUpdate* update)
 
- {
 
-     return CyBtldr_RunAction(PROGRAM, file, comm, update);
 
- }
 
- int CyBtldr_Erase(const char* file, CyBtldr_CommunicationsData* comm, CyBtldr_ProgressUpdate* update)
 
- {
 
-     return CyBtldr_RunAction(ERASE, file, comm, update);
 
- }
 
- int CyBtldr_Verify(const char* file, CyBtldr_CommunicationsData* comm, CyBtldr_ProgressUpdate* update)
 
- {
 
-     return CyBtldr_RunAction(VERIFY, file, comm, update);
 
- }
 
- int CyBtldr_Abort(void)
 
- {
 
-     g_abort = 1;
 
-     return CYRET_SUCCESS;
 
- }
 
 
  |