From 642d4b1c106919e632e5a8b748dd9adef57f20ea Mon Sep 17 00:00:00 2001 From: forth32 Date: Sun, 25 Sep 2016 19:37:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D1=81=20?= =?UTF-8?q?=D1=84=D0=BB=D0=B0=D0=B3=D0=B0=D0=BC=D0=B8=20=D1=82=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D1=86=D1=8B=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 4 +- balong-usbdload.c | 232 +++++++++++++++++++++++++++------------------- parts.c | 73 +++++++++++++++ parts.h | 29 ++++++ ptable-injector.c | 75 +-------------- 5 files changed, 242 insertions(+), 171 deletions(-) create mode 100644 parts.c create mode 100644 parts.h diff --git a/Makefile b/Makefile index 1d72d5a..301a070 100755 --- a/Makefile +++ b/Makefile @@ -15,10 +15,10 @@ clean: #.c.o: # $(CC) -o $@ $(LIBS) $^ qcio.o -balong-usbdload: balong-usbdload.o +balong-usbdload: balong-usbdload.o parts.o @gcc $^ -o $@ $(LIBS) -ptable-injector: ptable-injector.o +ptable-injector: ptable-injector.o parts.o @gcc $^ -o $@ $(LIBS) loader-patch: loader-patch.o diff --git a/balong-usbdload.c b/balong-usbdload.c index aa72b28..a94e3ad 100644 --- a/balong-usbdload.c +++ b/balong-usbdload.c @@ -21,6 +21,8 @@ #include "printf.h" #endif +#include "parts.h" + #ifndef WIN32 int siofd; @@ -202,20 +204,6 @@ for(off=(size-8);off>0;off--) { return 0; } -//********************************************* -//* Поиск таблицы разделов в загрузчике -//********************************************* -uint32_t find_ptable(char* buf, uint32_t size) { - -// сигнатура заголовка таблицы -const uint8_t headmagic[16]={0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80}; -uint32_t off; - -for(off=0;off<(size-16);off+=4) { - if (memcmp(buf+off,headmagic,16) == 0) return off; -} -return 0; -} //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -223,10 +211,9 @@ return 0; void main(int argc, char* argv[]) { unsigned int i,res,opt,datasize,pktcount,adr; -int nblk; // число блоков для загрузки int bl; // текущий блок unsigned char c; -int fbflag=0, tflag=0; +int fbflag=0, tflag=0, mflag=0; int koff; // смещение до ANDROID-заголовка char ptfile[100]; @@ -234,18 +221,23 @@ FILE* pt; char ptbuf[2048]; uint32_t ptoff; +struct ptable_t* ptable; + unsigned char cmdhead[14]={0xfe,0, 0xff}; unsigned char cmddata[1040]={0xda,0,0}; unsigned char cmdeod[5]={0xed,0,0,0,0}; +// список разделов, которым нужно установить файловый флаг +uint8_t fileflag[41]; + struct { int lmode; // режим загрузки: 1 - прямой старт, 2 - через перезапуск A-core - int size; // размер блока - int adr; // адрес загрузки блока в память - int offset; // смещение до блока от начала файла + int size; // размер компонента + int adr; // адрес загрузки компонента в память + int offset; // смещение до компонента от начала файла + char* pbuf; // буфер для загрузки образа компонента } blk[10]; -char* pbuf; // буфер для загрузки образа раздела #ifndef WIN32 unsigned char devname[50]="/dev/ttyUSB0"; @@ -254,11 +246,13 @@ char devname[50]=""; DWORD bytes_written, bytes_read; #endif -while ((opt = getopt(argc, argv, "hp:ft:")) != -1) { +bzero(fileflag,sizeof(fileflag)); + +while ((opt = getopt(argc, argv, "hp:ft:ms:")) != -1) { switch (opt) { case 'h': -printf("\n Утилита предназначена для аварийной USB-загрузки модемов E3372S\n\n\ +printf("\n Утилита предназначена для аварийной USB-загрузки устройств на чипете Balong V7\n\n\ %s [ключи] <имя файла для загрузки>\n\n\ Допустимы следующие ключи:\n\n\ -p - последовательный порт для общения с загрузчиком (по умолчанию /dev/ttyUSB0\n\ @@ -277,10 +271,23 @@ printf("\n Утилита предназначена для аварийной U fbflag=1; break; + case 'm': + mflag=1; + break; + case 't': tflag=1; strcpy(ptfile,optarg); break; + + case 's': + i=atoi(optarg); + if (i>41) { + printf("\n Раздела #%i не существует\n",i); + return; + } + fileflag[i]=1; + break; case '?': case ':': @@ -289,22 +296,15 @@ printf("\n Утилита предназначена для аварийной U } } -if (optind>=argc) { - printf("\n - Не указано имя файла для загрузки\n"); - return; -} - +printf("\n Аварийный USB-загрузчик Balong-чипсета, версия 2.01, (c) forth32, 2015"); #ifdef WIN32 -if (*devname == '\0') -{ - printf("\n - Последовательный порт не задан\n"); - return; -} +printf("\n Порт для Windows 32bit (c) rust3028, 2016"); #endif -if (!open_port(devname)) { - printf("\n Последовательный порт не открывается\n"); - return; + +if (optind>=argc) { + printf("\n - Не указано имя файла для загрузки\n"); + return; } ldr=fopen(argv[optind],"rb"); @@ -324,81 +324,127 @@ fseek(ldr,36,SEEK_SET); // начало описателей блоков для // Разбираем заголовок -for(nblk=0;nblk<10;nblk++) { - fread(&blk[nblk].lmode,1,4,ldr); - fread(&blk[nblk].size,1,4,ldr); - fread(&blk[nblk].adr,1,4,ldr); - fread(&blk[nblk].offset,1,4,ldr); - if (blk[nblk].lmode == 0) break; -} -printf("\n Найдено %i блоков для загрузки",nblk); - -// Проверяем загрузочный порт -c=0; -#ifndef WIN32 -write(siofd,"A",1); -res=read(siofd,&c,1); -#else - WriteFile(hSerial, "A", 1, &bytes_written, NULL); - FlushFileBuffers(hSerial); - Sleep(100); - ReadFile(hSerial, &c, 1, &bytes_read, NULL); -#endif -if (c != 0x55) { - printf("\n ! Порт не находится в режиме USB Boot\n"); - return; -} - -// главный цикл загрузки - загружаем все блоки, найденные в заголовке - -for(bl=0;blpart[i].nproperty |= 1; + } + } + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + // Вывод таблицы разделов + if (mflag) { if (ptoff == 0) { - printf("\n В загрузчике не найдена таблица разделов - замена невозможна"); + printf("\n Таблица разделов не найдена - вывод карты невозможен\n"); + return; } - else memcpy(pbuf+ptoff,ptbuf,2048); + show_map(*ptable); + return; } +} + +//--------------------------------------------------------------------- + +#ifdef WIN32 +if (*devname == '\0') +{ + printf("\n - Последовательный порт не задан\n"); + return; +} +#endif + +if (!open_port(devname)) { + printf("\n Последовательный порт не открывается\n"); + return; +} + + +// Проверяем загрузочный порт +c=0; +#ifndef WIN32 +write(siofd,"A",1); +res=read(siofd,&c,1); +#else + WriteFile(hSerial, "A", 1, &bytes_written, NULL); + FlushFileBuffers(hSerial); + Sleep(100); + ReadFile(hSerial, &c, 1, &bytes_read, NULL); +#endif +if (c != 0x55) { + printf("\n ! Порт не находится в режиме USB Boot\n"); + return; +} + +//---------------------------------- +// главный цикл загрузки - загружаем все блоки, найденные в заголовке //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -np: - printf("\n Загрузка блока %i, адрес=%08x, размер=%i\n",bl,blk[bl].adr,blk[bl].size); +printf("\n\n Компонент Адрес Размер %%загрузки\n------------------------------------------\n"); + +for(bl=0;bl<2;bl++) { + + datasize=1024; + pktcount=1; + + // фрмируем пакет начала блока *((unsigned int*)&cmdhead[4])=htonl(blk[bl].size); *((unsigned int*)&cmdhead[8])=htonl(blk[bl].adr); @@ -407,44 +453,40 @@ np: // отправляем пакет начала блока res=sendcmd(cmdhead,14); if (!res) { - printf("\nМодем отверг пакет заголовка\nОбраз пакета:"); - dump(cmdhead,14); + printf("\nМодем отверг пакет заголовка\n"); return; } // ---------- Цикл поблочной загрузки данных --------------------- for(adr=0;adr=blk[bl].size) datasize=blk[bl].size-adr; -#ifndef WIN32 - fprintf(stderr,"\r Адрес: %08x, пакет# %i размер: %i",blk[bl].adr+adr,pktcount,datasize); -#else - printf("\r Адрес: %08x, пакет# %i размер: %i",blk[bl].adr+adr,pktcount,datasize); -#endif + printf("\r %s %08x %8i %i%%",bl?"usbboot":"raminit",blk[bl].adr,blk[bl].size,(adr+datasize)*100/blk[bl].size); // готовим пакет данных cmddata[1]=pktcount; cmddata[2]=(~pktcount)&0xff; - memcpy(cmddata+3,pbuf+adr,datasize); + memcpy(cmddata+3,blk[bl].pbuf+adr,datasize); pktcount++; if (!sendcmd(cmddata,datasize+5)) { - printf("\nМодем отверг пакет данных\nОбраз пакета:"); - dump(cmddata,datasize+5); + printf("\nМодем отверг пакет данных"); return; } } - free(pbuf); + free(blk[bl].pbuf); // Фрмируем пакет конца данных cmdeod[1]=pktcount; cmdeod[2]=(~pktcount)&0xff; if (!sendcmd(cmdeod,5)) { - printf("\nМодем отверг пакет конца данных\nОбраз пакета:"); - dump(cmdeod,5); - } + printf("\nМодем отверг пакет конца данных"); + } +printf("\n"); } printf("\n Загрузка окончена\n"); } diff --git a/parts.c b/parts.c new file mode 100644 index 0000000..70a0af4 --- /dev/null +++ b/parts.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include +#include "parts.h" + +// сигнатура заголовка таблицы +const uint8_t headmagic[16]={0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80}; + +//********************************************* +//* Поиск таблицы разделов в загрузчике +//********************************************* +uint32_t find_ptable(FILE* ldr) { + +uint8_t rbuf[16]; +while (fread(rbuf,1,16,ldr) == 16) { + if (memcmp(rbuf,headmagic,16) == 0) { + fseek(ldr,-16,SEEK_CUR); + return ftell(ldr); + } + fseek(ldr,-12,SEEK_CUR); +} +return 0; +} + +//********************************************* +//* Печать таблицы разделов +//********************************************* +void show_map(struct ptable_t ptable) { + +int pnum; + +printf("\n Версия таблицы разделов: %16.16s",ptable.version); +printf("\n Версия прошивки: %16.16s\n",ptable.product); + +printf("\n ## ----- NAME ----- start len loadsize loadaddr entry flags type count\n------------------------------------------------------------------------------------------"); + +for(pnum=0; + (ptable.part[pnum].name[0] != 0) && + (strcmp(ptable.part[pnum].name,"T") != 0); + pnum++) { + + printf("\n %02i %-16.16s %4x %4x %08x %08x %08x %08x %08x %08x", + pnum, + ptable.part[pnum].name, + ptable.part[pnum].start/0x20000, + ptable.part[pnum].length/0x20000, + ptable.part[pnum].lsize, + ptable.part[pnum].loadaddr, + ptable.part[pnum].entry, + ptable.part[pnum].nproperty, + ptable.part[pnum].type, + ptable.part[pnum].count); +} +printf("\n"); + +} + +//********************************************* +//* Поиск таблицы разделов в памяти +//********************************************* +uint32_t find_ptable_ram(char* buf, uint32_t size) { + +// сигнатура заголовка таблицы +uint32_t off; + +for(off=0;off<(size-16);off+=4) { + if (memcmp(buf+off,headmagic,16) == 0) return off; +} +return 0; +} + diff --git a/parts.h b/parts.h new file mode 100644 index 0000000..7a6db38 --- /dev/null +++ b/parts.h @@ -0,0 +1,29 @@ + +// Структура описателя раздела +struct ptable_line{ + char name[16]; + unsigned start; + unsigned lsize; + unsigned length; + unsigned loadaddr; + unsigned entry; + unsigned type; + unsigned nproperty; // флаги раздела + unsigned count; +}; + +// Полная структура страницы таблицы разделов +struct ptable_t { + uint8_t head[16]; + uint8_t version[16]; + uint8_t product[16]; + struct ptable_line part[41]; + uint8_t tail[32]; +}; + +// сигнатура заголовка таблицы +extern const uint8_t headmagic[16]; + +uint32_t find_ptable(FILE* ldr); +uint32_t find_ptable_ram(char* buf, uint32_t size); +void show_map(struct ptable_t ptable); diff --git a/ptable-injector.c b/ptable-injector.c index c694b55..ae7ba39 100644 --- a/ptable-injector.c +++ b/ptable-injector.c @@ -6,80 +6,7 @@ #include #include #include - -// сигнатура заголовка таблицы -const uint8_t headmagic[16]={0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80}; - -// Структура описателя раздела -struct ptable_line{ - char name[16]; - unsigned start; - unsigned lsize; - unsigned length; - unsigned type; - unsigned loadaddr; - unsigned nproperty; // флаги раздела - unsigned entry; - unsigned count; -}; - -// Полная структура страницы таблицы разделов -struct ptable_t { - uint8_t head[16]; - uint8_t version[16]; - uint8_t product[16]; - struct ptable_line part[41]; - uint8_t tail[32]; -}; - -//********************************************* -//* Поиск таблицы разделов в загрузчике -//********************************************* -uint32_t find_ptable(FILE* ldr) { - -uint8_t rbuf[16]; -while (fread(rbuf,1,16,ldr) == 16) { - if (memcmp(rbuf,headmagic,16) == 0) { - fseek(ldr,-16,SEEK_CUR); - return ftell(ldr); - } - fseek(ldr,-12,SEEK_CUR); -} -return 0; -} - -//********************************************* -//* Печать таблицы разделов -//********************************************* -void show_map(struct ptable_t ptable) { - -int pnum; - -printf("\n Версия таблицы разделов: %16.16s",ptable.version); -printf("\n Версия прошивки: %16.16s\n",ptable.product); - -printf("\n ## ----- NAME ----- start len loadsize loadaddr entry flags type count\n------------------------------------------------------------------------------------------"); - -for(pnum=0; - (ptable.part[pnum].name[0] != 0) && - (strcmp(ptable.part[pnum].name,"T") != 0); - pnum++) { - - printf("\n %02i %-16.16s %4x %4x %08x %08x %08x %08x %08x %08x", - pnum, - ptable.part[pnum].name, - ptable.part[pnum].start/0x20000, - ptable.part[pnum].length/0x20000, - ptable.part[pnum].lsize, - ptable.part[pnum].loadaddr, - ptable.part[pnum].type, - ptable.part[pnum].entry, - ptable.part[pnum].nproperty, - ptable.part[pnum].count); -} -printf("\n"); - -} +#include "parts.h" //############################################################################################################3