⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netconfig.c

📁 Wiznet iRadio Source
💻 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 + -