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

pull/15/head
forth32 8 years ago
parent eaebd5d433
commit d7c8edf962

@ -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;
}

@ -1 +1 @@
141
146

@ -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);

Loading…
Cancel
Save