diff --git a/Makefile b/Makefile index 2a0dbdf..02c5b69 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) $(LIBS) .PHONY: all clean all: balong_flash diff --git a/balong_flash.c b/balong_flash.c index 8788397..522c895 100644 --- a/balong_flash.c +++ b/balong_flash.c @@ -29,9 +29,11 @@ unsigned int errflag=0; // флаг цифровой подписи int gflag=0; +// флаг типа прошивки +int dflag=0; // тип прошивки из заголовка файла -int dload_id; +int dload_id=-1; //*********************************************** //* Таблица разделов @@ -52,7 +54,7 @@ unsigned int mflag=0,eflag=0,rflag=0,sflag=0,nflag=0,kflag=0,fflag=0; unsigned char fdir[40]; // каталог для мультифайловой прошивки // разбор командной строки -while ((opt = getopt(argc, argv, "hp:mersng:kf")) != -1) { +while ((opt = getopt(argc, argv, "d:hp:mersng:kf")) != -1) { switch (opt) { case 'h': @@ -74,6 +76,7 @@ printf("\n Утилита предназначена для прошивки м -k - не перезагружать модем по окончании прошивки\n\ -r - принудительно перезагрузить модем без прошивки разделов\n\ -f - прошить даже при наличии ошибок CRC в исходном файле\n\ +-d# - установка типа прошивки (DLOAD_ID, 0..7), -dl - список типов\n\ \n",argv[0]); return 0; @@ -113,6 +116,10 @@ printf("\n Утилита предназначена для прошивки м gparm(optarg); break; + case 'd': + dparm(optarg); + break; + case '?': case ':': return -1; diff --git a/build b/build index 71d936f..997def4 100644 --- a/build +++ b/build @@ -1 +1 @@ -231 +237 diff --git a/ptable.c b/ptable.c index aabf46d..af81b5c 100644 --- a/ptable.c +++ b/ptable.c @@ -247,6 +247,7 @@ int findparts(FILE* in) { // буфер префикса BIN-файла uint8_t prefix[0x5c]; int32_t signsize; +int32_t hd_dload_id; // Маркер начала заголовка раздела const unsigned int dpattern=0xa55aaa55; @@ -270,12 +271,14 @@ fseek(in,-0x60,SEEK_CUR); // отъезжаем на начало BIN-файла // вынимаем префикс fread(prefix,0x5c,1,in); -dload_id=*((uint32_t*)&prefix[0]); +hd_dload_id=*((uint32_t*)&prefix[0]); +// если принудительно dload_id не установлен - выбираем его из заголовка +if (dload_id == -1) dload_id=hd_dload_id; if (dload_id > 0xf) { printf("\n Неверный код типа прошивки (dload_id) в заголовке - %x",dload_id); exit(0); } -printf("\n Код файла прошивки: %x (%s)",dload_id,fw_description(dload_id)); +printf("\n Код файла прошивки: %x (%s)",hd_dload_id,fw_description(hd_dload_id)); // поиск остальных разделов diff --git a/signver.c b/signver.c index 8aeb117..af82bff 100644 --- a/signver.c +++ b/signver.c @@ -63,6 +63,9 @@ uint8_t signver[200]; // Флаг режима цифровой подписи extern int gflag; +// Флаг типа прошивки +extern int dflag; + // Параметры текущей цифровой подписи uint32_t signtype; // тип прошивки uint32_t signlen; // длина подписи @@ -77,6 +80,44 @@ char* fw_description(uint8_t code) { return fwtypes[code&0x7]; } +//**************************************************** +//* Получение списка типов прошивок +//**************************************************** +void dlist() { + +int i; + +printf("\n # Описание\n--------------------------------------"); +for(i=1;i<8;i++) { + printf("\n %i %s",i,fw_description(i)); +} +printf("\n\n"); +exit(0); +} + +//*************************************************** +//* Обработка параметров ключа -d +//*************************************************** +void dparm(char* sparm) { + +if (dflag != 0) { + printf("\n Дублирующийся ключ -d\n\n"); + exit(-1); +} + +if (sparm[0] == 'l') { + dlist(); + exit(0); +} +sscanf(sparm,"%x",&dload_id); +if ((dload_id == 0) || (dload_id >7)) { + printf("\n Неправильное значение ключа -d\n\n"); + exit(-1); +} +dflag=1; +} + + //**************************************************** //* Получение списка параметров ключа -g //**************************************************** diff --git a/signver.h b/signver.h index a0dd8e8..df4c427 100644 --- a/signver.h +++ b/signver.h @@ -1,5 +1,6 @@ void glist(); void gparm(char* sparm); +void dparm(char* sparm); void send_signver(); char* fw_description(uint8_t code); int32_t serach_sign();