diff --git a/balong_flash.c b/balong_flash.c index d711da2..a58add7 100644 --- a/balong_flash.c +++ b/balong_flash.c @@ -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;i2) 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(); } diff --git a/build b/build index f84d24e..6c41245 100644 --- a/build +++ b/build @@ -1 +1 @@ -178 +189 diff --git a/hdlcio_linux.c b/hdlcio_linux.c index 247b8de..1b09208 100644 --- a/hdlcio_linux.c +++ b/hdlcio_linux.c @@ -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; } diff --git a/hdlcio_win32.c b/hdlcio_win32.c index 4dd368a..9740faf 100644 --- a/hdlcio_win32.c +++ b/hdlcio_win32.c @@ -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); diff --git a/signver.c b/signver.c index 6930cb0..071f512 100644 --- a/signver.c +++ b/signver.c @@ -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 ( (res2) printf("\n Идентификатор устройства: %s",replybuf+2); +} + + +//**************************************************** +//* Вывод карты файла прошивки +//**************************************************** +void show_file_map() { + +int i; + +printf("\n\n ## Смещение Размер Сжатие Имя\n-------------------------------------"); +for (i=0;i