diff --git a/balong_flash.c b/balong_flash.c index d6d16f9..12eda0f 100644 --- a/balong_flash.c +++ b/balong_flash.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -14,7 +15,132 @@ unsigned char replybuf[4096]; +// Цифровые подписи +unsigned char signhash[]="778A8D175E602B7B779D9E05C330B5279B0661BF2EED99A20445B366D63DD697"; // параметр 2 - hash + +struct { + uint8_t type; + uint32_t len; + char* descr; +} signbase[] = { + {1,2958,"Основная прошивка"}, + {1,2694,"Прошивка E3372s-stick"}, + {2,1110,"ISO для HLINK-модема"}, + {6,1110,"Вебинтерфейс+ISO"}, + {2,846,"ISO (dashboard) для stick-модема"}, +}; + +#define signbaselen 5 + +struct { + uint8_t code; + char* descr; +} fwtypes[]={ + {1,"ONLY_FW"}, + {2,"ONLY_ISO"}, + {3,"FW_ISO"}, + {4,"ONLY_WEBUI"}, + {5,"FW_WEBUI"}, + {6,"ISO_WEBUI"}, + {7,"FW_ISO_WEBUI"}, + {99,"COMPONENT_MAX"}, + {0,0} +}; + + +// результирующая строка ^signver - команды +static unsigned char signver[100]; +// Флаг режима цифровой подписи +int gflag=0; + +//**************************************************** +//* Получение описания типа прошивки по коду +//**************************************************** +char* fw_description(uint8_t code) { + +int i; +for (i=0; (fwtypes[i].code != 0); i++) { + if (code == fwtypes[i].code) return fwtypes[i].descr; +} +return 0; +} + +//**************************************************** +//* Получение списка параметров ключа -g +//**************************************************** +void glist() { + +int i; +printf("\n # длина тип описание \n--------------------------------------"); +for (i=0; i= signbaselen) goto perror; + signlen=signbase[index].len; + signtype=signbase[index].type; +} + +gflag=1; +sprintf(signver,"AT^SIGNVER=%i,0,778A8D175E602B7B779D9E05C330B5279B0661BF2EED99A20445B366D63DD697,%i",signtype,signlen); + +printf("\n Режим цифровой подписи: %s (%i байт)",fw_description(signtype),signlen); +// printf("\nstr - %s",signver); +return; + +perror: + printf("\n Ошибка в параметрах ключа -g\n"); + exit(0); +} + //**************************************************** //* Определение версии прошивальщика @@ -53,7 +179,7 @@ struct ptb_t ptable[100]; unsigned char buf[40960]; unsigned char devname[50]="/dev/ttyUSB0"; -unsigned char signver[]="^SIGNVER=1,0,778A8D175E602B7B779D9E05C330B5279B0661BF2EED99A20445B366D63DD697,2958"; + unsigned int err; unsigned char OKrsp[]={0x0d, 0x0a, 0x4f, 0x4b, 0x0d, 0x0a}; @@ -63,7 +189,6 @@ unsigned char SVrsp[]={0x0d, 0x0a, 0x30, 0x0d, 0x0a, 0x0d, 0x0a, 0x4f, 0x4b, 0x0 unsigned int dpattern=0xa55aaa55; unsigned int mflag=0,eflag=0,rflag=0,sflag=0,nflag=0; -int gflag=0; unsigned char filename [100]; unsigned char fdir[40]; // каталог для мультифайловой прошивки @@ -77,7 +202,7 @@ unsigned char cmd_dload_end[30]={0x43}; // команда конца ра // Коды типов разделов //-d - попытка переключить модем из режима HDLC в АТ-режим\n\ -while ((opt = getopt(argc, argv, "hp:mersng")) != -1) { +while ((opt = getopt(argc, argv, "hp:mersng:")) != -1) { switch (opt) { case 'h': @@ -86,7 +211,7 @@ printf("\n Утилита предназначена для прошивки м Допустимы следующие ключи:\n\n\ -p - последовательный порт для общения с загрузчиком (по умолчанию /dev/ttyUSB0)\n\ -n - режим мультифайловой прошивки из указанного каталога\n\ --g - прошивки в режиме цифровой подписи\n\ +-g# - установка режима цифровой подписи (-gl - описание параметров)\n\ -m - вывести карту файла прошивки и завершить работу\n\ -e - разобрать файл прошивки на разделы без заголовков\n\ -s - разобрать файл прошивки на разделы с заголовками\n\ @@ -119,7 +244,7 @@ printf("\n Утилита предназначена для прошивки м break; case 'g': - gflag=1; + gparm(optarg); break; case '?':