diff --git a/balong_flash.c b/balong_flash.c index 500490d..cd7b0c9 100644 --- a/balong_flash.c +++ b/balong_flash.c @@ -538,9 +538,9 @@ if (nflag) *((unsigned int*)&cmd_dload_end[8])=htonl(ptable[part].code); iolen=send_cmd(cmd_dload_end,24,replybuf); // отсылаем команду 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); - return; +// return; } } diff --git a/ptable.c b/ptable.c index 07d5b10..3ba6203 100644 --- a/ptable.c +++ b/ptable.c @@ -1,135 +1,143 @@ -// Процедуры работы с таблицей разделов - -#include -#include +// Процедуры работы с таблицей разделов + +#include +#include #ifndef WIN32 -#include -#include +#include +#include #else #include #include "printf.h" #endif - -#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) { - -// структура описания заголовка раздела -struct { - uint32_t magic; // 0xa55aaa55 - uint32_t hdsize; // размер заголовка - uint32_t hdversion; - uint8_t unlock[8]; - uint32_t code; // тип раздела - uint32_t psize; // разме поля данных - uint8_t date[16]; - uint8_t time[16]; // дата-время сборки прошивки - uint8_t version[32]; // версия пршоивки - uint16_t crc; // CRC заголовка - uint16_t blocksize; -} header; -// Маркер начала заголовка раздела -const unsigned int dpattern=0xa55aaa55; -unsigned int i,npart=0; - -// поиск начала цепочки разделов в файле -while (fread(&i,1,4,in) == 4) { - if (i == dpattern) break; -} -if (feof(in)) { - printf("\n В файле не найдены разделы - файл не содержит образа прошивки\n"); - exit(0); -} - -fseek(in,-4,SEEK_CUR); // отъезжаем на начало маркера -// поиск остальных разделов -while (fread(&i,1,4,in) == 4) { - if (i != dpattern) { - fseek(in,-3,SEEK_CUR); - continue; // ищем разделитель - } - // Выделяем параметры раздела - fseek(in,-4,SEEK_CUR); // встаем на начало заголовка - ptable[npart].hdoffset=ftell(in); // позиция начала заголовка раздела - fread(&header,1,sizeof(header),in); // читаем заголовок - - ptable[npart].hdsize=header.hdsize; // размер заголовка - ptable[npart].offset=ptable[npart].hdoffset+ptable[npart].hdsize; // смещение до тела раздела - ptable[npart].size=header.psize; // размер раздела - ptable[npart].code=header.code; // тип раздела - - // Ищем символическое имя раздела по таблице - find_pname(ptable[npart].code,ptable[npart].pname); - // Выводим информацию о версии проивки - if (npart == 0) { - printf("\n Версия прошивки: %s",header.version); - 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; -} + +#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}, + {"Ptable_R1",0x100}, + {"Bootloader_R1",0x101}, + {"Bootrom_R1",0x102}, + {"VxWorks_R1",0x550103}, + {"Fastboot_R1",0104}, + {"Kernel_R1",0x105}, + {"System_r1",0x107}, + {"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); // имя найдено - копируем его в структуру +else sprintf(pname,"U%08x",id); // имя не найдено - подставляем псевдоимя Uxxxxxxxx в тупоконечном формате +} + +//******************************************************* +//* Поиск разделов в файле прошивки +//* +//* возвращает число найденных разделов +//******************************************************* +int findparts(FILE* in, struct ptb_t* ptable) { + +// структура описания заголовка раздела +struct { + uint32_t magic; // 0xa55aaa55 + uint32_t hdsize; // размер заголовка + uint32_t hdversion; + uint8_t unlock[8]; + uint32_t code; // тип раздела + uint32_t psize; // разме поля данных + uint8_t date[16]; + uint8_t time[16]; // дата-время сборки прошивки + uint8_t version[32]; // версия пршоивки + uint16_t crc; // CRC заголовка + uint16_t blocksize; +} header; +// Маркер начала заголовка раздела +const unsigned int dpattern=0xa55aaa55; +unsigned int i,npart=0; + +// поиск начала цепочки разделов в файле +while (fread(&i,1,4,in) == 4) { + if (i == dpattern) break; +} +if (feof(in)) { + printf("\n В файле не найдены разделы - файл не содержит образа прошивки\n"); + exit(0); +} + +fseek(in,-4,SEEK_CUR); // отъезжаем на начало маркера +// поиск остальных разделов +while (fread(&i,1,4,in) == 4) { + if (i != dpattern) { + fseek(in,-3,SEEK_CUR); + continue; // ищем разделитель + } + // Выделяем параметры раздела + fseek(in,-4,SEEK_CUR); // встаем на начало заголовка + ptable[npart].hdoffset=ftell(in); // позиция начала заголовка раздела + fread(&header,1,sizeof(header),in); // читаем заголовок + + ptable[npart].hdsize=header.hdsize; // размер заголовка + ptable[npart].offset=ptable[npart].hdoffset+ptable[npart].hdsize; // смещение до тела раздела + ptable[npart].size=header.psize; // размер раздела + ptable[npart].code=header.code; // тип раздела + + // Ищем символическое имя раздела по таблице + find_pname(ptable[npart].code,ptable[npart].pname); + // Выводим информацию о версии проивки + if (npart == 0) { + printf("\n Версия прошивки: %s",header.version); + 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; +}