Полность реализована работа с упакованными разделами

master
forth32 8 years ago
parent d7c8edf962
commit 433e19c0c4

@ -1,8 +1,8 @@
CC = gcc
LIBS =
LIBS = -lz
#BUILDNO = `cat build`
BUILDNO=$(shell cat build)
CFLAGS = -O2 -Wno-unused-result -D BUILDNO=$(BUILDNO)
CFLAGS = -O2 -Wno-unused-result -D BUILDNO=$(BUILDNO) $(LIBS)
.PHONY: all clean
all: balong_flash

@ -21,6 +21,7 @@
#include "ptable.h"
#include "flasher.h"
#include "util.h"
#include "zlib.h"
unsigned char replybuf[4096];
// флаг ошибки структуры файла
@ -349,9 +350,13 @@ else findfiles(fdir);
//--------------------------------------------
if (mflag) {
printf("\n\n ## Смещение Размер Имя\n-------------------------------------");
for (i=0;i<npart;i++)
printf("\n %02i %08x %8i %s",i,ptable[i].offset,ptable[i].hd.psize,ptable[i].pname);
printf("\n\n ## Смещение Размер Сжатие Имя\n-------------------------------------");
for (i=0;i<npart;i++) {
printf("\n %02i %08x %8i",i,ptable[i].offset,ptable[i].hd.psize);
if (ptable[i].zflag == 0) printf(" ");
else printf(" %3i%% ",(ptable[i].hd.psize-ptable[i].zflag)*100/ptable[i].hd.psize);
printf("%s",ptable[i].pname);
}
printf("\n");
return;
}

@ -1 +1 @@
146
172

@ -10,6 +10,8 @@
#include "printf.h"
#endif
#include <zlib.h>
#include "ptable.h"
#include "hdlcio.h"
#include "util.h"
@ -157,7 +159,12 @@ void extract(FILE* in) {
uint16_t hcrc,crc;
uint16_t* crcblock;
uint32_t crcblocksize;
uint8_t* zbuf;
long unsigned int zlen;
int res;
ptable[npart].zflag=0;
// читаем заголовок в структуру
ptable[npart].offset=ftell(in);
fread(&ptable[npart].hd,1,sizeof(struct pheader),in); // заголовок
@ -197,6 +204,31 @@ else if (memcmp(crcblock,ptable[npart].csumblock,crcblocksize) != 0) {
}
free(crcblock);
// Определение zlib-сжатия
if ((*(uint16_t*)ptable[npart].pimage) == 0xda78) {
ptable[npart].zflag=ptable[npart].hd.psize; // сохраняем сжатый размер
zlen=52428800;
zbuf=malloc(zlen); // буфер в 50М
// распаковываем образ раздела
res=uncompress (zbuf, &zlen, ptable[npart].pimage, ptable[npart].hd.psize);
if (res != Z_OK) {
printf("\n! Ошибка распаковки раздела %s (%02x)\n",ptable[npart].pname,ptable[npart].hd.code>>16);
exit(0);
}
// создаем новый буфер образа раздела и копируем в него рапаковынные данные
free(ptable[npart].pimage);
ptable[npart].pimage=malloc(zlen);
memcpy(ptable[npart].pimage,zbuf,zlen);
ptable[npart].hd.psize=zlen;
free(zbuf);
// перерассчитываем контрольные суммы
calc_crc16(npart);
ptable[npart].hd.crc=crc16((uint8_t*)&ptable[npart].hd,sizeof(struct pheader));
}
// продвигаем счетчик разделов
npart++;
// отъезжаем немного назад

@ -22,7 +22,7 @@ struct ptb_t{
uint16_t* csumblock; // блок контрольных сумм
uint8_t* pimage; // образ раздела
uint32_t offset; // смещение в файле до начала раздела
uint32_t zflag; // признак сжатого раздела
};
int findparts(FILE* in);

Loading…
Cancel
Save