2025-06-27 00:32:57 +08:00
|
|
|
|
#include "system_updata.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ͨ<><CDA8>SD<53><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SysFile_Updata(char *FileName,char *FilePath)
|
|
|
|
|
{
|
|
|
|
|
u8 ret=0;
|
|
|
|
|
if (FLASH_FindFile(FileName,0)==0)
|
|
|
|
|
{
|
|
|
|
|
FILINFO *file_info=mymalloc(sizeof (FILINFO));
|
|
|
|
|
FIL *file_fil=mymalloc (sizeof(FIL));
|
|
|
|
|
u8 *file_mem=mymalloc(4096);
|
|
|
|
|
u32 read_size=0;
|
2025-06-28 22:15:49 +08:00
|
|
|
|
UINT real_size=0;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
u32 read_size_left=0;
|
|
|
|
|
u32 flash_write_addr=FLASH_GetUsed();
|
|
|
|
|
ret=f_stat (FilePath,file_info);
|
|
|
|
|
if (ret==FR_OK)
|
|
|
|
|
{
|
|
|
|
|
FLASH_CheckErase(flash_write_addr,file_info->fsize);
|
|
|
|
|
f_open(file_fil,FilePath,FA_READ);
|
|
|
|
|
read_size_left=file_info->fsize;
|
|
|
|
|
FLASH_AddFile(FileName,flash_write_addr,read_size_left);
|
|
|
|
|
while(read_size_left)
|
|
|
|
|
{
|
|
|
|
|
if (read_size_left>4096)
|
|
|
|
|
{
|
|
|
|
|
read_size=4096;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
read_size=read_size_left;
|
|
|
|
|
}
|
|
|
|
|
f_read (file_fil,file_mem,read_size,&real_size);
|
|
|
|
|
FLASH_WriteData(file_mem,flash_write_addr,real_size);
|
|
|
|
|
read_size_left-=read_size;
|
|
|
|
|
flash_write_addr+=real_size;
|
|
|
|
|
}
|
|
|
|
|
f_close(file_fil);
|
|
|
|
|
}
|
|
|
|
|
myfree(file_info);
|
|
|
|
|
myfree(file_fil);
|
|
|
|
|
myfree(file_mem);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ȡһ<C8A1><D2BB><EFBFBD>ļ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
u8 *SysFile_GetFileByName (char *name,u32 *size)
|
|
|
|
|
{
|
|
|
|
|
u8 *data=0;
|
|
|
|
|
if (name==0) return data;
|
|
|
|
|
if (name[0]=='0'&&name[1]==':')
|
|
|
|
|
{
|
|
|
|
|
FIL *file=mymalloc (sizeof(FIL));
|
|
|
|
|
FILINFO *file_info=mymalloc(sizeof(FILINFO));
|
|
|
|
|
UINT br;
|
|
|
|
|
u8 res=0;
|
|
|
|
|
f_stat(name,file_info);
|
|
|
|
|
data=mymalloc (file_info->fsize);
|
|
|
|
|
if (data)
|
|
|
|
|
{
|
|
|
|
|
f_open(file,name,FA_READ);
|
|
|
|
|
f_read(file,data,file_info->fsize,&br);
|
|
|
|
|
f_close(file);
|
|
|
|
|
if (size) *size=file_info->fsize;
|
|
|
|
|
}
|
|
|
|
|
myfree(file);
|
|
|
|
|
myfree(file_info);
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
u32 file_size=0;
|
|
|
|
|
if (FLASH_FindFile (name,&file_size)!=0)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FLASH<53>ж<EFBFBD>ȡͼ<C8A1><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
data=mymalloc (file_size);
|
|
|
|
|
FLASH_ReadFile (name,0,(u8*)data,file_size);
|
|
|
|
|
if (size) *size=file_size;
|
|
|
|
|
}
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F>ӽ<EFBFBD><D3BD><EFBFBD>buff<66><66><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>crcУ<63><D0A3>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
static int SysFile_GetData (u8 *buff,int len);
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int cmd_0x01 (SysFile_UpdataStruct *u,u8 *data,int dataLen);
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SysFile_UpdataSaveByte (SysFile_UpdataStruct *u,u8 byte);
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int cmd_0x01_Mem (SysFile_UpdataStruct *u,u8 *data,int dataLen);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//void SysFile_DeleteUpdata (SysFile_UpdataStruct *u)
|
|
|
|
|
//{
|
|
|
|
|
// if (u->data)
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ͨ<><CDA8>USB<53><42><EFBFBD><EFBFBD>ϵͳ<CFB5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SysFile_UpdataByIrq (u8 *data,int len)
|
|
|
|
|
{
|
|
|
|
|
int datalen=0;
|
|
|
|
|
int ret=0;
|
|
|
|
|
static SysFile_UpdataStruct *updata=0;
|
|
|
|
|
if (datalen=SysFile_GetData(data,len),datalen)
|
|
|
|
|
{
|
|
|
|
|
if (data[0]==0x01)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4>俪ʼ<E4BFAA><CABC><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if (data[1]==0x01)
|
|
|
|
|
{
|
|
|
|
|
if (updata)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F>ϴδ<CFB4><CEB4><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD>´δ<C2B4><CEB4>䵽<EFBFBD><E4B5BD>
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ϴδ<CFB4><CEB4><EFBFBD>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD>Ϣ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
SysFile_RecvedStruct *recv=mymalloc (sizeof (SysFile_RecvedStruct));
|
|
|
|
|
recv->structType=SYSFILE_TYPE_RECVFILE;
|
|
|
|
|
recv->data=(u8*)updata->saveAddr;
|
|
|
|
|
recv->dataLen=updata->buffUsed;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
recv->recved=0; //ʧ<><CAA7>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
mymemcpy (recv->name,updata->name,strlen(updata->name)+1);
|
|
|
|
|
WIN_PlaceExtData (recv,sizeof (SysFile_RecvedStruct));
|
|
|
|
|
myfree(recv);
|
|
|
|
|
if (updata->saveAddr) myfree((void *)updata->saveAddr);
|
|
|
|
|
myfree(updata); updata=0;
|
|
|
|
|
}
|
|
|
|
|
updata=mymalloc (sizeof (SysFile_UpdataStruct));
|
|
|
|
|
mymemset (updata,0,sizeof (SysFile_UpdataStruct));
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>Ž<EFBFBD><C5BD>봫<EFBFBD><EBB4AB>
|
|
|
|
|
if (updata&&(ret=cmd_0x01_Mem (updata,data+1,datalen-1),ret!=0))//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽ<EFBFBD><D1BD><EFBFBD>ʧ<EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
SysFile_RecvedStruct *recv=mymalloc (sizeof (SysFile_RecvedStruct));
|
|
|
|
|
recv->structType=SYSFILE_TYPE_RECVFILE;
|
|
|
|
|
recv->data=(u8*)updata->saveAddr;
|
|
|
|
|
recv->dataLen=updata->buffUsed;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
recv->recved=0; //ʧ<><CAA7>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
mymemcpy (recv->name,updata->name,strlen(updata->name)+1);
|
|
|
|
|
WIN_PlaceExtData (recv,sizeof (SysFile_RecvedStruct));
|
|
|
|
|
myfree(recv);
|
|
|
|
|
if (updata->saveAddr) myfree((void *)updata->saveAddr);
|
|
|
|
|
myfree(updata); updata=0;
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if (updata->step==0x04) //<2F><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽ<EFBFBD><D1BD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
SysFile_RecvedStruct *recv=mymalloc (sizeof (SysFile_RecvedStruct));
|
|
|
|
|
recv->structType=SYSFILE_TYPE_RECVFILE;
|
|
|
|
|
recv->data=(u8*)updata->saveAddr;
|
|
|
|
|
recv->dataLen=updata->buffUsed;
|
|
|
|
|
recv->recved=1;
|
|
|
|
|
mymemcpy (recv->name,updata->name,strlen(updata->name)+1);
|
|
|
|
|
if (WIN_PlaceExtData (recv,sizeof (SysFile_RecvedStruct))!=0)
|
2025-07-05 19:47:28 +08:00
|
|
|
|
myfree((void *)updata->saveAddr);//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>ʱ<EFBFBD>ͷŵ<CDB7><C5B5>ļ<EFBFBD>ռ<EFBFBD>õ<EFBFBD><C3B5>ڴ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
myfree(recv);
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD> SysFile_UpdataStruct <20>ṹ<EFBFBD>壬<EFBFBD><E5A3AC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ռ<EFBFBD>õ<EFBFBD><C3B5>ڴ<EFBFBD>û<EFBFBD><C3BB><EFBFBD>ͷ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
myfree(updata); updata=0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ͨ<><CDA8>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SysFile_UpdataByCom (void)
|
|
|
|
|
{
|
|
|
|
|
int real=0;
|
|
|
|
|
int datalen=0;
|
|
|
|
|
u8 *databuff=mymalloc (256);
|
|
|
|
|
u8 ret[10]={0};
|
|
|
|
|
int t=0;
|
|
|
|
|
SysFile_UpdataStruct *updata=mymalloc (sizeof (SysFile_UpdataStruct));
|
|
|
|
|
mymemset (updata,0,sizeof (SysFile_UpdataStruct));
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
if (datalen=SysFile_GetData(databuff,256),datalen)
|
|
|
|
|
{
|
|
|
|
|
if (databuff[0]==0x01)
|
|
|
|
|
{
|
|
|
|
|
if (t=cmd_0x01 (updata,databuff+1,datalen-1),t==0)
|
|
|
|
|
{ real=1; }
|
|
|
|
|
else
|
|
|
|
|
{ real=0;}
|
|
|
|
|
mymemset (ret,t,5);
|
2025-06-28 22:15:49 +08:00
|
|
|
|
// usb_sendData(ret,5);
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if (updata->step==0x04) break;//<2F><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}while (real);
|
|
|
|
|
myfree(databuff);
|
|
|
|
|
myfree(updata);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F>ӽ<EFBFBD><D3BD><EFBFBD>buff<66><66><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>crcУ<63><D0A3>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
static int SysFile_GetData (u8 *buff,int len)
|
|
|
|
|
{
|
|
|
|
|
u8 crc[2]={0};
|
|
|
|
|
//u8 *buf=mymalloc (256);
|
|
|
|
|
u8 *buf=buff;
|
|
|
|
|
u8 *buf_ptr=0;
|
|
|
|
|
int ret=0;
|
|
|
|
|
int recv_len=len;//usb_getRecvData (buf,256);
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// //<2F>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
// recv_len/=2;
|
|
|
|
|
// for (int i=0;i<recv_len;i++)
|
|
|
|
|
// {
|
|
|
|
|
// buf[i]=(buf[i*2]<<4)|(buf[i*2+1]&0x0f);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
if (recv_len>6)
|
|
|
|
|
{
|
|
|
|
|
if (((buf[2]<<8)|buf[3])==recv_len-2)
|
|
|
|
|
{
|
|
|
|
|
buf_ptr=buf+2;
|
|
|
|
|
Get_Crc16 (buf_ptr,recv_len-4,crc);
|
|
|
|
|
if ((crc[0]==buf_ptr[recv_len-2-2])&&(crc[1]==buf_ptr[recv_len-2-1]))
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//crcУ<63><D0A3>ͨ<EFBFBD><CDA8>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݵ<EFBFBD>buff
|
2025-06-27 00:32:57 +08:00
|
|
|
|
mymemcpy (buff,buf_ptr+2,recv_len-6);
|
|
|
|
|
ret=recv_len-6;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//myfree(buf);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int cmd_0x01 (SysFile_UpdataStruct *u,u8 *data,int dataLen)
|
|
|
|
|
{
|
|
|
|
|
int ret=-1;
|
|
|
|
|
if (u->step==0x00)
|
|
|
|
|
{
|
|
|
|
|
if (data[0]==0x01)
|
|
|
|
|
{
|
|
|
|
|
if (FLASH_FindFile ((char *)data+1,0)==0)
|
|
|
|
|
{
|
|
|
|
|
u->saveAddr=FLASH_GetUsed();
|
|
|
|
|
mymemcpy (u->name,data+1,dataLen-1);
|
|
|
|
|
u->step=data[0];
|
|
|
|
|
ret=0;
|
|
|
|
|
}
|
|
|
|
|
} else { ret=-1; }
|
|
|
|
|
}
|
|
|
|
|
else if (u->step==0x01)
|
|
|
|
|
{
|
|
|
|
|
if (data[0]==0x02)
|
|
|
|
|
{
|
|
|
|
|
u->dataLen=((data[1]<<24)|(data[2]<<16)|(data[3]<<8)|data[4]);
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>÷<EFBFBD><C3B7><EFBFBD>ʧ<EFBFBD><CAA7>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
FLASH_CheckErase (u->saveAddr,u->dataLen);
|
|
|
|
|
FLASH_AddFile (u->name,u->saveAddr,u->dataLen);
|
|
|
|
|
u->step=data[0];
|
|
|
|
|
ret=0;
|
|
|
|
|
} else { ret=-2; }
|
|
|
|
|
}
|
|
|
|
|
else if (u->step==0x02)
|
|
|
|
|
{
|
|
|
|
|
if (data[0]==0x03)
|
|
|
|
|
{
|
|
|
|
|
u->packet_all=(data[1]<<8)|data[2];
|
|
|
|
|
u->packet_now=0;
|
|
|
|
|
if (u->packet_now+1==((data[3]<<8)|data[4]) )
|
|
|
|
|
{
|
|
|
|
|
u->packet_now++;
|
|
|
|
|
for (int i=0;i<dataLen-5;i++)
|
|
|
|
|
SysFile_UpdataSaveByte (u,data[5+i]);
|
|
|
|
|
u->step=data[0]; ret=0;} else { ret=-3; }
|
|
|
|
|
} else { ret=-4; }
|
|
|
|
|
}
|
|
|
|
|
else if (u->step==0x03)
|
|
|
|
|
{
|
|
|
|
|
if (data[0]==0x03)
|
|
|
|
|
{
|
|
|
|
|
if (u->packet_all==((data[1]<<8)|data[2]))
|
|
|
|
|
{
|
|
|
|
|
if (u->packet_now+1==((data[3]<<8)|data[4]) )
|
|
|
|
|
{
|
|
|
|
|
u->packet_now++;
|
|
|
|
|
for (int i=0;i<dataLen-5;i++)
|
|
|
|
|
SysFile_UpdataSaveByte (u,data[5+i]);
|
|
|
|
|
if (u->packet_now==u->packet_all)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
FLASH_WriteData(u->dataBuff,u->saveAddr,u->buffUsed);
|
|
|
|
|
u->saveAddr+=u->buffUsed;
|
|
|
|
|
u->buffUsed=0;
|
|
|
|
|
u->step=0x04;
|
|
|
|
|
}
|
|
|
|
|
ret=0;
|
|
|
|
|
} else { ret=-5; }
|
|
|
|
|
} else { ret=-6; }
|
|
|
|
|
} else { ret=-7; }
|
|
|
|
|
} else { ret=-8; }
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SysFile_UpdataSaveByte (SysFile_UpdataStruct *u,u8 byte)
|
|
|
|
|
{
|
|
|
|
|
if (u->buffUsed<UPDATA_BUFF_SIZE)
|
|
|
|
|
{
|
|
|
|
|
u->dataBuff[u->buffUsed]=byte;
|
|
|
|
|
u->buffUsed++;
|
|
|
|
|
if (u->buffUsed==UPDATA_BUFF_SIZE)
|
|
|
|
|
{
|
|
|
|
|
FLASH_WriteData(u->dataBuff,u->saveAddr,u->buffUsed);
|
|
|
|
|
u->saveAddr+=u->buffUsed;
|
|
|
|
|
u->buffUsed=0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD>ڴ<EFBFBD><DAB4>б<EFBFBD><D0B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SysFile_UpdataSaveByteMem (SysFile_UpdataStruct *u,u8 byte)
|
|
|
|
|
{
|
|
|
|
|
u8 *data=(u8 *)u->saveAddr;
|
|
|
|
|
data[u->buffUsed]=byte;
|
|
|
|
|
u->buffUsed++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int cmd_0x01_Mem (SysFile_UpdataStruct *u,u8 *data,int dataLen)
|
|
|
|
|
{
|
|
|
|
|
int ret=-1;
|
|
|
|
|
if (u->step==0x00)
|
|
|
|
|
{
|
|
|
|
|
if (data[0]==0x01)
|
|
|
|
|
{
|
|
|
|
|
mymemcpy (u->name,data+1,dataLen-1);
|
|
|
|
|
u->step=data[0];
|
|
|
|
|
ret=0;
|
|
|
|
|
} else { ret=-1; }
|
|
|
|
|
}
|
|
|
|
|
else if (u->step==0x01)
|
|
|
|
|
{
|
|
|
|
|
if (data[0]==0x02)
|
|
|
|
|
{
|
|
|
|
|
u->dataLen=((data[1]<<24)|(data[2]<<16)|(data[3]<<8)|data[4]);
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>÷<EFBFBD><C3B7><EFBFBD>ʧ<EFBFBD><CAA7>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if (u->saveAddr=(u32)mymalloc (u->dataLen),u->saveAddr)
|
|
|
|
|
{
|
|
|
|
|
u->buffUsed=0;
|
|
|
|
|
u->step=data[0];
|
|
|
|
|
ret=0;
|
|
|
|
|
}
|
|
|
|
|
else {ret=-1;}
|
|
|
|
|
} else { ret=-2; }
|
|
|
|
|
}
|
|
|
|
|
else if (u->step==0x02)
|
|
|
|
|
{
|
|
|
|
|
if (data[0]==0x03)
|
|
|
|
|
{
|
|
|
|
|
u->packet_all=(data[1]<<8)|data[2];
|
|
|
|
|
u->packet_now=0;
|
|
|
|
|
if (u->packet_now+1==((data[3]<<8)|data[4]) )
|
|
|
|
|
{
|
|
|
|
|
u->packet_now++;
|
|
|
|
|
for (int i=0;i<dataLen-5;i++)
|
|
|
|
|
SysFile_UpdataSaveByteMem (u,data[5+i]);
|
|
|
|
|
u->step=data[0]; ret=0;} else { ret=-3; }
|
|
|
|
|
} else { ret=-4; }
|
|
|
|
|
}
|
|
|
|
|
else if (u->step==0x03)
|
|
|
|
|
{
|
|
|
|
|
if (data[0]==0x03)
|
|
|
|
|
{
|
|
|
|
|
if (u->packet_all==((data[1]<<8)|data[2]))
|
|
|
|
|
{
|
|
|
|
|
if (u->packet_now+1==((data[3]<<8)|data[4]) )
|
|
|
|
|
{
|
|
|
|
|
u->packet_now++;
|
|
|
|
|
for (int i=0;i<dataLen-5;i++)
|
|
|
|
|
SysFile_UpdataSaveByteMem (u,data[5+i]);
|
|
|
|
|
if (u->packet_now==u->packet_all)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
u->step=0x04;
|
|
|
|
|
}
|
|
|
|
|
ret=0;
|
|
|
|
|
} else { ret=-5; }
|
|
|
|
|
} else { ret=-6; }
|
|
|
|
|
} else { ret=-7; }
|
|
|
|
|
} else { ret=-8; }
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><>ʼ<EFBFBD><CABC>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int SysFile_SendFileInit(SysFile_SendStruct *send,char *name,char *path,
|
|
|
|
|
int (*send_data)(void *data,int len),int (*progress)(int now,int all))
|
|
|
|
|
{
|
|
|
|
|
mymemset(send,0,sizeof(SysFile_SendStruct));
|
|
|
|
|
send->name=name;
|
|
|
|
|
send->path=path;
|
|
|
|
|
send->send_data=send_data;
|
|
|
|
|
send->progress=progress;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>,<2C><><EFBFBD><EFBFBD>0<EFBFBD>ɹ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int SysFile_SendFileName(SysFile_SendStruct *send)
|
|
|
|
|
{
|
|
|
|
|
int ret=0;
|
|
|
|
|
u8 *file_mem=mymalloc(SEND_FILE_PACK_MAXSIZE+10);
|
|
|
|
|
u8 *send_pack=mymalloc(SEND_FILE_PACK_MAXSIZE+20);
|
|
|
|
|
|
|
|
|
|
int len=strlen(send->name);
|
|
|
|
|
file_mem[0]=0x01;
|
|
|
|
|
mymemcpy(&file_mem[1],send->name,len);
|
|
|
|
|
int pack_len=SysFile_PackData(send_pack,file_mem,len+1);
|
|
|
|
|
if(send->send_data)ret=send->send_data(send_pack,pack_len);
|
|
|
|
|
else ret=-1;
|
|
|
|
|
myfree(file_mem);
|
|
|
|
|
myfree(send_pack);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ߴ<EFBFBD>,<2C><><EFBFBD><EFBFBD>0<EFBFBD>ɹ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int SysFile_SendFileInfo(SysFile_SendStruct *send)
|
|
|
|
|
{
|
|
|
|
|
int ret=0;
|
|
|
|
|
u8 *file_mem=mymalloc(SEND_FILE_PACK_MAXSIZE+10);
|
|
|
|
|
u8 *send_pack=mymalloc(SEND_FILE_PACK_MAXSIZE+20);
|
|
|
|
|
FILINFO *file_info=mymalloc(sizeof (FILINFO));
|
|
|
|
|
u8 err=f_stat (send->path,file_info);
|
|
|
|
|
int read_size=0;
|
|
|
|
|
UINT real_size=0;
|
|
|
|
|
if (err==FR_OK)
|
|
|
|
|
{
|
|
|
|
|
send->file_size=file_info->fsize;
|
|
|
|
|
file_mem[0]=0x02;
|
|
|
|
|
file_mem[1]=send->file_size>>24;
|
|
|
|
|
file_mem[2]=send->file_size>>16;
|
|
|
|
|
file_mem[3]=send->file_size>>8;
|
|
|
|
|
file_mem[4]=send->file_size>>0;
|
|
|
|
|
int pack_len=SysFile_PackData(send_pack,file_mem,4+1);
|
|
|
|
|
if(send->send_data) ret=send->send_data(send_pack,pack_len);
|
|
|
|
|
else ret=-1;
|
|
|
|
|
}
|
|
|
|
|
else ret=-1;
|
|
|
|
|
myfree(file_info);
|
|
|
|
|
myfree(file_mem);
|
|
|
|
|
myfree(send_pack);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>0<EFBFBD>ɹ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int SysFile_SendFileData(SysFile_SendStruct *send)
|
|
|
|
|
{
|
|
|
|
|
int ret;
|
|
|
|
|
u8 err=0;
|
|
|
|
|
FIL *file_fil=mymalloc (sizeof(FIL));
|
|
|
|
|
u8 *file_mem=mymalloc(SEND_FILE_PACK_MAXSIZE+10);
|
|
|
|
|
u8 *send_pack=mymalloc(SEND_FILE_PACK_MAXSIZE+20);
|
|
|
|
|
int read_size=0;
|
|
|
|
|
UINT real_size=0;
|
|
|
|
|
if (err==FR_OK)
|
|
|
|
|
{
|
|
|
|
|
send->size_left=send->file_size;
|
|
|
|
|
send->packet_all=send->file_size/SEND_FILE_PACK_MAXSIZE;
|
|
|
|
|
if(send->file_size%SEND_FILE_PACK_MAXSIZE)
|
|
|
|
|
send->packet_all++;
|
|
|
|
|
f_open(file_fil,send->path,FA_READ);
|
|
|
|
|
while(send->size_left)
|
|
|
|
|
{
|
|
|
|
|
if (send->size_left>SEND_FILE_PACK_MAXSIZE)
|
|
|
|
|
{
|
|
|
|
|
read_size=SEND_FILE_PACK_MAXSIZE;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
read_size=send->size_left;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
send->packet_now++;
|
|
|
|
|
file_mem[0]=0x03;
|
|
|
|
|
file_mem[1]=send->packet_all>>8;
|
|
|
|
|
file_mem[2]=send->packet_all;
|
|
|
|
|
file_mem[3]=send->packet_now>>8;
|
|
|
|
|
file_mem[4]=send->packet_now;
|
|
|
|
|
f_read (file_fil,file_mem+5,read_size,&real_size);
|
|
|
|
|
|
|
|
|
|
int pack_len=SysFile_PackData(send_pack,file_mem,real_size+5);
|
|
|
|
|
if(send->send_data) ret=send->send_data(send_pack,pack_len);
|
|
|
|
|
else ret=-1;
|
|
|
|
|
if(ret!=0) break;
|
|
|
|
|
if(send->progress) send->progress(send->packet_now,send->packet_all);
|
|
|
|
|
send->size_left-=read_size;
|
|
|
|
|
}
|
|
|
|
|
f_close(file_fil);
|
|
|
|
|
}
|
|
|
|
|
else ret=-1;
|
|
|
|
|
myfree(file_fil);
|
|
|
|
|
myfree(file_mem);
|
|
|
|
|
myfree(send_pack);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int SysFile_PackData(u8 *out,u8 *in,int in_size)
|
|
|
|
|
{
|
|
|
|
|
if(out==0||in==0) return 0;
|
|
|
|
|
if(in_size==0) return 0;
|
|
|
|
|
u8 crc[2]={0};
|
|
|
|
|
|
|
|
|
|
out[0]=0xff;
|
|
|
|
|
out[1]=0xff;
|
|
|
|
|
out[2]=(in_size+5)>>8;
|
|
|
|
|
out[3]=(in_size+5);
|
|
|
|
|
out[4]=0x01;
|
|
|
|
|
mymemcpy(&out[5],in,in_size);
|
|
|
|
|
Get_Crc16 (&out[2],in_size+3,crc);
|
|
|
|
|
out[5+in_size]=crc[0];
|
|
|
|
|
out[5+in_size+1]=crc[1];
|
|
|
|
|
return 5+in_size+2;
|
|
|
|
|
}
|
|
|
|
|
|