PC是分块做的压缩
每4K压缩一次 压出来的结果是3000左右
我要对应的去加压 如下图
困难在于 我去读出来不方便!
换一个思路 把驱动的函数扩展出去 可以任意读!
以前做过表
做一个W24Q64的读函数 它可以任意地址读【目前我是要求的page起始地址】 读出数据比4096小的数组
可能1--完成在一个PAGE内部搞定
可能2-需要跨越2个PAGE拼出来4096
void SPI_FLASH_BufferRead( uint32_t ReadAddr,uint8_t* pBuffer, uint16_t NumByteToRead)
void SPI_FLASH_BufferRead_RANG( uint32_t ReadAddr,uint8_t* pBuffer, uint16_t NumByteToRead)
{
uint32_t i,p1Addr,p2Addr,p1len,p2len,p1lenno,p2lenno;
uint8_t status=0;
static uint8_t buf[4096];
if(NumByteToRead>4096){printf("--------NOW NOT---------\r\n");return;}
for(i=0;i<2049;i++)//电子表格 一共有2049个PAGE
{
p1Addr = i*4096;
p2Addr = p1Addr + 4096;
if(ReadAddr==p1Addr){printf("--------RIGHT GOOG A PAGE---------\r\n");status=1;break;}
if( (ReadAddrp1Addr)){printf("-------NEED TWO PAGE-----\r\n");status=2;break;}
}
if(status==0){printf("---------FUCK---------\r\n");return;}
if(status==1)
{SPI_FLASH_BufferRead(ReadAddr,pBuffer,NumByteToRead);return;}
if(status==2)
{
p1lenno = ReadAddr - p1Addr;
p1len = 4096 - p1lenno;
if(NumByteToRead > p1len)
{
p2len = NumByteToRead - p1len;
p2lenno = 4096 - p2len;
SPI_FLASH_BufferRead(p1Addr,buf,4096);
memcpy(pBuffer, &buf[p1lenno], p1len);
SPI_FLASH_BufferRead(p2Addr,buf,4096);
memcpy(&pBuffer[p1len],buf, p2len);
printf("-----TWO READ OK[%d][%d][%d][%d]----\r\n",p1lenno,p1len,p2len,p2lenno);
}
else
{
SPI_FLASH_BufferRead(p1Addr,buf,4096);
memcpy(pBuffer, &buf[p1lenno], NumByteToRead);
printf("------ONE PAG OK-----\r\n");
}
}
}
有了这个就方便多了!
void LZmv_binfile_work(void)
{
ChipFlash_T *c = &ChipFlash;
G_SPIFlash_Type *s = &spiflash;
uint8_t write[4096] __attribute__ ((at(0x10005000)));
uint8_t read[4096] __attribute__ ((at(0x10006000)));
uint16_t lenmark[50],*plenmark=NULL;
uint8_t *pdata=NULL;
uint8_t totalcnt=0,i=0,page=0,j=0;
uint32_t addrpagefrom=0,addrpageto=0,x=0,reslen=0,goonlen=0,outlen=0;
i= 0;
memset(read,0,4096);
addrpagefrom = W24Q64_BACKUP_ADD+i*4096;
s->read (addrpagefrom,read,50*2);
plenmark = (uint16_t *)&read;
for(i=0;i<50;i++)
{
if(plenmark[i]==0)break;
printf("outlen=%d\r\n",plenmark[i]);
lenmark[i]=plenmark[i];
}
totalcnt = i;
printf("MAX SESIGN 50 NOW WE HAVE :%d\r\n",totalcnt);
//开始挨个解压
addrpagefrom = W24Q64_BACKUP_ADD+100;
for(i=0;iread (addrpagefrom,read,lenmark[i]);
outlen = fastlz_decompress(read, lenmark[i],write, 4096);
//printf("outlen=%d\r\n",outlen);
//G_printHEX(write,outlen);
printf("完成第[%2d]个4K\r\n",i);
addrpagefrom += lenmark[i];
///save///
addrpageto = STM32_APP_ADD+i*4096;//一次翻了2页
c->write(addrpageto, write, 2048 );
c->write(addrpageto+2048 ,&write[2048],2048 );
}
}
成功 !
我的设计是在前面有50个U16的数组 标识后面每个包的长度 也就是我的MAX是50个4K OTA的包不能超过200k
有个细节