📄 wridblock.lib
字号:
/*** BeginHeader */
#ifndef MY_WRIDBLOCK_LIB
#define MY_WRIDBLOCK_LIB
/*** EndHeader */
#ifndef _FLASH_
#error "------Program Must Run In FLASH!------"
#endif
#ifndef GCPU
#define GCPU 0x2E
#endif
#ifndef GREV
#define GREV 0x2F
#endif
/*** BeginHeader SYSIDBLCOK_MAC */
xdata SYSIDBLCOK_MAC { '\x00', '\x90', '\xC2', '\x11', '\x22', '\x33' };
/*** EndHeader */
/*** BeginHeader SetTimeStamp */
void SetTimeStamp(unsigned long timeStamp);
/*** EndHeader */
void SetTimeStamp(unsigned long timeStamp)
{
auto struct tm t;
mktm(&t, timeStamp);
SysIDBlock.timestamp[0] = (t.tm_year + 1900) / 100;
SysIDBlock.timestamp[1] = t.tm_year % 100;
SysIDBlock.timestamp[2] = t.tm_mon;
SysIDBlock.timestamp[3] = t.tm_mday;
SysIDBlock.timestamp[4] = t.tm_hour;
SysIDBlock.timestamp[5] = t.tm_min;
SysIDBlock.timestamp[6] = t.tm_sec;
}
/*** BeginHeader GetFlashID */
int GetFlashID(void);
/*** EndHeader */
int GetFlashID(void)
{
static int id;
#asm
#if __SEPARATE_INST_DATA__ && FLASH_COMPILE
ld hl, _GetFlashID
lcall _CallRAMFunction
#else
call _GetFlashID
#endif
ld (id), hl
#endasm
return(id);
}
/*** BeginHeader GetCPUID */
int GetCPUID(void);
/*** EndHeader */
int GetCPUID(void)
{
static int id;
#asm
ioi ld a, (GCPU)
and 0x1F
ld (id+1), a
ioi ld a, (GREV)
and 0x1F
ld (id), a
#endasm
return id;
}
/*** BeginHeader WriteIDBlock */
int WriteIDBlock(int MyProductID);
/*** EndHeader */
int WriteIDBlock(int MyProductID)
{
auto int iLen, iCrc;
auto int iSaveMB1or3CR;
auto char div19200val;
auto unsigned long ulPhysAddr;
auto int iReturn;
iReturn = 0;
if( (_readIDBlock(0x01 | 0x02) != 0) || (MyProductID != SysIDBlock.productID) )
{
iSaveMB1or3CR = MB1CRShadow;
WrPortI(MB1CR, &MB1CRShadow, FLASH_WSTATES | 0x00);
_InitFlashDriver(0x01 | 0x02);
memset(&SysIDBlock, 0x00, sizeof(SysIDBlock));
SysIDBlock.tableVersion = 4;
SysIDBlock.productID = MyProductID;
SysIDBlock.vendorID = 1;
SetTimeStamp(SEC_TIMER);
SysIDBlock.flashID = GetFlashID();
SysIDBlock.flashSize = _FLASH_SIZE_;
SysIDBlock.flashType = _FlashInfo.writeMode;
SysIDBlock.sectorSize = _FlashInfo.sectorSize;
SysIDBlock.numSectors = _FlashInfo.numSectors;
SysIDBlock.flashSpeed = 0x00;
SysIDBlock.ramID = 0x01;
SysIDBlock.ramSize = _RAM_SIZE_;
SysIDBlock.ramSpeed = 0x00;
SysIDBlock.cpuID = GetCPUID();
xmem2root(&div19200val, (unsigned long)divider19200, sizeof(char));
SysIDBlock.crystalFreq = div19200val * 614400ul;
xmem2root(SysIDBlock.macAddr, SYSIDBLCOK_MAC, 6);
SysIDBlock.idBlockSize = sizeof(SysIDBlock);
SysIDBlock.userBlockSize = 0x4000 - (int) SysIDBlock.idBlockSize;
SysIDBlock.userBlockLoc = 0x4000 - (int) SysIDBlock.idBlockSize;
SysIDBlock.marker[0] = 0x55;
SysIDBlock.marker[1] = 0xAA;
SysIDBlock.marker[2] = 0x55;
SysIDBlock.marker[3] = 0xAA;
SysIDBlock.marker[4] = 0x55;
SysIDBlock.marker[5] = 0xAA;
iLen = (int)(&SysIDBlock.productName[29]) - (int)(&SysIDBlock.tableVersion) + 1;
iCrc = getcrc((char *)(&SysIDBlock), iLen, 0x0000);
iCrc = getcrc((char *)(&SysIDBlock.idBlockSize), 16, iCrc);
SysIDBlock.idBlockCRC = iCrc;
ulPhysAddr = sectorToLong(_FlashInfo.numSectors) - sizeof(SysIDBlock);
ulPhysAddr &= 0x000FFFFFul; // ensure physical address is within 1MB range
_overwrite_block_flag = 1;
iReturn = WriteFlash(ulPhysAddr, &SysIDBlock, sizeof(SysIDBlock));
_overwrite_block_flag = 0;
WrPortI(MB1CR, &MB1CRShadow, iSaveMB1or3CR);
}
return iReturn;
}
/*** BeginHeader */
#endif
/*** EndHeader */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -