Реструктуризация кода

This commit is contained in:
forth32 2016-08-03 07:57:28 +03:00
parent ba6fd2bee0
commit c91a7001e5
4 changed files with 111 additions and 80 deletions

View File

@ -16,5 +16,8 @@ clean:
hdlcio.o: hdlcio.c hdlcio.o: hdlcio.c
$(CC) -c 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) @gcc $^ -o $@ $(LIBS)

View File

@ -10,64 +10,11 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include "hdlcio.h" #include "hdlcio.h"
#include "ptable.h"
unsigned char replybuf[4096]; 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* in;
FILE* out; FILE* out;
struct { struct ptb_t ptable[100];
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];
unsigned char buf[40960]; unsigned char buf[40960];
unsigned char devname[50]="/dev/ttyUSB0"; unsigned char devname[50]="/dev/ttyUSB0";
@ -233,22 +172,7 @@ if (in == 0) {
if (!nflag) { if (!nflag) {
printf("\n Разбираем файл прошвки..."); printf("\n Разбираем файл прошвки...");
while (fread(&i,1,4,in) == 4) { npart=findparts(in,ptable);
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++;
}
if (npart == 0) { if (npart == 0) {
printf("\nРазделы не найдены!"); printf("\nРазделы не найдены!");
return ; return ;

90
ptable.c Normal file
View File

@ -0,0 +1,90 @@
// Процедуры работы с таблицей разделов
#include <stdio.h>
#include <string.h>
#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;
}

14
ptable.h Normal file
View File

@ -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);