1.mcu升级功能
This commit is contained in:
parent
d377144dc9
commit
40a52dc31c
|
@ -326,10 +326,12 @@ UINT8 sf_cardv_check_power_on_mode(void)
|
||||||
char *pStrSrc = NULL;
|
char *pStrSrc = NULL;
|
||||||
char *pStrOtsOk = "Mode=";
|
char *pStrOtsOk = "Mode=";
|
||||||
char *pStrUpFw = "UpFw=";
|
char *pStrUpFw = "UpFw=";
|
||||||
|
char *pStrUpMcu = "mcu=";
|
||||||
|
|
||||||
char *temp = NULL;
|
char *temp = NULL;
|
||||||
UINT8 startup = 0;
|
UINT8 startup = 0;
|
||||||
UINT8 UpFw = 0;
|
UINT8 UpFw = 0;
|
||||||
|
UINT8 Upmcu = 0;
|
||||||
|
|
||||||
system("cat /proc/cmdline > /tmp/Mode.txt");
|
system("cat /proc/cmdline > /tmp/Mode.txt");
|
||||||
fp = fopen("/tmp/Mode.txt","r");
|
fp = fopen("/tmp/Mode.txt","r");
|
||||||
|
@ -358,8 +360,13 @@ UINT8 sf_cardv_check_power_on_mode(void)
|
||||||
//printf("%s: UpFw=%d\r\n", __func__,UpFw);
|
//printf("%s: UpFw=%d\r\n", __func__,UpFw);
|
||||||
sf_set_fw_update(UpFw);
|
sf_set_fw_update(UpFw);
|
||||||
}
|
}
|
||||||
printf("%s: PowerOnModeStr=%d UpFw=%d\r\n", __func__,startup,UpFw);
|
temp = strstr(pStrSrc, pStrUpMcu);
|
||||||
|
if ( temp != NULL) {
|
||||||
|
temp += strlen("mcu=");
|
||||||
|
sscanf(temp, "%hhd", &Upmcu);
|
||||||
|
sf_set_mcu_update_flag(Upmcu);
|
||||||
|
}
|
||||||
|
SLOGI("StartMode=%d,UpFw=%d Upmcu=%d\r\n", startup, UpFw, Upmcu);
|
||||||
free(pStrSrc);
|
free(pStrSrc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -317,6 +317,7 @@ SRC = \
|
||||||
./code/source/systemMng/sf_commu_mcu_reg.c \
|
./code/source/systemMng/sf_commu_mcu_reg.c \
|
||||||
./code/source/systemMng/sf_commu_mcu.c \
|
./code/source/systemMng/sf_commu_mcu.c \
|
||||||
./code/source/systemMng/sys_usrmem.c \
|
./code/source/systemMng/sys_usrmem.c \
|
||||||
|
./code/source/systemMng/sf_mcu_upgrade.c \
|
||||||
./code/source/devMng/sf_dev_other.c \
|
./code/source/devMng/sf_dev_other.c \
|
||||||
./code/source/devMng/sf_dev_usb.c \
|
./code/source/devMng/sf_dev_usb.c \
|
||||||
./code/source/devMng/sf_keymng.c \
|
./code/source/devMng/sf_keymng.c \
|
||||||
|
@ -337,7 +338,7 @@ SRC = \
|
||||||
./code/source/sf_blue/src/sf_blue_hal.c \
|
./code/source/sf_blue/src/sf_blue_hal.c \
|
||||||
./code/source/sf_blue/src/util.c \
|
./code/source/sf_blue/src/util.c \
|
||||||
./code/source/sf_blue/src/watch.c \
|
./code/source/sf_blue/src/watch.c \
|
||||||
|
|
||||||
# ./code/source/wifi/sf_data_transfer.c \
|
# ./code/source/wifi/sf_data_transfer.c \
|
||||||
# ./code/source/wifi/sf_svr_send.c \
|
# ./code/source/wifi/sf_svr_send.c \
|
||||||
# ./code/source/wifi/sf_wifi_svr.c
|
# ./code/source/wifi/sf_wifi_svr.c
|
||||||
|
|
|
@ -81,7 +81,8 @@ void sf_set_module_update(UINT8 flag);
|
||||||
UINT8 sf_get_fw_update(void);
|
UINT8 sf_get_fw_update(void);
|
||||||
void sf_set_fw_update(UINT8 flag);
|
void sf_set_fw_update(UINT8 flag);
|
||||||
UINT8 sf_app_get_night_led_flag(void);
|
UINT8 sf_app_get_night_led_flag(void);
|
||||||
|
void sf_set_mcu_update_flag(UINT8 flag);
|
||||||
|
UINT8 sf_get_mcu_update_flag(void);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#if __cplusplus
|
#if __cplusplus
|
||||||
}
|
}
|
||||||
|
|
67
code/application/source/sf_app/code/include/sf_mcu_upgrade.h
Executable file
67
code/application/source/sf_app/code/include/sf_mcu_upgrade.h
Executable file
|
@ -0,0 +1,67 @@
|
||||||
|
#ifndef __FIRMWARE_UPGRADE_H
|
||||||
|
|
||||||
|
#define __FIRMWARE_UPGRADE_H
|
||||||
|
/**************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2020 by WuYuan Technology, Inc.
|
||||||
|
*
|
||||||
|
* This software is copyrighted by and is the property of SiFar
|
||||||
|
* Technology, Inc.. All rights are reserved by SiFar Technology, Inc..
|
||||||
|
* This software may only be used in accordance with the corresponding
|
||||||
|
* license agreement. Any unauthorized use, duplication, distribution,
|
||||||
|
* or disclosure of this software is expressly forbidden.
|
||||||
|
*
|
||||||
|
* This Copyright notice MUST not be removed or modified without prior
|
||||||
|
* written consent of SiFar Technology, Inc..
|
||||||
|
*
|
||||||
|
* WuYuan Technology, Inc. reserves the right to modify this software without notice.
|
||||||
|
*
|
||||||
|
* Author: ljy
|
||||||
|
* Ver: 1.0.0 2022.06.15
|
||||||
|
* Description: creat
|
||||||
|
**************************************************************************/
|
||||||
|
#include "sf_type.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#if __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct{
|
||||||
|
UINT8* fw_content;
|
||||||
|
UINT32 fw_total_size;
|
||||||
|
UINT32 fw_remain_size;
|
||||||
|
UINT32 fw_complete_size;
|
||||||
|
UINT16 fw_crc;
|
||||||
|
}FW_PKT_t;
|
||||||
|
|
||||||
|
typedef enum{
|
||||||
|
FWUPGRADE_INIT_STATE,
|
||||||
|
FWUPGRADE_ENTER_UPGRADE_STATE,
|
||||||
|
FWUPGRADE_WAIT_TO_RESTART_STATE,
|
||||||
|
FWUPGRADE_COMFIRM_UPGRADE_STATE,
|
||||||
|
FWUPGRADE_TRANSFER_PACKET_STATE,
|
||||||
|
FWUPGRADE_TRANSFER_FINISH_STATE,
|
||||||
|
FWUPGRADE_ERROR_OCCUR_STATE,
|
||||||
|
}FW_UPGRADE_STATE_e;
|
||||||
|
|
||||||
|
extern unsigned char mcu_upgrade_buf[32];
|
||||||
|
extern unsigned char mcu_upgrade_buf_len;
|
||||||
|
|
||||||
|
void Fw_UpgradeThreadStart(void);
|
||||||
|
void Fw_UpgradeThreadStop(void);
|
||||||
|
SINT8 Fw_UpgradeBinExist(char * file);
|
||||||
|
SINT8 Fw_GetFirmwareSize(char * file, UINT32 * file_size);
|
||||||
|
SINT8 Fw_GetFirmwareContent(char * file, UINT8 * file_content, UINT32 file_size);
|
||||||
|
SINT8 Fw_Read(UINT8* cmd, void * data, UINT32* size);
|
||||||
|
SINT8 Fw_Send(UINT8 cmd, void* data, UINT32 size);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#if __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -466,6 +466,8 @@ typedef enum sf_MCU_MESSAGE_TYPE_E
|
||||||
SF_MCU_CMD_MCU_VER = 0x1E00,
|
SF_MCU_CMD_MCU_VER = 0x1E00,
|
||||||
SF_MCU_CMD_MCU_RTC = 0x1F00,
|
SF_MCU_CMD_MCU_RTC = 0x1F00,
|
||||||
SF_MCU_CMD_SET_MCU = 0x1F01,
|
SF_MCU_CMD_SET_MCU = 0x1F01,
|
||||||
|
SF_MCU_CMD_UPDATA = 0x1F02,
|
||||||
|
|
||||||
}SF_MCU_MESSAGE_TYPE_E;
|
}SF_MCU_MESSAGE_TYPE_E;
|
||||||
|
|
||||||
typedef enum sf_PARA_MESSAGE_TYPE_E
|
typedef enum sf_PARA_MESSAGE_TYPE_E
|
||||||
|
|
|
@ -65,6 +65,7 @@ SINT32 app_auto_poweroff_start(void);
|
||||||
UINT8 sf_check_power_on_mode(void);
|
UINT8 sf_check_power_on_mode(void);
|
||||||
void sf_power_off_msg_to_cardv(void);
|
void sf_power_off_msg_to_cardv(void);
|
||||||
SINT32 sf_app_mcu_para_power_no_start(void);
|
SINT32 sf_app_mcu_para_power_no_start(void);
|
||||||
|
SINT32 sf_app_mcu_updata_start(void);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#if __cplusplus
|
#if __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,6 +112,8 @@ int main(int argc, char *argv[])
|
||||||
SINT32 isUsb = 0;
|
SINT32 isUsb = 0;
|
||||||
SINT32 isCard = 0;
|
SINT32 isCard = 0;
|
||||||
SINT32 isUpdate = 0;
|
SINT32 isUpdate = 0;
|
||||||
|
UINT8 isMcuUpdate = 0;
|
||||||
|
|
||||||
//SF_MESSAGE_BUF_S stMessageBuf = {0};
|
//SF_MESSAGE_BUF_S stMessageBuf = {0};
|
||||||
//BOOL autosend = FALSE;
|
//BOOL autosend = FALSE;
|
||||||
SF_MUTEX_INIT_LOCK(Param_mutexLock);
|
SF_MUTEX_INIT_LOCK(Param_mutexLock);
|
||||||
|
@ -130,7 +132,8 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
//sf_set_fw_update(isUpdate);
|
//sf_set_fw_update(isUpdate);
|
||||||
isUpdate = sf_get_fw_update();
|
isUpdate = sf_get_fw_update();
|
||||||
SLOGI("isUsb = %d isCard = %d isUpdate:%d\n", isUsb,isCard,isUpdate);
|
isMcuUpdate = sf_get_mcu_update_flag();
|
||||||
|
SLOGI("isUsb = %d isCard = %d isUpdate:%d isMcuUpdate:%d\n", isUsb,isCard,isUpdate ,isMcuUpdate);
|
||||||
|
|
||||||
if(!isUsb)
|
if(!isUsb)
|
||||||
{
|
{
|
||||||
|
@ -166,7 +169,7 @@ int main(int argc, char *argv[])
|
||||||
sf_set_bt_en(1);
|
sf_set_bt_en(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if((0 == isUpdate) && (puiPara->GprsSwitch))
|
if((0 == isMcuUpdate) && (0 == isUpdate) && (puiPara->GprsSwitch))
|
||||||
{
|
{
|
||||||
sf_4G_usb_init();
|
sf_4G_usb_init();
|
||||||
app_RegisterNet_start();
|
app_RegisterNet_start();
|
||||||
|
|
|
@ -64,6 +64,7 @@ SINT8 bmoduleupdate = 0;
|
||||||
static UINT8 ModuleUpdating = 0;
|
static UINT8 ModuleUpdating = 0;
|
||||||
static UINT8 FwUpdate = 0;
|
static UINT8 FwUpdate = 0;
|
||||||
static UINT8 IsNightLedOn = 0;
|
static UINT8 IsNightLedOn = 0;
|
||||||
|
static UINT8 McuUpdateFlag = 0;
|
||||||
|
|
||||||
static SF_THREAD_CFG_S sf_msgQueueThread =
|
static SF_THREAD_CFG_S sf_msgQueueThread =
|
||||||
{
|
{
|
||||||
|
@ -71,6 +72,15 @@ static SF_THREAD_CFG_S sf_msgQueueThread =
|
||||||
.TskId = -1,
|
.TskId = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
UINT8 sf_get_mcu_update_flag(void)
|
||||||
|
{
|
||||||
|
return McuUpdateFlag;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sf_set_mcu_update_flag(UINT8 flag)
|
||||||
|
{
|
||||||
|
McuUpdateFlag = flag;
|
||||||
|
}
|
||||||
|
|
||||||
UINT8 sf_get_module_update(void)
|
UINT8 sf_get_module_update(void)
|
||||||
{
|
{
|
||||||
|
@ -626,7 +636,13 @@ static SINT32 sf_app_process_cmd_SD(SF_MESSAGE_BUF_S *pMessageBuf)
|
||||||
|
|
||||||
sf_statistics_param_load(sf_statistics_param_get());
|
sf_statistics_param_load(sf_statistics_param_get());
|
||||||
MLOGI("card-%d mount OK\r\n", pMessageBuf->arg2 + 1);
|
MLOGI("card-%d mount OK\r\n", pMessageBuf->arg2 + 1);
|
||||||
sf_set_key_fw_update(sf_get_fw_update());
|
|
||||||
|
sf_set_key_fw_update(sf_get_fw_update());//up fw
|
||||||
|
|
||||||
|
if(sf_get_mcu_update_flag())//up mcu
|
||||||
|
{
|
||||||
|
sf_app_mcu_updata_start();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case FST_STA_DISK_UNFORMAT:
|
case FST_STA_DISK_UNFORMAT:
|
||||||
//sf_set_card(1);
|
//sf_set_card(1);
|
||||||
|
@ -784,6 +800,9 @@ static SINT32 sf_app_proccess_cmd_mcu(SF_MESSAGE_BUF_S *pMessageBuf)
|
||||||
case SF_MCU_CMD_SET_MCU:
|
case SF_MCU_CMD_SET_MCU:
|
||||||
sf_mcu_reg_set(pMessageBuf->arg2, pMessageBuf->arg3);
|
sf_mcu_reg_set(pMessageBuf->arg2, pMessageBuf->arg3);
|
||||||
break;
|
break;
|
||||||
|
case SF_MCU_CMD_UPDATA:
|
||||||
|
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
#include "sf_file.h"
|
#include "sf_file.h"
|
||||||
#include "sf_hal_ttyusb.h"
|
#include "sf_hal_ttyusb.h"
|
||||||
#include "sf_commu_mcu.h"
|
#include "sf_commu_mcu.h"
|
||||||
|
#include "sf_mcu_upgrade.h"
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#if __cplusplus
|
#if __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -135,6 +136,12 @@ SF_THREAD_S McuPowerOnTskCfg =
|
||||||
.TskId = -1,
|
.TskId = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SF_THREAD_S McuUpDataTskCfg =
|
||||||
|
{
|
||||||
|
.IsRun = 0,
|
||||||
|
.TskId = -1,
|
||||||
|
};
|
||||||
|
|
||||||
SINT8 debugFlag = 0;
|
SINT8 debugFlag = 0;
|
||||||
|
|
||||||
UINT8 McuInitFlag = 0;
|
UINT8 McuInitFlag = 0;
|
||||||
|
@ -1388,10 +1395,12 @@ UINT8 sf_check_power_on_mode(void)
|
||||||
char *pStrSrc = NULL;
|
char *pStrSrc = NULL;
|
||||||
char *pStrOtsOk = "Mode=";
|
char *pStrOtsOk = "Mode=";
|
||||||
char *pStrUpFw = "UpFw=";
|
char *pStrUpFw = "UpFw=";
|
||||||
|
char *pStrUpMcu = "mcu=";
|
||||||
|
|
||||||
char *temp = NULL;
|
char *temp = NULL;
|
||||||
UINT8 startup = 0;
|
UINT8 startup = 0;
|
||||||
UINT8 UpFw = 0;
|
UINT8 UpFw = 0;
|
||||||
|
UINT8 Upmcu = 0;
|
||||||
|
|
||||||
system("cat /proc/cmdline > /tmp/Mode.txt");
|
system("cat /proc/cmdline > /tmp/Mode.txt");
|
||||||
fp = fopen("/tmp/Mode.txt","r");
|
fp = fopen("/tmp/Mode.txt","r");
|
||||||
|
@ -1419,7 +1428,13 @@ UINT8 sf_check_power_on_mode(void)
|
||||||
//printf("%s: UpFw=%d\r\n", __func__,UpFw);
|
//printf("%s: UpFw=%d\r\n", __func__,UpFw);
|
||||||
sf_set_fw_update(UpFw);
|
sf_set_fw_update(UpFw);
|
||||||
}
|
}
|
||||||
SLOGI("StartMode=%d,UpFw=%d\r\n",startup,UpFw);
|
temp = strstr(pStrSrc, pStrUpMcu);
|
||||||
|
if ( temp != NULL) {
|
||||||
|
temp += strlen("mcu=");
|
||||||
|
sscanf(temp, "%hhd", &Upmcu);
|
||||||
|
sf_set_mcu_update_flag(Upmcu);
|
||||||
|
}
|
||||||
|
SLOGI("StartMode=%d,UpFw=%d Upmcu=%d\r\n", startup, UpFw, Upmcu);
|
||||||
|
|
||||||
free(pStrSrc);
|
free(pStrSrc);
|
||||||
}
|
}
|
||||||
|
@ -1563,4 +1578,51 @@ SINT32 sf_app_mcu_para_power_no_start(void)
|
||||||
}
|
}
|
||||||
return SF_SUCCESS;
|
return SF_SUCCESS;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void* sf_app_mcu_updata_thread(void *arg)
|
||||||
|
{
|
||||||
|
|
||||||
|
SLOGI("thread run\n");
|
||||||
|
McuUpDataTskCfg.IsRun = 1;
|
||||||
|
MLOGI("MCU_UPGRADE\n");
|
||||||
|
UINT32 McuFsize = 0;
|
||||||
|
SINT8 ret = 0;
|
||||||
|
ret = Fw_GetFirmwareSize((char*)"/mnt/sd/Mupgrade.bin", &McuFsize);
|
||||||
|
if((sf_in_card_exist() == SF_TRUE) && (access("/mnt/sd/Mupgrade.bin", F_OK) == 0)
|
||||||
|
&& (ret == 0) && (McuFsize > 1024) && (sf_is_enough_power_to_update() == SF_TRUE))
|
||||||
|
{
|
||||||
|
sf_set_mcu_update_flag(SF_TRUE);
|
||||||
|
Fw_UpgradeThreadStart();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// sf_set_mcu_update_flag(SF_TRUE);
|
||||||
|
// sleep(5);
|
||||||
|
// sf_led_set(SF_LED_ALL, SF_LED_STATE_OFF);
|
||||||
|
|
||||||
|
MLOGI(" sf_power_off_msg_to_cardv\n");
|
||||||
|
sf_power_off_msg_to_cardv();
|
||||||
|
}
|
||||||
|
McuUpDataTskCfg.IsRun = 0;
|
||||||
|
SLOGI("thread end\n");
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
SINT32 sf_app_mcu_updata_start(void)
|
||||||
|
{
|
||||||
|
SINT32 ret = SF_FAILURE;
|
||||||
|
if(McuUpDataTskCfg.IsRun)
|
||||||
|
{
|
||||||
|
SLOGE("thread has already run !!!\n");
|
||||||
|
return SF_FAILURE;
|
||||||
|
}
|
||||||
|
ret = pthread_create(&McuUpDataTskCfg.TskId, NULL, sf_app_mcu_updata_thread, NULL);
|
||||||
|
if(ret != SF_SUCCESS)
|
||||||
|
{
|
||||||
|
MLOGD("thread creat fail!\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
return SF_SUCCESS;
|
||||||
|
|
||||||
}
|
}
|
|
@ -656,7 +656,15 @@ unsigned char sf_mcu_reg_set(MCUParam_t attrId, unsigned char val)
|
||||||
mcuData[i++] = 0;
|
mcuData[i++] = 0;
|
||||||
|
|
||||||
mcuReg[i] = SYS_STATUS;
|
mcuReg[i] = SYS_STATUS;
|
||||||
mcuData[i++] = isUsb << 2 | isCardFull << 1 | isCard << 0;
|
if((sf_get_module_update() == SF_TRUE)
|
||||||
|
|| (sf_get_mcu_update_flag() == SF_TRUE))
|
||||||
|
{
|
||||||
|
mcuData[i++] = isUsb << 2 | isCardFull << 1 | isCard << 0 | 0x20;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mcuData[i++] = isUsb << 2 | isCardFull << 1 | isCard << 0;
|
||||||
|
}
|
||||||
|
|
||||||
mcuReg[i] = POWEROFF_TYPE;
|
mcuReg[i] = POWEROFF_TYPE;
|
||||||
temp = 0;
|
temp = 0;
|
||||||
|
@ -1208,7 +1216,7 @@ UINT8 sf_get_module_sleep_flag(void)
|
||||||
int sf_app_while_flag(void)
|
int sf_app_while_flag(void)
|
||||||
{
|
{
|
||||||
if((!sf_usb_IsInsert()) && (sf_get_power_off_flag() != 1)
|
if((!sf_usb_IsInsert()) && (sf_get_power_off_flag() != 1)
|
||||||
&& (sf_get_module_update() != 1) && (sf_get_fw_update() == 0))
|
&& (sf_get_module_update() != 1) && (sf_get_fw_update() == 0) && (sf_get_mcu_update_flag() == 0))
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
534
code/application/source/sf_app/code/source/systemMng/sf_mcu_upgrade.c
Executable file
534
code/application/source/sf_app/code/source/systemMng/sf_mcu_upgrade.c
Executable file
|
@ -0,0 +1,534 @@
|
||||||
|
/**************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2020 by WuYuan Technology, Inc.
|
||||||
|
*
|
||||||
|
* This software is copyrighted by and is the property of SiFar
|
||||||
|
* Technology, Inc.. All rights are reserved by SiFar Technology, Inc..
|
||||||
|
* This software may only be used in accordance with the corresponding
|
||||||
|
* license agreement. Any unauthorized use, duplication, distribution,
|
||||||
|
* or disclosure of this software is expressly forbidden.
|
||||||
|
*
|
||||||
|
* This Copyright notice MUST not be removed or modified without prior
|
||||||
|
* written consent of SiFar Technology, Inc..
|
||||||
|
*
|
||||||
|
* WuYuan Technology, Inc. reserves the right to modify this software without notice.
|
||||||
|
*
|
||||||
|
* Author: ljy
|
||||||
|
* Ver: 1.0.0 2022.06.15
|
||||||
|
* Description: creat
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include "sf_common.h"
|
||||||
|
#include "sf_mcu_upgrade.h"
|
||||||
|
#include "sf_param_common.h"
|
||||||
|
#include "sf_ledmng.h"
|
||||||
|
#include "sf_message_queue.h"
|
||||||
|
#include "sf_keymng.h"
|
||||||
|
#include "sf_param_enum.h"
|
||||||
|
#include "sf_type.h"
|
||||||
|
#include "sf_system.h"
|
||||||
|
#include "sf_fileMng.h"
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#if __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern int gsfd;
|
||||||
|
|
||||||
|
#define UPGRADE_FIRMWARE_NANE (char*)"/mnt/sd/Mupgrade.bin"
|
||||||
|
#define UART_PATH "dev/ttyS2"
|
||||||
|
|
||||||
|
//unsigned char mcu_upgrade_buf[32] = {0};
|
||||||
|
//unsigned char mcu_upgrade_buf_len = 0;
|
||||||
|
|
||||||
|
static FW_PKT_t fw_packet;
|
||||||
|
static SINT8 FwUpgradeExit = 1;
|
||||||
|
static FW_UPGRADE_STATE_e FwUpgradeState = FWUPGRADE_INIT_STATE;
|
||||||
|
static pthread_t FwUpgradeThread = 0;
|
||||||
|
|
||||||
|
extern int pthread_setname_np(pthread_t thread, const char *name);
|
||||||
|
|
||||||
|
static SINT8 depack(UINT8* src, UINT32 srcl, UINT8* cmd, UINT8* dst, UINT32* dstl);
|
||||||
|
static UINT32 pack(UINT8 cmd, UINT8 * src, UINT32 size, UINT8* dst);
|
||||||
|
static void * FwUpgradeTask(void * argv);
|
||||||
|
|
||||||
|
|
||||||
|
static const unsigned short Crc16Table[256] =
|
||||||
|
{
|
||||||
|
0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
|
||||||
|
0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
|
||||||
|
0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
|
||||||
|
0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
|
||||||
|
0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
|
||||||
|
0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
|
||||||
|
0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
|
||||||
|
0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
|
||||||
|
0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
|
||||||
|
0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
|
||||||
|
0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
|
||||||
|
0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
|
||||||
|
0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
|
||||||
|
0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
|
||||||
|
0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
|
||||||
|
0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
|
||||||
|
0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
|
||||||
|
0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
|
||||||
|
0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
|
||||||
|
0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
|
||||||
|
0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
|
||||||
|
0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
|
||||||
|
0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
|
||||||
|
0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
|
||||||
|
0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
|
||||||
|
0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
|
||||||
|
0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
|
||||||
|
0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
|
||||||
|
0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
|
||||||
|
0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
|
||||||
|
0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
|
||||||
|
0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned short sf_crc16_check(unsigned char * dataIn, int length)
|
||||||
|
{
|
||||||
|
unsigned short result = 0;
|
||||||
|
unsigned short tableNo = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
tableNo = ((result & 0xff) ^ (dataIn[i] &0xff));
|
||||||
|
result = ((result >> 8) & 0xff) ^Crc16Table[tableNo];
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fw_UpgradeThreadStart(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
int ret = -1;
|
||||||
|
FwUpgradeExit = 0;
|
||||||
|
ret = pthread_create(&FwUpgradeThread, NULL, FwUpgradeTask, NULL);
|
||||||
|
if(ret == 0)
|
||||||
|
{
|
||||||
|
pthread_setname_np(FwUpgradeThread, "fw_upgrade_task");
|
||||||
|
printf("%s pthread start\r\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FwUpgradeExit = 1;
|
||||||
|
printf("%s pthread create failed\r\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fw_UpgradeThreadStop(void)
|
||||||
|
{
|
||||||
|
FwUpgradeExit = 1;
|
||||||
|
pthread_join(FwUpgradeThread, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
SINT8 Fw_UpgradeBinExist(char * file)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(sf_file_IsExsit((CHAR *)file) != SF_TRUE)
|
||||||
|
{
|
||||||
|
printf("%s, fw file bin not exist\r\n", __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("%s, fw file bin exist\r\n", __FUNCTION__);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
SINT8 Fw_GetFirmwareSize(char * file, UINT32 * file_size)
|
||||||
|
{
|
||||||
|
struct stat statBuf;
|
||||||
|
SINT32 fileFd = 0;
|
||||||
|
fileFd = open((char *)file, O_RDONLY);
|
||||||
|
SINT8 ret = -1;
|
||||||
|
if(fileFd)
|
||||||
|
{
|
||||||
|
fstat(fileFd, &statBuf);
|
||||||
|
*file_size = statBuf.st_size;
|
||||||
|
ret = 0;
|
||||||
|
printf("%s, fw file bin size %d\r\n", __FUNCTION__, *file_size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("%s, fw open file bin failed\r\n", __FUNCTION__);
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
close(fileFd);
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
SINT8 Fw_GetFirmwareContent(char * file, UINT8 * file_content, UINT32 file_size)
|
||||||
|
{
|
||||||
|
SINT32 fileFd = 0;
|
||||||
|
SINT8 ret = -1;
|
||||||
|
UINT32 len = 0;
|
||||||
|
fileFd = open((char *)file, O_RDONLY);
|
||||||
|
|
||||||
|
if(fileFd)
|
||||||
|
{
|
||||||
|
while(len < file_size)
|
||||||
|
{
|
||||||
|
ret = read(fileFd, file_content + len, 32);
|
||||||
|
if(ret < 0)
|
||||||
|
{
|
||||||
|
ret = -1;
|
||||||
|
printf("fw read file bin failed\r\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
len += ret;
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("fw open file bin failed\r\n");
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
close(fileFd);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SINT8 Fw_Read(UINT8* cmd, void * data, UINT32* size)
|
||||||
|
{
|
||||||
|
SINT8 ret = -1;
|
||||||
|
//SINT8 fd = -1;
|
||||||
|
//UINT8 recvBuf[32] = {0};
|
||||||
|
//UINT32 len = 32;
|
||||||
|
UINT8 trytimes = 0;
|
||||||
|
//fd = open(UART_PATH, O_RDWR);
|
||||||
|
if (gsfd < 0)
|
||||||
|
{
|
||||||
|
printf("Open %s error!\n", UART_PATH);
|
||||||
|
ret = -1;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
//len = read(fd, recvBuf, len);
|
||||||
|
while(mcu_upgrade_buf_len == 0 && trytimes < 100)
|
||||||
|
{
|
||||||
|
trytimes++;
|
||||||
|
usleep(10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
//ret = depack(recvBuf, len, cmd, data, size);
|
||||||
|
ret = depack(mcu_upgrade_buf, mcu_upgrade_buf_len, cmd, (UINT8*)data, size);
|
||||||
|
mcu_upgrade_buf_len = 0;
|
||||||
|
//close(fd);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SINT8 depack(UINT8* src, UINT32 srcl, UINT8* cmd, UINT8* dst, UINT32* dstl)
|
||||||
|
{
|
||||||
|
UINT16 crc1 = 0;
|
||||||
|
UINT16 crc2 = 0;
|
||||||
|
SINT8 ret = -1;
|
||||||
|
crc1 = ((src[srcl - 4] << 8) & 0xff00) | src[srcl - 3];
|
||||||
|
crc2 = sf_crc16_check(&src[2], srcl - 6);
|
||||||
|
if(crc1 != crc2)
|
||||||
|
{
|
||||||
|
ret = -1;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
*cmd = src[2];
|
||||||
|
|
||||||
|
if(dst != NULL)
|
||||||
|
{
|
||||||
|
memcpy(dst, &src[2], srcl - 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dstl != NULL)
|
||||||
|
{
|
||||||
|
*dstl = srcl - 6;
|
||||||
|
}
|
||||||
|
ret = 0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
SINT8 Fw_Send(UINT8 cmd, void* data, UINT32 size)
|
||||||
|
{
|
||||||
|
SINT8 ret = -1;
|
||||||
|
//SINT8 fd = -1;
|
||||||
|
UINT8 sndBuf[300] = {0};
|
||||||
|
UINT32 len = 0;
|
||||||
|
//fd = open(UART_PATH, O_RDWR);
|
||||||
|
if (gsfd < 0)
|
||||||
|
{
|
||||||
|
printf("Open %s error!\n",UART_PATH);
|
||||||
|
ret = -1;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = pack(cmd, (UINT8*)data, size, sndBuf);
|
||||||
|
ret = write(gsfd, sndBuf, len);
|
||||||
|
|
||||||
|
//close(fd);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static UINT32 pack(UINT8 cmd, UINT8 * src, UINT32 size, UINT8* dst)
|
||||||
|
{
|
||||||
|
UINT32 crc_start = 0;
|
||||||
|
UINT32 crc_end = 0;
|
||||||
|
UINT16 crc = 0;
|
||||||
|
UINT32 idx = 0;
|
||||||
|
|
||||||
|
dst[idx] = 0x55;
|
||||||
|
idx++;
|
||||||
|
dst[idx] = 0xAA;
|
||||||
|
idx++;
|
||||||
|
crc_start = idx;
|
||||||
|
dst[idx] = cmd;
|
||||||
|
idx++;
|
||||||
|
if(size > 0)
|
||||||
|
{
|
||||||
|
memcpy(&dst[idx], src, size);
|
||||||
|
idx += size;
|
||||||
|
}
|
||||||
|
|
||||||
|
crc_end = idx;
|
||||||
|
crc = sf_crc16_check(&dst[crc_start], crc_end - crc_start);
|
||||||
|
dst[idx] = (crc & 0xff00) >> 8;
|
||||||
|
idx++;
|
||||||
|
dst[idx] = crc & 0x00ff;
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
dst[idx] = 0xff;
|
||||||
|
idx++;
|
||||||
|
dst[idx] = 0xee;
|
||||||
|
idx++;
|
||||||
|
return idx;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void * FwUpgradeTask(void * argv)
|
||||||
|
{
|
||||||
|
SINT8 ret = -1;
|
||||||
|
UINT8 recvBuf[32] = {0};
|
||||||
|
UINT32 recvl = 0;
|
||||||
|
UINT8 cmd = 0x00;
|
||||||
|
UINT8 data[300] = {0};
|
||||||
|
UINT16 len = 0;
|
||||||
|
UINT16 pkt_id = 0;
|
||||||
|
UINT16 ack_id = 0;
|
||||||
|
SINT8 param[1] = {0};
|
||||||
|
param[0] = 0;
|
||||||
|
|
||||||
|
while(FwUpgradeExit == 0)
|
||||||
|
{
|
||||||
|
switch (FwUpgradeState)
|
||||||
|
{
|
||||||
|
case FWUPGRADE_INIT_STATE:
|
||||||
|
//sf_sys_status_led_set(SF_LED_SYS_STATE_UPGRADE_START);
|
||||||
|
printf("FWUPGRADE_INIT_STATE\r\n");
|
||||||
|
fw_packet.fw_content = NULL;
|
||||||
|
fw_packet.fw_total_size = 0;
|
||||||
|
fw_packet.fw_remain_size = 0;
|
||||||
|
fw_packet.fw_complete_size = 0;
|
||||||
|
ret = Fw_GetFirmwareSize(UPGRADE_FIRMWARE_NANE, &fw_packet.fw_total_size);
|
||||||
|
|
||||||
|
if(ret < 0)
|
||||||
|
{
|
||||||
|
printf("Fw_GetFirmwareSize failed\r\n");
|
||||||
|
FwUpgradeState = FWUPGRADE_ERROR_OCCUR_STATE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
fw_packet.fw_remain_size = fw_packet.fw_total_size;
|
||||||
|
fw_packet.fw_content = (UINT8*)malloc(fw_packet.fw_total_size);
|
||||||
|
if(fw_packet.fw_content == NULL)
|
||||||
|
{
|
||||||
|
printf("malloc file content buffer failed\r\n");
|
||||||
|
FwUpgradeState = FWUPGRADE_ERROR_OCCUR_STATE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ret = Fw_GetFirmwareContent(UPGRADE_FIRMWARE_NANE, fw_packet.fw_content, fw_packet.fw_total_size);
|
||||||
|
fw_packet.fw_crc = sf_crc16_check(fw_packet.fw_content, fw_packet.fw_total_size);
|
||||||
|
|
||||||
|
if(sf_poweron_type_get() != 0x0f) /*at upgrade start mode already*/
|
||||||
|
{
|
||||||
|
FwUpgradeState = FWUPGRADE_ENTER_UPGRADE_STATE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FwUpgradeState = FWUPGRADE_COMFIRM_UPGRADE_STATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FWUPGRADE_ENTER_UPGRADE_STATE:
|
||||||
|
printf("FWUPGRADE_ENTER_UPGRADE_STATE\r\n");
|
||||||
|
data[0] = 1;
|
||||||
|
ret = Fw_Send(0xec, data, 1);
|
||||||
|
|
||||||
|
ret = Fw_Read(&cmd, recvBuf, &recvl);
|
||||||
|
if(recvBuf[1] == 1)
|
||||||
|
{
|
||||||
|
for(unsigned int i = 0; i < recvl; i++)
|
||||||
|
{
|
||||||
|
printf("recvBuf[%d]=0x%x\r\n", i, recvBuf[i]);
|
||||||
|
}
|
||||||
|
FwUpgradeState = FWUPGRADE_WAIT_TO_RESTART_STATE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FwUpgradeState = FWUPGRADE_ERROR_OCCUR_STATE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FWUPGRADE_WAIT_TO_RESTART_STATE:
|
||||||
|
printf("FWUPGRADE_WAIT_TO_RESTART_STATE\r\n");
|
||||||
|
/*if mcu does not power down the main control within 3 seconds,
|
||||||
|
all indicator lights will flash red for 5 seconds,
|
||||||
|
and the MCU will power down and restart itself.*/
|
||||||
|
sleep(3);
|
||||||
|
//sf_sys_status_led_set(SF_LED_SYS_STATE_UPGRADE_FAIL);
|
||||||
|
//sleep(5);
|
||||||
|
printf("SF_KEY_PIN_AOTU_MODE_POWOFF\r\n");
|
||||||
|
sf_power_off_msg_to_cardv();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FWUPGRADE_COMFIRM_UPGRADE_STATE:
|
||||||
|
printf("FWUPGRADE_COMFIRM_UPGRADE_STATE\r\n");
|
||||||
|
data[0] = 0;
|
||||||
|
data[1] = (fw_packet.fw_total_size & 0xff000000) >> 24;
|
||||||
|
data[2] = (fw_packet.fw_total_size & 0x00ff0000) >> 16;
|
||||||
|
data[3] = (fw_packet.fw_total_size & 0x0000ff00) >> 8;
|
||||||
|
data[4] = (fw_packet.fw_total_size & 0x000000ff);
|
||||||
|
data[5] = (fw_packet.fw_crc & 0xff00) >> 8;
|
||||||
|
data[6] = (fw_packet.fw_crc & 0x00ff);
|
||||||
|
|
||||||
|
ret = Fw_Send(0xef, data, 7);
|
||||||
|
|
||||||
|
ret = Fw_Read(&cmd, recvBuf, &recvl);
|
||||||
|
for(unsigned int i = 0; i < recvl; i++)
|
||||||
|
printf("recv 0x%x\r\n", recvBuf[i]);
|
||||||
|
if(cmd == 0xef && recvBuf[1] == 0)
|
||||||
|
{
|
||||||
|
FwUpgradeState = FWUPGRADE_TRANSFER_PACKET_STATE;/*mcu allow to upgrade*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FwUpgradeState = FWUPGRADE_ERROR_OCCUR_STATE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FWUPGRADE_TRANSFER_PACKET_STATE:
|
||||||
|
printf("FWUPGRADE_TRANSFER_PACKET_STATE\r\n");
|
||||||
|
if(fw_packet.fw_remain_size >= 256)
|
||||||
|
{
|
||||||
|
len = 256;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
len = fw_packet.fw_remain_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
data[0] = (pkt_id & 0xff00) >> 8;
|
||||||
|
data[1] = pkt_id & 0x00ff;
|
||||||
|
data[2] = (len & 0xff00) >> 8;
|
||||||
|
data[3] = len & 0x00ff;
|
||||||
|
memcpy(&data[4], fw_packet.fw_content + fw_packet.fw_complete_size, len);
|
||||||
|
|
||||||
|
ret = Fw_Send(0xee, &data, len + 4);
|
||||||
|
ret = Fw_Read(&cmd, recvBuf, &recvl);
|
||||||
|
|
||||||
|
ack_id = ((UINT16)recvBuf[1]) << 8 | recvBuf[2];
|
||||||
|
printf("cmd %x, ack_id %d, pkt_id %d, recv3 %x\r\n",
|
||||||
|
cmd, ack_id, pkt_id, recvBuf[3]);
|
||||||
|
if(cmd == 0xee && ack_id == pkt_id && recvBuf[3] == 0)
|
||||||
|
{
|
||||||
|
fw_packet.fw_remain_size -= len;
|
||||||
|
fw_packet.fw_complete_size += len;
|
||||||
|
pkt_id++;
|
||||||
|
if(fw_packet.fw_total_size == fw_packet.fw_complete_size)
|
||||||
|
{
|
||||||
|
ret = Fw_Read(&cmd, recvBuf, &recvl);
|
||||||
|
if(recvBuf[1] == 0)
|
||||||
|
{
|
||||||
|
FwUpgradeState = FWUPGRADE_TRANSFER_FINISH_STATE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FwUpgradeState = FWUPGRADE_TRANSFER_PACKET_STATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FwUpgradeState = FWUPGRADE_TRANSFER_PACKET_STATE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FwUpgradeState = FWUPGRADE_ERROR_OCCUR_STATE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FWUPGRADE_TRANSFER_FINISH_STATE:
|
||||||
|
printf("FWUPGRADE_TRANSFER_FINISH_STATE\r\n");
|
||||||
|
//sf_sys_status_led_set(SF_LED_SYS_STATE_UPGRADE_SUCCESS);
|
||||||
|
free(fw_packet.fw_content);
|
||||||
|
/*exit upgrade thread*/
|
||||||
|
FwUpgradeExit = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FWUPGRADE_ERROR_OCCUR_STATE:
|
||||||
|
printf("FWUPGRADE_ERROR_OCCUR_STATE\r\n");
|
||||||
|
if(fw_packet.fw_content != NULL)
|
||||||
|
{
|
||||||
|
free(fw_packet.fw_content);
|
||||||
|
}
|
||||||
|
data[0] = 0;
|
||||||
|
ret = Fw_Send(0xec, data, 1); /*notify mcu to exit upgrade mode*/
|
||||||
|
Fw_Read(&cmd, recvBuf, &recvl);
|
||||||
|
|
||||||
|
sf_power_off_msg_to_cardv();
|
||||||
|
|
||||||
|
/*exit upgrade thread*/
|
||||||
|
FwUpgradeExit = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
usleep(200000);
|
||||||
|
}
|
||||||
|
printf("ret is %d\r\n", ret);
|
||||||
|
pthread_exit(NULL);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#if __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
|
@ -40,6 +40,8 @@ void sf_set_pir_statu_flag(BOOL flag);
|
||||||
void sf_set_auto_off_time(UINT16 time);
|
void sf_set_auto_off_time(UINT16 time);
|
||||||
void sf_set_keep_alive_time(unsigned int time_s);
|
void sf_set_keep_alive_time(unsigned int time_s);
|
||||||
UINT16 sf_get_auto_off_time(void);
|
UINT16 sf_get_auto_off_time(void);
|
||||||
|
void sf_set_mcu_update_flag(UINT8 flag);
|
||||||
|
UINT8 sf_get_mcu_update_flag(void);
|
||||||
UINT8 sf_get_fw_update(void);
|
UINT8 sf_get_fw_update(void);
|
||||||
void sf_set_fw_update(UINT8 flag);
|
void sf_set_fw_update(UINT8 flag);
|
||||||
UINT8 sf_get_module_update(void);
|
UINT8 sf_get_module_update(void);
|
||||||
|
|
|
@ -97,6 +97,7 @@ static int shared_condition = 1;
|
||||||
static SINT32 WifiSocket = 0;
|
static SINT32 WifiSocket = 0;
|
||||||
static UINT8 UiparaFlag = 0;
|
static UINT8 UiparaFlag = 0;
|
||||||
static SF_BLE_STATUS_E BleStatus = SF_BLE_OK;
|
static SF_BLE_STATUS_E BleStatus = SF_BLE_OK;
|
||||||
|
static UINT8 McuUpdateFlag = 0;
|
||||||
|
|
||||||
static SF_THREAD_S UpgradeTskParam =
|
static SF_THREAD_S UpgradeTskParam =
|
||||||
{
|
{
|
||||||
|
@ -310,7 +311,7 @@ void sf_mode_detect(void)
|
||||||
//countDownOffFlg = 0;
|
//countDownOffFlg = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(puiPara->AutoOffSwitch == 0 || SF_BLE_CON == sf_get_ble_status() || (0x04 == NetWorkFlag/*SF_4G_SENDING*/) || (0x05 == NetWorkFlag/*SF_4G_SEARCHING*/) || (sf_get_fw_update()) || (sf_get_module_update())/*|| (appActiveStateGet() == APP_STATE_CUSTOMER_TRANSFER)*/)
|
if(puiPara->AutoOffSwitch == 0 || SF_BLE_CON == sf_get_ble_status() || (0x04 == NetWorkFlag/*SF_4G_SENDING*/) || (0x05 == NetWorkFlag/*SF_4G_SEARCHING*/) || (sf_get_fw_update()) || (sf_get_module_update()) || (sf_get_mcu_update_flag())/*|| (appActiveStateGet() == APP_STATE_CUSTOMER_TRANSFER)*/)
|
||||||
{
|
{
|
||||||
AutoOfftime=0;
|
AutoOfftime=0;
|
||||||
}
|
}
|
||||||
|
@ -347,6 +348,17 @@ void sf_mode_detect(void)
|
||||||
}
|
}
|
||||||
//printf("[%s:%d] e\n", __FUNCTION__, __LINE__);
|
//printf("[%s:%d] e\n", __FUNCTION__, __LINE__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UINT8 sf_get_mcu_update_flag(void)
|
||||||
|
{
|
||||||
|
return McuUpdateFlag;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sf_set_mcu_update_flag(UINT8 flag)
|
||||||
|
{
|
||||||
|
McuUpdateFlag = flag;
|
||||||
|
}
|
||||||
|
|
||||||
UINT8 sf_get_module_update(void)
|
UINT8 sf_get_module_update(void)
|
||||||
{
|
{
|
||||||
return ModuleUpdating;
|
return ModuleUpdating;
|
||||||
|
@ -1775,7 +1787,7 @@ static SINT32 sf_cardv_proccess_cmd_wifi(SF_MESSAGE_BUF_S *pMessageBuf)
|
||||||
switch(pMessageBuf->arg1)
|
switch(pMessageBuf->arg1)
|
||||||
{
|
{
|
||||||
case SF_WIFI_CMD_START:
|
case SF_WIFI_CMD_START:
|
||||||
if((0 == sf_get_fw_update()) && (sf_get_mode_flag()))
|
if((0 == sf_get_mcu_update_flag()) && (0 == sf_get_fw_update()) && (sf_get_mode_flag()))
|
||||||
sf_cardv_wifi_start();
|
sf_cardv_wifi_start();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2675,7 +2687,7 @@ UINT32 sf_cardv_wifi_start(void)
|
||||||
SINT32 ret = 1;
|
SINT32 ret = 1;
|
||||||
UIMenuStoreInfo *puiPara = sf_ui_para_get();
|
UIMenuStoreInfo *puiPara = sf_ui_para_get();
|
||||||
|
|
||||||
if((0 == sf_get_fw_update()) && (sf_get_mode_flag()) && (puiPara->WifiSwitch))
|
if((0 == sf_get_mcu_update_flag()) && (0 == sf_get_fw_update()) && (sf_get_mode_flag()) && (puiPara->WifiSwitch))
|
||||||
{
|
{
|
||||||
if(WifiTskCfg.IsRun)
|
if(WifiTskCfg.IsRun)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2017,7 +2017,7 @@ void sf_calculate_daily_report(UINT8*dailyHour, UINT8*dailyMin)
|
||||||
int sf_while_flag(void)
|
int sf_while_flag(void)
|
||||||
{
|
{
|
||||||
if((!sf_is_usb_flag()) && (POWEROFF != 1)
|
if((!sf_is_usb_flag()) && (POWEROFF != 1)
|
||||||
&& (ModuleUpdating != 1) && (sf_get_fw_update() == 0))
|
&& (ModuleUpdating != 1) && (0 == sf_get_mcu_update_flag()) && (sf_get_fw_update() == 0))
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -185,6 +185,7 @@ UINT32 DrvGPIO_GetPhotoMovieModeFromMonitor(void)
|
||||||
case PWR_ON_GPRS_INIT://A
|
case PWR_ON_GPRS_INIT://A
|
||||||
case PWR_ON_TIME_SYNC://B
|
case PWR_ON_TIME_SYNC://B
|
||||||
case PWR_ON_TIME_SEND:
|
case PWR_ON_TIME_SEND:
|
||||||
|
case PWR_ON_MCU_UPDATA:
|
||||||
#endif
|
#endif
|
||||||
Save_MenuInfo();
|
Save_MenuInfo();
|
||||||
g_uiBootMode = DX_HUNTING_MODE_OTHER;
|
g_uiBootMode = DX_HUNTING_MODE_OTHER;
|
||||||
|
|
|
@ -240,8 +240,8 @@ extern BOOL GPIOMap_DetAudio(void);
|
||||||
#define PAD_KEY_RIGHT PAD_PIN_CGPIO4
|
#define PAD_KEY_RIGHT PAD_PIN_CGPIO4
|
||||||
#define GPIO_KEY_PLAYBACK C_GPIO_17 // Key Playback (kmp)
|
#define GPIO_KEY_PLAYBACK C_GPIO_17 // Key Playback (kmp)
|
||||||
#define PAD_KEY_PLAYBACK PAD_PIN_CGPIO17
|
#define PAD_KEY_PLAYBACK PAD_PIN_CGPIO17
|
||||||
#define GPIO_KEY_DOWN C_GPIO_20 // Key Down (kd)
|
#define GPIO_KEY_DOWN C_GPIO_6 // Key Down (kd)
|
||||||
#define PAD_KEY_DOWN PAD_PIN_CGPIO20
|
#define PAD_KEY_DOWN PAD_PIN_CGPIO6
|
||||||
#define GPIO_KEY_MODE D_GPIO_4 // Key Mode (kmd)
|
#define GPIO_KEY_MODE D_GPIO_4 // Key Mode (kmd)
|
||||||
#define PAD_KEY_MODE PAD_PIN_DGPIO4
|
#define PAD_KEY_MODE PAD_PIN_DGPIO4
|
||||||
#define GPIO_KEY_MENU C_GPIO_21 // Key Menu (km)
|
#define GPIO_KEY_MENU C_GPIO_21 // Key Menu (km)
|
||||||
|
|
|
@ -846,7 +846,7 @@ static int make_bootargs(LINUXTMP_PARTITION *p_linuxtmp, unsigned int bootts_beg
|
||||||
//static char bootargs[] = "root=/dev/ram0 rootfstype=ramfs rdinit=/linuxrc bootts=568047,1720128 resume_addr=0x00007e88 user_debug=0xff";
|
//static char bootargs[] = "root=/dev/ram0 rootfstype=ramfs rdinit=/linuxrc bootts=568047,1720128 resume_addr=0x00007e88 user_debug=0xff";
|
||||||
#if HUNTING_CAMERA_MCU == ENABLE
|
#if HUNTING_CAMERA_MCU == ENABLE
|
||||||
char PowerOnModeStr[32] = {'\0'};
|
char PowerOnModeStr[32] = {'\0'};
|
||||||
snprintf(PowerOnModeStr, sizeof(PowerOnModeStr), "Mode=%d UpFw=%d",sf_get_power_on_mode(), sf_in_update());
|
snprintf(PowerOnModeStr, sizeof(PowerOnModeStr), "Mode=%d UpFw=%d mcu=%d",sf_get_power_on_mode(), sf_in_update() , sf_in_mcu_update());
|
||||||
linuxboot_set_extra_bootarg(PowerOnModeStr);
|
linuxboot_set_extra_bootarg(PowerOnModeStr);
|
||||||
#endif
|
#endif
|
||||||
p_linuxtmp->bootargs_addr = p_linuxtmp->tmp_curr;
|
p_linuxtmp->bootargs_addr = p_linuxtmp->tmp_curr;
|
||||||
|
|
|
@ -1730,6 +1730,7 @@ void sf_power_on_para_check_init(void)
|
||||||
puiPara->FristSendDailyAndGps = 1;
|
puiPara->FristSendDailyAndGps = 1;
|
||||||
puiPara->GpsSendFlag = 0;
|
puiPara->GpsSendFlag = 0;
|
||||||
memset(puiPara->SimIccid,'\0',sizeof(puiPara->SimIccid));
|
memset(puiPara->SimIccid,'\0',sizeof(puiPara->SimIccid));
|
||||||
|
//sf_dailyReport_refresh();
|
||||||
}
|
}
|
||||||
else if(PowerOnMode == PWR_ON_TIME_SYNC)
|
else if(PowerOnMode == PWR_ON_TIME_SYNC)
|
||||||
{
|
{
|
||||||
|
@ -1780,4 +1781,7 @@ void sf_power_on_para_check_init(void)
|
||||||
Save_MenuInfo();
|
Save_MenuInfo();
|
||||||
}*/
|
}*/
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,7 @@
|
||||||
#define PWR_ON_GPRS_INIT 0x0A
|
#define PWR_ON_GPRS_INIT 0x0A
|
||||||
#define PWR_ON_TIME_SYNC 0x0B
|
#define PWR_ON_TIME_SYNC 0x0B
|
||||||
#define PWR_ON_TIME_SEND 0x0C
|
#define PWR_ON_TIME_SEND 0x0C
|
||||||
|
#define PWR_ON_MCU_UPDATA 0x0F
|
||||||
|
|
||||||
/*REG FUNCTION_SWTICH*/
|
/*REG FUNCTION_SWTICH*/
|
||||||
#define PIR_OFF 0x00
|
#define PIR_OFF 0x00
|
||||||
|
@ -527,6 +528,8 @@ UINT8 sf_convert_power_on_mode(void);
|
||||||
void sf_hw_info_save(char *name,FST_FILE fd);
|
void sf_hw_info_save(char *name,FST_FILE fd);
|
||||||
void sf_set_iso_exp_lv(UINT32 adj, UINT32 iso, UINT32 exp, UINT32 lv);
|
void sf_set_iso_exp_lv(UINT32 adj, UINT32 iso, UINT32 exp, UINT32 lv);
|
||||||
UINT32 sf_in_update(void);
|
UINT32 sf_in_update(void);
|
||||||
|
UINT32 sf_in_mcu_update(void);
|
||||||
int sf_base64_decode(const char * base64, char * bindata);
|
int sf_base64_decode(const char * base64, char * bindata);
|
||||||
|
void sf_dailyReport_refresh(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -391,12 +391,12 @@ UINT8 sf_mcu_power_on_para_get(MCUParam_t attrId)
|
||||||
}
|
}
|
||||||
else */
|
else */
|
||||||
#endif
|
#endif
|
||||||
{
|
// {
|
||||||
if(startMode > PWR_ON_TIME_SEND) //if start mode err, USB IN default power on SETUP
|
// if(startMode > PWR_ON_MCU_UPDATA) //if start mode err, USB IN default power on SETUP
|
||||||
{
|
// {
|
||||||
startMode = PWR_ON_SETUP;
|
// startMode = PWR_ON_SETUP;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
printf(" start mode = %d \n", startMode);
|
printf(" start mode = %d \n", startMode);
|
||||||
return startMode;
|
return startMode;
|
||||||
}
|
}
|
||||||
|
@ -765,11 +765,22 @@ UINT32 sf_gpio_get_status(UINT32 ipin)
|
||||||
}
|
}
|
||||||
UINT32 sf_in_update(void)
|
UINT32 sf_in_update(void)
|
||||||
{
|
{
|
||||||
if(sf_gpio_get_status(GPIO_KEY_TEST)){
|
if((sf_gpio_get_status(GPIO_KEY_TEST)) && (PWR_ON_SETUP == sf_get_power_on_mode()))
|
||||||
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
UINT32 sf_in_mcu_update(void)
|
||||||
|
{
|
||||||
|
if((sf_gpio_get_status(GPIO_KEY_DOWN)) && (PWR_ON_SETUP == sf_get_power_on_mode())){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(PWR_ON_MCU_UPDATA == sf_get_power_on_mode()){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
/*************************************************
|
/*************************************************
|
||||||
Function: sf_mcu_dataready_get
|
Function: sf_mcu_dataready_get
|
||||||
Description:
|
Description:
|
||||||
|
@ -2506,6 +2517,90 @@ void sf_hw_info_save(char *name,FST_FILE fd)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*************************************************
|
||||||
|
Function: sf_dailyReport_refresh
|
||||||
|
Description: refresh dailyreport
|
||||||
|
Input: N/A
|
||||||
|
Output: N/A
|
||||||
|
Return: N/A
|
||||||
|
Others: N/A
|
||||||
|
*************************************************/
|
||||||
|
void sf_dailyReport_refresh(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
UIMenuStoreInfo *puiPara = sf_ui_para_get();
|
||||||
|
UINT32 preTimeValue = 0;
|
||||||
|
UINT32 dr1TimeValue = 0;
|
||||||
|
UINT32 dr2TimeValue = 0;
|
||||||
|
SF_PARA_TIME_S preRtcTime = { 0 };
|
||||||
|
//sf_sys_rtc_time_get(&preRtcTime);
|
||||||
|
struct tm ctv = {0};
|
||||||
|
ctv = hwclock_get_time(TIME_ID_CURRENT);
|
||||||
|
printf("%s:%d tm: %d : %d : %d : %d : %d : %d\n", __FUNCTION__, __LINE__,ctv.tm_year, ctv.tm_mon,ctv.tm_mday,ctv.tm_hour,ctv.tm_min,ctv.tm_sec);
|
||||||
|
preRtcTime.Year = ctv.tm_year;
|
||||||
|
preRtcTime.Mon = ctv.tm_mon;
|
||||||
|
preRtcTime.Day = ctv.tm_mday;
|
||||||
|
preRtcTime.Hour = ctv.tm_hour;
|
||||||
|
preRtcTime.Min = ctv.tm_min;
|
||||||
|
preRtcTime.Sec = ctv.tm_sec;
|
||||||
|
|
||||||
|
preTimeValue = preRtcTime.Hour * 60 + preRtcTime.Min;
|
||||||
|
dr1TimeValue = puiPara->DailyReportTime.Hour * 60 + puiPara->DailyReportTime.Min;
|
||||||
|
dr2TimeValue = dr1TimeValue + (12 * 60);
|
||||||
|
|
||||||
|
if(puiPara->ReDailyReport == 0)
|
||||||
|
{
|
||||||
|
//twice a day
|
||||||
|
if(((preTimeValue < dr1TimeValue) && (preTimeValue < dr2TimeValue)) || ((preTimeValue >= dr1TimeValue) && (preTimeValue >= dr2TimeValue)))
|
||||||
|
{
|
||||||
|
puiPara->DailyReportTime2.Hour = puiPara->DailyReportTime.Hour;
|
||||||
|
puiPara->DailyReportTime2.Min = puiPara->DailyReportTime.Min;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
puiPara->DailyReportTime2.Hour = (puiPara->DailyReportTime.Hour + 12) % 24;
|
||||||
|
puiPara->DailyReportTime2.Min = puiPara->DailyReportTime.Min;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if((preTimeValue >= dr1TimeValue) && (preTimeValue < dr1TimeValue + 60))
|
||||||
|
{
|
||||||
|
puiPara->DailyReportTime2.Hour = (puiPara->DailyReportTime.Hour + 1) % 24;
|
||||||
|
puiPara->DailyReportTime2.Min = puiPara->DailyReportTime.Min;
|
||||||
|
}
|
||||||
|
else if((preTimeValue >= dr1TimeValue + 60) && (preTimeValue < dr2TimeValue))
|
||||||
|
{
|
||||||
|
puiPara->DailyReportTime2.Hour = (puiPara->DailyReportTime.Hour + 12) % 24;
|
||||||
|
puiPara->DailyReportTime2.Min = puiPara->DailyReportTime.Min;
|
||||||
|
}
|
||||||
|
else if((preTimeValue >= dr2TimeValue) && (preTimeValue < dr2TimeValue + 60))
|
||||||
|
{
|
||||||
|
puiPara->DailyReportTime2.Hour = (puiPara->DailyReportTime.Hour + 12 + 1) % 24;
|
||||||
|
puiPara->DailyReportTime2.Min = puiPara->DailyReportTime.Min;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
puiPara->DailyReportTime2.Hour = puiPara->DailyReportTime.Hour;
|
||||||
|
puiPara->DailyReportTime2.Min = puiPara->DailyReportTime.Min;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(puiPara->DailyReportTestSwitch)
|
||||||
|
{
|
||||||
|
if(puiPara->ReDailyReport)
|
||||||
|
{
|
||||||
|
puiPara->DailyReportTime2.Hour = (preRtcTime.Hour + (preRtcTime.Min + 15) / 60) % 24;
|
||||||
|
puiPara->DailyReportTime2.Min = (preRtcTime.Min + 15) % 60;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
puiPara->DailyReportTime2.Hour = (preRtcTime.Hour + (preRtcTime.Min + 5) / 60) % 24;
|
||||||
|
puiPara->DailyReportTime2.Min = (preRtcTime.Min + 5) % 60;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if defined __FREERTOS
|
#if defined __FREERTOS
|
||||||
|
|
||||||
int sf_mod_init(void)
|
int sf_mod_init(void)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user