/**
******************************************************************************
* @file    			w5500_conf.c                                                                                              
* @version 			V1.2										  		
* @date    			2017-11-01								 
* @brief 				用3.5.0版本库建的工程模板						  	
* @attention		配置MCU，移植w5500程序需要修改的文件，配置w5500的MAC和IP地址 	
*				
* @company  		深圳炜世科技有限公司
* @information  WIZnet W5500官方代理商，全程技术支持，价格绝对优势！
* @website  		www.wisioe.com																							 	 				
* @forum        www.w5500.cn																								 		
* @qqGroup      383035001																										 
******************************************************************************
*/

/*
add by Gavin 2020.03
RST -PA15
CS  -PB14
INT -PB15
SPI -sys_SPI3(PC10-clk;PC11 MISO;PC12 -MOSI;

 参考原理图得知，w5500和NFC读卡器共用系统spi3,
 而目前的NFC驱动是用的模拟spi，需要修改；
 特别说明： 由于RST复位引脚也是共用（硬件设计缺陷），所以初始化在前的执行一次复位;
 后初始化的那个模块不能再执行复位动作了，否则...
 
 NFC ic RC522的spi速度最大10M；
 w5500  SPI最大速度 80M
 system SPI3 最大速度 21.5M
 所以系统SPI只能设置成3个中最小的那个 10M;
 代理商参考设计资料 http://www.w5500.cn
 //---------------------------
1,DEMO_W5500的宏定义用于屏蔽 demo中的开发板硬件信息
2, 实际调试，NFC ic-RC522只能用SPI3 8分频=5M通信，4分频实际测试不通过!!!!!!!!!!!!

*/
#include <stdio.h> 
#include <string.h>
#include "w5500_conf.h"
#include "utility.h"
#include "w5500.h"
#include "dhcp.h"
#include "platform_interface.h"
#include "function_interface.h"
#include "function.h"
#include "tcp_demo.h"
#include "platform.h"

//next 3 header file mask by Gavin 
//#include "bsp_i2c_ee.h"
//#include "bsp_spi_flash.h"
//#include "bsp_TiMbase.h"
 
//add by Gavin 
extern SPI_HandleTypeDef hspi3;

#ifndef DEMO_W5500
#define 	W5500_CS_PORT			GPIOB
#define 	W5500_CS_PIN			GPIO_PIN_14	
#define 	SET_W5500_CS  		HAL_GPIO_WritePin(W5500_CS_PORT,W5500_CS_PIN,GPIO_PIN_SET)
#define 	RESET_W5500_CS  	HAL_GPIO_WritePin(W5500_CS_PORT,W5500_CS_PIN,GPIO_PIN_RESET)


#endif 




CONFIG_MSG  ConfigMsg;																	/*配置结构体*/
EEPROM_MSG_STR EEPROM_MSG;															/*EEPROM存储信息结构体*/

/*MAC地址首字节必须为偶数*/
/*如果多块W5500网络适配板在同一现场工作，请使用不同的MAC地址*/
uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};

/*定义默认IP信息*/
uint8 local_ip[4]={192,168,0,12};												/*定义W5500默认IP地址*/
uint8 subnet[4]={255,255,255,0};												/*定义W5500默认子网掩码*/
uint8 gateway[4]={200,200,100,1}; //{192,168,1,1};													/*定义W5500默认网关*/
uint8 dns_server[4]={114,114,114,114};									/*定义W5500默认DNS*/

uint16 local_port=4000;//8000;	                    						/*定义本地端口*/

/*定义远端IP信息*/
uint8  remote_ip[4]={192,168,1,107};										/*远端IP地址*/
uint16 remote_port=8080;																/*远端端口号*/

/*IP配置方法选择，请自行选择*/
uint8  ip_from=IP_FROM_DEFINE;				

uint8  dhcp_ok=0;																				/*dhcp成功获取IP*/
uint32 ms=0;																						/*毫秒计数*/
uint32 dhcp_time= 0;																		/*DHCP运行计数*/
vu8    ntptimer = 0;																		/*NPT秒计数*/

/**
*@brief		配置W5500的IP地址
*@param		无
*@return	无
*/
void set_w5500_ip(void)
{	
		
  /*复制定义的配置信息到配置结构体*/
	memcpy(ConfigMsg.mac, mac, 6);
	memcpy(ConfigMsg.lip,local_ip,4);
	memcpy(ConfigMsg.sub,subnet,4);
	memcpy(ConfigMsg.gw,gateway,4);
	memcpy(ConfigMsg.dns,dns_server,4);
	if(ip_from==IP_FROM_DEFINE){	
		//printf(" 使用定义的IP信息配置W5500:\r\n");
	}
	/*使用EEPROM存储的IP参数*/	
	if(ip_from==IP_FROM_EEPROM)
	{
		/*从EEPROM中读取IP配置信息*/
		read_config_from_eeprom();		
		
		/*如果读取EEPROM中MAC信息,如果已配置，则可使用*/		
		if( *(EEPROM_MSG.mac)==0x00&& *(EEPROM_MSG.mac+1)==0x08&&*(EEPROM_MSG.mac+2)==0xdc)		
		{
			//printf(" IP from EEPROM\r\n");
			/*复制EEPROM配置信息到配置的结构体变量*/
			memcpy(ConfigMsg.lip,EEPROM_MSG.lip, 4);				
			memcpy(ConfigMsg.sub,EEPROM_MSG.sub, 4);
			memcpy(ConfigMsg.gw, EEPROM_MSG.gw, 4);
		}
		else
		{
			//printf(" EEPROM未配置,使用定义的IP信息配置W5500,并写入EEPROM\r\n");
			write_config_to_eeprom();	/*使用默认的IP信息，并初始化EEPROM中数据*/
		}			
	}

	/*使用DHCP获取IP参数，需调用DHCP子函数*/		
	if(ip_from==IP_FROM_DHCP)								
	{
		/*复制DHCP获取的配置信息到配置结构体*/
		if(dhcp_ok==1)
		{
			//printf(" IP from DHCP\r\n");		 
			memcpy(ConfigMsg.lip,DHCP_GET.lip, 4);
			memcpy(ConfigMsg.sub,DHCP_GET.sub, 4);
			memcpy(ConfigMsg.gw,DHCP_GET.gw, 4);
			memcpy(ConfigMsg.dns,DHCP_GET.dns,4);
		}
		else
		{
			//printf(" DHCP子程序未运行,或者不成功\r\n");
			//printf(" 使用定义的IP信息配置W5500\r\n");
		}
	}
		
	/*以下配置信息，根据需要选用*/	
	ConfigMsg.sw_ver[0]=FW_VER_HIGH;
	ConfigMsg.sw_ver[1]=FW_VER_LOW;	

	/*将IP配置信息写入W5500相应寄存器*/	
	setSUBR(ConfigMsg.sub);
	setGAR(ConfigMsg.gw);
	setSIPR(ConfigMsg.lip);
	
	getSIPR (local_ip);			
	//printf(" W5500 IP地址   : %d.%d.%d.%d\r\n", local_ip[0],local_ip[1],local_ip[2],local_ip[3]);
	getSUBR(subnet);
	//printf(" W5500 子网掩码 : %d.%d.%d.%d\r\n", subnet[0],subnet[1],subnet[2],subnet[3]);
	getGAR(gateway);
	//printf(" W5500 网关     : %d.%d.%d.%d\r\n", gateway[0],gateway[1],gateway[2],gateway[3]);
	
}

/**
*@brief		配置W5500的MAC地址
*@param		无
*@return	无
*/
void set_w5500_mac(void)
{
	memcpy(ConfigMsg.mac, mac, 6);
	setSHAR(ConfigMsg.mac);	/**/
	memcpy(DHCP_GET.mac, mac, 6);
}






/**
*@brief		配置W5500的GPIO接口
*@param		无
*@return	无
*/
void gpio_for_w5500_config(void)
{
	#ifdef DEMO_W5500 //add by Gavin
	GPIO_InitTypeDef GPIO_InitStructure;
	SPI_FLASH_Init();																		 /*初始化STM32 SPI接口*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG, ENABLE);
		
	/*使用SPI1*/
	#ifdef STM32_SPI1
		/*定义RESET引脚*/	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;						 /*选择要控制的GPIO引脚*/		 
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 /*设置引脚速率为50MHz*/		
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		 /*设置引脚模式为通用推挽输出*/		
		GPIO_Init(GPIOC, &GPIO_InitStructure);							 /*调用库函数，初始化GPIO*/
		GPIO_SetBits(GPIOC, GPIO_Pin_0);		
		/*定义INT引脚*/	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;						 /*选择要控制的GPIO引脚*/		 
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 /*设置引脚速率为50MHz */		
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;				 /*设置引脚模式为通用推挽模拟上拉输入*/	
		GPIO_Init(GPIOC, &GPIO_InitStructure);							 /*调用库函数，初始化GPIO*/
	#endif
  
	/*使用SPI2*/
	#ifdef  STM32_SPI2
		/*定义RESET引脚*/	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;						 /*选择要控制的GPIO引脚*/		 
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 /*设置引脚速率为50MHz*/		
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		 /*设置引脚模式为通用推挽输出*/		
		GPIO_Init(GPIOB, &GPIO_InitStructure);							 /*调用库函数，初始化GPIO*/
		GPIO_SetBits(GPIOB, GPIO_Pin_9);		
		/*定义INT引脚*/	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;						 /*选择要控制的GPIO引脚*/		 
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 /*设置引脚速率为50MHz */		
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;				 /*设置引脚模式为通用推挽模拟上拉输入*/	
		GPIO_Init(GPIOC, &GPIO_InitStructure);							 /*调用库函数，初始化GPIO*/
	#endif
	#else 
		GPIO_InitTypeDef GPIO_InitStruct = {0};
	 
		GPIO_InitStruct.Pin = W5500_CS_PIN;
		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
		GPIO_InitStruct.Pull = GPIO_NOPULL;
		GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
		HAL_GPIO_Init(W5500_CS_PORT, &GPIO_InitStruct);		

	#endif
}

/**
*@brief		W5500片选信号设置函数
*@param		val: 为“0”表示片选端口为低，为“1”表示片选端口为高
*@return	无
*/
void wiz_cs(uint8_t val)
{
#ifdef DEMO_W5500 //add by Gavin
	#ifdef  STM32_SPI1
		if (val == LOW) 
		{
			GPIO_ResetBits(GPIOA, GPIO_Pin_4); 
		}
		else if (val == HIGH)
		{
			GPIO_SetBits(GPIOA, GPIO_Pin_4); 
		}
	#endif
	#ifdef STM32_SPI2
		if (val == LOW) 
		{
			GPIO_ResetBits(GPIOB, GPIO_Pin_12); 
		}
		else if (val == HIGH)
		{
			GPIO_SetBits(GPIOB, GPIO_Pin_12); 
		}
	#endif
#else	
		if (val == LOW) 
		{
			RESET_W5500_CS;//GPIO_ResetBits(GPIOB, GPIO_Pin_12); 
		}
		else if (val == HIGH)
		{
			SET_W5500_CS;//GPIO_SetBits(GPIOB, GPIO_Pin_12); 
		}
#endif
}

/**
*@brief		设置W5500的片选端口SCSn为低
*@param		无
*@return	无
*/
void iinchip_csoff(void)
{
	wiz_cs(LOW);
}

/**
*@brief		设置W5500的片选端口SCSn为高
*@param		无
*@return	无
*/
void iinchip_cson(void)
{	
   wiz_cs(HIGH);
}


/*
2019.12.04 实测1ms;
环境：主频168MHz,关闭中断,IO取反用示波器测试!!	*/
void w5500_delay_ms( unsigned short  time )
{
    unsigned short  i = 0;
    while( time-- ){
			i = 33400;
			while( i-- );
    }
}

/**
*@brief		W5500复位设置函数
*@param		无
*@return	无
*/
void reset_w5500(void)
{
#ifdef DEMO_W5500 //add by Gavin	
	#ifdef STM32_SPI1
		GPIO_ResetBits(GPIOC, GPIO_Pin_0);
		delay_us(2);  
		GPIO_SetBits(GPIOC, GPIO_Pin_0);
		delay_ms(1600);	
	#endif
	#ifdef  STM32_SPI2
		GPIO_ResetBits(GPIOB, GPIO_Pin_9);
		delay_us(2);  
		GPIO_SetBits(GPIOB, GPIO_Pin_9);
		delay_ms(1600);
	#endif
#endif
	
	if( get_hard_flag() ==0){	//200S_V3 w5500 RST-PA8
		GPIO_InitTypeDef GPIO_InitStruct = {0};
	 
		GPIO_InitStruct.Pin = GPIO_PIN_8;
		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
		GPIO_InitStruct.Pull = GPIO_NOPULL;
		GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
		HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);		
		
		//
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
		w5500_delay_ms(50);	
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
		w5500_delay_ms(50);	
	}	
	
}

/**
*@brief		STM32 SPI1读写8位数据
*@param		dat：写入的8位数据
*@return	无
*/
uint8  IINCHIP_SpiSendData(uint8 dat)
{
#ifdef DEMO_W5500 //add by Gavin	
	return(SPI_FLASH_SendByte(dat));
#else		
	unsigned char rxdata;
	HAL_SPI_TransmitReceive(&hspi3,&dat,&rxdata,1,100);
	return rxdata;	
#endif 

}

/**
*@brief		写入一个8位数据到W5500
*@param		addrbsb: 写入数据的地址
*@param   data：写入的8位数据
*@return	无
*/
void IINCHIP_WRITE( uint32 addrbsb,  uint8 data)
{
	iinchip_csoff();                              		
	IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);	
	IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);
	IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4);  
	IINCHIP_SpiSendData(data);                   
	iinchip_cson();                            
}

/**
*@brief		从W5500读出一个8位数据
*@param		addrbsb: 写入数据的地址
*@param   data：从写入的地址处读取到的8位数据
*@return	无
*/
uint8 IINCHIP_READ(uint32 addrbsb)
{
	uint8 data = 0;
	iinchip_csoff();                            
	IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);
	IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);
	IINCHIP_SpiSendData( (addrbsb & 0x000000F8))    ;
	data = IINCHIP_SpiSendData(0x00);            
	iinchip_cson();                               
	return data;    
}

/**
*@brief		向W5500写入len字节数据
*@param		addrbsb: 写入数据的地址
*@param   buf：写入字符串
*@param   len：字符串长度
*@return	len：返回字符串长度
*/
uint16 wiz_write_buf(uint32 addrbsb,uint8* buf,uint16 len)
{
	uint16 idx = 0;
	if(len == 0){ //printf(" Unexpected2 length 0\r\n");
	}
	iinchip_csoff();                               
	IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);
	IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);
	IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4); 
	for(idx = 0; idx < len; idx++)
	{
		IINCHIP_SpiSendData(buf[idx]);
	}
	iinchip_cson();                           
	return len;  
}

/**
*@brief		从W5500读出len字节数据
*@param		addrbsb: 读取数据的地址
*@param 	buf：存放读取数据
*@param		len：字符串长度
*@return	len：返回字符串长度
*/
uint16 wiz_read_buf(uint32 addrbsb, uint8* buf,uint16 len)
{
  uint16 idx = 0;
  if(len == 0)
  {
    //printf(" Unexpected2 length 0\r\n");
  }
  iinchip_csoff();                                
  IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);
  IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);
  IINCHIP_SpiSendData( (addrbsb & 0x000000F8));    
  for(idx = 0; idx < len; idx++)                   
  {
    buf[idx] = IINCHIP_SpiSendData(0x00);
  }
  iinchip_cson();                                  
  return len;
}

/**
*@brief		写配置信息到EEPROM
*@param		无
*@return	无
*/
void write_config_to_eeprom(void)
{
#ifdef DEMO_W5500 //add by Gavin	
	uint16 dAddr=0;
	ee_WriteBytes(ConfigMsg.mac,dAddr,(uint8)EEPROM_MSG_LEN);				
	delay_ms(10);	
#endif	
}

/**
*@brief		从EEPROM读配置信息
*@param		无
*@return	无
*/
void read_config_from_eeprom(void)
{
#ifdef DEMO_W5500 //add by Gavin
	ee_ReadBytes(EEPROM_MSG.mac,0,EEPROM_MSG_LEN);
	delay_us(10);
#endif
}

/**
*@brief		STM32定时器2初始化
*@param		无
*@return	无
*/
void timer2_init(void)
{
#ifdef DEMO_W5500 //add by Gavin	
	TIM2_Configuration();																		/* TIM2 定时配置 */
	TIM2_NVIC_Configuration();															/* 定时器的中断优先级 */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);		/* TIM2 重新开时钟，开始计时 */
#endif
}

/**
*@brief		dhcp用到的定时器初始化
*@param		无
*@return	无
*/
void dhcp_timer_init(void)
{
  timer2_init();																	
}

/**
*@brief		ntp用到的定时器初始化
*@param		无
*@return	无
*/
void ntp_timer_init(void)
{
  timer2_init();																	
}

/**
*@brief		定时器2中断函数
*@param		无
*@return	无
*/
#ifdef DEMO_W5500 //add by Gavin	
void timer2_isr(void)
{

  ms++;	
  if(ms>=1000)
  {  
    ms=0;
    dhcp_time++;			/*DHCP定时加1S*/
	#ifndef	__NTP_H__
	ntptimer++;				/*NTP重试时间加1S*/
	#endif
  }
}
#else
void timer2_isr(void)
{
//called by 20ms
  if(++ms>=50)
  {  
    ms=0;
    dhcp_time++;			/*DHCP定时加1S*/
	#ifndef	__NTP_H__
	ntptimer++;				/*NTP重试时间加1S*/
	#endif
  }	
}	
#endif

/**
*@brief		STM32系统软复位函数
*@param		无
*@return	无
*/
void reboot(void)
{
#ifdef DEMO_W5500 //add by Gavin
  pFunction Jump_To_Application;
  uint32 JumpAddress;
  //printf(" 系统重启中……\r\n");
  JumpAddress = *(vu32*) (0x00000004);
  Jump_To_Application = (pFunction) JumpAddress;
  Jump_To_Application();
#endif
}




//----------------------------------- NEXT add by Gavin ----------------------------------------------------------------


//see BASE protocol 5.2.9		TCPIP
struct tcpip_STR{
	unsigned char ip_addr[4];
	unsigned char mac_addr[6];	
	unsigned char subnet_mask[4];
	unsigned char gateway[4];	
#define 	IP_ADDR_LEN 	4
#define 	MAC_ADDR_LEN 	6
#define 	SUBNET_ADDR_LEN 	4
#define 	GATEWAY_ADDR_LEN 	4	
};
struct tcpip_STR tcp_ip;

#define 	STORE_IP_ADDR								0x120	//len=4+1
#define 	STORE_MAC_ADDR							0x128 //len=6+1
#define 	STORE_SUBNET_ADDR						0x130	//len=4+1
#define 	STORE_GATEWAY_ADDR					0x138 //len=4+1

#define 	W5500_STORE_FLAG		0x5A




//--------------------------------------------------------------------
static void w5500_set_mac_addr(void){
	memcpy(ConfigMsg.mac,tcp_ip.mac_addr, 6);//	memcpy(ConfigMsg.mac, mac, 6);
	setSHAR(ConfigMsg.mac);	
}

static void w5500_set_ip_addr(void){
	memcpy(ConfigMsg.lip,tcp_ip.ip_addr,4);
	setSIPR(ConfigMsg.lip);
}

static void w5500_set_sub_addr(void){
	memcpy(ConfigMsg.sub,tcp_ip.subnet_mask,4);
	setSUBR(ConfigMsg.sub);
}

static void w5500_set_getway_addr(void){
	memcpy(ConfigMsg.gw,tcp_ip.gateway,4);
	setGAR(ConfigMsg.gw);
}



/*
设置w5500的网络参数!!!
*/
static void setting_w5500_parameter(void)
{
	memcpy(ConfigMsg.mac,tcp_ip.mac_addr, 6);//	memcpy(ConfigMsg.mac, mac, 6);
	setSHAR(ConfigMsg.mac);	/**/
	memcpy(DHCP_GET.mac, tcp_ip.mac_addr, 6);//	memcpy(DHCP_GET.mac, mac, 6);	

  //复制定义的配置信息到配置结构体/
	memcpy(ConfigMsg.mac, tcp_ip.mac_addr, 6);
	
	
	memcpy(ConfigMsg.lip,tcp_ip.ip_addr,4);
	memcpy(ConfigMsg.sub,tcp_ip.subnet_mask,4);
	memcpy(ConfigMsg.gw,tcp_ip.gateway,4);
	
	memcpy(ConfigMsg.dns,dns_server,4);	
		
	/*将IP配置信息写入W5500相应寄存器*/	
	setSUBR(ConfigMsg.sub);
	setGAR(ConfigMsg.gw);
	setSIPR(ConfigMsg.lip);
}



/*
#define 	STORE_IP_ADDR								0x120	//len=4+1
#define 	STORE_MAC_ADDR							0x128 //len=6+1
#define 	STORE_SUBNET_ADDR						0x130	//len=4+1
#define 	STORE_GATEWAY_ADDR					0x138 //len=4+1
* 处理来自sdk/PC的配置参数信息
*/
void _0x61_tcpip_sub(const unsigned char *rxpc)
{
		unsigned char ack_buf[32],ack_len,wtmp[8];
		unsigned char op_flag =0;
		
		switch(rxpc[4]){

			case 2:
				memcpy(tcp_ip.ip_addr,rxpc+5,IP_ADDR_LEN);
				w5500_set_ip_addr();//
				memcpy(wtmp+1,tcp_ip.ip_addr,IP_ADDR_LEN);
				wtmp[0] =W5500_STORE_FLAG;
				platform.e2prom_write(STORE_IP_ADDR,wtmp,IP_ADDR_LEN+1);
			case 1: //read ip addr
				ack_buf[0] =1;
				memcpy(ack_buf+1,tcp_ip.ip_addr,IP_ADDR_LEN);
				ack_len =IP_ADDR_LEN;
				op_flag =1; 
				break;
			
			case 4:
				memcpy(tcp_ip.mac_addr,rxpc+5,MAC_ADDR_LEN);
				w5500_set_mac_addr();//
				memcpy(wtmp+1,tcp_ip.mac_addr,MAC_ADDR_LEN);
				wtmp[0] =W5500_STORE_FLAG;			
				platform.e2prom_write(STORE_MAC_ADDR,wtmp,MAC_ADDR_LEN+1);
			case 3: //read mac_addr addr
				ack_buf[0] =3;
				memcpy(ack_buf+1,tcp_ip.mac_addr,MAC_ADDR_LEN);
				ack_len =MAC_ADDR_LEN;
				op_flag =1;
				break;	

			case 6:
				memcpy(tcp_ip.subnet_mask,rxpc+5,SUBNET_ADDR_LEN);
				w5500_set_sub_addr();
				memcpy(wtmp+1,tcp_ip.subnet_mask,SUBNET_ADDR_LEN);
				wtmp[0] =W5500_STORE_FLAG;				
				platform.e2prom_write(STORE_SUBNET_ADDR,wtmp,SUBNET_ADDR_LEN+1);
			case 5: //read subnet_mask addr
				ack_buf[0] =5;
				memcpy(ack_buf+1,tcp_ip.subnet_mask,SUBNET_ADDR_LEN);
				ack_len =SUBNET_ADDR_LEN;
				op_flag =1;			
				break;	
			
			case 8:
				memcpy(tcp_ip.gateway,rxpc+5,GATEWAY_ADDR_LEN);
				w5500_set_getway_addr();
				memcpy(wtmp+1,tcp_ip.gateway,GATEWAY_ADDR_LEN);
				wtmp[0] =W5500_STORE_FLAG;			
				platform.e2prom_write(STORE_GATEWAY_ADDR,wtmp,GATEWAY_ADDR_LEN+1);
			case 7: //read gateway addr
				ack_buf[0] =7;
				memcpy(ack_buf+1,tcp_ip.gateway,GATEWAY_ADDR_LEN);
				ack_len =GATEWAY_ADDR_LEN;
				op_flag =1;			
				break;		
			
			default:break;
		}//sw	

		if(op_flag){
			user__pc_cmd_ack(0x61,12,ack_buf,ack_len+1);
		}
}


/*
* 从E2prom中的指定位置读取W5500的参数，用于上电初始化
* 初始化设置W5500 :
 setting parameter;
*/
static void read_w5500_parameter(void)
{
		unsigned char tmp[8];
		//12 TCP IP settting 
		//ip
		platform.e2prom_read(STORE_IP_ADDR,tmp,IP_ADDR_LEN+1);
		if(tmp[0] ==W5500_STORE_FLAG ){
			memcpy(tcp_ip.ip_addr,tmp+1,IP_ADDR_LEN);		
		}
		else{
			tcp_ip.ip_addr[0] = 192;
			tcp_ip.ip_addr[1] = 168;
			tcp_ip.ip_addr[2] = 0;
			tcp_ip.ip_addr[3] = 12;			
		}
		
		//mac
		 platform.e2prom_read(STORE_MAC_ADDR,tmp,MAC_ADDR_LEN+1);
		if( tmp[0] ==W5500_STORE_FLAG ){
			memcpy(tcp_ip.mac_addr,tmp+1,MAC_ADDR_LEN);						
		}
		else{
			tcp_ip.mac_addr[0] = 0x00;
			tcp_ip.mac_addr[1] = 0x08;
			tcp_ip.mac_addr[2] = 0xdc;
			tcp_ip.mac_addr[3] = 0x11;
			tcp_ip.mac_addr[4] = 0x11;
			tcp_ip.mac_addr[5] = 0x11;					
		}	
		
		//subnet
		platform.e2prom_read(STORE_SUBNET_ADDR,tmp,SUBNET_ADDR_LEN+1);
		if(tmp[0] == W5500_STORE_FLAG ){
			memcpy(tcp_ip.subnet_mask,tmp+1,SUBNET_ADDR_LEN);							
		}
		else{
			tcp_ip.subnet_mask[0] = 255;
			tcp_ip.subnet_mask[1] = 255;
			tcp_ip.subnet_mask[2] = 255;
			tcp_ip.subnet_mask[3] = 0;			
		}
		
		//gateway
		platform.e2prom_read(STORE_GATEWAY_ADDR,tmp,GATEWAY_ADDR_LEN+1);
		if(tmp[0] ==W5500_STORE_FLAG ){
			memcpy(tcp_ip.gateway,tmp+1,GATEWAY_ADDR_LEN);							
		}
		else{
			tcp_ip.gateway[0] = 200;
			tcp_ip.gateway[1] = 200;
			tcp_ip.gateway[2] = 100;
			tcp_ip.gateway[3] = 1;			
		}
		
}




/*
* 初始化W5500 
* 初始化io控制; rest ; setting ip mac。。。
*/
void w5500_init(void)
{
	if( !function.TCPIP__SW) return ;
	
  gpio_for_w5500_config();							/*初始化MCU相关引脚*/
  reset_w5500();												/*硬复位W5500*/
	
	//useing to test spi communication；add by Gavin 
	//w5500_ver = IINCHIP_READ(VERSIONR);	
	
//  PHY_check();													/*检查网线是否接入*/   
//  set_w5500_mac();											/*配置MAC地址*/
//  set_w5500_ip();												/*配置IP地址*/	
	read_w5500_parameter();	
	setting_w5500_parameter();//
	
  socket_buf_init(txsize, rxsize);			/*初始化8个Socket的发送接收缓存大小*/
}








