OTA计划--OTA-HEX2BIN脚本压缩BIN-本地工程配合解压代码

PC是分块做的压缩

每4K压缩一次 压出来的结果是3000左右

我要对应的去加压 如下图

OTA计划--OTA-HEX2BIN脚本压缩BIN-本地工程配合解压代码_第1张图片

困难在于 我去读出来不方便!

换一个思路 把驱动的函数扩展出去 可以任意读!

以前做过表

OTA计划--OTA-HEX2BIN脚本压缩BIN-本地工程配合解压代码_第2张图片

 

做一个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

有个细节

OTA计划--OTA-HEX2BIN脚本压缩BIN-本地工程配合解压代码_第3张图片

你可能感兴趣的:(TOUCH-KING,C语言基础)