From c91a7001e53881ba13150ba1c0c3ba6b77a420e2 Mon Sep 17 00:00:00 2001 From: forth32 Date: Wed, 3 Aug 2016 07:57:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=81=D1=82=D1=80=D1=83=D0=BA?= =?UTF-8?q?=D1=82=D1=83=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 5 ++- balong_flash.c | 82 ++------------------------------------------- ptable.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++ ptable.h | 14 ++++++++ 4 files changed, 111 insertions(+), 80 deletions(-) create mode 100644 ptable.c create mode 100644 ptable.h diff --git a/Makefile b/Makefile index 587fc3a..4e5a13c 100755 --- a/Makefile +++ b/Makefile @@ -16,5 +16,8 @@ clean: hdlcio.o: hdlcio.c $(CC) -c hdlcio.c -balong_flash: balong_flash.o hdlcio.o +ptable.o: ptable.c + $(CC) -c ptable.c + +balong_flash: balong_flash.o hdlcio.o ptable.o @gcc $^ -o $@ $(LIBS) diff --git a/balong_flash.c b/balong_flash.c index 0f43179..d6d16f9 100644 --- a/balong_flash.c +++ b/balong_flash.c @@ -10,64 +10,11 @@ #include #include "hdlcio.h" +#include "ptable.h" unsigned char replybuf[4096]; -//****************************************************** -//* поиск символического имени раздела по его коду -//****************************************************** - -void find_pname(unsigned int id,unsigned char* pname) { - -unsigned int j; -struct { - char name[20]; - int code; -} pcodes[]={ - {"M3Boot",0x20000}, - {"M3Boot-ptable",0x10000}, - {"M3Boot_R11",0x200000}, - {"Ptable",0x10000}, - {"Fastboot",0x110000}, - {"Logo",0x130000}, - {"Kernel",0x30000}, - {"Kernel_R11",0x90000}, - {"VxWorks",0x40000}, - {"VxWorks_R11",0x220000}, - {"M3Image",0x50000}, - {"M3Image_R11",0x230000}, - {"DSP",0x60000}, - {"DSP_R11",0x240000}, - {"Nvdload",0x70000}, - {"Nvdload_R11",0x250000}, - {"Nvimg",0x80000}, - {"System",0x590000}, - {"System",0x100000}, - {"APP",0x570000}, - {"APP",0x5a0000}, - {"Oeminfo",0xa0000}, - {"CDROMISO",0xb0000}, - {"Oeminfo",0x550000}, - {"Oeminfo",0x510000}, - {"Oeminfo",0x1a0000}, - {"WEBUI",0x560000}, - {"WEBUI",0x5b0000}, - {"Wimaxcfg",0x170000}, - {"Wimaxcrf",0x180000}, - {"Userdata",0x190000}, - {"Online",0x1b0000}, - {"Online",0x5d0000}, - {"Online",0x5e0000}, - {0,0} -}; - -for(j=0;pcodes[j].code != 0;j++) { - if(pcodes[j].code == id) break; -} -if (pcodes[j].code != 0) strcpy(pname,pcodes[j].name); // имя найдено - копируем его в структуру -else sprintf(pname,"U%08x",id); // имя не найдено - подставляем псевдоимя Uxxxxxxxx в тупоконечном формате -} //**************************************************** //* Определение версии прошивальщика @@ -101,15 +48,7 @@ int res; FILE* in; FILE* out; -struct { - unsigned int offset; // позиция образа раздела - unsigned int hdoffset; // позиция заголовка раздела - unsigned int size; // размер образа раздела - unsigned int hdsize; // размер заголовка раздела - unsigned int code; // ID раздела - unsigned char pname[20]; // буквенное имя раздела - unsigned char filename[50]; // имя файла, соответствующее разделу -}ptable[100]; +struct ptb_t ptable[100]; unsigned char buf[40960]; unsigned char devname[50]="/dev/ttyUSB0"; @@ -233,22 +172,7 @@ if (in == 0) { if (!nflag) { printf("\n Разбираем файл прошвки..."); - while (fread(&i,1,4,in) == 4) { - if (i != dpattern) continue; // ищем разделитель - - // Выделяем параметры раздела - ptable[npart].hdoffset=ftell(in); // позиция начала заголовка раздела - fread(buf,1,96,in); // заголовок - ptable[npart].hdsize=*((unsigned int*)&buf[0])-4; // размер заголовка - ptable[npart].offset=ptable[npart].hdoffset+ptable[npart].hdsize; // смещение до тела раздела - ptable[npart].size=*((unsigned int*)&buf[20]); // размер раздела - ptable[npart].code=*((unsigned int*)&buf[16]); // тип раздела - - // Ищем символическое имя раздела по таблице - find_pname(ptable[npart].code,ptable[npart].pname); - // увеличиваем счетчик разделов - npart++; - } + npart=findparts(in,ptable); if (npart == 0) { printf("\nРазделы не найдены!"); return ; diff --git a/ptable.c b/ptable.c new file mode 100644 index 0000000..bf038cd --- /dev/null +++ b/ptable.c @@ -0,0 +1,90 @@ +// Процедуры работы с таблицей разделов + +#include +#include +#include "ptable.h" +//****************************************************** +//* поиск символического имени раздела по его коду +//****************************************************** + +void find_pname(unsigned int id,unsigned char* pname) { + +unsigned int j; +struct { + char name[20]; + int code; +} pcodes[]={ + {"M3Boot",0x20000}, + {"M3Boot-ptable",0x10000}, + {"M3Boot_R11",0x200000}, + {"Ptable",0x10000}, + {"Fastboot",0x110000}, + {"Logo",0x130000}, + {"Kernel",0x30000}, + {"Kernel_R11",0x90000}, + {"VxWorks",0x40000}, + {"VxWorks_R11",0x220000}, + {"M3Image",0x50000}, + {"M3Image_R11",0x230000}, + {"DSP",0x60000}, + {"DSP_R11",0x240000}, + {"Nvdload",0x70000}, + {"Nvdload_R11",0x250000}, + {"Nvimg",0x80000}, + {"System",0x590000}, + {"System",0x100000}, + {"APP",0x570000}, + {"APP",0x5a0000}, + {"Oeminfo",0xa0000}, + {"CDROMISO",0xb0000}, + {"Oeminfo",0x550000}, + {"Oeminfo",0x510000}, + {"Oeminfo",0x1a0000}, + {"WEBUI",0x560000}, + {"WEBUI",0x5b0000}, + {"Wimaxcfg",0x170000}, + {"Wimaxcrf",0x180000}, + {"Userdata",0x190000}, + {"Online",0x1b0000}, + {"Online",0x5d0000}, + {"Online",0x5e0000}, + {0,0} +}; + +for(j=0;pcodes[j].code != 0;j++) { + if(pcodes[j].code == id) break; +} +if (pcodes[j].code != 0) strcpy(pname,pcodes[j].name); // имя найдено - копируем его в структуру +else sprintf(pname,"U%08x",id); // имя не найдено - подставляем псевдоимя Uxxxxxxxx в тупоконечном формате +} + +//******************************************************* +//* Поиск разделов в файле прошивки +//* +//* возвращает число найденных разделов +//******************************************************* +int findparts(FILE* in, struct ptb_t* ptable) { + +// Маркер начала заголовка раздела +const unsigned int dpattern=0xa55aaa55; +unsigned int i,npart=0; +char buf[200]; + +while (fread(&i,1,4,in) == 4) { + if (i != dpattern) continue; // ищем разделитель + + // Выделяем параметры раздела + ptable[npart].hdoffset=ftell(in); // позиция начала заголовка раздела + fread(buf,1,96,in); // заголовок + ptable[npart].hdsize=*((unsigned int*)&buf[0])-4; // размер заголовка + ptable[npart].offset=ptable[npart].hdoffset+ptable[npart].hdsize; // смещение до тела раздела + ptable[npart].size=*((unsigned int*)&buf[20]); // размер раздела + ptable[npart].code=*((unsigned int*)&buf[16]); // тип раздела + + // Ищем символическое имя раздела по таблице + find_pname(ptable[npart].code,ptable[npart].pname); + // увеличиваем счетчик разделов + npart++; + } +return npart; +} diff --git a/ptable.h b/ptable.h new file mode 100644 index 0000000..97404a9 --- /dev/null +++ b/ptable.h @@ -0,0 +1,14 @@ +// Структура описания таблицы разделов + +struct ptb_t{ + unsigned int offset; // позиция образа раздела + unsigned int hdoffset; // позиция заголовка раздела + unsigned int size; // размер образа раздела + unsigned int hdsize; // размер заголовка раздела + unsigned int code; // ID раздела + unsigned char pname[20]; // буквенное имя раздела + unsigned char filename[50]; // имя файла, соответствующее разделу +}; + +int findparts(FILE* in, struct ptb_t* ptable); +void find_pname(unsigned int id,unsigned char* pname); \ No newline at end of file