📄 flash.cpp
字号:
UINT32* pDestineStart;
UCHAR* pTempStr;
UCHAR* pTempStr1;
UCHAR* pTempStr2;
pTempStr2 = pInfo;
nTempAddr = nAddr;
nTempAddr += FLASH_BASE_ADDRESS;
lTempLen = nLen;
if ((nTempAddr + lTempLen) > (g_anFlashTailAddr[0] + FLASH_NORMAL_BLOCK_SIZE))
return 0;
CHIP_UNPROTECT;
while (lTempLen > 0)
{
if (nTempAddr >= g_anFlashTailAddr[0])
{
// 将所有的尾部参数扇区作为一个扇区处理,只是需要分别擦除
// 其他读写都作为一个正常扇区处理
if (nTempAddr >= g_anFlashTailAddr[0] + FLASH_NORMAL_BLOCK_SIZE)
{
lTempLen = 0;
continue;
}
// 4M flash, start block is unordered address
// read all header blocks
pTempStr = (UCHAR*)(g_anFlashTailAddr[0]);
for (j = 0; j < FLASH_NORMAL_BLOCK_SIZE; j ++)
*(s_acFlashBlockBuffer + j) = *(pTempStr + j);
lTempLen1 = lTempLen;
// combine data
if (lTempLen1 + nTempAddr > FLASH_NORMAL_BLOCK_SIZE + g_anFlashTailAddr[0])
{
if (nTempAddr > FLASH_NORMAL_BLOCK_SIZE + g_anFlashTailAddr[0])
{
lTempLen1 = 0;
}
else
{
lTempLen1 = FLASH_NORMAL_BLOCK_SIZE + g_anFlashTailAddr[0] - nTempAddr;
}
}
pTempStr1 = (UCHAR*)(s_acFlashBlockBuffer + nTempAddr - g_anFlashTailAddr[0]);
for (i = 0; i < lTempLen1; i ++)
*(pTempStr1 + i) = *(pTempStr2 + i);
// unlock and erase all header blocks are unlocked, and earse all lastest blocks
pStates = (UINT32*)(g_anFlashTailAddr[0]);
*pStates = 0x00500050; // clear status
for( int i = 0; i < 8; i++ )
{
// unlock
pStates = ( UINT32*)(g_anFlashTailAddr[i]);
*pStates = 0x00600060;
*pStates = 0x00d000d0;
*pStates = 0x00900090;
// 注意使用g_anFlashTailAddr[0],而不是使用g_anFlashTailAddr[i]
while (*((UINT32*)(g_anFlashTailAddr[0] + g_nSecondAddr))
&& 0x00010001);
*pStates = 0xffffffff;
// erase
pStates = ( UINT32*)(g_anFlashTailAddr[i]);
*pStates = 0x00500050; // clear status
pDestineStart = (UINT32*)(g_anFlashTailAddr[i]);
*pDestineStart = 0x00200020;
*pDestineStart = 0x00d000d0;
*pStates = 0x00700070;
while( (*pStates & SR7_OK) != SR7_OK );
*pStates = 0x00500050;
*pStates = 0xffffffff;
}
// write data
pStates = (UINT32*)(g_anFlashTailAddr[0]);
*pStates = 0x00500050;
pSourceStart = (UINT32*)s_acFlashBlockBuffer;
pDestineStart = (UINT32*)(g_anFlashTailAddr[0]);
for (i = 0; i < FLASH_NORMAL_BLOCK_SIZE/4;i ++)
{
*pStates = 0x00400040;
pDestineStart[i] = pSourceStart[i];
*pStates = 0x00700070;
while( (*pStates & SR7_OK) != SR7_OK );
*pStates = 0x00500050;
}
*pStates = 0xffffffff;
lTempLen = 0;
continue; // data's writing is over
}
else // --- if (nTempAddr < FLASH_TAIL_POS)
{
// read current block, nTempAddr1 is start address of current block
nTempAddr1 = nTempAddr / FLASH_NORMAL_BLOCK_SIZE * FLASH_NORMAL_BLOCK_SIZE;
pTempStr = (UCHAR*)(nTempAddr1);
for (int j = 0; j < FLASH_NORMAL_BLOCK_SIZE; j ++)
*(s_acFlashBlockBuffer + j) = *(pTempStr + j);
// combine data
lTempLen1 = lTempLen;
if (lTempLen1 + nTempAddr > FLASH_NORMAL_BLOCK_SIZE + nTempAddr1)
{
lTempLen1 = FLASH_NORMAL_BLOCK_SIZE + nTempAddr1 - nTempAddr;
}
pTempStr1 = (UCHAR*)(s_acFlashBlockBuffer + nTempAddr - nTempAddr1);
for (j = 0; j < lTempLen1; j ++)
*(pTempStr1 + j) = *(pTempStr2 + j);
// unlock
pStates = (UINT32*)(nTempAddr1);
*pStates = 0x00500050; // clear status
// 注意unblock最后读状态需要使用 block的第二个地址,即使用nTempAddr1 + g_nSecondAddr
pStates = ( UINT32*)(nTempAddr1);
*pStates = 0x00600060;
*pStates = 0x00d000d0;
*pStates = 0x00900090;
while (*((UINT32*)(nTempAddr1 + g_nSecondAddr)) && 0x00010001);
*pStates = 0xffffffff;
// erase
pStates = (UINT32*)(nTempAddr1);
*pStates = 0x00500050; // clear status
pDestineStart = (UINT32*)(nTempAddr1);
*pDestineStart = 0x00200020;
*pDestineStart = 0x00d000d0;
*pStates = 0x00700070;
while( (*pStates & SR7_OK) != SR7_OK );
*pStates = 0x00500050;
*pStates = 0xffffffff;
// write data
pStates = (UINT32*)(nTempAddr1);
*pStates = 0x00500050;
pSourceStart = (UINT32*)s_acFlashBlockBuffer;
pDestineStart = (UINT32*)(nTempAddr1);
for (i = 0; i < FLASH_NORMAL_BLOCK_SIZE/4; i ++)
{
*pStates = 0x00400040;
*(pDestineStart + i) = *(pSourceStart + i);
*pStates = 0x00700070;
while( (*pStates & SR7_OK) != SR7_OK );
*pStates = 0x00500050;
}
lTempLen -= lTempLen1;
nTempAddr += lTempLen1;
pTempStr2 += lTempLen1;
continue; // continue
} // end if (nTempAddr >= g_anFlashTailAddr[0])
} // end while(nTempLen > 0)
*pStates = 0xffffffff; // change to read mode
CHIP_PROTECT;
// check up by checksum
UINT32 nCheckSum;
UCHAR* pFlashInfo;
nCheckSum = 0;
nLen &= (~1);
nTempAddr = nAddr;
nTempAddr += FLASH_BASE_ADDRESS;
pFlashInfo = (UCHAR* )(nTempAddr);
for ( i = 0; i < nLen; i += 2)
{
if (*((UINT16*)(pInfo + i)) != *((UINT16*)(pFlashInfo + i)))
{
break;
}
nCheckSum += *((UINT16*)(pInfo + i));
}
#ifdef BIOS_DEBUG
char acTempStr[100];
sprintf(acTempStr, "Flash Checksum: 0x%x",nCheckSum);
TextOut(300, 340, 12, 0, acTempStr);
#endif
if (i == nLen)
{
return TRUE;
}
else
{
return FALSE;
}
}
#ifdef BIOS_DEBUG
void Test_4MFlash()
{
UINT32 nAddr;
char* pTemp = "123456";
char* pTemp1 = "abcdef";
char acTemp2[20];
int i;
if (g_nFlashSizeType == FLASH_SIZE_2M)
{
for (i = 0; i < 8; i ++)
{
if (!(i % 2))
{
nAddr = 0x20000 * i * 2;
WriteFlash(nAddr, (UINT8*)pTemp, 7);
}
else
{
nAddr = 0x20000 * (i-1) * 2 + 0x03;
WriteFlash(nAddr, (UINT8*)pTemp1, 7);
}
}
nAddr = 0x1e0000;
for (i = 0; i < 8; i ++)
{
nAddr += 0x4000;
WriteFlash(nAddr, (UINT8*)pTemp1, 6);
}
for (i = 0; i < 16; i +=2)
{
nAddr = 0x20000 * i * 2 + FLASH_BASE_ADDRESS;
for (int j = 0; j < 10; j ++)
{
acTemp2[j] = *((char*)(nAddr+j));
}
TextOut(20, i * 10, 15, 0, acTemp2);
}
nAddr = 0x1f0000 + FLASH_BASE_ADDRESS;
for (int j = 0; j < 14; j ++)
{
acTemp2[j] = *((char*)(nAddr+j));
}
TextOut(20, 300, 15, 0, acTemp2);
}
if (g_nFlashSizeType == FLASH_SIZE_4M)
{
for (i = 0; i < 16; i ++)
{
if (!(i % 2))
{
nAddr = 0x20000 * i * 2;
WriteFlash(nAddr, (UINT8*)pTemp, 7);
}
else
{
nAddr = 0x20000 * (i-1) * 2 + 0x03;
WriteFlash(nAddr, (UINT8*)pTemp1, 7);
}
}
nAddr = 0x3f0000;
WriteFlash(nAddr, (UINT8*)pTemp1, 6);
WriteFlash(nAddr+6, (UINT8*)pTemp, 7);
for (i = 0; i < 16; i +=2)
{
nAddr = 0x20000 * i * 2 + FLASH_BASE_ADDRESS;
for (int j = 0; j < 10; j ++)
{
acTemp2[j] = *((char*)(nAddr+j));
}
TextOut(20, i * 10, 15, 0, acTemp2);
}
nAddr = 0x3f0000 + FLASH_BASE_ADDRESS;
for (int j = 0; j < 14; j ++)
{
acTemp2[j] = *((char*)(nAddr+j));
}
TextOut(20, 300, 15, 0, acTemp2);
}
return;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -