Files
player/Project/Src/MyApp/system_updata.c

561 lines
13 KiB
C
Raw Permalink Normal View History

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;
}