Переработка кода разбора заголовков разделов

Возвращен выход из HDLC-режима - иначе дописывать разделы не получается
master
forth32 8 years ago
parent 90a1e938d2
commit 14af6c1db3

@ -503,6 +503,6 @@ if (rflag || !kflag) {
send_cmd(cmd_reset,1,replybuf);
atcmd("^RESET",replybuf);
}
// выход из HDLC пока выкидываем
//else send_cmd(cmddone,1,replybuf);
// выход из HDLC
else send_cmd(cmddone,1,replybuf);
}

@ -2,6 +2,7 @@
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include "ptable.h"
//******************************************************
//* поиск символического имени раздела по его коду
@ -65,26 +66,49 @@ else sprintf(pname,"U%08x",id); // имя не найдено - подставл
//*******************************************************
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;
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; // размер заголовка
fseek(in,-4,SEEK_CUR); // встаем на начало заголовка
fread(&header,1,sizeof(header),in); // читаем заголовок
ptable[npart].hdsize=header.hdsize-4; // размер заголовка
ptable[npart].offset=ptable[npart].hdoffset+ptable[npart].hdsize; // смещение до тела раздела
ptable[npart].size=*((unsigned int*)&buf[20]); // размер раздела
ptable[npart].code=*((unsigned int*)&buf[16]); // тип раздела
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++;
npart++;
// пропускаем тело раздела
fseek(in,(header.psize+header.hdsize-sizeof(header)-4)&0xfffffffc,SEEK_CUR);
}
return npart;
}

Loading…
Cancel
Save