From d7c8edf96281b820cae0809d56ffd92e0a63f39c Mon Sep 17 00:00:00 2001 From: forth32 Date: Fri, 4 Nov 2016 11:25:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D1=81=D1=83=D0=BC=D0=BC=20=D0=B7=D0=B0=D0=B3=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B8=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- balong_flash.c | 24 ++++++++++++++++++------ build | 2 +- ptable.c | 8 ++++++-- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/balong_flash.c b/balong_flash.c index b34dd04..208a6f6 100644 --- a/balong_flash.c +++ b/balong_flash.c @@ -23,6 +23,8 @@ #include "util.h" unsigned char replybuf[4096]; +// флаг ошибки структуры файла +unsigned int errflag=0; //*********************************************** //* Таблица разделов @@ -204,7 +206,7 @@ unsigned char NAKrsp[]={0x03, 0x00, 0x02, 0xba, 0x0a, 0x7e}; unsigned char SVrsp[]={0x0d, 0x0a, 0x30, 0x0d, 0x0a, 0x0d, 0x0a, 0x4f, 0x4b, 0x0d, 0x0a}; unsigned int dpattern=0xa55aaa55; -unsigned int mflag=0,eflag=0,rflag=0,sflag=0,nflag=0,kflag=0; +unsigned int mflag=0,eflag=0,rflag=0,sflag=0,nflag=0,kflag=0,fflag=0; unsigned char filename [100]; unsigned char fdir[40]; // каталог для мультифайловой прошивки @@ -217,7 +219,7 @@ unsigned char cmd_getproduct[30]={0x45}; // Коды типов разделов //-d - попытка переключить модем из режима HDLC в АТ-режим\n\ -while ((opt = getopt(argc, argv, "hp:mersng:k")) != -1) { +while ((opt = getopt(argc, argv, "hp:mersng:kf")) != -1) { switch (opt) { case 'h': @@ -236,6 +238,7 @@ printf("\n Утилита предназначена для прошивки м -s - разобрать файл прошивки на разделы с заголовками\n\ -k - не перезагружать модем по окончании прошивки\n\ -r - принудительно перезагрузить модем без прошивки разделов\n\ +-f - прошить даже при наличии ошибок CRC в исходном файле\n\ \n",argv[0]); return; @@ -251,6 +254,10 @@ printf("\n Утилита предназначена для прошивки м nflag=1; break; + case 'f': + fflag=1; + break; + case 'r': rflag=1; break; @@ -349,6 +356,11 @@ if (mflag) { return; } +// выход по ошибкам CRC +if (!fflag && errflag) { + printf("\n\n! Входной файл содержит ошибки - завершаем работу\n"); + return; +} //------- Режим разрезания файла прошивки //-------------------------------------------- @@ -383,7 +395,7 @@ sio: #ifndef WIN32 if (!open_port(devname)) { - printf("\n - Последовательный порт %s не открывается\n", devname); + printf("\n! - Последовательный порт %s не открывается\n", devname); return; } @@ -393,17 +405,17 @@ tcflush(siofd,TCIOFLUSH); // очистка выходного буфера if (*devname == '\0') { - printf("\n - Последовательный порт не задан\n"); + printf("\n! - Последовательный порт не задан\n"); return; } res = open_port(devname); if (res == 0) { - printf("\n - Последовательный порт COM%s не открывается\n", devname); + printf("\n! - Последовательный порт COM%s не открывается\n", devname); return; } else if (res == -1) { - printf("\n - Ошибка при инициализации COM-порта\n"); + printf("\n! - Ошибка при инициализации COM-порта\n"); return; } diff --git a/build b/build index b4f334f..878d5a0 100644 --- a/build +++ b/build @@ -1 +1 @@ -141 +146 diff --git a/ptable.c b/ptable.c index 8d12ea9..ccd39db 100644 --- a/ptable.c +++ b/ptable.c @@ -20,6 +20,7 @@ extern struct ptb_t ptable[]; extern int npart; // число разделов в таблице +extern unsigned int errflag; //****************************************************** //* поиск символического имени раздела по его коду @@ -179,17 +180,20 @@ ptable[npart].hd.crc=0; // старая CRC в рассчете не учиты crc=crc16((uint8_t*)&ptable[npart].hd,sizeof(struct pheader)); if (crc != hcrc) { printf("\n! Раздел %s (%02x) - ошибка контрольной суммы заголовка",ptable[npart].pname,ptable[npart].hd.code>>16); + errflag=1; } ptable[npart].hd.crc=crc; // восстанавливаем CRC // вычисляем и проверяем CRC раздела calc_crc16(npart); if (crcblocksize != crcsize(npart)) { - printf("\nРаздел %s (%02x) - неправильный размер блока контрольных сумм",ptable[npart].pname,ptable[npart].hd.code>>16); + printf("\n! Раздел %s (%02x) - неправильный размер блока контрольных сумм",ptable[npart].pname,ptable[npart].hd.code>>16); + errflag=1; } else if (memcmp(crcblock,ptable[npart].csumblock,crcblocksize) != 0) { - printf("\nРаздел %s (%02x) - неправильная блочная контрольная сумма",ptable[npart].pname,ptable[npart].hd.code>>16); + printf("\n! Раздел %s (%02x) - неправильная блочная контрольная сумма",ptable[npart].pname,ptable[npart].hd.code>>16); + errflag=1; } free(crcblock);