/*******************************************************************/ | |
/************************* File Description ************************/ | |
/*******************************************************************/ | |
/* File Name: $Workfile: hmx_uprade.c $ | |
* Version: $Revision: 1.0 $ | |
* Original Author: Yang Hyun Uk $ | |
* Current Author: $Author: huyang@humaxdigital.com $ | |
* Date: $Date: 2011.09.30 | |
* File Description: HTTP Live Streaming | |
* Module: | |
* Remarks: | |
*/ | |
/** | |
* | |
* @defgroup UPGRADE Upgrade APIs | |
* | |
*/ | |
/** | |
* @author Hyunuk Yang(huyang@humaxdigital.com) | |
* @date 30 Sept 2011 | |
*/ | |
/** | |
* @note | |
* Copyright (C) 2011 Humax Corporation. All Rights Reserved. <br> | |
* This software is the confidential and proprietary information | |
* of Humax Corporation. You may not use or distribute this software | |
* except in compliance with the terms and conditions of any applicable license | |
* agreement in writing between Humax Corporation and you. | |
*/ | |
/*@{*/ | |
/** | |
* @file hmx_upgrade.c | |
*/ | |
/*******************************************************************/ | |
/**************************** Header Files *************************/ | |
/*******************************************************************/ | |
/* Start Including Header Files */ | |
#include <stdio.h> | |
#include "hmx_upgrade.h" | |
#include "util.h" | |
/* End Including Headers */ | |
/*******************************************************************/ | |
/****************************** define *****************************/ | |
/*******************************************************************/ | |
#define HMX_UPGRADE_NUMBER_OF_QUEUE 64 | |
#define HMX_UPGRADE_TASK_PRIORITY 10 | |
#define HMX_UPGRADE_TASK_STACK_SIZE (1024*128) | |
/* End #define */ | |
/*******************************************************************/ | |
/****************************** typedef ****************************/ | |
/*******************************************************************/ | |
/* Start typedef */ | |
/* End typedef */ | |
/*******************************************************************/ | |
/************************ global variables *************************/ | |
/*******************************************************************/ | |
/* Start global variable */ | |
/** | |
* Upgrade Status Callback notifies status to APP | |
*/ | |
HMX_UpgradeEventCallback g_fUpgradeStatusCallback = NULL; | |
HMX_UPGRADE_COMMAND_t g_tUpgradeCommand; | |
/* End global variable */ | |
/*******************************************************************/ | |
/************************ static variables *************************/ | |
/*******************************************************************/ | |
/* Start static variable */ | |
static unsigned long s_ulUpgradeTaskId = 0; | |
static unsigned long s_ulUpgradeMessgseId=0; | |
/* End static variable */ | |
static void P_HMX_Upgrade_Task(void* param); | |
/** | |
* @b Function @b Description <br> | |
* Start Humax Upgrade Module. it creates a thread for Upgrading. <br> | |
* | |
* @param[in] callback : specify a callback to get Upgrade Status. if NULL, Upgrade Module can't be started. | |
* @param[in] file : specify a file path. also http address will be possible. if NULL, Upgrade Module can't be started. | |
* | |
* @return # 0 : success <br> | |
* # 1 : failed <br> | |
* | |
*/ | |
int HMX_UPGRADE_Start( HMX_UpgradeEventCallback callback, unsigned char * file) | |
{ | |
int err; | |
HMX_UPGRADE_COMMAND_t upgrade_msg; | |
/* Add Callback */ | |
if( callback == NULL ) | |
{ | |
printf("[%s] ERROR callback porinter is NULL \n", __FUNCTION__); | |
return 1; | |
} | |
g_fUpgradeStatusCallback = callback; | |
if ( file == NULL ) | |
{ | |
printf("[%s] ERROR file path is nULL\n", __FUNCTION__); | |
return 1; | |
} | |
err = HMX_MSG_Create(HMX_UPGRADE_NUMBER_OF_QUEUE, sizeof(HMX_UPGRADE_COMMAND_t), "UpgradeMsgQ", &s_ulUpgradeMessgseId, HMX_SUSPENDTYPE_FIFO); | |
if(err != HMX_OK) | |
{ | |
printf("[%s] [%d] Error(0x%x) \n\r",__FUNCTION__,__LINE__, err); | |
return HMX_ERROR; | |
} | |
err = HMX_TASK_Create( P_HMX_Upgrade_Task, HMX_UPGRADE_TASK_PRIORITY, HMX_UPGRADE_TASK_STACK_SIZE, "UpgradeTask", NULL, &s_ulUpgradeTaskId, 0); | |
if( err != HMX_OK ) | |
{ | |
printf("[%s] [%d] Error(0x%x) \n\r",__FUNCTION__,__LINE__, err); | |
return HMX_ERROR; | |
} | |
HMX_TASK_Start(s_ulUpgradeTaskId); | |
upgrade_msg.command = HMX_UPGRADE_FETCH; | |
/* this should be freed at Reciever */ | |
upgrade_msg.file_path = strdup(file); | |
err = HMX_MSG_Send(s_ulUpgradeMessgseId, &upgrade_msg, sizeof(HMX_UPGRADE_COMMAND_t),0); | |
if(err != HMX_OK) | |
{ | |
printf( "[HMX_UPGRADE_Start] HMX_MSG_Send error : err is 0x%x\n", err); | |
return HMX_ERROR; | |
} | |
return HMX_OK; | |
} | |
/** | |
* @b Function @b Description <br> | |
* Stop Humax Upgrade Module. even it can be stoped while it is Reading or Flashing. <br> | |
* | |
* @return # 0 : success <br> | |
* # 1 : failed <br> | |
* | |
*/ | |
int HMX_UPGRADE_Stop(void) | |
{ | |
int err; | |
HMX_UPGRADE_COMMAND_t upgrade_msg; | |
upgrade_msg.command = HMX_UPGRADE_STOP; | |
err = HMX_MSG_SendUrgent(s_ulUpgradeMessgseId, &upgrade_msg, sizeof(HMX_UPGRADE_COMMAND_t),0); | |
if(err != HMX_OK) | |
{ | |
printf( "[HMX_UPGRADE_Stop] HMX_MSG_Send error : err is 0x%x\n", err); | |
return HMX_ERROR; | |
} | |
HMX_TASK_Stop(s_ulUpgradeTaskId); | |
err = HMX_TASK_Destroy(s_ulUpgradeTaskId); | |
if( err != HMX_OK ) | |
{ | |
printf("[%s] [%d] Error(0x%x) \n\r",__FUNCTION__,__LINE__, err); | |
return HMX_ERROR; | |
} | |
err = HMX_MSG_Destroy(s_ulUpgradeMessgseId); | |
if(err != HMX_OK) | |
{ | |
printf("[%s] [%d] Error(0x%x) \n\r",__FUNCTION__,__LINE__, err); | |
return HMX_ERROR; | |
} | |
return HMX_OK; | |
} | |
#if 0 | |
/** | |
* @b Function @b Description <br> | |
* Specify a file to upgrade <br> | |
* | |
* @param[in] file : specify full file path. | |
* | |
* @return # 0 : success <br> | |
* # 1 : failed <br> | |
* | |
*/ | |
int HMX_UPGRADE_FetchFileToUpgrade(unsigned char * file) | |
{ | |
int nErr; | |
HMX_UPGRADE_COMMAND_t upgrade_msg; | |
if ( file == NULL ) | |
{ | |
printf("[%s] file path is nULL\n", __FUNCTION__); | |
} | |
upgrade_msg.command = HMX_UPGRADE_FETCH; | |
/* this should be freed at Reciever */ | |
upgrade_msg.file_path = strdup(file); | |
printf("[%s] file path is %s\n", __FUNCTION__, upgrade_msg.file_path); | |
nErr = HMX_MSG_SendTimeout(s_ulUpgradeMessgseId, &upgrade_msg, sizeof(HMX_UPGRADE_COMMAND_t),0); | |
if(nErr != HMX_OK) | |
{ | |
printf( "[HMX_UPGRADE_FetchFileToUpgrade] HMX_MSG_Send error : err is 0x%x\n", nErr); | |
return HMX_ERR; | |
} | |
return HMX_OK; | |
} | |
#endif | |
void HMX_UPGRADE_Call_Callback(HMX_UPGRADE_STATUS_Msg_t * upgrade_status_msg ) | |
{ | |
if ( g_fUpgradeStatusCallback != NULL ) | |
{ | |
g_fUpgradeStatusCallback(upgrade_status_msg); | |
} | |
} | |
/*******************************************************************/ | |
/************************ static funtions **************************/ | |
/*******************************************************************/ | |
static HMX_UPGRADE_EVENT_e P_HMX_UPGRADE_FILE(unsigned char * path) | |
{ | |
HMX_UPGRADE_STATUS_Msg_t * upgrade_status_msg; | |
int ret; | |
upgrade_status_msg = malloc(sizeof(HMX_UPGRADE_STATUS_Msg_t)); | |
printf ("[%s] \n", __FUNCTION__ ); | |
ret = HMX_UPGRADE_HDF_Do_Flash( path ); | |
if ( ret != HMX_OK ) | |
{ | |
printf ("[%s] HMX_UPGRADE_HDF_Do_Flash ret %d\n", __FUNCTION__, ret ); | |
upgrade_status_msg->event = ret; | |
HMX_UPGRADE_Call_Callback(upgrade_status_msg); | |
return HMX_UPGRADE_FILE_NOT_EXIST; | |
} | |
free(upgrade_status_msg); | |
return HMX_UPGRADE_DONE; | |
} | |
static void P_HMX_Upgrade_Task(void* param) | |
{ | |
HMX_UPGRADE_EVENT_e nErr; | |
int upgrade_is_done = 0; | |
HMX_UPGRADE_COMMAND_t recieved_command; | |
unsigned char * file_path=NULL; | |
HMX_UPGRADE_COMMAND_t send_command; | |
HMX_UPGRADE_STATUS_Msg_t * upgrade_status_msg; | |
upgrade_status_msg = malloc(sizeof(upgrade_status_msg)); | |
while(1) | |
{ | |
nErr = HMX_MSG_Receive(s_ulUpgradeMessgseId, &recieved_command, sizeof(HMX_UPGRADE_COMMAND_t)); | |
if(nErr != HMX_OK) | |
{ | |
printf ("%s (%d) Error> Error VK_MSG_ReceiveTimeout\n",__FUNCTION__,__LINE__); | |
} | |
else | |
{ | |
switch( recieved_command.command) | |
{ | |
case HMX_UPGRADE_START: | |
{ | |
printf("[%s] Receive HMX_UPGRADE_START command \n",__FUNCTION__); | |
/* DO Upgrade ........ here */ | |
nErr = P_HMX_UPGRADE_FILE(file_path); | |
send_command.command = HMX_UPGRADE_STOP; | |
(void)HMX_MSG_Send(s_ulUpgradeMessgseId, &send_command, sizeof(HMX_UPGRADE_COMMAND_t),0); | |
break; | |
} | |
case HMX_UPGRADE_STOP: | |
{ | |
printf("[%s] HMX_UPGRADE_STOP \r\n",__FUNCTION__); | |
free(upgrade_status_msg); | |
free(file_path); | |
/* Notify to app, UPgreade is done. */ | |
upgrade_status_msg->event = HMX_UPGRADE_DONE; | |
HMX_UPGRADE_Call_Callback(upgrade_status_msg); | |
/* TASK kills itself. */ | |
return 0; | |
} | |
case HMX_UPGRADE_FETCH: | |
{ | |
printf("[%s] HMX_UPGRADE_FETCH \r\n",__FUNCTION__); | |
file_path = strdup(recieved_command.file_path); | |
printf("[%s] file path = %s \r\n",__FUNCTION__, file_path); | |
/* command file_path free */ | |
free(recieved_command.file_path); | |
send_command.command = HMX_UPGRADE_START; | |
(void)HMX_MSG_Send(s_ulUpgradeMessgseId, &send_command, sizeof(HMX_UPGRADE_COMMAND_t),0); | |
break; | |
} | |
default: | |
printf("[%s] Receive Unknown Command \r\n",__FUNCTION__); | |
break; | |
} | |
} | |
} | |
} | |
/*@}*/ |