#include #include #include #include #include #include #include #include #include #include #include "hdlcio.h" //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void main(int argc, char* argv[]) { struct termios sioparm; unsigned int i,j,res,opt,npart=0,iolen,part,blk,blksize; FILE* in; FILE* out; struct { unsigned int offset; unsigned int size; unsigned int code; }ptable[100]; unsigned char buf[4096]; unsigned char devname[50]="/dev/ttyUSB0"; unsigned char replybuf[4096]; unsigned char datamodecmd[]="AT^DATAMODE"; unsigned char resetcmd[]="AT^RESET"; unsigned char OKrsp[]={0x0d, 0x0a, 0x4f, 0x4b, 0x0d, 0x0a}; unsigned int dpattern=0xa55aaa55; unsigned int mflag=0,eflag=0,rflag=0; unsigned char filename [100]; unsigned char cmdver[7]={0x0c}; // версия протокола unsigned char cmddone[7]={0x1}; // команда выхода из HDLC unsigned char cmd_reset[7]={0xa}; // команда выхода из HDLC unsigned char cmd_dload_init[15]={0x41}; // команда начала раздела unsigned char cmd_data_packet[11000]={0x42}; // команда начала пакета unsigned char cmd_dload_end[30]={0x43}; // команда конца раздела // Коды типов разделов struct { char name[20]; int code; } pcodes[]={ {"M3Boot",0x20000}, {"Ptable",0x10000}, {"Fastboot",0x110000}, {"Kernel",0x30000}, {"VxWorks",0x40000}, {"M3Image",0x50000}, {"DSP",0x60000}, {"NVRAM",0x70000}, {"System",0x590000}, {"APP",0x5a0000}, {"CD_WUI_VER",0xa0000}, {"CDROMISO",0xb0000}, {"WEBUI",0x5b0000}, {0,0} }; //-d - попытка переключить модем из режима HDLC в АТ-режим\n\ while ((opt = getopt(argc, argv, "hp:mer")) != -1) { switch (opt) { case 'h': printf("\n Утилита предназначена для аварийной USB-загрузки модемов E3372S\n\n\ %s [ключи] <имя файла для загрузки>\n\n\ Допустимы следующие ключи:\n\n\ -p - последовательный порт для общения с загрузчиком (по умолчанию /dev/ttyUSB0\n\ -m - вывести карту файла прошивки и завершить работу\n\ -e - разобрать файл прошивки на разделы и завершить работу\n\ -r - перезагрузить модем после прошивки\n\ \n",argv[0]); return; case 'p': strcpy(devname,optarg); break; case 'm': mflag=1; break; case 'r': rflag=1; break; case 'e': eflag=1; break; case '?': case ':': return; } } if (optind>=argc) { printf("\n - Не указано имя файла для загрузки\n"); return; } in=fopen(argv[optind],"r"); if (in == 0) { printf("\n Ошибка открытия %s",argv[optind]); return; } // Поиск разделов внутри файла printf("\n Разбираем файл прошвки..."); while (fread(&i,1,4,in) == 4) { if (i != dpattern) continue; // ищем разделитель ptable[npart].offset=ftell(in); // позиция начала раздела fread(buf,1,96,in); // заголовок ptable[npart].offset+=*((unsigned int*)&buf[0])-4; // выкидываем из смещения длину заголовка+КС ptable[npart].size=*((unsigned int*)&buf[20]); // размер раздела ptable[npart].code=*((unsigned int*)&buf[16]); // тип раздела npart++; } if (npart == 0) { printf("\nРазделы не найдены!"); return ; } printf(" найдено %i разделов",npart); //------ Режим вывода карты файла прошивки if (mflag) { printf("\n Таблица разделов, найденных в файле:\n\n ## Смещение Размер Имя\n-------------------------------------"); for (i=0;i