2016-09-30 11:15:56 +00:00
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdint.h>
|
2016-09-28 08:04:05 +00:00
|
|
|
|
#ifndef WIN32
|
2016-09-30 11:15:56 +00:00
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
#include <sys/stat.h>
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
#include <strings.h>
|
|
|
|
|
#include <termios.h>
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
#include <arpa/inet.h>
|
2016-09-28 08:04:05 +00:00
|
|
|
|
#else
|
|
|
|
|
#include <windows.h>
|
|
|
|
|
#include "getopt.h"
|
|
|
|
|
#include "printf.h"
|
2016-10-08 15:20:21 +00:00
|
|
|
|
#include "buildno.h"
|
2016-09-28 08:04:05 +00:00
|
|
|
|
#endif
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
|
|
|
|
#include "hdlcio.h"
|
|
|
|
|
#include "ptable.h"
|
2016-11-04 07:51:40 +00:00
|
|
|
|
#include "flasher.h"
|
|
|
|
|
#include "util.h"
|
2016-11-05 05:13:53 +00:00
|
|
|
|
#include "signver.h"
|
2016-11-04 10:40:24 +00:00
|
|
|
|
#include "zlib.h"
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
2016-11-04 08:25:50 +00:00
|
|
|
|
// флаг ошибки структуры файла
|
|
|
|
|
unsigned int errflag=0;
|
2016-11-04 12:01:50 +00:00
|
|
|
|
|
2016-11-05 05:13:53 +00:00
|
|
|
|
// флаг цифровой подписи
|
2016-11-04 12:01:50 +00:00
|
|
|
|
int gflag;
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
2016-11-04 07:51:40 +00:00
|
|
|
|
//***********************************************
|
|
|
|
|
//* Таблица разделов
|
|
|
|
|
//***********************************************
|
|
|
|
|
struct ptb_t ptable[120];
|
|
|
|
|
int npart=0; // число разделов в таблице
|
|
|
|
|
|
|
|
|
|
|
2016-09-30 11:15:56 +00:00
|
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
|
|
|
|
|
|
void main(int argc, char* argv[]) {
|
|
|
|
|
|
2016-11-05 05:13:53 +00:00
|
|
|
|
unsigned int opt;
|
2016-09-30 11:15:56 +00:00
|
|
|
|
int res;
|
|
|
|
|
FILE* in;
|
2016-09-28 08:04:05 +00:00
|
|
|
|
char devname[50] = "";
|
2016-11-04 08:25:50 +00:00
|
|
|
|
unsigned int mflag=0,eflag=0,rflag=0,sflag=0,nflag=0,kflag=0,fflag=0;
|
2016-09-30 11:15:56 +00:00
|
|
|
|
unsigned char fdir[40]; // каталог для мультифайловой прошивки
|
|
|
|
|
|
2016-11-05 05:13:53 +00:00
|
|
|
|
// разбор командной строки
|
2016-11-04 08:25:50 +00:00
|
|
|
|
while ((opt = getopt(argc, argv, "hp:mersng:kf")) != -1) {
|
2016-09-30 11:15:56 +00:00
|
|
|
|
switch (opt) {
|
|
|
|
|
case 'h':
|
|
|
|
|
|
|
|
|
|
printf("\n Утилита предназначена для прошивки модемов на чипсете Balong V7\n\n\
|
|
|
|
|
%s [ключи] <имя файла для загрузки или имя каталога с файлами>\n\n\
|
|
|
|
|
Допустимы следующие ключи:\n\n"
|
2016-09-28 08:04:05 +00:00
|
|
|
|
#ifndef WIN32
|
2016-09-30 11:15:56 +00:00
|
|
|
|
"-p <tty> - последовательный порт для общения с загрузчиком (по умолчанию /dev/ttyUSB0)\n"
|
2016-09-28 08:04:05 +00:00
|
|
|
|
#else
|
2016-09-30 11:15:56 +00:00
|
|
|
|
"-p <tty> - последовательный порт для общения с загрузчиком\n"
|
|
|
|
|
#endif
|
|
|
|
|
"-n - режим мультифайловой прошивки из указанного каталога\n\
|
|
|
|
|
-g# - установка режима цифровой подписи (-gl - описание параметров)\n\
|
|
|
|
|
-m - вывести карту файла прошивки и завершить работу\n\
|
|
|
|
|
-e - разобрать файл прошивки на разделы без заголовков\n\
|
|
|
|
|
-s - разобрать файл прошивки на разделы с заголовками\n\
|
2016-09-30 12:45:33 +00:00
|
|
|
|
-k - не перезагружать модем по окончании прошивки\n\
|
2016-09-30 11:15:56 +00:00
|
|
|
|
-r - принудительно перезагрузить модем без прошивки разделов\n\
|
2016-11-04 08:25:50 +00:00
|
|
|
|
-f - прошить даже при наличии ошибок CRC в исходном файле\n\
|
2016-09-30 11:15:56 +00:00
|
|
|
|
\n",argv[0]);
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
case 'p':
|
|
|
|
|
strcpy(devname,optarg);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'm':
|
|
|
|
|
mflag=1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'n':
|
|
|
|
|
nflag=1;
|
|
|
|
|
break;
|
|
|
|
|
|
2016-11-04 08:25:50 +00:00
|
|
|
|
case 'f':
|
|
|
|
|
fflag=1;
|
|
|
|
|
break;
|
|
|
|
|
|
2016-09-30 11:15:56 +00:00
|
|
|
|
case 'r':
|
|
|
|
|
rflag=1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'k':
|
|
|
|
|
kflag=1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'e':
|
|
|
|
|
eflag=1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 's':
|
|
|
|
|
sflag=1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'g':
|
|
|
|
|
gparm(optarg);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case '?':
|
|
|
|
|
case ':':
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-11-04 07:51:40 +00:00
|
|
|
|
printf("\n Программа для прошивки устройств на Balong-чипсете, V3.0.%i, (c) forth32, 2015, GNU GPLv3",BUILDNO);
|
2016-09-30 11:15:56 +00:00
|
|
|
|
#ifdef WIN32
|
|
|
|
|
printf("\n Порт для Windows 32bit (c) rust3028, 2016");
|
2016-09-28 08:04:05 +00:00
|
|
|
|
#endif
|
2016-10-07 04:20:59 +00:00
|
|
|
|
printf("\n--------------------------------------------------------------------------------------------------\n");
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
|
|
|
|
if (eflag&sflag) {
|
|
|
|
|
printf("\n Ключи -s и -e несовместимы\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (kflag&rflag) {
|
|
|
|
|
printf("\n Ключи -k и -r несовместимы\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (nflag&(eflag|sflag|mflag)) {
|
|
|
|
|
printf("\n Ключ -n несовместим с ключами -s, -m и -e\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ------ перезагрузка без указания файла
|
|
|
|
|
//--------------------------------------------
|
|
|
|
|
if ((optind>=argc)&rflag) goto sio;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Открытие входного файла
|
|
|
|
|
//--------------------------------------------
|
|
|
|
|
if (optind>=argc) {
|
|
|
|
|
if (nflag)
|
|
|
|
|
printf("\n - Не указан каталог с файлами\n");
|
|
|
|
|
else
|
2016-09-30 11:17:50 +00:00
|
|
|
|
printf("\n - Не указано имя файла для загрузки, используйте ключ -h для подсказки\n");
|
2016-09-30 11:15:56 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (nflag)
|
|
|
|
|
// для -n - просто копируем префикс
|
|
|
|
|
strncpy(fdir,argv[optind],39);
|
|
|
|
|
else {
|
|
|
|
|
// для однофайловых операций
|
|
|
|
|
in=fopen(argv[optind],"rb");
|
|
|
|
|
if (in == 0) {
|
|
|
|
|
printf("\n Ошибка открытия %s",argv[optind]);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Поиск разделов внутри файла
|
|
|
|
|
if (!nflag) {
|
2016-11-04 07:51:40 +00:00
|
|
|
|
findparts(in);
|
2016-11-07 04:40:17 +00:00
|
|
|
|
show_fw_info();
|
2016-09-30 11:15:56 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Поиск файлов прошивок в указанном каталоге
|
2016-11-04 07:51:40 +00:00
|
|
|
|
else findfiles(fdir);
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
|
|
|
|
//------ Режим вывода карты файла прошивки
|
2016-11-05 05:13:53 +00:00
|
|
|
|
if (mflag) show_file_map();
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
2016-11-04 08:25:50 +00:00
|
|
|
|
// выход по ошибкам CRC
|
|
|
|
|
if (!fflag && errflag) {
|
|
|
|
|
printf("\n\n! Входной файл содержит ошибки - завершаем работу\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
|
|
|
|
//------- Режим разрезания файла прошивки
|
|
|
|
|
if (eflag|sflag) {
|
2016-11-04 17:42:26 +00:00
|
|
|
|
fwsplit(sflag);
|
|
|
|
|
printf("\n");
|
|
|
|
|
return;
|
2016-09-30 11:15:56 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sio:
|
|
|
|
|
//--------- Основной режим - запись прошивки
|
|
|
|
|
//--------------------------------------------
|
|
|
|
|
|
|
|
|
|
// Настройка SIO
|
2016-11-05 05:13:53 +00:00
|
|
|
|
open_port(devname);
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
2016-11-05 05:13:53 +00:00
|
|
|
|
// Определяем режим порта и версию dload-протокола
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
|
|
|
|
res=dloadversion();
|
|
|
|
|
if (res == -1) return;
|
|
|
|
|
if (res == 0) {
|
|
|
|
|
printf("\n Модем уже находится в HDLC-режиме");
|
|
|
|
|
goto hdlc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Если надо, отправляем команду цифровой подписи
|
2016-11-05 05:13:53 +00:00
|
|
|
|
if (gflag) send_signver();
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
|
|
|
|
// Входим в HDLC-режим
|
|
|
|
|
|
|
|
|
|
usleep(100000);
|
2016-11-05 05:13:53 +00:00
|
|
|
|
enter_hdlc();
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
|
|
|
|
// Вошли в HDLC
|
|
|
|
|
//------------------------------
|
|
|
|
|
hdlc:
|
|
|
|
|
|
2016-11-05 05:13:53 +00:00
|
|
|
|
// получаем версию протокола и идентификатор устройства
|
|
|
|
|
protocol_version();
|
|
|
|
|
dev_ident();
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
|
|
|
|
|
2016-09-28 08:04:05 +00:00
|
|
|
|
printf("\n----------------------------------------------------\n");
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
2016-11-05 05:13:53 +00:00
|
|
|
|
if ((optind>=argc)&rflag) {
|
|
|
|
|
// перезагрузка без указания файла
|
|
|
|
|
restart_modem();
|
|
|
|
|
exit(0);
|
|
|
|
|
}
|
2016-09-30 11:15:56 +00:00
|
|
|
|
|
2016-11-04 07:51:40 +00:00
|
|
|
|
// Записываем всю флешку
|
|
|
|
|
flash_all();
|
2016-09-30 11:15:56 +00:00
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
|
|
port_timeout(1);
|
2016-11-04 17:42:26 +00:00
|
|
|
|
|
2016-09-30 11:15:56 +00:00
|
|
|
|
// выходим из режима HDLC и перезагружаемся
|
2016-11-05 05:13:53 +00:00
|
|
|
|
if (rflag || !kflag) restart_modem();
|
|
|
|
|
// выход из HDLC без перезагрузки
|
|
|
|
|
else leave_hdlc();
|
2016-09-30 11:15:56 +00:00
|
|
|
|
}
|