📄 netconfig.c
字号:
#include "socket.h"
#include "init.h"
#include "remote.h"
#include "eeprom.h"
#include "serial.h"
#include "netconfig.h"
#include <string.h>
//#define NETCONFIG_DEBUG
unsigned int xdata NET_DOWN_SIZE _at_ 0x07ffb;
unsigned char xdata W_TEST1 _at_ 0x07FFD;
unsigned char xdata W_TEST2 _at_ 0x07FFE;
unsigned char xdata W_TEST3 _at_ 0x07FFF;
IGM_INFO xdata ConfigMsg _at_ 0x6000;
IGM_INFO xdata Shadow_Msg; // copy of ConfigMsg
extern u_char xdata sock_buf[MAX_BUF_SIZE];
extern u_char xdata Mac[6]; // main.c
extern bit Debug_Off;
int Net_Upgrade(void);
void Update_ConfigMsg(void)
{
u_char i;
for(i = 1; i <= EEPROMVALUE; i++) {
ConfigMsg.c[3+i] = EEP_Read(i);
}
}
/*
********************************************************************************
* Description : Save current setting to EEPROM
* Arguments : None
* Returns : None
* Note :
********************************************************************************
*/
void SaveConfig(void)
{
u_char i;
if ( (Shadow_Msg.s.Mac[0] == Mac[0]) &&
(Shadow_Msg.s.Mac[1] == Mac[1]) &&
(Shadow_Msg.s.Mac[2] == Mac[2]) &&
(Shadow_Msg.s.Mac[3] == Mac[3]) &&
(Shadow_Msg.s.Mac[4] == Mac[4]) &&
(Shadow_Msg.s.Mac[5] == Mac[5]) ) {
for(i = 7; i <= EEPROMVALUE; i++)
EEP_Write(i, ConfigMsg.c[3+i]);
}
}
/*
********************************************************************************
* Description : Message parsing routine
* Arguments : s - socket, length - data size
* Returns : None
* Note :
********************************************************************************
*/
u_char ParseConfigMsg(SOCKET s, u_int length)
{
u_int serverport = 0;
u_int len = 0;
u_char type = 0;
u_char serverip[4];
len = recvfrom(s,(u_char xdata *)&Shadow_Msg, length, serverip, &serverport);
if (serverport == REMOTE_SERVER_PORT)
{
if (!Debug_Off) PutStringLn("> ConfigMsg received");
#ifdef NETCONFIG_DEBUG
PutStringLn("> ConfigMsg received");
#endif
if ( (Shadow_Msg.s.op[0] == 'F') && (Shadow_Msg.s.op[1] == 'I') && (Shadow_Msg.s.op[2] == 'N') && (Shadow_Msg.s.op[3] == 'D') )
{
Update_ConfigMsg(); // Read EEPROM and Write configmsg
Shadow_Msg = ConfigMsg; // copy
Shadow_Msg.s.op[0] = 'I';
Shadow_Msg.s.op[1] = 'M';
Shadow_Msg.s.op[2] = 'I';
Shadow_Msg.s.op[3] = 'N';
// DST IP : BroadCasting
serverip[0] = 0xFF;
serverip[1] = 0xFF;
serverip[2] = 0xFF;
serverip[3] = 0xFF;
serverport = REMOTE_SERVER_PORT;
sendto(s, (u_char*)&Shadow_Msg, CONFIG_MSG_SIZE, serverip, serverport);
wait_10ms(1);
type = REMOTE_FIND;
}
else if ( (Shadow_Msg.s.op[0] == 'S')&& (Shadow_Msg.s.op[1] == 'E')&& (Shadow_Msg.s.op[2] == 'T')&& (Shadow_Msg.s.op[3] == 'T') )
{
if ( (Shadow_Msg.s.Mac[0] == Mac[0]) && (Shadow_Msg.s.Mac[1] == Mac[1])&& (Shadow_Msg.s.Mac[2] == Mac[2])
&& (Shadow_Msg.s.Mac[3] == Mac[3]) && (Shadow_Msg.s.Mac[4] == Mac[4]) && (Shadow_Msg.s.Mac[5] == Mac[5]) )
{
Shadow_Msg.s.op[0] = 'S';
Shadow_Msg.s.op[1] = 'E';
Shadow_Msg.s.op[2] = 'T';
Shadow_Msg.s.op[3] = 'C';
// DST IP : BroadCasting
serverip[0] = 0xFF;
serverip[1] = 0xFF;
serverip[2] = 0xFF;
serverip[3] = 0xFF;
serverport = REMOTE_SERVER_PORT;
sendto(s, (u_char*)&Shadow_Msg, SETC_MSG_SIZE, serverip, serverport);
wait_10ms(1); //
ConfigMsg = Shadow_Msg;
type = REMOTE_SETT;
}
}
else if ( (Shadow_Msg.s.op[0] == 'F')&& (Shadow_Msg.s.op[1] == 'I')&& (Shadow_Msg.s.op[2] == 'R')&& (Shadow_Msg.s.op[3] == 'S') )
{
if ( (Shadow_Msg.s.Mac[0] == Mac[0]) && (Shadow_Msg.s.Mac[1] == Mac[1])&& (Shadow_Msg.s.Mac[2] == Mac[2])
&& (Shadow_Msg.s.Mac[3] == Mac[3]) && (Shadow_Msg.s.Mac[4] == Mac[4]) && (Shadow_Msg.s.Mac[5] == Mac[5]) )
{
if (Net_Upgrade() == 0) {
#ifdef NETCONFIG_DEBUG
PutString("\n\r> Download Error ");
#endif
if (!Debug_Off) PutStringLn("> ConfigMsg received");
return(0); // error
}
}
}
}
return type;
}
/*
********************************************************************************
* Description : Receive config message throuth Ethernet
* Arguments : None
* Returns :
* Note :
********************************************************************************
*/
u_char Recv_ConfigMsg(void)
{
int len;
u_char type;
// waiting FIND Msg
if ( (len = select(SOCK_CONFIG, SEL_RECV)) > 0)
{
if (len > MAX_BUF_SIZE - 8) len = MAX_BUF_SIZE - 8;
type = ParseConfigMsg(SOCK_CONFIG,len);
// send IMIN Msg
if (type == REMOTE_SETT) {
SaveConfig();
close(SOCK_DATA); // Close Data channel
// Reboot
W_TEST1 = 0xAA; W_TEST2 = 0xFF; W_TEST3 = 0xAA;
((void (code *)(void)) BOOT_ADDR)();
while (1);
}
}
return(0);
}
/******************************************************************************/
int Net_Upgrade(void)
{
int xdata len;
u_char xdata state;
u_int xdata j;
u_long xdata size;
u_char xdata * xdata sram_addr;
bit flag = 0;
u_int xdata checksum;
u_char xdata header[6];
u_int xdata recv_size = 0;
u_char xdata check[2];
#ifdef NETCONFIG_DEBUG
PutString("\n\r> Net-Upgrade ");
#endif
if (!Debug_Off) PutString("\n\r> Net-Upgrade ");
Init_Net();
socket(SOCK_CONFIG, SOCK_STREAM, REMOTE_UPDATE_PORT, 0);
NBlisten(SOCK_CONFIG);
while(1) {
state = select(SOCK_CONFIG, SEL_CONTROL);
if (state == SOCK_ESTABLISHED)
{
size = 0;
sram_addr = (u_char volatile xdata *)0x0000;
checksum = 0;
break;
}
}
while (1) {
state = select(SOCK_CONFIG, SEL_CONTROL);
if (state == SOCK_ESTABLISHED) {
if (flag == 0) {
if (select(SOCK_CONFIG, SEL_RECV) >= 10) {
recv(SOCK_CONFIG, (u_char xdata *)&size, 4);
#ifdef NETCONFIG_DEBUG
PutString("\n\r>1. size : ");PutITOA(size);
#endif
recv(SOCK_CONFIG, header, 6);
if (header[0] != 'W') return(0);
if (header[1] != 'i') return(0);
if (header[2] != 'z') return(0);
if (header[3] != 'n') return(0);
if (header[4] != 'e') return(0);
if (header[5] != 't') return(0);
#ifdef NETCONFIG_DEBUG
PutString("\n\r>Header : ");
for (j=0;j<6;j++) {
PutByte(header[j]);
}
PutStringLn("");
#endif
flag = 1;
}
}else if ((len = select(SOCK_CONFIG, SEL_RECV)) > 0) {
len = recv(SOCK_CONFIG, sock_buf, len);
#ifdef NETCONFIG_DEBUG
//PutString("len = ");PutITOA(len);
//PutString("1.sock_buf = ");PutITOA(sock_buf);
//PutStringLn("");
#endif
for (j = 0; j < len; j++) {
*sram_addr++ = sock_buf[j];
/*
PutString(" Addr : ");PutITOA((u_int)sram_addr);
PutString(" buf : ");PutHTOA(sock_buf[j]);
PutStringLn("");
*/
//PutHTOA(sock_buf[j]);PutByte(' ');
//if ((j+1)%16 == 0) PutStringLn("");
}
recv_size += len;
//PutString("2.sock_buf = ");PutITOA(sock_buf);
//PutStringLn("");
#ifdef NETCONFIG_DEBUG
//PutString(" recv_size : ");PutITOA(recv_size);
//PutString(" Addr : ");PutITOA((u_int)sram_addr);PutStringLn("");
#endif
// checksum
if (recv_size == (u_int)(size - 6)) {
#ifdef NETCONFIG_DEBUG
PutStringLn("\n\rCalculate CheckSum ");
#endif
sram_addr = (u_char volatile xdata *)0x0000;
for(j = 0; j < (size-8); j++) {
checksum += *sram_addr++;
#ifdef NETCONFIG_DEBUG
//PutString("\n\rChecksum : ");PutITOA()
#endif
}
check[0] = *sram_addr++;
check[1] = *sram_addr++;
if ((u_char)((checksum &0xff00) >> 8) != check[0]) {
#ifdef NETCONFIG_DEBUG
PutStringLn("\n\r Checksum Error 1");
#else
return(0);
#endif
}
if ((u_char)((checksum &0x00ff)) != check[1]) {
#ifdef NETCONFIG_DEBUG
PutStringLn("\n\r Checksum Error 2");
#else
return(0);
#endif
}
//#ifdef NETCONFIG_DEBUG
if (!Debug_Off) {
PutString("\n\r> Checksum : ");PutITOA(checksum);
}
//#endif
COMMAND(SOCK_CONFIG) = CCLOSE; // CLOSE
break;
}
}
}
} // while
NET_DOWN_SIZE = size - 8; // write file size;
#ifdef NETCONFIG_DEBUG
PutString("\n\rSize : ");PutITOA(NET_DOWN_SIZE+8);
PutString("\n\rAll data Received !");
#endif
if (!Debug_Off) PutString("\n\rAll data Received !");
// Jump to Boot
W_TEST1 = 0xAA; W_TEST2 = 0xFF; W_TEST3 = 0x55;
((void (code *)(void)) BOOT_ADDR)();
while (1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -