#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