📄 init.c
字号:
#include "config.h"
#include "eeprom.h"
#include "serial.h"
#include "socket.h"
#include "init.h"
extern u_char xdata Mac[6]; //
/*
Verify mode of T89C51RC2
If some error, correct it
*/
void Verify_RC2(void)
{
u_char value;
u_char error_flag = 0;
//SBV
value = __api_rd_SBV();
if (value != 0x60) {
error_flag++;
}
// BLJB
value = __api_rd_HSB();
if (value & 0x40) {
error_flag++;
}
//BSB
value = __api_rd_BSB();
if (value == 0x00) {
error_flag++;
}
// SSB
value = __api_rd_SSB();
if (value != 0xFE) {
error_flag++;
}
// if some error, reboot
if (error_flag > 0) {
// re-program
__api_wr_SSB_NO_SECURITY(); // Level0
__api_wr_SBV(0x60);
__api_set_BLJB();
__api_wr_BSB(0xff);
__api_wr_SSB_WR_SECURITY(); // Level1
((void (code *)(void)) BOOT_ADDR)();
while (1);
}
}
/*
Verify EEPROM data
If some error, restore it
*/
void Restore_EEPROM(void)
{
u_char i;
u_char val;
val = EEP_Read(0xFF); // is backuped ?
if (val == 0xAA) {
for(i = BACKUP_OFFSET; i <= (BACKUP_OFFSET + EEPROMVALUE); i++) {
val = EEP_Read(i);
EEP_Write(i-BACKUP_OFFSET, val);
}
}
}
void Verify_EEPROM(void)
{
u_char Error_flag = 0;
u_char SW_flag = 0;
u_char val;
val = EEP_Read(EE_ERROR);
if (val == 0x55) Error_flag++;
//MAC
val = EEP_Read(EE_MAC1);
if (val != 0x00) Error_flag++;
val = EEP_Read(EE_MAC2);
if (val != 0x08) Error_flag++;
val = EEP_Read(EE_MAC3);
if (val != 0xDC) Error_flag++;
//Kind
val = EEP_Read(EE_KIND);
if (val > 1) Error_flag++;
// Debug
val = EEP_Read(EE_DEBUG);
if (val > 1) Error_flag++;
// DHCP
val = EEP_Read(EE_DEBUG);
if (val > 1) Error_flag++;
// SW Version
val = EEP_Read(EE_VER_H);
if (val != SW_VERSION_H) SW_flag++;
val = EEP_Read(EE_VER_L);
if (val != SW_VERSION_L) SW_flag++;
// correct
if (SW_flag > 0) {
EEP_Write(EE_VER_H, SW_VERSION_H);
EEP_Write(EE_VER_L, SW_VERSION_L);
}
// configmsg.s.SW_Ver = (SW_VERSION_H << 8) + SW_VERSION_L; // SW Version
if (Error_flag > 0) {
PutString("\n\r> Config Error Recovery ");
Restore_EEPROM();
// write restore number
val = EEP_Read(RESTORE_L);
if (val > 0xFF) {
val = EEP_Read(RESTORE_H);
val++;
EEP_Write(RESTORE_H, val);
EEP_Write(RESTORE_L, 0x00);
}
else {
val++;
EEP_Write(RESTORE_L, val);
}
EEP_Write(EE_ERROR, 0xAA);
//Update_ConfigMsg();
// Jump Boot
((void (code *)(void)) BOOT_ADDR)();
while(1);
}
}
/*
********************************************************************************
* 8051 initialization function
*
* Description :
* Arguments : None
* Returns : None
* Note :
********************************************************************************
*/
void Init_Interrupt(void)
{
IT0 = 0; // interrupt level trigger
EX0 = 1; // INT 0 enable
EX1 = 0; // INT 1 disable
}
/*
********************************************************************************
* 8051 Timer0 initialization function
*
* Description :
* Arguments : None
* Returns : None
* Note :
********************************************************************************
*/
void Init_Timer0(void)
{
EA = 0;
TR0 = 0;
TMOD &= ~0x0F;
TMOD |= 0x01;
TL0 = TIMER0_COUNT & 0x00FF;
TH0 = TIMER0_COUNT >> 8;
PT0 = 0;
ET0 = 1;
TR0 = 1;
EA = 1;
}
/*
Init Network as 0.0.0.0
*/
void Init_Net_Default(void)
{
u_char i, ip[6];
initW3100A(); // S/W RESET W3100A
//MAC
setMACAddr(Mac);
// GATEWAY
for(i = 0; i < 4; i++) ip[i] = 0;
setgateway(ip);
// SUBNET MASK
setsubmask(ip);
// Local IP
setIP(ip);
*(TIMEOUT_PTR + 2) = 0x03; // Retry Count Register : set timeout cnt
sysinit(0x55,0x55);
}
void Init_Net(void)
{
u_char i, ip[6];
initW3100A(); // S/W RESET W3100A
setMACAddr(Mac); // MAC
for (i = 0;i < 4; i++) ip[i] = EEP_Read(EE_GW1 + i);
setgateway(ip); // gateway address
for (i = 0; i < 4; i++) ip[i] = EEP_Read(EE_SM1 + i);
setsubmask(ip); // subnet mask
for (i = 0; i < 4; i++) ip[i] = EEP_Read(EE_IA1 + i);
setIP(ip); // source IP
*(TIMEOUT_PTR + 2) = 0x03; // Retry Count Register : set timeout cnt
sysinit(0x55,0x55);
}
void Send_KeepalivePacket(SOCKET s)
{
u_char k;
un_l2cval rd_ptr, ack_ptr;
k = *SHADOW_TXRD_PTR(s);
wait_1us(2);
rd_ptr.cVal[0] = *TX_RD_PTR(s);
rd_ptr.cVal[1] = *(TX_RD_PTR(s) + 1);
rd_ptr.cVal[2] = *(TX_RD_PTR(s) + 2);
rd_ptr.cVal[3] = *(TX_RD_PTR(s) + 3);
wait_1us(2);
rd_ptr.lVal -= 1;
*TX_RD_PTR(s) = rd_ptr.cVal[0];
*(TX_RD_PTR(s) + 1) = rd_ptr.cVal[1];
*(TX_RD_PTR(s) + 2) = rd_ptr.cVal[2];
*(TX_RD_PTR(s) + 3) = rd_ptr.cVal[3];
wait_1us(2);
k = *SHADOW_TXACK_PTR(s);
wait_1us(2);
ack_ptr.cVal[0] = *TX_ACK_PTR(s);
ack_ptr.cVal[1] = *(TX_ACK_PTR(s) + 1);
ack_ptr.cVal[2] = *(TX_ACK_PTR(s) + 2);
ack_ptr.cVal[3] = *(TX_ACK_PTR(s) + 3);
wait_1us(2);
ack_ptr.lVal -= 1;
*TX_ACK_PTR(s) = ack_ptr.cVal[0];
*(TX_ACK_PTR(s) + 1) = ack_ptr.cVal[1];
*(TX_ACK_PTR(s) + 2) = ack_ptr.cVal[2];
*(TX_ACK_PTR(s) + 3) = ack_ptr.cVal[3];
wait_1us(2);
COMMAND(s) = CSEND; /* SEND command */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -