mirror of
https://git.zaage.it/robert/balong-flash
synced 2024-11-04 12:00:14 +00:00
Полность реализована работа с упакованными разделами
This commit is contained in:
parent
d7c8edf962
commit
433e19c0c4
4
Makefile
4
Makefile
@ -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;
|
||||
}
|
||||
|
32
ptable.c
32
ptable.c
@ -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++;
|
||||
// отъезжаем немного назад
|
||||
|
Loading…
Reference in New Issue
Block a user