引导程序之ota文件:otausb.c

#include "otausb.h"
#include "halUSB.h"
#include "misc.h"
#include "yc_qspi.h"
#include "printerConfig.h"
#include "api_iap_flash_opt.h"
#include "api_iap_process.h"
#include "var_global.h"

extern void start_app(void);
extern USB_OTG_CORE_HANDLE  USB_OTG_dev;


_PACK_CONFIG  PackConfig = {0};


uint8_t  rev_data[64];
uint8_t  rev_data[64], tx_buffer[64];
uint8_t  tx_buffer_flash[8192];
uint8_t  rx_buffer_flash[8192];
uint8_t  send_data_flag;
uint8_t  rx_buffer[100] = {0};
uint8_t  tx_buffer_boot[32] = {0};
uint8_t  len, uart_flag;
uint8_t  tx_buffer[64] = {0};
uint8_t  q;
uint32_t earse_len, check_sum = 0, address = 0, now_packet_num, total_packet_num, last_packet_len, pc_check_sum;
uint32_t a = 0, total_len, rem_len, total_len_send;
_Bool  bBacktoAppFlag = 0;

void USB_OTA_START(void)
{
    /******************CMD_OTA_START***************/
    total_packet_num = rev_data[2] + (rev_data[3] << 8);
    total_len = rev_data[4] + (rev_data[5] << 8) + (rev_data[6] << 16);

    tx_buffer[0] = 0xAB;
    tx_buffer[1] = 0xC0;
    tx_buffer[2] = 0x3A;
    tx_buffer[3] = 0x00;
    DCD_EP_Tx(&USB_OTG_dev, HID_IN_EP, tx_buffer, 64);
    
    #if USE_BACKUP_AREA
        PackConfig.UPDataSize = total_len;        //总长度 
        PackConfig.CurrentPackLen = 0;            //当前包长度  为0 
    #endif 
    
    GlobalVar.all_len = total_len;                //总长 
    GlobalVar.current_len = 0;
}

void USB_OTA_DATA(void)
{
    bool  finish_flag = false;        //完成标记 
    
    /******************CMD_OTA_DATA***************/
    now_packet_num =  rev_data[2] + (rev_data[3] << 8);
    if (now_packet_num < total_packet_num)
    {
        for (int i = 6; i  <  64 ; i++)
        {
            tx_buffer_flash [a] = rev_data [i];
            a++;
            if (a == 8192)  //发包为8K  由于外部flash一页为4K 所以分开2次4K写
            {
                #if USE_BACKUP_AREA
                    PackConfig.CurrentPackLen = 8192;
                    Iap_BackDataWrite(&finish_flag,&PackConfig,&tx_buffer_flash[0],8192);
                #else 
                    //enc_write_flash_bulk要消耗36K  ram  整个芯片共64k ram 加了备份区之后不够用 
                    enc_write_flash_bulk(APPWRITEADDR + address * 0x2000, tx_buffer_flash, 8192, 0);  
                #endif
                
                a = 0;
                address++;
                for (int i = 0; i < 8192; i++)
                {
                    tx_buffer_flash[i] = 0;
                }
                
                GlobalVar.current_len += 8192;        //用于求升级的百分比 
            }
        }
        tx_buffer[0] = 0xAB;
        tx_buffer[1] = 0xC1;
        tx_buffer[2] = rev_data[2];
        tx_buffer[3] = rev_data[3];
        for (int i = 6; i < 64; i++)
        {
            check_sum = check_sum + rev_data[i];
        }
        DCD_EP_Tx(&USB_OTG_dev, HID_IN_EP, tx_buffer, 64);
    }
    else
    {
        //最后一包  可能是满8K  可能是不满8K
        last_packet_len = rev_data[4] + (rev_data[5] << 8);
        for (int i = 6; i  <  (last_packet_len + 6) ; i++)
        {
            tx_buffer_flash [a] = rev_data [i];
            a++;
            if (a == 8192)    //满8K 
            {
                #if USE_BACKUP_AREA
                    PackConfig.CurrentPackLen = 8192;
                    Iap_BackDataWrite(&finish_flag,&PackConfig,&tx_buffer_flash[0],8192);
                #else 
                    //enc_write_flash_bulk要消耗36K  ram  整个芯片共64k ram 加了备份区之后不够用 
                    enc_write_flash_bulk(APPWRITEADDR + address * 0x2000, tx_buffer_flash, 8192, 0);  
                #endif
                
                a = 0;
                address++;
                for (int i = 0; i < 8192; i++)
                {
                    tx_buffer_flash[i] = 0;
                }
                
                GlobalVar.current_len += 8192;        //用于求升级的百分比 
            }
        }

        #if USE_BACKUP_AREA
        
            PackConfig.CurrentPackLen = a;
            Iap_BackDataWrite(&finish_flag,&PackConfig,&tx_buffer_flash[0],a);
            
            GlobalVar.current_len += a;
        #else 
            //enc_write_flash_bulk要消耗36K  ram  整个芯片共64k ram 加了备份区之后不够用 
            a = a + (32 - a % 32);        //32byte对齐     
            enc_write_flash_bulk(APPWRITEADDR + address * 0x2000, tx_buffer_flash, a, 1);
        #endif

        tx_buffer[0] = 0xAB;
        tx_buffer[1] = 0xC1;
        tx_buffer[2] = rev_data[2];
        tx_buffer[3] = rev_data[3];
        for (int i = 6; i < last_packet_len + 6; i++)
        {
            check_sum = check_sum + rev_data[i];
        }
        DCD_EP_Tx(&USB_OTG_dev, HID_IN_EP, tx_buffer, 64);
    }
}

void USB_OTA_END(void)
{
    /******************CMD_OTA_END***************/
    pc_check_sum =  rev_data[4] + (rev_data[5] << 8) + (rev_data[6] << 16);
    tx_buffer[0] = 0xAB;
    tx_buffer[1] = 0xC2;
    tx_buffer[2] = rev_data[2];
    tx_buffer[3] = rev_data[3];
    if (pc_check_sum == check_sum)
    {
        tx_buffer[4] = 0x55;
        bBacktoAppFlag = 1;
        MyPrintf("pc_check_sum sucess\n\n");
        
        //总长和已接长 均等于0 
        GlobalVar.all_len = 0;
        GlobalVar.current_len = 0;
    }
    else
    {
        tx_buffer[4] = 0xAA;
        soft_reset();
    }
    DCD_EP_Tx(&USB_OTG_dev, HID_IN_EP, tx_buffer, 64);
}

void Cmd_check(void)
{
    if (halUsbDataAck() == HAVE_DATA)
    {
        len = halUsbReceive(rev_data, 64);
        switch ((rev_data[0] | rev_data[1] << 8))
        {
        case 0xC0BA:
            USB_OTA_START();
            break;
        case 0xC1BA:
            USB_OTA_DATA();
            break;
        case 0xC2BA:
            USB_OTA_END();
            break;
        }
    }
}

void BackToApp(unsigned char status)
{
    if (status)
    {
        delay_ms(10);
        MyPrintf("BackToApp\n\n");
       // enc_erase_flash_32byte(FLASH_SYSTEM_CONFIG);
       // start_app();
        
        Proc_BootLoader();
    }
}

以下为:otausb.h

#ifndef _OTA_USB_H_
#define _OTA_USB_H_

#include "yc_encflash_bulk.h"
#include "type.h"


void Cmd_check(void);
void BackToApp(unsigned char status);

#endif

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值