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