Добавлены описания разделов для прошивок R1

отключен выход по ошибке закрытия раздела
master
forth32 8 years ago
parent 8c3c57519b
commit 3618940123

@ -538,9 +538,9 @@ if (nflag)
*((unsigned int*)&cmd_dload_end[8])=htonl(ptable[part].code); *((unsigned int*)&cmd_dload_end[8])=htonl(ptable[part].code);
iolen=send_cmd(cmd_dload_end,24,replybuf); // отсылаем команду iolen=send_cmd(cmd_dload_end,24,replybuf); // отсылаем команду
if ((iolen == 0) || (replybuf[1] != 2)) { if ((iolen == 0) || (replybuf[1] != 2)) {
printf("\n Ошибка закрытия раздела, код ошибки = %02x %02x %02x\n",replybuf[1],replybuf[2],replybuf[3]); printf("\n ! Ошибка закрытия раздела, код ошибки = %02x %02x %02x\n",replybuf[1],replybuf[2],replybuf[3]);
// dump(replybuf,iolen,0); // dump(replybuf,iolen,0);
return; // return;
} }
} }

@ -1,135 +1,143 @@
// Процедуры работы с таблицей разделов // Процедуры работы с таблицей разделов
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
#ifndef WIN32 #ifndef WIN32
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#else #else
#include <windows.h> #include <windows.h>
#include "printf.h" #include "printf.h"
#endif #endif
#include "ptable.h" #include "ptable.h"
//****************************************************** //******************************************************
//* поиск символического имени раздела по его коду //* поиск символического имени раздела по его коду
//****************************************************** //******************************************************
void find_pname(unsigned int id,unsigned char* pname) { void find_pname(unsigned int id,unsigned char* pname) {
unsigned int j; unsigned int j;
struct { struct {
char name[20]; char name[20];
int code; int code;
} pcodes[]={ } pcodes[]={
{"M3Boot",0x20000}, {"M3Boot",0x20000},
{"M3Boot-ptable",0x10000}, {"M3Boot-ptable",0x10000},
{"M3Boot_R11",0x200000}, {"M3Boot_R11",0x200000},
{"Ptable",0x10000}, {"Ptable",0x10000},
{"Fastboot",0x110000}, {"Fastboot",0x110000},
{"Logo",0x130000}, {"Logo",0x130000},
{"Kernel",0x30000}, {"Kernel",0x30000},
{"Kernel_R11",0x90000}, {"Kernel_R11",0x90000},
{"VxWorks",0x40000}, {"VxWorks",0x40000},
{"VxWorks_R11",0x220000}, {"VxWorks_R11",0x220000},
{"M3Image",0x50000}, {"M3Image",0x50000},
{"M3Image_R11",0x230000}, {"M3Image_R11",0x230000},
{"DSP",0x60000}, {"DSP",0x60000},
{"DSP_R11",0x240000}, {"DSP_R11",0x240000},
{"Nvdload",0x70000}, {"Nvdload",0x70000},
{"Nvdload_R11",0x250000}, {"Nvdload_R11",0x250000},
{"Nvimg",0x80000}, {"Nvimg",0x80000},
{"System",0x590000}, {"System",0x590000},
{"System",0x100000}, {"System",0x100000},
{"APP",0x570000}, {"APP",0x570000},
{"APP",0x5a0000}, {"APP",0x5a0000},
{"Oeminfo",0xa0000}, {"Oeminfo",0xa0000},
{"CDROMISO",0xb0000}, {"CDROMISO",0xb0000},
{"Oeminfo",0x550000}, {"Oeminfo",0x550000},
{"Oeminfo",0x510000}, {"Oeminfo",0x510000},
{"Oeminfo",0x1a0000}, {"Oeminfo",0x1a0000},
{"WEBUI",0x560000}, {"WEBUI",0x560000},
{"WEBUI",0x5b0000}, {"WEBUI",0x5b0000},
{"Wimaxcfg",0x170000}, {"Wimaxcfg",0x170000},
{"Wimaxcrf",0x180000}, {"Wimaxcrf",0x180000},
{"Userdata",0x190000}, {"Userdata",0x190000},
{"Online",0x1b0000}, {"Online",0x1b0000},
{"Online",0x5d0000}, {"Online",0x5d0000},
{"Online",0x5e0000}, {"Online",0x5e0000},
{0,0} {"Ptable_R1",0x100},
}; {"Bootloader_R1",0x101},
{"Bootrom_R1",0x102},
for(j=0;pcodes[j].code != 0;j++) { {"VxWorks_R1",0x550103},
if(pcodes[j].code == id) break; {"Fastboot_R1",0104},
} {"Kernel_R1",0x105},
if (pcodes[j].code != 0) strcpy(pname,pcodes[j].name); // имя найдено - копируем его в структуру {"System_r1",0x107},
else sprintf(pname,"U%08x",id); // имя не найдено - подставляем псевдоимя Uxxxxxxxx в тупоконечном формате {"Nvimage_r1",0x66},
} {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); // имя найдено - копируем его в структуру
int findparts(FILE* in, struct ptb_t* ptable) { else sprintf(pname,"U%08x",id); // имя не найдено - подставляем псевдоимя Uxxxxxxxx в тупоконечном формате
}
// структура описания заголовка раздела
struct { //*******************************************************
uint32_t magic; // 0xa55aaa55 //* Поиск разделов в файле прошивки
uint32_t hdsize; // размер заголовка //*
uint32_t hdversion; //* возвращает число найденных разделов
uint8_t unlock[8]; //*******************************************************
uint32_t code; // тип раздела int findparts(FILE* in, struct ptb_t* ptable) {
uint32_t psize; // разме поля данных
uint8_t date[16]; // структура описания заголовка раздела
uint8_t time[16]; // дата-время сборки прошивки struct {
uint8_t version[32]; // версия пршоивки uint32_t magic; // 0xa55aaa55
uint16_t crc; // CRC заголовка uint32_t hdsize; // размер заголовка
uint16_t blocksize; uint32_t hdversion;
} header; uint8_t unlock[8];
// Маркер начала заголовка раздела uint32_t code; // тип раздела
const unsigned int dpattern=0xa55aaa55; uint32_t psize; // разме поля данных
unsigned int i,npart=0; uint8_t date[16];
uint8_t time[16]; // дата-время сборки прошивки
// поиск начала цепочки разделов в файле uint8_t version[32]; // версия пршоивки
while (fread(&i,1,4,in) == 4) { uint16_t crc; // CRC заголовка
if (i == dpattern) break; uint16_t blocksize;
} } header;
if (feof(in)) { // Маркер начала заголовка раздела
printf("\n В файле не найдены разделы - файл не содержит образа прошивки\n"); const unsigned int dpattern=0xa55aaa55;
exit(0); unsigned int i,npart=0;
}
// поиск начала цепочки разделов в файле
fseek(in,-4,SEEK_CUR); // отъезжаем на начало маркера while (fread(&i,1,4,in) == 4) {
// поиск остальных разделов if (i == dpattern) break;
while (fread(&i,1,4,in) == 4) { }
if (i != dpattern) { if (feof(in)) {
fseek(in,-3,SEEK_CUR); printf("\n В файле не найдены разделы - файл не содержит образа прошивки\n");
continue; // ищем разделитель exit(0);
} }
// Выделяем параметры раздела
fseek(in,-4,SEEK_CUR); // встаем на начало заголовка fseek(in,-4,SEEK_CUR); // отъезжаем на начало маркера
ptable[npart].hdoffset=ftell(in); // позиция начала заголовка раздела // поиск остальных разделов
fread(&header,1,sizeof(header),in); // читаем заголовок while (fread(&i,1,4,in) == 4) {
if (i != dpattern) {
ptable[npart].hdsize=header.hdsize; // размер заголовка fseek(in,-3,SEEK_CUR);
ptable[npart].offset=ptable[npart].hdoffset+ptable[npart].hdsize; // смещение до тела раздела continue; // ищем разделитель
ptable[npart].size=header.psize; // размер раздела }
ptable[npart].code=header.code; // тип раздела // Выделяем параметры раздела
fseek(in,-4,SEEK_CUR); // встаем на начало заголовка
// Ищем символическое имя раздела по таблице ptable[npart].hdoffset=ftell(in); // позиция начала заголовка раздела
find_pname(ptable[npart].code,ptable[npart].pname); fread(&header,1,sizeof(header),in); // читаем заголовок
// Выводим информацию о версии проивки
if (npart == 0) { ptable[npart].hdsize=header.hdsize; // размер заголовка
printf("\n Версия прошивки: %s",header.version); ptable[npart].offset=ptable[npart].hdoffset+ptable[npart].hdsize; // смещение до тела раздела
printf("\n Дата сборки: %s %s",header.date,header.time); ptable[npart].size=header.psize; // размер раздела
printf("\n Заголовок: версия %i, платформа %8.8s",header.hdversion,header.unlock); ptable[npart].code=header.code; // тип раздела
}
// увеличиваем счетчик разделов // Ищем символическое имя раздела по таблице
npart++; find_pname(ptable[npart].code,ptable[npart].pname);
// пропускаем тело раздела // Выводим информацию о версии проивки
fseek(in,header.psize+header.hdsize-sizeof(header)-16,SEEK_CUR); if (npart == 0) {
} printf("\n Версия прошивки: %s",header.version);
return npart; printf("\n Дата сборки: %s %s",header.date,header.time);
} printf("\n Заголовок: версия %i, платформа %8.8s",header.hdversion,header.unlock);
}
// увеличиваем счетчик разделов
npart++;
// пропускаем тело раздела
fseek(in,header.psize+header.hdsize-sizeof(header)-16,SEEK_CUR);
}
return npart;
}

Loading…
Cancel
Save