balong-usbdload - добавлен ключ -t, для подстановки таблицы разделов из файла

pull/38/head
forth32 8 years ago
parent 1cfa56d739
commit b9042f257b

@ -191,6 +191,21 @@ for(off=(size-8);off>0;off--) {
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;
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ -200,8 +215,13 @@ unsigned int i,res,opt,datasize,pktcount,adr;
int nblk; // число блоков для загрузки
int bl; // текущий блок
unsigned char c;
int fbflag=0;
int fbflag=0, tflag=0;
int koff; // смещение до ANDROID-заголовка
char ptfile[100];
FILE* pt;
char ptbuf[2048];
uint32_t ptoff;
unsigned char cmdhead[14]={0xfe,0, 0xff};
unsigned char cmddata[1040]={0xda,0,0};
@ -222,7 +242,7 @@ unsigned char devname[50]="/dev/ttyUSB0";
char devname[50]="";
#endif
while ((opt = getopt(argc, argv, "hp:f")) != -1) {
while ((opt = getopt(argc, argv, "hp:ft:")) != -1) {
switch (opt) {
case 'h':
@ -231,6 +251,7 @@ printf("\n Утилита предназначена для аварийной U
Допустимы следующие ключи:\n\n\
-p <tty> - последовательный порт для общения с загрузчиком (по умолчанию /dev/ttyUSB0\n\
-f - грузить usbloader только до fastboot (без запуска линукса)\n\
-t <file>- взять таблицу разделов из указанного файла\n\
\n",argv[0]);
return;
@ -241,6 +262,10 @@ printf("\n Утилита предназначена для аварийной U
case 'f':
fbflag=1;
break;
case 't':
tflag=1;
strcpy(ptfile,optarg);
case '?':
case ':':
@ -327,6 +352,7 @@ for(bl=0;bl<nblk;bl++) {
return;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// fastboot-патч
if ((bl == 1) && fbflag) {
koff=locate_kernel(pbuf,blk[bl].size);
@ -336,7 +362,27 @@ for(bl=0;bl<nblk;bl++) {
}
else printf("\n В загрузчике нет ANDROID-компонента - fastboot-загрузка невозможна\n");
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// патч таблицы разделов
if ((bl ==1) && tflag) {
pt=fopen(ptfile,"r");
if (pt == 0) {
printf("\n Не найден файл %s - таблица разделов не изменена",ptfile);
goto np;
}
fread(ptbuf,1,2048,pt);
fclose(pt);
ptoff=find_ptable(pbuf,blk[bl].size);
if (ptoff == 0) {
printf("\n В загрузчике не найдена таблица разделов - замена невозможна");
}
else memcpy(pbuf+ptoff,ptbuf,2048);
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
np:
printf("\n Загрузка блока %i, адрес=%08x, размер=%i\n",bl,blk[bl].adr,blk[bl].size);
// фрмируем пакет начала блока
*((unsigned int*)&cmdhead[4])=htonl(blk[bl].size);

Loading…
Cancel
Save