Завершен вынос низкоуровневых процедур из main()

Восстановлена проверка CRC заголовка и тела разделов прошивки
pull/15/head
forth32 8 years ago
parent 8895932a97
commit 0e9399b0d7

@ -21,15 +21,14 @@
#include "ptable.h"
#include "flasher.h"
#include "util.h"
#include "signver.h"
#include "zlib.h"
unsigned char replybuf[4096];
// флаг ошибки структуры файла
unsigned int errflag=0;
void gparm(char* sparm);
// флаг цифровой подписи
int gflag;
uint8_t signver[200];
//***********************************************
//* Таблица разделов
@ -42,32 +41,14 @@ int npart=0; // число разделов в таблице
void main(int argc, char* argv[]) {
unsigned int i,opt,iolen;
unsigned int opt;
int res;
FILE* in;
#ifndef WIN32
unsigned char devname[50]="/dev/ttyUSB0";
#else
char devname[50] = "";
#endif
unsigned char OKrsp[]={0x0d, 0x0a, 0x4f, 0x4b, 0x0d, 0x0a};
// ответ на ^signver
unsigned char SVrsp[]={0x0d, 0x0a, 0x30, 0x0d, 0x0a, 0x0d, 0x0a, 0x4f, 0x4b, 0x0d, 0x0a};
unsigned int mflag=0,eflag=0,rflag=0,sflag=0,nflag=0,kflag=0,fflag=0;
unsigned char fdir[40]; // каталог для мультифайловой прошивки
unsigned char cmdver[7]={0x0c}; // версия протокола
unsigned char cmddone[7]={0x1}; // команда выхода из HDLC
unsigned char cmd_reset[7]={0xa}; // команда выхода из HDLC
unsigned char cmd_getproduct[30]={0x45};
// Коды типов разделов
//-d - попытка переключить модем из режима HDLC в АТ-режим\n\
// разбор командной строки
while ((opt = getopt(argc, argv, "hp:mersng:kf")) != -1) {
switch (opt) {
case 'h':
@ -192,22 +173,9 @@ if (!nflag) {
// Поиск файлов прошивок в указанном каталоге
else findfiles(fdir);
//------ Режим вывода карты файла прошивки
//--------------------------------------------
if (mflag) {
printf("\n\n ## Смещение Размер Сжатие Имя\n-------------------------------------");
for (i=0;i<npart;i++) {
printf("\n %02i %08x %8i",i,ptable[i].offset,ptable[i].hd.psize);
if (ptable[i].zflag == 0) printf(" ");
else printf(" %3i%% ",(ptable[i].hd.psize-ptable[i].zflag)*100/ptable[i].hd.psize);
printf("%s",ptable[i].pname);
}
printf("\n");
return;
}
if (mflag) show_file_map();
// выход по ошибкам CRC
if (!fflag && errflag) {
@ -216,48 +184,20 @@ if (!fflag && errflag) {
}
//------- Режим разрезания файла прошивки
//--------------------------------------------
if (eflag|sflag) {
fwsplit(sflag);
printf("\n");
return;
}
sio:
//--------- Основной режим - запись прошивки
//--------------------------------------------
// Настройка SIO
open_port(devname);
#ifndef WIN32
if (!open_port(devname)) {
printf("\n! - Последовательный порт %s не открывается\n", devname);
return;
}
tcflush(siofd,TCIOFLUSH); // очистка выходного буфера
#else
if (*devname == '\0')
{
printf("\n! - Последовательный порт не задан\n");
return;
}
res = open_port(devname);
if (res == 0) {
printf("\n! - Последовательный порт COM%s не открывается\n", devname);
return;
}
else if (res == -1) {
printf("\n! - Ошибка при инициализации COM-порта\n");
return;
}
#endif
// Определяем режим порта и версию dload-протокола
res=dloadversion();
if (res == -1) return;
@ -267,71 +207,38 @@ if (res == 0) {
}
// Если надо, отправляем команду цифровой подписи
if (gflag) {
res=atcmd(signver,replybuf);
if (memcmp(replybuf,SVrsp,sizeof(SVrsp)) != 0) {
printf("\n ! Ошибка проверки цифровой сигнатуры\n");
// return;
}
}
if (gflag) send_signver();
// Входим в HDLC-режим
usleep(100000);
res=atcmd("^DATAMODE",replybuf);
if (res != 6) {
printf("\n Неправильная длина ответа на ^DATAMODE");
return;
}
if (memcmp(replybuf,OKrsp,6) != 0) {
printf("\n Команда ^DATAMODE отвергнута, возможно требуется режим цифровой подписи\n");
return;
}
enter_hdlc();
// Вошли в HDLC
//------------------------------
hdlc:
iolen=send_cmd(cmdver,1,replybuf);
if (iolen == 0) {
printf("\n Нет ответа от модема в HDLC-режиме\n");
return;
}
if (replybuf[0] == 0x7e) memcpy(replybuf,replybuf+1,iolen-1);
if (replybuf[0] != 0x0d) {
printf("\n Ошибка получения версии протокола\n");
return;
}
i=replybuf[1];
replybuf[2+i]=0;
printf("ok");
printf("\n Версия протокола: %s",replybuf+2);
// получаем версию протокола и идентификатор устройства
protocol_version();
dev_ident();
iolen=send_cmd(cmd_getproduct,1,replybuf);
if (iolen>2) printf("\n Идентификатор устройства: %s",replybuf+2);
printf("\n----------------------------------------------------\n");
if ((optind>=argc)&rflag) goto reset; // перезагрузка без указания файла
if ((optind>=argc)&rflag) {
// перезагрузка без указания файла
restart_modem();
exit(0);
}
// Записываем всю флешку
flash_all();
printf("\n");
port_timeout(1);
// выходим из режима HDLC и перезагружаемся
reset:
if (rflag || !kflag) {
printf("\n Перезагрузка модема...\n");
send_cmd(cmd_reset,1,replybuf);
atcmd("^RESET",replybuf);
}
// выход из HDLC
else send_cmd(cmddone,1,replybuf);
if (rflag || !kflag) restart_modem();
// выход из HDLC без перезагрузки
else leave_hdlc();
}

@ -1 +1 @@
178
189

@ -173,7 +173,9 @@ int open_port(char* devname) {
int i,dflag=1;
char devstr[200]={0};
strcpy(pdev,devname); // сохраняем имя порта
if (strlen(devname) != 0) strcpy(pdev,devname); // сохраняем имя порта
else strcpy(devname,"/dev/ttyUSB0"); // если имя порта не было задано
// Вместо полного имени устройства разрешается передавать только номер ttyUSB-порта
@ -189,8 +191,10 @@ if (dflag) strcpy(devstr,"/dev/ttyUSB");
strcat(devstr,devname);
siofd = open(devstr, O_RDWR | O_NOCTTY |O_SYNC);
if (siofd == -1) return 0;
if (siofd == -1) {
printf("\n! - Последовательный порт %s не открывается\n", devname);
exit(0);
}
bzero(&sioparm, sizeof(sioparm)); // готовим блок атрибутов termios
sioparm.c_cflag = B115200 | CS8 | CLOCAL | CREAD ;
sioparm.c_iflag = 0; // INPCK;
@ -200,6 +204,7 @@ sioparm.c_cc[VTIME]=30; // timeout
sioparm.c_cc[VMIN]=0;
tcsetattr(siofd, TCSANOW, &sioparm);
tcflush(siofd,TCIOFLUSH); // очистка выходного буфера
return 1;
}

@ -165,6 +165,14 @@ int open_port(char* devname) {
char device[20] = "\\\\.\\COM";
if (*devname == '\0')
{
printf("\n! - Последовательный порт не задан\n");
exit(0);
}
DCB dcbSerialParams = {0};
COMMTIMEOUTS CommTimeouts;
@ -173,7 +181,8 @@ strcat(device, devname);
hSerial = CreateFileA(device, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hSerial == INVALID_HANDLE_VALUE)
{
return 0;
printf("\n! - Последовательный порт COM%s не открывается\n", devname);
exit(0);
}
ZeroMemory(&dcbSerialParams, sizeof(dcbSerialParams));
@ -188,6 +197,7 @@ dcbSerialParams.fRtsControl = RTS_CONTROL_ENABLE;
if (!SetCommState(hSerial, &dcbSerialParams))
{
CloseHandle(hSerial);
printf("\n! - Ошибка при инициализации COM-порта\n");
return -1;
}
@ -199,7 +209,7 @@ CommTimeouts.WriteTotalTimeoutMultiplier = 0;
if (!SetCommTimeouts(hSerial, &CommTimeouts))
{
CloseHandle(hSerial);
return -1;
exit(0);
}
PurgeComm(hSerial, PURGE_RXCLEAR);

@ -61,8 +61,9 @@ struct {
};
// результирующая строка ^signver - команды
extern unsigned char signver[];
// результирующая строка ^signver-команды
uint8_t signver[200];
// Флаг режима цифровой подписи
extern int gflag;
@ -152,3 +153,19 @@ perror:
exit(0);
}
//***************************************************
//* Отправка цифровой подписи
//***************************************************
void send_signver() {
uint32_t res;
// ответ на ^signver
unsigned char SVrsp[]={0x0d, 0x0a, 0x30, 0x0d, 0x0a, 0x0d, 0x0a, 0x4f, 0x4b, 0x0d, 0x0a};
uint8_t replybuf[200];
res=atcmd(signver,replybuf);
if ( (res<sizeof(SVrsp)) || (memcmp(replybuf,SVrsp,sizeof(SVrsp)) != 0) ) {
printf("\n ! Ошибка проверки цифровой сигнатуры - %02x\n",replybuf[2]);
}
}

109
util.c

@ -153,3 +153,112 @@ for (i=0;i<npart;i++) {
printf("\n");
return;
}
//****************************************************
//* Вход в HDLC-режим
//****************************************************
void enter_hdlc() {
uint32_t res;
unsigned char OKrsp[]={0x0d, 0x0a, 0x4f, 0x4b, 0x0d, 0x0a};
uint8_t replybuf[100];
usleep(100000);
res=atcmd("^DATAMODE",replybuf);
if (res != 6) {
printf("\n Неправильная длина ответа на ^DATAMODE");
exit(0);
}
if (memcmp(replybuf,OKrsp,6) != 0) {
printf("\n Команда ^DATAMODE отвергнута, возможно требуется режим цифровой подписи\n");
exit(0);
}
}
//****************************************************
//* Выход из HDLC-режима
//****************************************************
void leave_hdlc() {
uint8_t replybuf[100];
unsigned char cmddone[7]={0x1}; // команда выхода из HDLC
send_cmd(cmddone,1,replybuf);
}
//****************************************************
//* Получение версии протокол прошивки
//****************************************************
void protocol_version() {
uint8_t replybuf[100];
uint32_t iolen,i;
unsigned char cmdver[7]={0x0c}; // команда запроса версии протокола
iolen=send_cmd(cmdver,1,replybuf);
if (iolen == 0) {
printf("\n Нет ответа от модема в HDLC-режиме\n");
exit(0);
}
if (replybuf[0] == 0x7e) memcpy(replybuf,replybuf+1,iolen-1);
if (replybuf[0] != 0x0d) {
printf("\n Ошибка получения версии протокола\n");
exit(0);
}
i=replybuf[1];
replybuf[2+i]=0;
printf("\n Версия протокола: %s",replybuf+2);
}
//****************************************************
//* Перезагрузка модема
//****************************************************
void restart_modem() {
unsigned char cmd_reset[7]={0xa}; // команда выхода из HDLC
uint8_t replybuf[100];
printf("\n Перезагрузка модема...\n");
send_cmd(cmd_reset,1,replybuf);
atcmd("^RESET",replybuf);
}
//****************************************************
//* Получение идентификатора устройства
//****************************************************
void dev_ident() {
uint8_t replybuf[100];
uint32_t iolen;
unsigned char cmd_getproduct[30]={0x45};
iolen=send_cmd(cmd_getproduct,1,replybuf);
if (iolen>2) printf("\n Идентификатор устройства: %s",replybuf+2);
}
//****************************************************
//* Вывод карты файла прошивки
//****************************************************
void show_file_map() {
int i;
printf("\n\n ## Смещение Размер Сжатие Имя\n-------------------------------------");
for (i=0;i<npart;i++) {
printf("\n %02i %08x %8i",i,ptable[i].offset,ptable[i].hd.psize);
if (ptable[i].zflag == 0) printf(" ");
else printf(" %3i%% ",(ptable[i].hd.psize-ptable[i].zflag)*100/ptable[i].hd.psize);
printf("%s",ptable[i].pname);
}
printf("\n");
exit(0);
}

@ -3,4 +3,10 @@ void dump(char buffer[],int len,long base);
unsigned short crc16(char* buf, int len);
int dloadversion();
void fwsplit(uint32_t sflag);
void enter_hdlc();
void protocol_version();
void leave_hdlc();
void restart_modem();
void dev_ident();
void show_file_map();

Loading…
Cancel
Save