📄 flash.c
字号:
while (Count > 0) {
Length = Count;
if (Length > (UINT16)(FlashPageByte - PageOffs))
Length = (UINT16)(FlashPageByte - PageOffs);
PageAddr = (INT32)ByteAddr >> FlashPageBit;
FlashBlockOffset(&PageAddr);
for (i = PageOffs, j = 0; j < Length; i++, j++) {
FlashBuffer[i] = pSource[j];
}
FlashWriteRealPage(PageAddr, FlashBuffer);
PageOffs = 0;
ByteAddr += Length;
pSource += Length;
Count -= Length;
#if 0
PollingUartRecv();
#endif
#ifdef SUPPORT_WATCH_DOG
PollingWatchDog();
#endif
#ifdef SUPPORT_DSA_DEVICE
PollingDSA();
#endif
}
}
#endif
#endif SUPPORT_FLASH_WRITE
#if 0
void FlashReadPage(UINT32 PageAddr, UINT16 BufferAddr, BYTE *pTarget, UINT16 Count)
{
#ifdef SUPPORT_GPIO_BUS_FUNCTION
UINT16 i, j;
FlashBlockOffset(&PageAddr);
FlashReadRealPage(PageAddr, FlashBuffer);
for (i = BufferAddr, j = 0; j < Count; i++, j++) {
pTarget[j] = FlashBuffer[i];
}
#else
UINT16 i;
FlashWaitBusy();
FLASH_SCK_LOW;
FLASH_CS_LOW;
FlashSendData(CMD_MEMORY_ARRAY_READ); FlashDelay(80);
FlashSendData((PageAddr >> 24) & 0xff); FlashDelay(80);
FlashSendData((PageAddr >> 16) & 0xff); FlashDelay(80);
FlashSendData((PageAddr >> 8) & 0xff); FlashDelay(80);
FlashSendData((PageAddr ) & 0xff); FlashDelay(80);
FlashSendData((BufferAddr >> 8) & 0xff); FlashDelay(80);
FlashSendData((BufferAddr ) & 0xff); FlashDelay(80);
FlashSendData((Count >> 8) & 0xff); FlashDelay(80);
FlashSendData((Count ) & 0xff); FlashDelay(80);
FlashSendData(CMD_STATUS_REG_READ);
for (i = 0; i < MAX_BUSY_DELAY; i++) {
FlashDelay(2000);
if (FlashSendReadData(CMD_STATUS_REG_READ) == STATUS_NOT_BUSY)
break;
}
if (i >= MAX_BUSY_DELAY) {
// psprintf(LineBuffer, "ERROR : FLASH Wait too long.(%04x)", i);
// MenuPrintMessage(4);
psprintf(LineBuffer, "无效卡或者卡接触不良");
MenuPrintMessage(3);
psprintf(LineBuffer, "请关机,检查卡");
MenuPrintMessage(4);
while (1);
}
FlashReadData();
for (i = 0; i < Count; i++) {
pTarget[i] = FlashReadData();
}
FLASH_CS_HIGH;
#endif
#if 0
PollingUartRecv();
#endif
#ifdef SUPPORT_WATCH_DOG
PollingWatchDog();
#endif SUPPORT_WATCH_DOG
#ifdef SUPPORT_DSA_DEVICE
PollingDSA();
#endif
}
void FlashReadPages(UINT32 PageAddr, UINT16 BufferAddr, BYTE *pTarget, UINT32 Count)
{
UINT32 Length;
while (Count > 0) {
Length = Count;
if (Length > (UINT16)(FLASH_PAGE_SIZE - BufferAddr))
Length = (UINT16)(FLASH_PAGE_SIZE - BufferAddr);
FlashReadPage(PageAddr, BufferAddr, pTarget, Length);
PageAddr++;
BufferAddr = 0;
pTarget += Length;
Count -= Length;
}
}
#endif
#ifdef SUPPORT_GPIO_BUS_FUNCTION
void FlashReadByte(UINT32 ByteAddr, BYTE *pTarget, UINT32 Count)
{
UINT32 i, j;
UINT32 Length;
UINT32 PageAddr;
UINT16 PageOffs;
PageOffs = ByteAddr & (FlashPageByte - 1);
while (Count > 0) {
Length = Count;
if (Length > (UINT16)(FlashPageByte - PageOffs))
Length = (UINT16)(FlashPageByte - PageOffs);
PageAddr = (INT32)ByteAddr >> FlashPageBit;
FlashBlockOffset(&PageAddr);
FlashReadRealPage(PageAddr, FlashBuffer);
for (i = PageOffs, j = 0; j < Length; i++, j++) {
pTarget[j] = FlashBuffer[i];
}
PageOffs = 0;
ByteAddr += Length;
pTarget += Length;
Count -= Length;
#if 0
PollingUartRecv();
#endif
#ifdef SUPPORT_WATCH_DOG
PollingWatchDog();
#endif
#ifdef SUPPORT_DSA_DEVICE
PollingDSA();
#endif
}
}
#endif
BYTE FlashSelfTest()
{
#ifdef SUPPORT_GPIO_BUS_FUNCTION
FlashInit();
if (FlashMaker == 0xFF || FlashSizer == 0xFF)
return 0;
FlashBlockCheck();
if (FlashBlockNumber > FLASH_TABLE_SIZE)
return 0;
#else
BYTE Data;
UINT16 i;
FLASH_SCK_LOW;
FLASH_CS_LOW;
FlashSendData(CMD_STATUS_REG_READ);
for (i = 0; i < (MAX_BUSY_DELAY >> 2); i++) {
polling();
FlashDelay(500);
Data = FlashSendReadData(CMD_STATUS_REG_READ);
#ifdef MONITOR_FLASH_TEST
psprintf(LineBuffer, "STATUS:%02x-%04x", Data, i);
MenuPrintString(2, 1, LineBuffer);
#endif
if (Data == STATUS_NOT_BUSY) {
break;
}
}
FLASH_CS_HIGH;
if (i >= (MAX_BUSY_DELAY >> 2)) {
#if 0
while (1) {
polling();
}
#endif
return 0;
}
#if 0
#if 1
((BYTE *)CalcByteBuffer)[100] = 0x12;
((BYTE *)CalcByteBuffer)[101] = 0xCF;
((BYTE *)CalcByteBuffer)[102] = 0x70;
#else
((BYTE *)CalcByteBuffer)[100] = 0xCF;
((BYTE *)CalcByteBuffer)[101] = 0x70;
((BYTE *)CalcByteBuffer)[102] = 0x12;
((BYTE *)CalcByteBuffer)[103] = 0x00;
#endif
// FlashErasePage(-32L);
// FlashWritePage(-32L, 0x0000L, CalcByteBuffer, FLASH_PAGE_SIZE);
FlashEraseByte(-(FlashBlockPage << FlashPageBit));
FlashWriteByte(-(FlashBlockPage << FlashPageBit), CalcByteBuffer, FlashPageByte);
while (1);
#endif
#endif
#if 0
// FlashReadPage(-32L, 0x0000L, CalcByteBuffer, FLASH_PAGE_SIZE);
FlashReadByte(-(FlashBlockPage << FlashPageBit), CalcByteBuffer, FlashPageByte);
#ifdef MONITOR_FLASH_TEST
#if 0
psprintf(LineBuffer, "%08x-%08x-%02x-%02x-%02x-%02x",
((UINT32 *)CalcByteBuffer)[0 / 4],
((UINT32 *)CalcByteBuffer)[4 / 4],
#elif 1
psprintf(LineBuffer, "%08x-%08x-%02x-%02x-%02x-%02x",
*((UINT32 *)(CalcByteBuffer)),
*((UINT32 *)(CalcByteBuffer + 4)),
#else
psprintf(LineBuffer, "%02x%02x%02x%02x-%02x%02x%02x%02x-%02x-%02x-%02x-%02x",
CalcByteBuffer[ 3],
CalcByteBuffer[ 2],
CalcByteBuffer[ 1],
CalcByteBuffer[ 0],
CalcByteBuffer[ 7],
CalcByteBuffer[ 6],
CalcByteBuffer[ 5],
CalcByteBuffer[ 4],
#endif
CalcByteBuffer[100],
CalcByteBuffer[101],
CalcByteBuffer[102],
CalcByteBuffer[103]);
MenuPrintString(2, 2, LineBuffer);
#if 0
psprintf(LineBuffer, "%08x-%08x-%02x-%02x-%02x-%02x",
((UINT32 *)CalcByteBuffer)[ 8 / 4],
((UINT32 *)CalcByteBuffer)[12 / 4],
#elif 1
psprintf(LineBuffer, "%08x-%08x-%02x-%02x-%02x-%02x",
*((UINT32 *)(CalcByteBuffer + 8)),
*((UINT32 *)(CalcByteBuffer + 12)),
#else
psprintf(LineBuffer, "%02x%02x%02x%02x-%02x%02x%02x%02x-%02x-%02x-%02x-%02x",
CalcByteBuffer[ 11],
CalcByteBuffer[ 10],
CalcByteBuffer[ 9],
CalcByteBuffer[ 8],
CalcByteBuffer[ 15],
CalcByteBuffer[ 14],
CalcByteBuffer[ 13],
CalcByteBuffer[ 12],
#endif
CalcByteBuffer[100],
CalcByteBuffer[101],
CalcByteBuffer[102],
CalcByteBuffer[103]);
MenuPrintString(2, 3, LineBuffer);
#endif
#else
FATType = FAT_TYPE_UNKNOWN;
// FlashReadPage(65152L, 0x0000L, CalcByteBuffer, FLASH_PAGE_SIZE);
FlashReadByte(65152L << FlashPageBit, CalcByteBuffer, FLASH_PAGE_SIZE);
if (strcmp(CalcByteBuffer, "TMLH-CN") == 0) {
#ifdef MONITOR_FLASH_TEST
strcpy( LineBuffer, "Card (1) ");
strcpylen(LineBuffer + 9, CalcByteBuffer + 10, 19);
MenuPrintString(2, 2, LineBuffer);
strcpy( LineBuffer, "File (1) ");
strcpylen(LineBuffer + 9, CalcByteBuffer + 30, 19);
MenuPrintString(2, 3, LineBuffer);
#endif
FATType = FAT_TYPE_ZERO;
}
// FlashReadPage(-32L, 0x0000L, CalcByteBuffer, FLASH_PAGE_SIZE);
FlashReadByte(-(FlashBlockPage << FlashPageBit), CalcByteBuffer, FLASH_PAGE_SIZE);
if (FATType == FAT_TYPE_UNKNOWN) {
if (strcmp(CalcByteBuffer + 200, "TMLH-CN") == 0) {
#ifdef MONITOR_FLASH_TEST
strcpy( LineBuffer, "Card (2) ");
strcpylen(LineBuffer + 9, CalcByteBuffer + 210, 19);
MenuPrintString(2, 2, LineBuffer);
strcpy( LineBuffer, "File (2) ");
strcpylen(LineBuffer + 9, CalcByteBuffer + 230, 19);
MenuPrintString(2, 3, LineBuffer);
#endif
FATType = FAT_TYPE_INDEX;
}
}
#endif
#if 0
#ifdef SUPPORT_TEST_FUNCTION
// TestFlash();
#endif
while (1) {
polling();
}
#endif
#if 0
// FlashErasePage(-32L);
FlashEraseByte(-(FlashBlockPage << FlashPageBit));
#endif
return (CalcByteBuffer[100] == 0xCF &&
CalcByteBuffer[101] == 0x70 &&
CalcByteBuffer[102] == 0x12);
}
#ifdef SUPPORT_TEST_FUNCTION
#define TEST_FLASH_PAGES (32 * 64 * 1) // FLASH_TOTAL_PAGE
#define TEST_FLASH_ADDRESS ((FLASH_PAGE_SIZE * 4 + 64) / 4)
void TestFlash()
{
#ifdef SUPPORT_FLASH_WRITE
UINT32 i, j, k;
UINT32 DataSize, StartAddr;
#ifdef FLASH_TABLE_NO
StartAddr = TEST_FLASH_PAGES * (FLASH_TABLE_NO - 1);
#else
StartAddr = 0x8800;
#endif
#if 1
for (DataSize = 0, i = 0, j = -1; i < TEST_FLASH_PAGES; i += 32) {
if (j != i * 100 / TEST_FLASH_PAGES) {
j = i * 100 / TEST_FLASH_PAGES;
psprintf(LineBuffer, "FLASH Erasing... (%02d%s)", j, "%");
MenuPrintMessage(3);
}
FlashErasePage(i + StartAddr);
}
psprintf(LineBuffer, "FLASH Erasing... (%02d%s) Over!", 100, "%");
MenuPrintMessage(3);
#endif
#if 1
for (DataSize = 0, i = 0, j = -1; i < TEST_FLASH_PAGES; i++) {
if (j != i * 100 / TEST_FLASH_PAGES) {
j = i * 100 / TEST_FLASH_PAGES;
psprintf(LineBuffer, "FLASH Writting... (%02d%s)", j, "%");
MenuPrintMessage(2);
}
FlashWritePage(i + StartAddr, 0x0000, (BYTE *)(ASC16 + DataSize), FLASH_PAGE_SIZE);
DataSize += FLASH_PAGE_SIZE;
if (DataSize >= FLASH_PAGE_SIZE * 8)
DataSize = 0;
}
psprintf(LineBuffer, "FLASH Writting... (%02d%s) Over!", 100, "%");
MenuPrintMessage(2);
#endif
#if 1
for (DataSize = 0, i = 0, j = -1; i < TEST_FLASH_PAGES; i++) {
#if 0
if (j != i * 100 / TEST_FLASH_PAGES) {
j = i * 100 / TEST_FLASH_PAGES;
psprintf(LineBuffer, "FLASH Reading... (%02d%s)", j, "%");
MenuPrintMessage(2);
}
#endif
FlashReadPage(i + StartAddr, 0x0000, CalcByteBuffer, FLASH_PAGE_SIZE);
for (k = 0; k < FLASH_PAGE_SIZE; k++) {
if ((BYTE)(CalcByteBuffer[k]) != (BYTE)(ASC16[k + DataSize])) {
break;
}
}
if (k < FLASH_PAGE_SIZE) {
psprintf(LineBuffer, "FLASH Read Page (%04d) Addr (%03d) ERROR!", i, k);
MenuPrintMessage(2);
psprintf(LineBuffer, "FLASH (%02x%02x%02x%02x) - DATA (%02x%02x%02x%02x)",
(BYTE)(CalcByteBuffer[k]),
(BYTE)(CalcByteBuffer[k + 1]),
(BYTE)(CalcByteBuffer[k + 2]),
(BYTE)(CalcByteBuffer[k + 3]),
(BYTE)(ASC16[k + i * FLASH_PAGE_SIZE]),
(BYTE)(ASC16[k + 1 + i * FLASH_PAGE_SIZE]),
(BYTE)(ASC16[k + 2 + i * FLASH_PAGE_SIZE]),
(BYTE)(ASC16[k + 3 + i * FLASH_PAGE_SIZE]));
MenuPrintMessage(3);
break;
}
else {
psprintf(LineBuffer, "FLASH Read Page (%04d) OK!", i + 1);
MenuPrintMessage(2);
}
DataSize += FLASH_PAGE_SIZE;
if (DataSize >= FLASH_PAGE_SIZE * 8)
DataSize = 0;
}
// psprintf(LineBuffer, "FLASH Reading... (%02d%s) Over!", 100, "%");
// MenuPrintMessage(2);
if (i < TEST_FLASH_PAGES) {
return;
}
#endif
#if 0
FlashErasePage(0x0000);
FlashWritePage(0x0000, 0x0000, (BYTE *)(ASC16 + 0), FLASH_PAGE_SIZE);
#endif
#if 0
FlashReadPage(0x0000 + StartAddr, 0x0000, CalcByteBuffer, FLASH_PAGE_SIZE);
#else
FlashReadPages(0x0000 + StartAddr, 0x0000, CalcByteBuffer, FLASH_PAGE_SIZE * 2 + 200);
#endif
psprintf(LineBuffer, "FLASH:%08x-%08x-%08x",
((UINT32 *)CalcByteBuffer)[TEST_FLASH_ADDRESS / 4],
((UINT32 *)CalcByteBuffer)[TEST_FLASH_ADDRESS / 4 + 1],
((UINT32 *)CalcByteBuffer)[TEST_FLASH_ADDRESS / 4 + 2]);
MenuPrintMessage(3);
for (DataSize = 0, i = 0; i < 0x1000; i++, DataSize++) {
((BYTE *)CalcByteBuffer)[(UINT32)i] = ((BYTE *)ASC16)[(UINT32)DataSize];
}
psprintf(LineBuffer, "DATA :%08x-%08x-%08x",
((UINT32 *)CalcByteBuffer)[(UINT32)(TEST_FLASH_ADDRESS / 4)],
((UINT32 *)CalcByteBuffer)[(UINT32)(TEST_FLASH_ADDRESS / 4 + 1)],
((UINT32 *)CalcByteBuffer)[(UINT32)(TEST_FLASH_ADDRESS / 4 + 2)]);
MenuPrintMessage(4);
#endif SUPPORT_FLASH_WRITE
}
#endif
#endif SUPPORT_FLASH_SERIAL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -