📄 netconfig.c
字号:
#include "71x_lib.h"
#include "socket.h"
#include "eeprom.h"
#include "util.h"
#include "netconfig.h"
#include "w5100.h"
#include "vs1033.h"
#include "flash.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//#define DEBUG_CH_LIST
const u8 DEFAULT_NET_MAC[6] = {0x00, 0x08, 0xdc, 0x01, 0x02, 0x03};
const u8 DEFAULT_NET_LIP[4] = {192, 168, 1, 100};
const u8 DEFAULT_NET_SN[4] = {255, 255, 255, 0};
const u8 DEFAULT_NET_GW[4] = {192, 168, 1, 1};
CONFIG_MSG Config_Msg, Recv_Msg;
u8 MAC[6];
u8 Ch_buf[MAX_CHINFO_SIZE];
u8 http_request[MAX_URL_SIZE + 256];
u8 Server_URL[MAX_URL_SIZE/2]; // 64
u8 Server_Page[MAX_URL_SIZE/4]; // 32
extern u8 stream_protocol;
u16 LastChannel;
u16 Cur_Ch;
void (*jump_function)(void);
void Set_Default(void)
{
memcpy(Config_Msg.Lip, DEFAULT_NET_LIP, 4);
memcpy(Config_Msg.Sn, DEFAULT_NET_SN , 4);
memcpy(Config_Msg.Gw, DEFAULT_NET_GW , 4);
memcpy(Config_Msg.Gw, DEFAULT_NET_GW , 2);
Config_Msg.Cur_Ch[1] = 0;
Config_Msg.Cur_Ch[0] = 1;
Config_Msg.Dhcp = STATIC_MODE;
Config_Msg.FW_Ver[1] = ((FW_VERSION & 0xFF00) >> 8);
Config_Msg.FW_Ver[0] = (u8)(FW_VERSION & 0x00ff);
}
u8 UartRecvByte(void)
{
u16 status;
while(!((status = UART2->SR) & 0x01));
return((u8)UART2->RxBUFR);
}
char atonum(char ch)
{
ch -= '0';
if (ch > 9) ch -= 7;
if (ch > 15) ch -= 0x20;
return(ch);
}
u8 gethex(u8 b0, u8 b1)
{
u8 buf[2];
buf[0] = b0;
buf[1] = b1;
buf[0] = atonum(buf[0]);
buf[0] <<= 4;
buf[0] += atonum(buf[1]);
return(buf[0]);
}
void WaitforMacAddress(void)
{
u8 buf[12];
u8 i, j;
MyPrintf("\r\nWait for MAC address\r\n");
buf[0] = UartRecvByte();
if (buf[0] == 'S') {
buf[0] = 'R';
UART_ByteSend(UART2, &buf[0]);
}
for( i = 0; i < 12; i++) {
buf[i] = UartRecvByte();
}
for (i = 0, j = 0; i <= 6; i++)
{
Config_Msg.Mac[i] = gethex(buf[j], buf[j+1]);
j += 2;
}
}
void Get_Config(void)
{
u8 i;
char buf[8];
u8 * ptr = 0;
for (i = 0; i < 4; i++) buf[i] = EEP_Read(i);
// If eeprom is new one
if ((buf[0] != 0xAA) || ((buf[1] != 0x00) && (buf[2] != 0x08) && (buf[3] != 0xDC))){
WaitforMacAddress();
// set the board as default value
//memcpy(Config_Msg.Mac, DEFAULT_NET_MAC, 6);
Set_Default();
EEP_Write(EEP_TEST, 0xAA); // set flag
for ( i = 0; i < (CONFIG_MSG_SIZE - 4); i++) {
EEP_Write(i+1, *(u8 *)(Config_Msg.Mac+i));
}
}
MyPrintf("\r\nGet_Config");
for ( i = 0; i < (CONFIG_MSG_SIZE - 4 - MAX_URL_SIZE); i++) {
*(u8 *)(Config_Msg.Mac+i) = EEP_Read(i+1);
}
// F/W Version is fixed in the code (netconfig.h)
Config_Msg.FW_Ver[1] = ((FW_VERSION & 0xFF00) >> 8);
Config_Msg.FW_Ver[0] = (u8)(FW_VERSION & 0x00ff);
for (i = 0; i < 6; i++) MAC[i] = Config_Msg.Mac[i];
MyPrintf("\r\nCurrent Ch = %02x %02x", Config_Msg.Cur_Ch[0], Config_Msg.Cur_Ch[1]) ;
// get number of ch.
memset(buf, '\0', 8);
ptr = memstr(Ch_buf, "Count=", MAX_CHINFO_SIZE);
ptr = ptr+6;
for(i = 0; i < 8;i++ ) {
if (*(ptr+i) == '\r') break;
buf[i] = *(ptr+i);
}
LastChannel = atoi(buf);
// read URL
memset(buf, '\0', 8);
Cur_Ch = (u16)(Config_Msg.Cur_Ch[0] << 8) + Config_Msg.Cur_Ch[1];
if (Cur_Ch > LastChannel) {
Cur_Ch = LastChannel;
Config_Msg.Cur_Ch[0] = HIGH(LastChannel);
Config_Msg.Cur_Ch[1] = LOW(LastChannel);
}
sprintf(buf, "url%d=", Cur_Ch);
ptr = memstr(Ch_buf, buf, MAX_CHINFO_SIZE);
ptr = ptr+strlen(buf); // skip "url4"
for (i = 0; i < MAX_URL_SIZE; i++)
{
if (*(ptr+i) == '\r') break;
Config_Msg.D_SIP[i] = *(ptr+i);
}
}
void Set_network(void)
{
setSHAR(MAC);
setSUBR(Config_Msg.Sn);
setGAR(Config_Msg.Gw);
setSIPR(Config_Msg.Lip);
setRCR(3);
sysinit(0x06,0x06); //// 1,1,2,4K
}
void Parse_String(u8 * ptr)
{
u8 i;
char buf2[MAX_URL_SIZE];
char buf[6];
u16 port;
// http://xxx.xxx.xxx.xxx/abc
// mms://xxx.xxx.xxx.xxx/abc
if (*ptr == 'm') {
// mms:// : skip
ptr += 6;
}else if (*ptr == 'h'){
// http:// : skip
ptr += 7;
}
// extract IP address
memset(Server_URL, '\0', MAX_URL_SIZE/2);
MyPrintf("\r\n Server URL = ");
for (i = 0; i < MAX_URL_SIZE; i++) {
if (*ptr == '/') break;
if (*ptr =='\0') break;
if (*ptr == '\r') break;
if (*ptr == ':') break;
Server_URL[i] = *ptr;
MyPrintf("%c", Server_URL[i]);
ptr++;
}
// Port
memset(buf, '\0', 6);
if (*ptr == ':') {
MyPrintf("\r\nPort");
ptr++;
for (i = 0; i < 6; i++) {
MyPrintf(" %x", *ptr);
if (*ptr == '\r') break;
if (*ptr == '/') {
ptr++;
break;
}
buf[i] = *ptr;
ptr++;
}
port = atoi(buf);
MyPrintf(" [%d]",port);
Config_Msg.Sport[0] = HIGH(port);
Config_Msg.Sport[1] = LOW(port);
}
else {
Config_Msg.Sport[0] = 0;
Config_Msg.Sport[1] = 80;
}
/*
if (stream_protocol == STREAM_MMS) {
Config_Msg.Sport[0] = 0x06; // 1755
Config_Msg.Sport[1] = 0xdb;
}
*/
// Page
MyPrintf("\r\n Page = ");
memset(Server_Page, '\0', MAX_URL_SIZE/4);
for (i = 0; i < MAX_URL_SIZE/4; i++) {
if (*ptr == '\0') break;
if (*ptr == '\r') break;
if (*ptr == ':') break;
Server_Page[i] = *ptr;
MyPrintf("%c", Server_Page[i]);
ptr++;
}
// memset(Server_Page, '\0', MAX_URL_SIZE/4);
if (strlen(Server_Page) == 0) {
Server_Page[0] = '/';
}
// if (strlen(buf2) > 1) memcpy(Server_Page, &buf2[0], strlen(buf2));
}
// Search channel in the Channel buffer (Ch_buf) and
// set the Channel.url & Config_Msg.D_IP
u8 * Navi_Channel(u16 channel)
{
char buf[8];
u8 * ptr = 0;
MyPrintf("\r\nNavi channel %d",channel);
sprintf(buf, "url%d=", channel);
ptr = memstr(Ch_buf, buf, MAX_CHINFO_SIZE);
ptr = ptr+strlen(buf); // skip "url4"
return(ptr);
}
u8 ParseConfigMsg(u16 length)
{
u16 len = 0;
u8 type = 0;
u16 serverport;
u8 serverip[4];
u16 recv_len=0;
// u16 i, recv_len=0;
// char tmp;
// Receive UDP data
recvfrom(SOCK_CONFIG,(u8 *)&Recv_Msg, length, serverip, &serverport);
if (serverport == REMOTE_SERVER_PORT)
{
//MyPrintf("\r\n> ConfigMsg received");
if ( (Recv_Msg.op[0] == 'F') && (Recv_Msg.op[1] == 'I') && (Recv_Msg.op[2] == 'N') && (Recv_Msg.op[3] == 'D') )
{
Recv_Msg = Config_Msg;
Recv_Msg.op[0] = 'I';
Recv_Msg.op[1] = 'M';
Recv_Msg.op[2] = 'I';
Recv_Msg.op[3] = 'N';
// DST IP : BroadCasting
serverip[0] = 0xff;
serverip[1] = 0xff;
serverip[2] = 0xff;
serverip[3] = 0xff;
serverport = REMOTE_SERVER_PORT;
//Get_Config();
sendto(SOCK_CONFIG, (u8*)&Recv_Msg, CONFIG_MSG_SIZE, serverip, serverport);
type = REMOTE_FIND;
}
else if ( (Recv_Msg.op[0] == 'S')&& (Recv_Msg.op[1] == 'E')&& (Recv_Msg.op[2] == 'T')&& (Recv_Msg.op[3] == 'T') )
{
if ( (Recv_Msg.Mac[0] == MAC[0]) && (Recv_Msg.Mac[1] == MAC[1])&& (Recv_Msg.Mac[2] == MAC[2])
&& (Recv_Msg.Mac[3] == MAC[3]) && (Recv_Msg.Mac[4] == MAC[4]) && (Recv_Msg.Mac[5] == MAC[5]) )
{
Recv_Msg.op[0] = 'S';
Recv_Msg.op[1] = 'E';
Recv_Msg.op[2] = 'T';
Recv_Msg.op[3] = 'C';
// DST IP : BroadCasting
serverip[0] = 0xff;
serverip[1] = 0xff;
serverip[2] = 0xff;
serverip[3] = 0xff;
serverport = REMOTE_SERVER_PORT;
sendto(SOCK_CONFIG, (u8*)&Recv_Msg, CONFIG_MSG_SIZE, serverip, serverport);
Config_Msg = Recv_Msg;
type = REMOTE_SETT;
}
}
else if ( (Recv_Msg.op[0] == 'S')&& (Recv_Msg.op[1] == 'M')&& (Recv_Msg.op[2] == 'A')&& (Recv_Msg.op[3] == 'C') )
{
{
Recv_Msg.op[0] = 'S';
Recv_Msg.op[1] = 'E';
Recv_Msg.op[2] = 'T';
Recv_Msg.op[3] = 'C';
// DST IP : BroadCasting
serverip[0] = 0xff;
serverip[1] = 0xff;
serverip[2] = 0xff;
serverip[3] = 0xff;
serverport = REMOTE_SERVER_PORT;
sendto(SOCK_CONFIG, (u8*)&Recv_Msg, CONFIG_MSG_SIZE, serverip, serverport);
type = REMOTE_SMAC;
}
}
else if ( (Recv_Msg.op[0] == 'F')&& (Recv_Msg.op[1] == 'I')&& (Recv_Msg.op[2] == 'R')&& (Recv_Msg.op[3] == 'S') )
{
if ( (Recv_Msg.Mac[0] == MAC[0]) && (Recv_Msg.Mac[1] == MAC[1])&& (Recv_Msg.Mac[2] == MAC[2])
&& (Recv_Msg.Mac[3] == MAC[3]) && (Recv_Msg.Mac[4] == MAC[4]) && (Recv_Msg.Mac[5] == MAC[5]) )
{
// Jump to Net IAP
jump_function = (void*) 0x40030000;
jump_function();
}
}
else if ( (Recv_Msg.op[0] == 'P')&& (Recv_Msg.op[1] == 'U')&& (Recv_Msg.op[2] == 'R')&& (Recv_Msg.op[3] == 'L') )
{
if ( (Recv_Msg.Mac[0] == MAC[0]) && (Recv_Msg.Mac[1] == MAC[1])&& (Recv_Msg.Mac[2] == MAC[2])
&& (Recv_Msg.Mac[3] == MAC[3]) && (Recv_Msg.Mac[4] == MAC[4]) && (Recv_Msg.Mac[5] == MAC[5]) )
{
memcpy(Config_Msg.Cur_Ch, Recv_Msg.Cur_Ch, 2);
while(1){
if ( (len = getSn_RX_RSR(SOCK_CONFIG)) > 0) {
if (len > MAX_BUF_SIZE) len = MAX_BUF_SIZE;
memset(Config_Msg.D_SIP, '\0', MAX_URL_SIZE);
recvfrom(SOCK_CONFIG, Config_Msg.D_SIP, len, serverip, &serverport);
Parse_String(Config_Msg.D_SIP);
//MyPrintf("\r\nChange Channel to %s", Config_Msg.D_SIP);
break;
}
}
}
}
else if ( (Recv_Msg.op[0] == 'S')&& (Recv_Msg.op[1] == 'U')&& (Recv_Msg.op[2] == 'R')&& (Recv_Msg.op[3] == 'L') )
{
if ( (Recv_Msg.Mac[0] == MAC[0]) && (Recv_Msg.Mac[1] == MAC[1])&& (Recv_Msg.Mac[2] == MAC[2])
&& (Recv_Msg.Mac[3] == MAC[3]) && (Recv_Msg.Mac[4] == MAC[4]) && (Recv_Msg.Mac[5] == MAC[5]) )
{
#ifdef DEBUG_CH_LIST
MyPrintf("\r\nReceive Channel List");
#endif
EIC_IRQConfig(DISABLE);
#ifdef USE_JUMP
jump_function = (void*) 0x40020000;
jump_function();
#else
while(1) {
if ( (len = getSn_RX_RSR(SOCK_CONFIG)) > 0) {
if (len > MAX_BUF_SIZE) len = MAX_BUF_SIZE;
recvfrom(SOCK_CONFIG, &Ch_buf[recv_len], len, serverip, &serverport);
recv_len += len;
#ifdef DEBUG_CH_LIST
MyPrintf("\r\n recv_len = %d, len = %d", recv_len, len);
#endif
if (memstr(Ch_buf, "\r\n\r\n", recv_len) > 0) {
#ifdef DEBUG_CH_LIST
MyPrintf("\r\n Complete\r\n");
for(i = 0; i < recv_len-8; i++) {
MyPrintf("%c", Ch_buf[i]);
}
#endif
// Flash Write
#ifdef DEBUG_CH_LIST
MyPrintf("\r\n Erase Flash 1");
#endif
Flash_Erase(0x10000); // B1F0
if (recv_len >= 8*1024) {
Flash_Erase(0x20000); // B1F0
#ifdef DEBUG_CH_LIST
MyPrintf("\r\n Erase Flash 2");
#endif
}
#ifdef DEBUG_CH_LIST
MyPrintf("\r\n Write Flash");
#endif
IntFlashProgram(0x000C0000, recv_len-8, (u32 *)Ch_buf);
#ifdef DEBUG_CH_LIST
MyPrintf("\r\n Read Flash\r\n");
#endif
#ifdef DEBUG_CH_LIST
for (i = 0; i < recv_len-8; i++) {
tmp = *(vu8 *)(0x400C0000 + i);
MyPrintf("%c", tmp);
}
#endif
type = REMOTE_SETT;
break;
}
}
}
EIC_IRQConfig(ENABLE);
#endif
}
}
}
return type;
}
u8 Recv_ConfigMsg(void)
{
int len;
u8 type = 0;
u8 i;
u8 tmp;
// waiting FIND Msg
if ( (len = getSn_RX_RSR(SOCK_CONFIG)) > 0)
{
if (len > MAX_BUF_SIZE) len = MAX_BUF_SIZE;
type = ParseConfigMsg(len);
if (type == REMOTE_SETT) {
if (Config_Msg.Dhcp == 1) {
Config_Msg.Lip[0] = 0; Config_Msg.Lip[1] = 0; Config_Msg.Lip[2] = 0; Config_Msg.Lip[3] = 0;
Config_Msg.Gw[0] = 0; Config_Msg.Gw[1] = 0; Config_Msg.Gw[2] = 0; Config_Msg.Gw[3] = 0;
Config_Msg.Sn[0] = 0; Config_Msg.Sn[1] = 0; Config_Msg.Sn[2] = 0; Config_Msg.Sn[3] = 0;
}
// We don't want to change the MAC address & F/W version
for ( i = 0; i <= (CONFIG_MSG_SIZE - 11-MAX_URL_SIZE); i++) {
// tmp = *(u8 *)(Recv_Msg.Lip+i);
EEP_Write(EEP_LIP+i, *(u8 *)(Config_Msg.Lip+i));
}
//Config_Msg.Status = sock_status;
//MyPrintf("\r\n> Configuration changed");
}
/*
// change MAC address
if (type == REMOTE_SMAC) {
for ( i = 0; i < (CONFIG_MSG_SIZE - 4); i++) {
EEP_Write(EEP_MAC+i, *(u8 *)(Config_Msg.Mac+i));
}
for (i = 0; i < 6; i++) MAC[i] = Config_Msg.Mac[i];
//MyPrintf("\r\n> MAC address changed");
}
*/
}
return(type);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -