Upgrade.c 9.1 KB
#include <stdio.h>
#include "JZsdkLib.h"
#include <string.h>
#include <sys/reboot.h>
#include <unistd.h>  // 添加这行来声明 sync() 函数

#include "BaseConfig.h"
#include "DeviceInfo/DeviceInfo.h"
#include "Upgrade.h"

#define UPGRADE_FILE_DIR "/root/ugradeFile"
#define UPGRADE_FILE_STATUS "/root/upgradeFile/upgrade_status"

#define REMOTE_UPGRADE_FILE_DIR "/root/ugradeFile/remote_ugradeFile.tar"

static int g_PackLen = 0;


static T_JZsdkUpgradeStatus g_UpgradeStatus = JZSDK_UPGRADE_STATUS_DEFAULT;
static int g_UpgradeMode = 0;

T_JZsdkFileHandle Upgrade_FileHandle = NULL;
static unsigned char g_CheckCode[128] = {0};
static int g_CheckCodeFlag =JZ_FLAGCODE_OFF;
static int g_UpgradeCheckFlag = JZ_FLAGCODE_OFF;

/*****************
 * 
 *  获取升级状态
 * 
 * 
 * ***************/
T_JZsdkReturnCode Upgrade_GetStatus(int *status)
{
    *status = g_UpgradeStatus;
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/************************************
 * 
 *   升级包下载
 * 
 * 
 * **********************************/
T_JZsdkReturnCode Upgrade_PackageDownload_Start()
{
    T_JZsdkReturnCode ret;

    if (g_UpgradeStatus == JZSDK_UPGRADE_STATUS_DOWNLOADING)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageDownload_Start: upgrade package is downloading");
        return JZ_ERROR_SYSTEM_MODULE_CODE_IS_BUSY;
    }
    
    ret = JZsdk_Osal_FileOpen(REMOTE_UPGRADE_FILE_DIR, "wb", &Upgrade_FileHandle);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageDownload_Start: JZsdk_Osal_FileOpen failed");
        return ret;
    }

    JZSDK_LOG_INFO("Upgrade_PackageDownload_Start: upgrade package is downloading");

    g_UpgradeStatus = JZSDK_UPGRADE_STATUS_DOWNLOADING;
    g_PackLen = 0;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/************************************
 * 
 *  升级包下载中
 * 
 * 
 * **********************************/
T_JZsdkReturnCode Upgrade_PackageDownload_Trans(unsigned char *buf, unsigned int len)
{
    T_JZsdkReturnCode ret;

    if (g_UpgradeStatus != JZSDK_UPGRADE_STATUS_DOWNLOADING)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageDownload_Trans: upgrade package is not downloading");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    JZSDK_LOG_INFO("目前下载的数据 第0个 : %d,第%d 个 :%d 共:%d", buf[0], len - 1, buf[len - 1], len);

    //下载升级包
    int realLen = 0;
    ret = JZsdk_Osal_FileWrite_U8(Upgrade_FileHandle, buf, len, &realLen);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageDownload_Trans: JZsdk_Osal_FileWrite failed");
        return ret;
    }

    g_PackLen += len;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/************************************
 * 
 *  升级包下载结束
 * 
 * 
 * **********************************/
T_JZsdkReturnCode Upgrade_PackageDownload_Stop()
{
    T_JZsdkReturnCode ret;

    JZSDK_LOG_INFO("传输结束已下载:%d", g_PackLen);

    if (g_UpgradeStatus != JZSDK_UPGRADE_STATUS_DOWNLOADING)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageDownload_Stop: upgrade package is not downloading");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    JZsdk_Osal_FileSync(Upgrade_FileHandle);

    ret = JZsdk_Osal_FileClose(Upgrade_FileHandle);

    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("Upgrade_PackageDownload_Stop: JZsdk_Osal_FileClose failed");
        return ret;
    }

    Upgrade_FileHandle = NULL;

    g_UpgradeStatus = JZSDK_UPGRADE_STATUS_UPGRADING;
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/*******************
 * 
 *  升级包校验码录入
 * 
 * 
 * ********************/
T_JZsdkReturnCode Upgrade_PackageCheckCodeSave(unsigned char *CheckCode, int CheckFlag, int len)
{
    memcpy(g_CheckCode, CheckCode, len);
    g_CheckCodeFlag = CheckFlag;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/************************************
 * 
 *  升级包校验
 * 
 * 
 * **********************************/
T_JZsdkReturnCode Upgrade_PackageCheck()
{
    T_JZsdkReturnCode ret;

    switch (g_CheckCodeFlag)
    {
        case JZSDK_CHECK_SUM_TYPE_MD5:
        {
            JZSDK_LOG_INFO("升级文件使用md5校验码");
            //1、获取文件的md5校验码
            ret = JZsdk_CheckSum(JZSDK_CHECK_SUM_TYPE_MD5, REMOTE_UPGRADE_FILE_DIR, g_CheckCode, 32);
        }
        break;

        case JZSDK_CHECK_SUM_TYPE_SRC32:
        {
            JZSDK_LOG_INFO("升级文件使用src32校验码");
            //1、获取文件的src32校验码
            ret = JZsdk_CheckSum(JZSDK_CHECK_SUM_TYPE_SRC32, REMOTE_UPGRADE_FILE_DIR, g_CheckCode, 4);
        }
        break;
        
        default:
        {
            JZSDK_LOG_ERROR("opus保存校验码类型错误");
            ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
        }
        break;
    }

    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("升级文件校验失败");
        JZsdk_Osal_delete(REMOTE_UPGRADE_FILE_DIR);  
        g_UpgradeStatus = JZSDK_UPGRADE_STATUS_FAILURE;

        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}


/****************************
 * 
 *  升级
 * 
 * 
 * ******************************/
T_JZsdkReturnCode Upgrade_PackageUpgrade()
{
    T_JZsdkReturnCode ret;

    //获取固件名,组合成能识别的固件包
    char PackName[256] = { 0 };
    DeviceInfo_GetDeviceName(PackName);

    //将升级文件移动到sd卡
    char cmd[256] = {0};
    sprintf(cmd, "mv %s /root/sdcard/%s_V00.00.00.00.bin", REMOTE_UPGRADE_FILE_DIR, PackName);
    system(cmd);

    sync();
    delayS(1);

    //重启设备
    // 调用重启系统调用
    if (reboot(RB_AUTOBOOT) == -1) {
        printf("系统重启调用失败\n");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
   
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}


/********************************
 * 
 *  升级模块初始化
 *   
 * 
 * ************************************/
T_JZsdkReturnCode Upgrade_Init()
{
    T_JZsdkReturnCode ret;
    unsigned char Upstatus[256] = { 0 };
    int UpstatusLen = 0;

    if (JZsdk_check_directory_exists_posix(UPGRADE_FILE_DIR) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZsdk_Osal_Mkdir(UPGRADE_FILE_DIR);

        JZSDK_LOG_INFO("无升级文件夹,创建一个");
    }

    //检查是否存在升级完成文件,如果存在则如果存在则删除,并将升级状态改为已完成
    if (JZsdk_check_file_exists(UPGRADE_FILE_STATUS) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_INFO("默认升级状态,无升级");

        //不存在升级完成文件,直接退出升级模块
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    //读取更新文件中的内容
    T_JZsdkFSHandler *FShandle = JZsdk_GetFsHandler();
    if (FShandle == NULL)
    {
        JZSDK_LOG_ERROR("fshandle获取失败");

        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    T_JZsdkFileHandle FileHandle;

    ret = FShandle->FileOpen(UPGRADE_FILE_STATUS, FS_READ_AND_WRITE, &FileHandle);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_INFO("未检测到升级状态");

        //不存在升级完成文件,直接退出升级模块
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    //读取升级状态
    ret = FShandle->FileRead_U8(FileHandle, Upstatus, sizeof(Upstatus), &UpstatusLen);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_INFO("读取升级状态失败");

        g_UpgradeStatus = JZSDK_UPGRADE_STATUS_DEFAULT;

        FShandle->FileClose(FileHandle);

        //不存在升级完成文件,直接退出升级模块
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    g_UpgradeStatus = atoi(Upstatus);
    JZSDK_LOG_INFO("升级状态:%d\n", g_UpgradeStatus);

    FShandle->FileSeek(FileHandle, 0);

    //将里面的升级状态改为0
    ret = FShandle->FileWrite_U8(FileHandle, "0\n", 2, &UpstatusLen);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_INFO("写入升级状态失败");

        g_UpgradeStatus = JZSDK_UPGRADE_STATUS_DEFAULT;

        FShandle->FileClose(FileHandle);

        //不存在升级完成文件,直接退出升级模块
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    FShandle->FileSync(FileHandle);

    //关闭文件
    ret = FShandle->FileClose(FileHandle);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_INFO("关闭升级状态文件失败");

        g_UpgradeStatus = JZSDK_UPGRADE_STATUS_DEFAULT;

        //不存在升级完成文件,直接退出升级模块
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    JZSDK_LOG_INFO("UPGRADE_INIT_SUCCESS");

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}