/******************************************************************************** * File Name: WiredLanTask * Function Describe:The Wired Lan Task * Relate Module: * Explain: * Writer: slw * Date: *******************************************************************************/ #define THIS_FILE_ID 11 //--------------------------------------------------------------------------------- #include "includes.h" #include "spi.h" #include "socket.h" #include "Internet/TcpEchoServer.h" #include "Internet/dhcp.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ //SOCKET 分配 #define SOCK_UDPS_DHCP 0 //DHCP 用于动态分配本地IP #define SOCK_TCPS_APP1 1 //Clinet #define SOCK_TCPS_LOOPBACK 7 //回环测试 uint8_t DHCP_MSG_BUF[548];//548 #define DATA_BUF_SIZE 900//1500 STATUE ServerStatus; SUT_WL_STATUS sutWLanStatus; OS_TID idWLanTask=0; U64 stkWLANTask[WIRE_LAN_TASK_STK_SIZE]; uint8_t gDATABUF[DATA_BUF_SIZE]; // Default Network Configuration wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc,0x00, 0xab, 0xcd}, .ip = {0, 0, 0, 0}, .sn = {255,255,255,0}, .gw = {0, 0, 0, 0}, .dns = {0,0,0,0}, .dhcp = NETINFO_DHCP };//dhcp:=NETINFO_STATIC or NETINFO_DHCP /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ void network_init(void); // Initialize Network information and display it void cb_ip_assign(void); //callback func when IP is assigned from DHCP server first void cb_ip_update(void); // callback func when IP is changed void cb_ip_conflict(void); // callback func when the assigned IP is conflict with others. uint8_t ClientInit(void); void ClientRun(void); int32_t WiredSendTcpData(uint8_t *data,uint16_t len); void SetIoMode(uint8_t iomode);//SOCK_IO_NONBLOCK;//SOCK_IO_BLOCK; /* ************************************************************************ W5500 PMODE配置 111: ALL CAPABLE,Auto-Negotiation enable * ************************************************************************/ void W5500_PMODE_CONFIG(void) { GPIO_InitTypeDef GPIO_InitStruct; //PB5->PMODE0,PB6->PMODE1,PB7->PMODE2 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_SetBits(GPIOB,(GPIO_Pin_5 | GPIO_Pin_6|GPIO_Pin_7)); } /* ************************************************************************ W5500 RESET 配置 (Active low) RESET should be held low at least 500 us for W550 * ************************************************************************/ void W5500_RESET_CONFIG(void) { GPIO_InitTypeDef GPIO_InitStruct; //PB2->RESET GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_ResetBits(GPIOB,GPIO_Pin_2); os_dly_wait(1); GPIO_SetBits(GPIOB,GPIO_Pin_2); } //192.168.1.107 unsigned char* StrTocharIP(unsigned char* SIP,unsigned char *ip) { char i =0; char j=0; // static unsigned char ip[4]={0}; unsigned char buf[20]={0}; while(*SIP!=0){ if(*SIP=='.'){ buf[i]=0; // printf("buf2====%d\r\n",buf[0]); ip[j]=atoi(buf); // printf("buf2====%s\r\n",buf); // printf("ip[%d]=%d\r\n",j,ip[j]); j++; SIP++; i=0; } buf[i]=*SIP; SIP++; i++; } buf[i]=0; ip[j]=atoi(buf); return ip; } /* 链接服务器 成功 返回1 失败 返回0 */ int8_t ConnectServer(void) { uint8_t mode; char tracebuf[35];//22 unsigned char buf2[4]={0}; int8_t r; SlwTrace(DEBUG,"Connect server...\r\n"); memset(buf2,0,sizeof(buf2)); StrTocharIP(sutProductPara.SIP,buf2); r=connect(SOCK_TCPS_APP1,buf2,sutProductPara.Port);//StrTocharIP(sutProductPara.SIP) snprintf(tracebuf,sizeof(tracebuf),"IP=%s..port=%d\r\n",sutProductPara.SIP,sutProductPara.Port); SlwTrace(DEBUG,tracebuf); if(r==SOCK_OK){ SlwTrace(DEBUG,"Connect OK!\r\n"); return 1; }else if(r==SOCKERR_SOCKINIT || r==SOCKERR_SOCKMODE){//socket未初始化,初始化之 SlwTrace(DEBUG,"socket init...\r\n"); mode=SOCK_IO_NONBLOCK; socket(SOCK_TCPS_APP1,Sn_MR_TCP,6000,SF_TCP_NODELAY); ctlsocket(SOCK_TCPS_APP1,CS_SET_IOMODE,&mode); }else if(r==SOCKERR_TIMEOUT){ SlwTrace(DEBUG,"Connect timeout!\r\n"); //os_dly_wait(1000); }else{ sprintf(tracebuf,"connect err=%d\r\n",r); SlwTrace(DEBUG,tracebuf); } return 0; } void DhcpDisplayIP(void) { #if 0 uint8_t ip[4]; char tracebuf[30]; getIPfromDHCP(ip); sprintf(tracebuf,"LC IP=%d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]); SlwTrace(DEBUG,tracebuf); getGWfromDHCP(ip); sprintf(tracebuf,"GW IP=%d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]); SlwTrace(DEBUG,tracebuf); getSNfromDHCP(ip); sprintf(tracebuf,"SN IP=%d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]); SlwTrace(DEBUG,tracebuf); getDNSfromDHCP(ip); sprintf(tracebuf,"DNS IP=%d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]); SlwTrace(DEBUG,tracebuf); #else char tracebuf[30]; sprintf(tracebuf,"LC IP=%d.%d.%d.%d\r\n",gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]); SlwTrace(DEBUG,tracebuf); sprintf(tracebuf,"GW IP=%d.%d.%d.%d\r\n",gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]); SlwTrace(DEBUG,tracebuf); sprintf(tracebuf,"SN IP=%d.%d.%d.%d\r\n",gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]); SlwTrace(DEBUG,tracebuf); sprintf(tracebuf,"DNS IP=%d.%d.%d.%d\r\n",gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]); SlwTrace(DEBUG,tracebuf); #endif } /************************************************************************************** cb_ip_assign callback func when IP is assigned from DHCP server first ***************************************************************************************/ void cb_ip_assign(void) { default_ip_assign(); SlwTrace(DEBUG,"IP is assigned from DHCP!\r\n"); ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO); DhcpDisplayIP(); sutWLanStatus.NetFlag=3;// //ClientInit(); } /************************************************************************************** cb_ip_update callback func when IP is changed ***************************************************************************************/ void cb_ip_update(void) { default_ip_update(); SlwTrace(DEBUG,"IP is update from DHCP!\r\n"); ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO); DhcpDisplayIP(); } /************************************************************************************** cb_ip_conflict callback func when the assigned IP is conflict with others. ***************************************************************************************/ void cb_ip_conflict(void) { SlwTrace(DEBUG,"IP Conflict!\r\n"); default_ip_conflict(); } /** * @brief Intialize the network information to be used in WIZCHIP * @retval None */ void network_init(void) { char tacebuf[100]; uint8_t tmpstr[6]; getNetMacByPSN(sutProductPara.MAC,sutProductPara.PSN); //MAC memcpy(gWIZNETINFO.mac,sutProductPara.MAC,6); ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO); ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO); if(0!=memcmp(gWIZNETINFO.mac,sutProductPara.MAC,6)){ W5500_RESET_CONFIG(); os_dly_wait(20); memcpy(gWIZNETINFO.mac,sutProductPara.MAC,6); ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO); ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO); if(0!=memcmp(gWIZNETINFO.mac,sutProductPara.MAC,6)){ SlwTrace(DEBUG,"W5500 Init fail!\r\nWiredLan Stop!\r\n"); while(1){ os_dly_wait(10000); } } } // Display Network Information ctlwizchip(CW_GET_ID,(void*)tmpstr); snprintf(tacebuf,sizeof(tacebuf),"\r\n=== %s NET CONF ===\r\n",(char*)tmpstr); SlwTrace(DEBUG,tacebuf); snprintf(tacebuf,sizeof(tacebuf),"MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2], gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]); SlwTrace(DEBUG,tacebuf); snprintf(tacebuf,sizeof(tacebuf),"SIP: %d.%d.%d.%d\r\n", gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]); SlwTrace(DEBUG,tacebuf); snprintf(tacebuf,sizeof(tacebuf),"GAR: %d.%d.%d.%d\r\n", gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]); SlwTrace(DEBUG,tacebuf); snprintf(tacebuf,sizeof(tacebuf),"SUB: %d.%d.%d.%d\r\n", gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]); SlwTrace(DEBUG,tacebuf); snprintf(tacebuf,sizeof(tacebuf),"DNS: %d.%d.%d.%d\r\n", gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]); SlwTrace(DEBUG,tacebuf); SlwTrace(DEBUG,"======================\r\n"); } //int32_t RecvDataFromServer() //{ // char tracebuf[20]; // int32_t r; // r=recv(SOCK_TCPS_APP1,gDATABUF, sizeof(gDATABUF)); // if(r>0){ // snprintf(tracebuf,sizeof(tracebuf),">SendUpload>>\r\n"); // sutTestData.CSQ=0; // sutTestData.NetMode=2; // len=TcpPackingSendTest(g_ucTcpSendBuf); // return WiredSendTcpData(g_ucTcpSendBuf,len); return 0; } int32_t SendRegServer(void) { int r,len; // SlwTrace(DEBUG,">>SendReg>>\r\n"); // sutModemStatus.TcpSendTimeCt++; // sutTestData.NetMode=2;//LAN模式上传 // len=TcpPackingReg(g_ucTcpSendBuf); // if(len==0)return -1; // Debugsend(g_ucTcpSendBuf, len);//打印发送的数据 // r = WiredSendTcpData(g_ucTcpSendBuf,len); return r; } /* SOCK_IO_NONBLOCK;//SOCK_IO_BLOCK; */ void SetIoMode(uint8_t iomode) { static uint8_t mode; mode=iomode; ctlsocket(SOCK_TCPS_APP1,CS_SET_IOMODE,&mode); } //void ClientRun(void) //{ // static uint8_t sucCt=0; // static uint8_t sucSendRegCt=0; // static uint8_t sucSendTestCt=0; // if(sutWLanStatus.Connected==1) // RecvDataFromServer();//接收处理 非阻塞模式 // if(++sucCt>100){ // sucCt=0; // }else return; // // if(sutWLanStatus.Connected==0){//未链接 // if(SOCK_OK==ConnectServer()){//链接服务器 阻塞模式 // sutWLanStatus.Connected=1; // sucSendRegCt=0; // sucSendTestCt=30; // SendReg2Server(); // } // }else if(sutWLanStatus.Logined==0){//已链接,但未登陆,定时发登陆包 // if(++sucSendRegCt>5){ // sucSendRegCt=0; // sucSendTestCt=30; // if(SendReg2Server()<0){ // sutWLanStatus.Connected=0; // } // } // }else{//已登陆 // if(++sucSendTestCt>30){ // sucSendTestCt=0; // SendTest2Server(); // } // } //} /* 通过有线通道发送TCP数据 */ int32_t WiredSendTcpData(uint8_t *data,uint16_t len) { char buf[30]; int i,flag; int32_t r; sprintf(buf,">WD Send %d>\r\n",len); SlwTrace(DEBUG,buf); //------------------------------- //sutModemStatus.TcpSendTimeCt++; //测试暂时注销 r=send(SOCK_TCPS_APP1,data,len); switch(r){ case SOCKERR_TIMEOUT://- Timeout occurred \n SlwTrace(DEBUG,"err:SOCKERR_TIMEOUT\r\n"); break; case SOCKERR_SOCKMODE://Invalid operation in the socket \n SlwTrace(DEBUG,"err:SOCKERR_SOCKMODE\r\n"); break; case SOCKERR_SOCKNUM://Invalid socket number \n SlwTrace(DEBUG,"err:SOCKERR_SOCKNUM\r\n"); break; case SOCKERR_DATALEN://zero data length \n SlwTrace(DEBUG,"err:SOCKERR_DATALEN\r\n"); break; case SOCK_BUSY://Socket is busy. SlwTrace(DEBUG,"err:SOCK_BUSY\r\n"); break; sut_sys_status.Resend=1; } if(sutDeviceConfig.DebugPrintEn != 0 && r>0){ snprintf(buf,sizeof(buf),"Send[%d/%d] OK!\r\n",r,len); SlwTrace(DEBUG,buf); sut_sys_status.Resend=0; } return r; } /******************************************************************* *WiredLanTask *有线网络任务 ********************************************************************/ __task void WiredLanTask(void) { static unsigned short susSendUploadCt=0; static unsigned char sucSendTickCt=0; static unsigned char sucSendWaitAckCt=0;//发送后等待ACK计数器 char tracebuf[50]; uint8_t SecCt=0; uint8_t tmp; int32_t ret = 0; uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}}; uint8_t flag=1; sutProductPara.ConnectType=0; //0---有线 1---无线 WIRED_LAN_TASK_START: HeartTimeOut=20; SlwTrace(DEBUG,"WiredLanTask Start...\r\n"); memset(&sutWLanStatus,0,sizeof(SUT_WL_STATUS)); W5500_PMODE_CONFIG(); W5500_RESET_CONFIG(); SPI_Configuration();//Config SPI reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit); //注册临界区函数 #if _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_ reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect);//注册SPI片选信号函数 #elif _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_ reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect); // CS must be tried with LOW. #else #if (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SIP_) != _WIZCHIP_IO_MODE_SIP_ #error "Unknown _WIZCHIP_IO_MODE_" #else reg_wizchip_cs_cbfunc(wizchip_select, wizchip_deselect); #endif #endif /* SPI Read & Write callback function */ reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte); //注册读写函数 /* WIZCHIP SOCKET Buffer initialize */ if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1){ SlwTrace(DEBUG,"WIZCHIP Initialized fail.\r\n"); GPIO_ResetBits(GPIOB,GPIO_Pin_2);//set W5500 Reset os_dly_wait(10);//6000 goto WIRED_LAN_TASK_START; } /* PHY link status check */ do{ if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1){ SlwTrace(DEBUG,"Unknown PHY Link stauts.\r\n"); } os_dly_wait(100); if(++SecCt>10){ SecCt=0; while(1){ //跑无线任务 os_dly_wait(100); if(sutProductPara.ConnectType==0)sutProductPara.ConnectType=1; } SlwTrace(DEBUG,"4444444444444444444\r\n"); goto WIRED_LAN_TASK_START; } }while(tmp == PHY_LINK_OFF); sutWLanStatus.NetFlag=1;//网络IC初始化成功 //////////////////////////////////////////// /* Network initialization */ network_init(); //检查网线是否已插入 while((getPHYCFGR()&PHYCFGR_LNK_ON)==PHYCFGR_LNK_OFF){ SlwTrace(DEBUG,"Network cable not inserted!\r\n"); os_dly_wait(100); if(++SecCt>30){ //改为30S //180 goto WIRED_LAN_TASK_START; } }; sutWLanStatus.NetFlag=2;//网线已插入 //////////////////////////////////////////// //DHCP client initialization DHCP_init(SOCK_UDPS_DHCP,DHCP_MSG_BUF); //Register DHCP call back function reg_dhcp_cbfunc(cb_ip_assign,cb_ip_update,cb_ip_conflict); memset(&sutWLanStatus,0,sizeof(SUT_WL_STATUS)); //清0 sutWLanStatus.SendTestInterval=20;//发送间隔 /* Main loop */ SecCt=0; while(1){ //os_dly_wait(10); FEED_EXTWATCHDOG(); IWDG_ReloadCounter(); os_dly_wait(1); //DHCP client in the main loop DHCP_run(); //处理接收 // typedef struct SUT_WL_STATUS //{ // uint8_t NetFlag;//网络状态 0--网络芯片未完成初始化 1--网络IC初始化成功但网线未链接 2--网线已插入但DHCP未分配IP 3--DHCP已分配内网IP // uint8_t ConnectEnable;//链接使能 0--不允许链接服务器 1--允许链接服务器 // uint8_t SocketOpened;//Socket已绑定 // uint8_t Connected;//0未链接 1已链接 // uint8_t Logined;//0未登陆 1已登陆 // uint8_t SendRegCt; //发送登陆包次数计数器 // uint8_t SendRegCtrlCt;//发送登陆包控制计数器 // uint8_t SendTestCt; //发测试包次数计数器 // uint8_t SendTestCtrlCt;//发测试包控制计数器 // uint8_t SendTestInterval;//发送Test间隔 // uint16_t TaskRunSec;//运行了多久 // uint16_t OffLineCt;//离线时间 //}SUT_WL_STATUS; // sutWLanStatus.ConnectEnable=1; if(sutWLanStatus.ConnectEnable==1 && sutWLanStatus.Connected==1){ ret=recv(SOCK_TCPS_APP1,gDATABUF, sizeof(gDATABUF)); if(ret==SOCKERR_SOCKSTATUS){ if(flag){ SlwTrace(DEBUG,"recv err:SOCKERR_SOCKSTATUS\r\n"); flag=0; } sutWLanStatus.Connected=0; sutWLanStatus.Logined=0; }else if(ret>0){ flag=1; sutWLanStatus.Connected=1; sutWLanStatus.SendTestCt=0; snprintf(tracebuf,sizeof(tracebuf),"100)os_old_time=os_cur_time; else continue; if(sutWLanStatus.TaskRunSec<0xffff)sutWLanStatus.TaskRunSec++; //判断网线是否已插入 if((getPHYCFGR()&PHYCFGR_LNK_ON)==PHYCFGR_LNK_OFF){ if(sutWLanStatus.NetFlag!=1){ sutWLanStatus.NetFlag=1;//网线未插入 SlwTrace(DEBUG,"Network cable not inserted!\r\n"); } }else if(sutWLanStatus.NetFlag<2){//网线已插入 SlwTrace(DEBUG,"Network cable inserted!\r\n"); if(gWIZNETINFO.ip[0]!=0){ sutWLanStatus.NetFlag=3; }else{ sutWLanStatus.NetFlag=2; } } //DHCP 1s Tick Timer handler DHCP_time_handler(); //--- if(sutWLanStatus.Connected==0){//------TCP未链接 则连接之----- ServerStatus=CLOSED; sutWLanStatus.Connected=ConnectServer(); sutWLanStatus.SendRegCtrlCt=9; sutWLanStatus.SendRegCt=0; }else if(ServerStatus!=OPENED){//----服务器未登陆则发登陆包----- // /***************************/ // ServerStatus=OPENED; //测试 // sut_sys_status.Logined=1; // /**************************/ sutWLanStatus.SendTestCt=0; sutWLanStatus.SendTestCtrlCt=sutWLanStatus.SendTestInterval-1;// //控制每10秒发1次登陆包,直到已登陆 if(++sutWLanStatus.SendRegCtrlCt>10){ sutWLanStatus.SendRegCtrlCt=0; //SendRegServer(); TSStatueSendPosition(TS_TERMINAL_LOGIN); //登录包 //连续发了5次还是无法登陆,则延时一段时间后重来 if(++sutWLanStatus.SendRegCt>5){ sutWLanStatus.SendRegCt=0; os_dly_wait(1); goto WIRED_LAN_TASK_START;// } } }else{//------已登陆服务器,定时发Test----- //控制发Test包 //if(!HeartTimeOut--)goto WIRED_LAN_TASK_START; if(sucSendWaitAckCt>0) sucSendWaitAckCt--; //15S if(sucSendWaitAckCt==0){ if(++susSendUploadCt>15){ susSendUploadCt=0; sucSendWaitAckCt=1; //SendTestServer(); //心跳 TSStatueSendPosition(TS_TERMINAL_HEARTBEAT); SlwTrace(DEBUG,"SendValue 111111\r\n"); printf("ConnectEnable==%d,Connected===%d\r\n",sutWLanStatus.ConnectEnable,sutWLanStatus.Connected); } } } } }