Project

General

Profile

完成 #293 » 0001-sd-update-fix-sd-card-update-can-not-update-loader.patch

余 顺, 04/22/2026 07:08 AM

View differences:

external/recovery/update_engine/rkboot.c
USHORT m_usFlashDataSec;
USHORT m_usFlashBootSec;
DWORD m_dwLoaderSize;
DWORD m_dwLoaderDataSize;
USHORT m_usFlashHeadSec;
DWORD m_dwLoaderSize;
DWORD m_dwLoaderDataSize;
DWORD m_dwLoaderHeadSize;
DWORD uiSecNumPerIDB;
size_t uiFlashPageSize;
size_t uiFlashBlockSize;
USHORT usPhyBlokcPerIDB;
bool m_bRc4Disable;
bool m_NewIDBFlag;
DWORD m_idBlockOffset[IDB_BLOCKS];
long long m_FlashSize;
......
return 0;
}
static int MakeNewIDBlockData(PBYTE lpIDBlock, PBYTE loaderHeadBuffer, PBYTE loaderCodeBuffer, PBYTE loaderDataBuffer)
{
int i;
if (lpIDBlock == NULL || loaderHeadBuffer == NULL ||
loaderCodeBuffer == NULL || loaderDataBuffer == NULL)
return -1;
if (m_bRc4Disable) {
//close rc4 encryption
for (i = 0; i < m_dwLoaderHeadSize / SECTOR_SIZE; i++) {
P_RC4(loaderHeadBuffer + SECTOR_SIZE * i, SECTOR_SIZE);
}
for (i = 0; i < m_dwLoaderDataSize / SECTOR_SIZE; i++) {
P_RC4(loaderDataBuffer + SECTOR_SIZE * i, SECTOR_SIZE);
}
for (i = 0; i < m_dwLoaderSize / SECTOR_SIZE; i++) {
P_RC4(loaderCodeBuffer + SECTOR_SIZE * i, SECTOR_SIZE);
}
}
memcpy(lpIDBlock, loaderHeadBuffer, m_dwLoaderHeadSize);
memcpy(lpIDBlock + SECTOR_SIZE * m_usFlashHeadSec, loaderDataBuffer, m_dwLoaderDataSize);
memcpy(lpIDBlock + SECTOR_SIZE * (m_usFlashHeadSec + m_usFlashDataSec), loaderCodeBuffer, m_dwLoaderSize);
LOGI("MakeNewIDBlockData out\n");
return 0;
}
static void calcIDBCount()
{
uiSecNumPerIDB = 4 + m_usFlashDataSec + m_usFlashBootSec;
if (m_NewIDBFlag == false) {
uiSecNumPerIDB = 4 + m_usFlashDataSec + m_usFlashBootSec;
} else {
uiSecNumPerIDB = m_usFlashHeadSec + m_usFlashDataSec + m_usFlashBootSec;
}
usPhyBlokcPerIDB = ((uiSecNumPerIDB > 0) ? ((uiSecNumPerIDB - 1) / 8 + 1) : (uiSecNumPerIDB));
LOGI("usPhyBlokcPerIDB = %d.\n", usPhyBlokcPerIDB);
}
......
//debug for 3308
//256 为128k 的起始位置
//每256k 备份一份
lseek64(fd_dest, (i * 512)*SECTOR_SIZE, SEEK_SET);
lseek64(fd_dest, (i * 1024)*SECTOR_SIZE, SEEK_SET);
if (write(fd_dest, lpIDBlock, dwSectorNum * SECTOR_SIZE) != dwSectorNum * SECTOR_SIZE) {
close(fd_dest);
LOGE("[%s:%d] error (%s).\n", __func__, __LINE__, strerror(errno));
......
LOGE("pBootHead->uiTag!=0x544F4F42 && pBootHead->uiTag!=0x2052444C, cur is 0x%08x\n", pBootHead->uiTag );
return false;
}
if (pBootHead->uiTag == 0x2052444C) {
m_NewIDBFlag = true;
LOGI("this is new IDB flag\n");
} else {
m_NewIDBFlag = false;
}
if (pBootHead->ucRc4Flag) {
m_bRc4Disable = true;
......
m_dwLoaderSize = getLoaderSizeAndData(loaderName, data_buf, &loaderCodeBuffer);
m_usFlashBootSec = PAGEALIGN(BYTE2SECTOR(m_dwLoaderSize)) * 4;
LOGI("m_usFlashBootSec = %d, m_dwLoaderSize = %d.\n", m_usFlashBootSec, m_dwLoaderSize);
unsigned char *loaderHeadBuffer = NULL;
if (m_NewIDBFlag == true) {
char loaderHeadName[] = "FlashHead";
m_dwLoaderHeadSize = getLoaderSizeAndData(loaderHeadName, data_buf, &loaderHeadBuffer);
m_usFlashHeadSec = PAGEALIGN(BYTE2SECTOR(m_dwLoaderHeadSize)) * 4;
LOGI("m_usFlashHeadSec = %d, m_dwLoaderSize = %d.\n", m_usFlashHeadSec, m_dwLoaderHeadSize);
}
calcIDBCount();
reserveIDBlock();
......
if ( !pIDBData )
return false;
memset(pIDBData, 0, uiSecNumPerIDB * SECTOR_SIZE);
if (MakeIDBlockData(pIDBData, loaderCodeBuffer, loaderDataBuffer) != 0 ) {
LOGE("[%s:%d] MakeIDBlockData failed.\n", __func__, __LINE__);
return false;
if (m_NewIDBFlag == true) {
MakeNewIDBlockData(pIDBData, loaderHeadBuffer, loaderCodeBuffer, loaderDataBuffer);
} else {
if (MakeIDBlockData(pIDBData, loaderCodeBuffer, loaderDataBuffer) != 0 ) {
LOGE("[%s:%d] MakeIDBlockData failed.\n", __func__, __LINE__);
return false;
}
}
if (WriteIDBlock(pIDBData, uiSecNumPerIDB, dest_path) != 0) {
......
free(pIDBData);
free(loaderCodeBuffer);
free(loaderDataBuffer);
if (m_NewIDBFlag == true) {
free(loaderHeadBuffer);
}
return true;
}
    (1-1/1)