Добавлена работа с флагами таблицы разделов

pull/38/head
forth32 8 years ago
parent 95c68e14bb
commit 642d4b1c10

@ -15,10 +15,10 @@ clean:
#.c.o: #.c.o:
# $(CC) -o $@ $(LIBS) $^ qcio.o # $(CC) -o $@ $(LIBS) $^ qcio.o
balong-usbdload: balong-usbdload.o balong-usbdload: balong-usbdload.o parts.o
@gcc $^ -o $@ $(LIBS) @gcc $^ -o $@ $(LIBS)
ptable-injector: ptable-injector.o ptable-injector: ptable-injector.o parts.o
@gcc $^ -o $@ $(LIBS) @gcc $^ -o $@ $(LIBS)
loader-patch: loader-patch.o loader-patch: loader-patch.o

@ -21,6 +21,8 @@
#include "printf.h" #include "printf.h"
#endif #endif
#include "parts.h"
#ifndef WIN32 #ifndef WIN32
int siofd; int siofd;
@ -202,20 +204,6 @@ for(off=(size-8);off>0;off--) {
return 0; return 0;
} }
//*********************************************
//* Поиск таблицы разделов в загрузчике
//*********************************************
uint32_t find_ptable(char* buf, uint32_t size) {
// сигнатура заголовка таблицы
const uint8_t headmagic[16]={0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80};
uint32_t off;
for(off=0;off<(size-16);off+=4) {
if (memcmp(buf+off,headmagic,16) == 0) return off;
}
return 0;
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ -223,10 +211,9 @@ return 0;
void main(int argc, char* argv[]) { void main(int argc, char* argv[]) {
unsigned int i,res,opt,datasize,pktcount,adr; unsigned int i,res,opt,datasize,pktcount,adr;
int nblk; // число блоков для загрузки
int bl; // текущий блок int bl; // текущий блок
unsigned char c; unsigned char c;
int fbflag=0, tflag=0; int fbflag=0, tflag=0, mflag=0;
int koff; // смещение до ANDROID-заголовка int koff; // смещение до ANDROID-заголовка
char ptfile[100]; char ptfile[100];
@ -234,18 +221,23 @@ FILE* pt;
char ptbuf[2048]; char ptbuf[2048];
uint32_t ptoff; uint32_t ptoff;
struct ptable_t* ptable;
unsigned char cmdhead[14]={0xfe,0, 0xff}; unsigned char cmdhead[14]={0xfe,0, 0xff};
unsigned char cmddata[1040]={0xda,0,0}; unsigned char cmddata[1040]={0xda,0,0};
unsigned char cmdeod[5]={0xed,0,0,0,0}; unsigned char cmdeod[5]={0xed,0,0,0,0};
// список разделов, которым нужно установить файловый флаг
uint8_t fileflag[41];
struct { struct {
int lmode; // режим загрузки: 1 - прямой старт, 2 - через перезапуск A-core int lmode; // режим загрузки: 1 - прямой старт, 2 - через перезапуск A-core
int size; // размер блока int size; // размер компонента
int adr; // адрес загрузки блока в память int adr; // адрес загрузки компонента в память
int offset; // смещение до блока от начала файла int offset; // смещение до компонента от начала файла
char* pbuf; // буфер для загрузки образа компонента
} blk[10]; } blk[10];
char* pbuf; // буфер для загрузки образа раздела
#ifndef WIN32 #ifndef WIN32
unsigned char devname[50]="/dev/ttyUSB0"; unsigned char devname[50]="/dev/ttyUSB0";
@ -254,11 +246,13 @@ char devname[50]="";
DWORD bytes_written, bytes_read; DWORD bytes_written, bytes_read;
#endif #endif
while ((opt = getopt(argc, argv, "hp:ft:")) != -1) { bzero(fileflag,sizeof(fileflag));
while ((opt = getopt(argc, argv, "hp:ft:ms:")) != -1) {
switch (opt) { switch (opt) {
case 'h': case 'h':
printf("\n Утилита предназначена для аварийной USB-загрузки модемов E3372S\n\n\ printf("\n Утилита предназначена для аварийной USB-загрузки устройств на чипете Balong V7\n\n\
%s [ключи] <имя файла для загрузки>\n\n\ %s [ключи] <имя файла для загрузки>\n\n\
Допустимы следующие ключи:\n\n\ Допустимы следующие ключи:\n\n\
-p <tty> - последовательный порт для общения с загрузчиком (по умолчанию /dev/ttyUSB0\n\ -p <tty> - последовательный порт для общения с загрузчиком (по умолчанию /dev/ttyUSB0\n\
@ -277,10 +271,23 @@ printf("\n Утилита предназначена для аварийной U
fbflag=1; fbflag=1;
break; break;
case 'm':
mflag=1;
break;
case 't': case 't':
tflag=1; tflag=1;
strcpy(ptfile,optarg); strcpy(ptfile,optarg);
break; break;
case 's':
i=atoi(optarg);
if (i>41) {
printf("\n Раздела #%i не существует\n",i);
return;
}
fileflag[i]=1;
break;
case '?': case '?':
case ':': case ':':
@ -289,22 +296,15 @@ printf("\n Утилита предназначена для аварийной U
} }
} }
if (optind>=argc) { printf("\n Аварийный USB-загрузчик Balong-чипсета, версия 2.01, (c) forth32, 2015");
printf("\n - Не указано имя файла для загрузки\n");
return;
}
#ifdef WIN32 #ifdef WIN32
if (*devname == '\0') printf("\n Порт для Windows 32bit (c) rust3028, 2016");
{
printf("\n - Последовательный порт не задан\n");
return;
}
#endif #endif
if (!open_port(devname)) {
printf("\n Последовательный порт не открывается\n"); if (optind>=argc) {
return; printf("\n - Не указано имя файла для загрузки\n");
return;
} }
ldr=fopen(argv[optind],"rb"); ldr=fopen(argv[optind],"rb");
@ -324,81 +324,127 @@ fseek(ldr,36,SEEK_SET); // начало описателей блоков для
// Разбираем заголовок // Разбираем заголовок
for(nblk=0;nblk<10;nblk++) { fread(&blk[0],1,16,ldr); // raminit
fread(&blk[nblk].lmode,1,4,ldr); fread(&blk[1],1,16,ldr); // usbldr
fread(&blk[nblk].size,1,4,ldr);
fread(&blk[nblk].adr,1,4,ldr);
fread(&blk[nblk].offset,1,4,ldr);
if (blk[nblk].lmode == 0) break;
}
printf("\n Найдено %i блоков для загрузки",nblk);
// Проверяем загрузочный порт
c=0;
#ifndef WIN32
write(siofd,"A",1);
res=read(siofd,&c,1);
#else
WriteFile(hSerial, "A", 1, &bytes_written, NULL);
FlushFileBuffers(hSerial);
Sleep(100);
ReadFile(hSerial, &c, 1, &bytes_read, NULL);
#endif
if (c != 0x55) {
printf("\n ! Порт не находится в режиме USB Boot\n");
return;
}
// главный цикл загрузки - загружаем все блоки, найденные в заголовке
for(bl=0;bl<nblk;bl++) {
datasize=1024; //---------------------------------------------------------------------
pktcount=1; // Чтение компонентов в память
for(bl=0;bl<2;bl++) {
// выделяем память под полный образ раздела // выделяем память под полный образ раздела
pbuf=(char*)malloc(blk[bl].size); blk[bl].pbuf=(char*)malloc(blk[bl].size);
// читаем образ раздела в память // читаем образ раздела в память
fseek(ldr,blk[bl].offset,SEEK_SET); fseek(ldr,blk[bl].offset,SEEK_SET);
res=fread(pbuf,1,blk[bl].size,ldr); res=fread(blk[bl].pbuf,1,blk[bl].size,ldr);
if (res != blk[bl].size) { if (res != blk[bl].size) {
printf("\n Неожиданный конец файла: прочитано %i ожидалось %i\n",res,blk[bl].size); printf("\n Неожиданный конец файла: прочитано %i ожидалось %i\n",res,blk[bl].size);
return; return;
} }
if (bl == 0) continue; // для raminit более ничего делать не надо
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// fastboot-патч // fastboot-патч
if ((bl == 1) && fbflag) { if (fbflag) {
koff=locate_kernel(pbuf,blk[bl].size); koff=locate_kernel(blk[bl].pbuf,blk[bl].size);
if (koff != 0) { if (koff != 0) {
pbuf[koff]=0x55; // патч сигнатуры blk[bl].pbuf[koff]=0x55; // патч сигнатуры
blk[bl].size=koff+8; // обрезаем раздел до начала ядра blk[bl].size=koff+8; // обрезаем раздел до начала ядра
} }
else printf("\n В загрузчике нет ANDROID-компонента - fastboot-загрузка невозможна\n"); else printf("\n В загрузчике нет ANDROID-компонента - fastboot-загрузка невозможна\n");
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// Ищем таблицу разделов в загрузчике
ptoff=find_ptable_ram(blk[bl].pbuf,blk[bl].size);
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// патч таблицы разделов // патч таблицы разделов
if ((bl ==1) && tflag) { if (tflag) {
pt=fopen(ptfile,"r"); pt=fopen(ptfile,"r");
if (pt == 0) { if (pt == 0) {
printf("\n Не найден файл %s - таблица разделов не изменена",ptfile); printf("\n Не найден файл %s - замена таблицы разделов невозможна\n",ptfile);
goto np; return;
} }
fread(ptbuf,1,2048,pt); fread(ptbuf,1,2048,pt);
fclose(pt); fclose(pt);
ptoff=find_ptable(pbuf,blk[bl].size); if (memcmp(headmagic,ptbuf,sizeof(headmagic)) != 0) {
printf("\n Файл %s не явлется таблицей разделов\n",ptfile);
return;
}
if (ptoff == 0) {
printf("\n В загрузчике не найдена таблица разделов - замена невозможна");
return;
}
memcpy(blk[bl].pbuf+ptoff,ptbuf,2048);
}
ptable=(struct ptable_t*)(blk[bl].pbuf+ptoff);
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// Патч файловых флагов
for(i=0;i<41;i++) {
if (fileflag[i]) {
ptable->part[i].nproperty |= 1;
}
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// Вывод таблицы разделов
if (mflag) {
if (ptoff == 0) { if (ptoff == 0) {
printf("\n В загрузчике не найдена таблица разделов - замена невозможна"); printf("\n Таблица разделов не найдена - вывод карты невозможен\n");
return;
} }
else memcpy(pbuf+ptoff,ptbuf,2048); show_map(*ptable);
return;
} }
}
//---------------------------------------------------------------------
#ifdef WIN32
if (*devname == '\0')
{
printf("\n - Последовательный порт не задан\n");
return;
}
#endif
if (!open_port(devname)) {
printf("\n Последовательный порт не открывается\n");
return;
}
// Проверяем загрузочный порт
c=0;
#ifndef WIN32
write(siofd,"A",1);
res=read(siofd,&c,1);
#else
WriteFile(hSerial, "A", 1, &bytes_written, NULL);
FlushFileBuffers(hSerial);
Sleep(100);
ReadFile(hSerial, &c, 1, &bytes_read, NULL);
#endif
if (c != 0x55) {
printf("\n ! Порт не находится в режиме USB Boot\n");
return;
}
//----------------------------------
// главный цикл загрузки - загружаем все блоки, найденные в заголовке
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
np:
printf("\n Загрузка блока %i, адрес=%08x, размер=%i\n",bl,blk[bl].adr,blk[bl].size); printf("\n\n Компонент Адрес Размер %%загрузки\n------------------------------------------\n");
for(bl=0;bl<2;bl++) {
datasize=1024;
pktcount=1;
// фрмируем пакет начала блока // фрмируем пакет начала блока
*((unsigned int*)&cmdhead[4])=htonl(blk[bl].size); *((unsigned int*)&cmdhead[4])=htonl(blk[bl].size);
*((unsigned int*)&cmdhead[8])=htonl(blk[bl].adr); *((unsigned int*)&cmdhead[8])=htonl(blk[bl].adr);
@ -407,44 +453,40 @@ np:
// отправляем пакет начала блока // отправляем пакет начала блока
res=sendcmd(cmdhead,14); res=sendcmd(cmdhead,14);
if (!res) { if (!res) {
printf("\nМодем отверг пакет заголовка\nОбраз пакета:"); printf("\nМодем отверг пакет заголовка\n");
dump(cmdhead,14);
return; return;
} }
// ---------- Цикл поблочной загрузки данных --------------------- // ---------- Цикл поблочной загрузки данных ---------------------
for(adr=0;adr<blk[bl].size;adr+=1024) { for(adr=0;adr<blk[bl].size;adr+=1024) {
// формируем размер последнего загружаемого пакета
if ((adr+1024)>=blk[bl].size) datasize=blk[bl].size-adr; if ((adr+1024)>=blk[bl].size) datasize=blk[bl].size-adr;
#ifndef WIN32
fprintf(stderr,"\r Адрес: %08x, пакет# %i размер: %i",blk[bl].adr+adr,pktcount,datasize);
#else
printf("\r Адрес: %08x, пакет# %i размер: %i",blk[bl].adr+adr,pktcount,datasize);
#endif
printf("\r %s %08x %8i %i%%",bl?"usbboot":"raminit",blk[bl].adr,blk[bl].size,(adr+datasize)*100/blk[bl].size);
// готовим пакет данных // готовим пакет данных
cmddata[1]=pktcount; cmddata[1]=pktcount;
cmddata[2]=(~pktcount)&0xff; cmddata[2]=(~pktcount)&0xff;
memcpy(cmddata+3,pbuf+adr,datasize); memcpy(cmddata+3,blk[bl].pbuf+adr,datasize);
pktcount++; pktcount++;
if (!sendcmd(cmddata,datasize+5)) { if (!sendcmd(cmddata,datasize+5)) {
printf("\nМодем отверг пакет данных\nОбраз пакета:"); printf("\nМодем отверг пакет данных");
dump(cmddata,datasize+5);
return; return;
} }
} }
free(pbuf); free(blk[bl].pbuf);
// Фрмируем пакет конца данных // Фрмируем пакет конца данных
cmdeod[1]=pktcount; cmdeod[1]=pktcount;
cmdeod[2]=(~pktcount)&0xff; cmdeod[2]=(~pktcount)&0xff;
if (!sendcmd(cmdeod,5)) { if (!sendcmd(cmdeod,5)) {
printf("\nМодем отверг пакет конца данных\nОбраз пакета:"); printf("\nМодем отверг пакет конца данных");
dump(cmdeod,5); }
} printf("\n");
} }
printf("\n Загрузка окончена\n"); printf("\n Загрузка окончена\n");
} }

@ -0,0 +1,73 @@
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "parts.h"
// сигнатура заголовка таблицы
const uint8_t headmagic[16]={0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80};
//*********************************************
//* Поиск таблицы разделов в загрузчике
//*********************************************
uint32_t find_ptable(FILE* ldr) {
uint8_t rbuf[16];
while (fread(rbuf,1,16,ldr) == 16) {
if (memcmp(rbuf,headmagic,16) == 0) {
fseek(ldr,-16,SEEK_CUR);
return ftell(ldr);
}
fseek(ldr,-12,SEEK_CUR);
}
return 0;
}
//*********************************************
//* Печать таблицы разделов
//*********************************************
void show_map(struct ptable_t ptable) {
int pnum;
printf("\n Версия таблицы разделов: %16.16s",ptable.version);
printf("\n Версия прошивки: %16.16s\n",ptable.product);
printf("\n ## ----- NAME ----- start len loadsize loadaddr entry flags type count\n------------------------------------------------------------------------------------------");
for(pnum=0;
(ptable.part[pnum].name[0] != 0) &&
(strcmp(ptable.part[pnum].name,"T") != 0);
pnum++) {
printf("\n %02i %-16.16s %4x %4x %08x %08x %08x %08x %08x %08x",
pnum,
ptable.part[pnum].name,
ptable.part[pnum].start/0x20000,
ptable.part[pnum].length/0x20000,
ptable.part[pnum].lsize,
ptable.part[pnum].loadaddr,
ptable.part[pnum].entry,
ptable.part[pnum].nproperty,
ptable.part[pnum].type,
ptable.part[pnum].count);
}
printf("\n");
}
//*********************************************
//* Поиск таблицы разделов в памяти
//*********************************************
uint32_t find_ptable_ram(char* buf, uint32_t size) {
// сигнатура заголовка таблицы
uint32_t off;
for(off=0;off<(size-16);off+=4) {
if (memcmp(buf+off,headmagic,16) == 0) return off;
}
return 0;
}

@ -0,0 +1,29 @@
// Структура описателя раздела
struct ptable_line{
char name[16];
unsigned start;
unsigned lsize;
unsigned length;
unsigned loadaddr;
unsigned entry;
unsigned type;
unsigned nproperty; // флаги раздела
unsigned count;
};
// Полная структура страницы таблицы разделов
struct ptable_t {
uint8_t head[16];
uint8_t version[16];
uint8_t product[16];
struct ptable_line part[41];
uint8_t tail[32];
};
// сигнатура заголовка таблицы
extern const uint8_t headmagic[16];
uint32_t find_ptable(FILE* ldr);
uint32_t find_ptable_ram(char* buf, uint32_t size);
void show_map(struct ptable_t ptable);

@ -6,80 +6,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include "parts.h"
// сигнатура заголовка таблицы
const uint8_t headmagic[16]={0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80};
// Структура описателя раздела
struct ptable_line{
char name[16];
unsigned start;
unsigned lsize;
unsigned length;
unsigned type;
unsigned loadaddr;
unsigned nproperty; // флаги раздела
unsigned entry;
unsigned count;
};
// Полная структура страницы таблицы разделов
struct ptable_t {
uint8_t head[16];
uint8_t version[16];
uint8_t product[16];
struct ptable_line part[41];
uint8_t tail[32];
};
//*********************************************
//* Поиск таблицы разделов в загрузчике
//*********************************************
uint32_t find_ptable(FILE* ldr) {
uint8_t rbuf[16];
while (fread(rbuf,1,16,ldr) == 16) {
if (memcmp(rbuf,headmagic,16) == 0) {
fseek(ldr,-16,SEEK_CUR);
return ftell(ldr);
}
fseek(ldr,-12,SEEK_CUR);
}
return 0;
}
//*********************************************
//* Печать таблицы разделов
//*********************************************
void show_map(struct ptable_t ptable) {
int pnum;
printf("\n Версия таблицы разделов: %16.16s",ptable.version);
printf("\n Версия прошивки: %16.16s\n",ptable.product);
printf("\n ## ----- NAME ----- start len loadsize loadaddr entry flags type count\n------------------------------------------------------------------------------------------");
for(pnum=0;
(ptable.part[pnum].name[0] != 0) &&
(strcmp(ptable.part[pnum].name,"T") != 0);
pnum++) {
printf("\n %02i %-16.16s %4x %4x %08x %08x %08x %08x %08x %08x",
pnum,
ptable.part[pnum].name,
ptable.part[pnum].start/0x20000,
ptable.part[pnum].length/0x20000,
ptable.part[pnum].lsize,
ptable.part[pnum].loadaddr,
ptable.part[pnum].type,
ptable.part[pnum].entry,
ptable.part[pnum].nproperty,
ptable.part[pnum].count);
}
printf("\n");
}
//############################################################################################################3 //############################################################################################################3

Loading…
Cancel
Save