diff --git a/Makefile b/Makefile index 02c5b69..805b085 100755 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ CC = gcc LIBS = -lz #BUILDNO = `cat build` BUILDNO=$(shell cat build) -CFLAGS = -O2 -Wunused -Wno-unused-result -D BUILDNO=$(BUILDNO) $(LIBS) +CFLAGS = -O2 -Wunused -Wno-unused-result -D BUILDNO=$(BUILDNO) -D_7ZIP_ST $(LIBS) .PHONY: all clean all: balong_flash @@ -11,7 +11,7 @@ clean: rm *.o rm balong_flash -balong_flash: balong_flash.o hdlcio_linux.o ptable.o flasher.o util.o signver.o +balong_flash: balong_flash.o hdlcio_linux.o ptable.o flasher.o util.o signver.o lzma/Alloc.o lzma/LzmaDec.o @gcc $^ -o $@ $(LIBS) @echo Current buid: $(BUILDNO) @echo $$((`cat build`+1)) >build diff --git a/build b/build index 9183bf0..2681747 100644 --- a/build +++ b/build @@ -1 +1 @@ -256 +277 diff --git a/ptable.c b/ptable.c index b7dd443..ff0b7e1 100644 --- a/ptable.c +++ b/ptable.c @@ -17,6 +17,8 @@ #include "util.h" #include "signver.h" +int32_t lzma_decode(uint8_t* inbuf,uint32_t fsize,uint8_t* outbuf); + //****************************************************** //* поиск символического имени раздела по его коду //****************************************************** @@ -160,10 +162,9 @@ uint16_t hcrc,crc; uint16_t* crcblock; uint32_t crcblocksize; uint8_t* zbuf; -long unsigned int zlen; +long int zlen; int res; - ptable[npart].zflag=0; // читаем заголовок в структуру ptable[npart].offset=ftell(in); @@ -205,8 +206,11 @@ else if (memcmp(crcblock,ptable[npart].csumblock,crcblocksize) != 0) { free(crcblock); + +ptable[npart].ztype=' '; // Определение zlib-сжатия + if ((*(uint16_t*)ptable[npart].pimage) == 0xda78) { ptable[npart].zflag=ptable[npart].hd.psize; // сохраняем сжатый размер zlen=52428800; @@ -226,9 +230,38 @@ if ((*(uint16_t*)ptable[npart].pimage) == 0xda78) { // перерассчитываем контрольные суммы calc_crc16(npart); ptable[npart].hd.crc=crc16((uint8_t*)&ptable[npart].hd,sizeof(struct pheader)); + ptable[npart].ztype='Z'; } - +// Определение lzma-сжатия + +if ((ptable[npart].pimage[0] == 0x5d) && (*(uint64_t*)(ptable[npart].pimage+5) == 0xffffffffffffffff)) { + ptable[npart].zflag=ptable[npart].hd.psize; // сохраняем сжатый размер + zlen=52428800; + zbuf=malloc(zlen); // буфер в 50М + // распаковываем образ раздела + zlen=lzma_decode(ptable[npart].pimage, ptable[npart].hd.psize, zbuf); + if (zlen>52428800) { + printf("\n Превышен размер буфера\n"); + exit(1); + } + if (res == -1) { + printf("\n! Ошибка распаковки раздела %s (%02x)\n",ptable[npart].pname,ptable[npart].hd.code>>16); + errflag=1; + } + // создаем новый буфер образа раздела и копируем в него рапаковынные данные + 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)); + ptable[npart].ztype='L'; +} + + // продвигаем счетчик разделов npart++; @@ -254,6 +287,7 @@ int32_t hd_dload_id; const unsigned int dpattern=0xa55aaa55; unsigned int i; + // поиск начала цепочки разделов в файле while (fread(&i,1,4,in) == 4) { if (i == dpattern) break; @@ -279,16 +313,18 @@ if (dload_id > 0xf) { printf("\n Неверный код типа прошивки (dload_id) в заголовке - %x",dload_id); exit(0); } -printf("\n Код файла прошивки: %x (%s)",hd_dload_id,fw_description(hd_dload_id)); +printf("\n Код файла прошивки: %x (%s)\n",hd_dload_id,fw_description(hd_dload_id)); // поиск остальных разделов do { + printf("\r Поиск раздела # %i",npart); fflush(stdout); if (fread(&i,1,4,in) != 4) break; // конец файла if (i != dpattern) break; // образец не найден - конец цепочки разделов fseek(in,-4,SEEK_CUR); // отъезжаем назад, на начало заголовка extract(in); // извлекаем раздел } while(1); +printf("\r \r"); // ищем цифровую подпись signsize=serach_sign(); diff --git a/ptable.h b/ptable.h index e714c59..e6f6c3f 100644 --- a/ptable.h +++ b/ptable.h @@ -33,6 +33,7 @@ struct ptb_t{ uint8_t* pimage; // образ раздела uint32_t offset; // смещение в файле до начала раздела uint32_t zflag; // признак сжатого раздела + uint8_t ztype; // тип сжатия }; //****************************************************** diff --git a/util.c b/util.c index 97a03ff..c7f7b9f 100644 --- a/util.c +++ b/util.c @@ -252,12 +252,25 @@ void show_file_map() { int i; -printf("\n\n ## Смещение Размер Сжатие Имя\n-------------------------------------"); +printf("\n\n ## Смещение Размер Сжатие Имя\n-----------------------------------------------"); for (i=0;i