📄 fmd.cpp
字号:
{
pusDest32= (volatile PULONG)g_FMDInfo.ChipBaseAddress;
WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR1,AMD_SETUP_CODE1);
// RETAILMSG(1, (TEXT("DoWordWrite: write over 0-1\r\n")));
WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR2,AMD_SETUP_CODE2);
// RETAILMSG(1, (TEXT("DoWordWrite: write over 0-2\r\n")));
WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR1,0x0020);
// RETAILMSG(1, (TEXT("DoWordWrite: write over 0-3\r\n")));
}
else
{
pusDest16= (volatile PUSHORT)g_FMDInfo.ChipBaseAddress;
WRITE_COMMAND(pusDest16+ AMD_SETUP_ADDR1,AMD_SETUP_CODE1);
// RETAILMSG(1, (TEXT("DoWordWrite: write over 0-1\r\n")));
WRITE_COMMAND(pusDest16+ AMD_SETUP_ADDR2,AMD_SETUP_CODE2);
// RETAILMSG(1, (TEXT("DoWordWrite: write over 0-2\r\n")));
WRITE_COMMAND(pusDest16+ AMD_SETUP_ADDR1,0x0020);
// RETAILMSG(1, (TEXT("DoWordWrite: write over 0-3\r\n")));
}
m_offset=physicalSectorAddr-g_FMDInfo.ChipBaseAddress;
for(k = 0 ; k < dwWordCount ; k += 1)
{
//RETAILMSG(1, (TEXT("DoWordWrite: write over 0 :chipbase=%x,block =%x des addes %x num=%x databuffer addr=%x\r\n"),
// g_FMDInfo.ChipBaseAddress,ulBlockAddress,physicalSectorAddr,dwWordCount,
// pBuffer));
if (g_bPairedFlash)
{
//m_offset=physicalSectorAddr-g_FMDInfo.ChipBaseAddress;
#if 0//AMD_unlock
pusDest32= (volatile PULONG)g_FMDInfo.ChipBaseAddress;
//RETAILMSG(1, (TEXT(" 0\r\n")));
//WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1, (AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1);
//WRITE_COMMAND(g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1,AMD_SETUP_CODE1);
// *((ULONG *)g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1)=(AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;
*(pusDest32+ AMD_SETUP_ADDR1)=(AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;
//RETAILMSG(1, (TEXT("DoWordWrite: write over 0-1\r\n")));
//WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR2, (AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2);
//WRITE_COMMAND(g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1,AMD_SETUP_CODE2);
*(pusDest32+ AMD_SETUP_ADDR2)=(AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2;
//RETAILMSG(1, (TEXT("DoWordWrite: write over 0-2\r\n")));
//WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1, (AMD_PROGRAM << 16) | AMD_PROGRAM);
//WRITE_COMMAND(g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1,AMD_PROGRAM);
*(pusDest32+ AMD_SETUP_ADDR1)=(0x0020 << 16) | 0x0020;
#endif
pusDest32= (volatile PULONG)g_FMDInfo.ChipBaseAddress;
//RETAILMSG(1, (TEXT(" 0\r\n")));
/*
//WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1, (AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1);
WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR1,AMD_SETUP_CODE1);
// *((ULONG *)g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1)=(AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;
//*(pusDest32+ AMD_SETUP_ADDR1)=(AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;
RETAILMSG(1, (TEXT("DoWordWrite: write over 0-1\r\n")));
//WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR2, (AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2);
WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR2,AMD_SETUP_CODE2);
// *((ULONG *)g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR2)=(AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2;
//*(pusDest32+ AMD_SETUP_ADDR2)=(AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2;
RETAILMSG(1, (TEXT("DoWordWrite: write over 0-2\r\n")));
//WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1, (AMD_PROGRAM << 16) | AMD_PROGRAM);
WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR1,AMD_PROGRAM);
// *((ULONG *)g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1)=(AMD_PROGRAM << 16) | AMD_PROGRAM;
//*(pusDest32+ AMD_SETUP_ADDR1)=(AMD_PROGRAM << 16) | AMD_PROGRAM;
//RETAILMSG(1, (TEXT("DoWordWrite: write over 0-3\r\n")));
RETAILMSG(1, (TEXT(" 0-0\r\n")));
//WRITE_ULONG (physicalSectorAddr + k, *(pLongBuffer+k));
//*((ULONG *)physicalSectorAddr + k)=*(pLongBuffer+k) ;
//pusDest32= (PULONG)physicalSectorAddr;
//*(pusDest32+k)=*(pLongBuffer+k) ;
*/
WRITE_COMMAND(pusDest32+ 0x00000,0x00a0);
// RETAILMSG(1, (TEXT("DoWordWrite: write over 0-4\r\n")));
*(pusDest32+(m_offset>>2)+k)=*(pLongBuffer+k) ;
//*((ULONG *)physicalSectorAddr+k)=*(pLongBuffer+k) ;
//*((ULONG *)ulBlockAddress) =*(pLongBuffer+k) ;
//WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR1,0x0090);
//WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR2,0x0000);
DelayInuSec(100);
ulCount = 0;
//RETAILMSG(1, (TEXT(" 0-0-0\r\n")));
//WRITE_COMMAND(pusDest32+(m_offset>>2)+k, AMD_RESET);
//WRITE_COMMAND((volatile ULONG *)g_FMDInfo.ChipBaseAddress, AMD_RESET);
//RETAILMSG(1, (TEXT(" 1 %x \r\n"),m_offset));
//RETAILMSG(1, (TEXT(" 1 %x \r\n"),pLongBuffer));
//RETAILMSG(1, (TEXT(" 1 %x \r\n"),*(pLongBuffer+k)));
//RETAILMSG(1, (TEXT(" 1 %x \r\n"),ulBlockAddress));
//RETAILMSG(1, (TEXT(" 1 %x \r\n"),*((ULONG *)ulBlockAddress)));
//RETAILMSG(1, (TEXT(" 1 %x \r\n"),pusDest32+(m_offset>>2)+k));
//RETAILMSG(1, (TEXT(" 1 %x \r\n"),*(pusDest32+(m_offset>>2)+k)));
while ( *(pusDest32+(m_offset>>2)+k) != *(pLongBuffer+k) )
//while ( *(pLongBuffer+k) !=*(pusDest32+(m_offset>>2)+k) )
{
//RETAILMSG(1, (TEXT("DoWordWrite: write over 1-1 =%x,%x \r\n"),*((ULONG *)physicalSectorAddr+k),*(pLongBuffer+k)));
DelayInuSec(1);
if ( ulCount++== 100)
{
RETAILMSG(1, (TEXT("DoWordWrite: %x %x\r\n"),*(pusDest32+(m_offset>>2)+k),*(pLongBuffer+k) ));
iResult = FLASH_ERR_DRV_TIMEOUT;
//return 0;
break;
}
}
//RETAILMSG(1, (TEXT("%x \r\n"),pLongBuffer+k));
//RETAILMSG(1, (TEXT("%x \r\n"),*(pLongBuffer+k) ));
//RETAILMSG(1, (TEXT("%x \r\n"),pusDest32+k));
//RETAILMSG(1, (TEXT("%x \r\n"),*(pusDest32+k) ));
// RETAILMSG(1, (TEXT("%x %x\r\n"),*(pLongBuffer+k),*((ULONG *)physicalSectorAddr+k) ));
// //RETAILMSG(1, (TEXT("DoWordWrite: write over 2 =%x,%x \r\n"),*((ULONG *)physicalSectorAddr+k),*(pLongBuffer+k)));
}
else
{
pusDest16= (PUSHORT)g_FMDInfo.ChipBaseAddress;
//RETAILMSG(1, (TEXT(" 0\r\n")));
//WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1, (AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1);
//WRITE_COMMAND(g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1,AMD_SETUP_CODE1);
// *((ULONG *)g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1)=(AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;
//*(pusDest16+ AMD_SETUP_ADDR1)=(AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;
//RETAILMSG(1, (TEXT("DoWordWrite: write over 0-1\r\n")));
//WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR2, (AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2);
//WRITE_COMMAND(g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1,AMD_SETUP_CODE2);
// *(pusDest16+ AMD_SETUP_ADDR2)=(AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2;
//RETAILMSG(1, (TEXT("DoWordWrite: write over 0-2\r\n")));
//WRITE_ULONG (g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1, (AMD_PROGRAM << 16) | AMD_PROGRAM);
//WRITE_COMMAND(g_FMDInfo.ChipBaseAddress+ AMD_SETUP_ADDR1,AMD_PROGRAM);
//*(pusDest16+ AMD_SETUP_ADDR1)=(AMD_PROGRAM << 16) | AMD_PROGRAM;
//RETAILMSG(1, (TEXT("DoWordWrite: write over 0-3\r\n")));
//RETAILMSG(1, (TEXT(" 0-0\r\n")));
//WRITE_ULONG (physicalSectorAddr + k, *(pLongBuffer+k));
//*((ULONG *)physicalSectorAddr + k)=*(pLongBuffer+k) ;
WRITE_COMMAND(pusDest16+ 0x00000,0x00a0);
*(pusDest16+(m_offset>>1)+k)=*(pShortBuffer+k) ;
DelayInuSec(1);
ulCount = 0;
//RETAILMSG(1, (TEXT(" 1\r\n")));
while ( *(pusDest16+(m_offset>>1)+k) != *(pShortBuffer+k) )
{
//RETAILMSG(1, (TEXT("DoWordWrite: write over 1-1 =%x,%x \r\n"),*((ULONG *)physicalSectorAddr+k),*(pLongBuffer+k)));
DelayInuSec(1);
if ( ulCount++== 1000 )
{
RETAILMSG(1, (TEXT("DoWordWrite: Timed out writing buffered data 1\r\n")));
iResult = FLASH_ERR_DRV_TIMEOUT;
//return 0;
break;
}
}
//RETAILMSG(1, (TEXT("%x \r\n"),pShortBuffer+k));
//RETAILMSG(1, (TEXT("%x \r\n"),*(pShortBuffer+k) ));
//RETAILMSG(1, (TEXT("%x \r\n"),pusDest16+k));
//RETAILMSG(1, (TEXT("%x \r\n"),*(pusDest16+k) ));
// //RETAILMSG(1, (TEXT("%x %x\r\n"),*(pLongBuffer+k),*((ULONG *)physicalSectorAddr+k) ));
// //RETAILMSG(1, (TEXT("DoWordWrite: write over 2 =%x,%x \r\n"),*((ULONG *)physicalSectorAddr+k),*(pLongBuffer+k)));
}
DelayInuSec(1);
ulCount = 0;
//RETAILMSG(1, (TEXT("3\r\n")));
/*
if (g_bPairedFlash)
{
if (FLASH_ERR_OK != iResult)
{
WRITE_COMMAND(g_FMDInfo.ChipBaseAddress, AMD_RESET);
RETAILMSG(1, (TEXT("DoWordWrite: Timed out writing buffered data 1\r\n")));
return FALSE;
}
if (*((ULONG *)physicalSectorAddr + k)!=*(pLongBuffer+k))
{
// Only update return value if erase operation was OK
if (FLASH_ERR_OK == iResult)
{
iResult = FLASH_ERR_DRV_VERIFY;
}
RETAILMSG(1, (TEXT("DoWordWrite: data error...addre=%x value=%x should value=%x\r\n"),
(physicalSectorAddr + k),*((ULONG *)physicalSectorAddr + k),*(pLongBuffer+k)));
}
}
else
{
if (FLASH_ERR_OK != iResult)
{
WRITE_COMMAND(g_FMDInfo.ChipBaseAddress, AMD_RESET);
RETAILMSG(1, (TEXT("DoWordWrite: Timed out writing buffered data 1\r\n")));
return FALSE;
}
if (*((USHORT *)physicalSectorAddr + k)!=*(pShortBuffer+k))
{
// Only update return value if erase operation was OK
if (FLASH_ERR_OK == iResult)
{
iResult = FLASH_ERR_DRV_VERIFY;
}
RETAILMSG(1, (TEXT("DoWordWrite: data error...addre=%x value=%x should value=%x\r\n"),
(physicalSectorAddr + k),*((USHORT *)physicalSectorAddr + k),*(pShortBuffer+k)));
}
}
RETAILMSG(1, (TEXT("DoWordWrite: write over 2\r\n")));
*/
}
if (g_bPairedFlash)
{
pusDest32= (volatile PULONG)g_FMDInfo.ChipBaseAddress;
WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR1,0x0090);
WRITE_COMMAND(pusDest32+ AMD_SETUP_ADDR2,0x0000);
// WRITE_COMMAND(g_FMDInfo.ChipBaseAddress, AMD_RESET);
}
else
{
pusDest16= (volatile PUSHORT)g_FMDInfo.ChipBaseAddress;
WRITE_COMMAND(pusDest16+ AMD_SETUP_ADDR1,0x0090);
WRITE_COMMAND(pusDest16+ AMD_SETUP_ADDR2,0x0000);
// WRITE_COMMAND(g_FMDInfo.ChipBaseAddress, AMD_RESET);
}
#endif
return NumWriteBytes;
}
#else
DWORD DoBufferedWrite(volatile ULONG ulBlockAddress,
volatile SECTOR_ADDR physicalSectorAddr,
PUCHAR pBuffer,
USHORT NumWriteBytes)
{
DWORD k = 0;
DWORD dwBusWidth = g_bPairedFlash ? sizeof(ULONG) : sizeof(USHORT);
ULONG ulCount;
// Let the flash know the size of the buffer we plan to send (note that this is a 0-based word count and we simulatenously
// write it to both flash parts (upper and lower).
DWORD dwWordCount = (NumWriteBytes / dwBusWidth) - 1;
WRITE_COMMAND(ulBlockAddress, CLEAR_STATUS_CMD);
WRITE_COMMAND(ulBlockAddress, BUFFER_WRITE_CMD);
// DelayInuSec(1000);
ulCount = 0;
while (!CHECK_STATUS(ulBlockAddress, STATUS_READY_MASK))
{
DelayInuSec(1);
if ( ulCount++ == 1000 )
{
RETAILMSG(1, (TEXT("DoBufferedWrite: Timed out writing buffered data 0\r\n")));
return 0;
}
}
WRITE_COMMAND(ulBlockAddress, CLEAR_STATUS_CMD);
// RETAILMSG(1, (TEXT("DoBufferedWrite: dwWordCount = %d should 15 \r\n"), dwWordCount));
if (g_bPairedFlash)
{
PULONG pLongBuffer = (PULONG)pBuffer;
WRITE_ULONG (ulBlockAddress, (dwWordCount << 16) | dwWordCount);
for(k = 0 ; k < NumWriteBytes ; k += dwBusWidth)
{
WRITE_ULONG (physicalSectorAddr + k, *pLongBuffer++);
ulCount = 0;
WRITE_COMMAND(ulBlockAddress, READ_STATUS_CMD);
while (!CHECK_STATUS(ulBlockAddress, STATUS_READY_MASK))
{
DelayInuSec(1);
if ( ulCount++ == 1000 )
{
RETAILMSG(1, (TEXT("DoBufferedWrite: Timed out writing buffered data 1\r\n")));
return 0;
}
}
WRITE_COMMAND(ulBlockAddress, CLEAR_STATUS_CMD);
}
}
else
{
PUSHORT pShortBuffer = (PUSHORT)pBuffer;
WRITE_USHORT (ulBlockAddress, (USHORT)dwWordCount);
for(k = 0 ; k < NumWriteBytes ; k += dwBusWidth)
{
WRITE_USHORT (physicalSectorAddr + k, *pShortBuffer++);
ulCount = 0;
WRITE_COMMAND(ulBlockAddress, READ_STATUS_CMD);
while (!CHECK_STATUS(ulBlockAddress, STATUS_READY_MASK))
{
DelayInuSec(1);
if ( ulCount++ == 1000 )
{
RETAILMSG(1, (TEXT("DoBufferedWrite: Timed out writing buffered data 2\r\n")));
return 0;
}
}
WRITE_COMMAND(ulBlockAddress, CLEAR_STATUS_CMD);
}
}
// Now program the buffer into flash...
//
WRITE_COMMAND(ulBlockAddress, BLOCK_PROCEED_CMD);
// DelayInuSec(100);
ulCount = 0;
WRITE_COMMAND(ulBlockAddress, READ_STATUS_CMD);
while (!CHECK_STATUS(ulBlockAddress, STATUS_READY_MASK))
{
DelayInuSec(1);
if ( ulCount++ == 1000 )
{
RETAILMSG(1, (TEXT("DoBufferedWrite: Timed out writing buffered data 3\r\n")));
return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -