Hi,
Customer is trying to modify HDK lwip sample code for TCP/IP client.
The base code is provided from below git (see the original E2E post).
http://git.ti.com/hercules_examples/hercules_examples/trees/master/Application/LwIP
Customer modified below code:
hercules_examples-master\Application\LwIP\v00.04.00\example\hdk\src\lwip_main.c
Modified code is below.
err_t connected(void *arg, struct tcp_pcb *newpcb, err_t err) // err is always ERR_OK。 { err = tcp_write(newpcb, "ABCDE", 5, 0); if (err != ERR_OK) { return err; } err = tcp_output(newpcb); if (err != ERR_OK) { return err; } return ERR_OK; } void EMAC_LwIP_Main (uint8_t * macAddress) { unsigned int ipAddr; /// uint8_t testChar; /// struct in_addr devIPAddress; /// err_t udp_error; err_t tcp_error; u16_t send_bufs; //u8_t senddat[]={ 1, 2, 3, 4};//"ABCDE"; //s struct pbuf send_p; //iommUnlock(); //iommMuxEnableMdio(); //iommMuxEnableMii(); //iommLock(); sciInit(); /* Enable the interrupt generation in CPSR register */ IntMasterIRQEnable(); _enable_FIQ(); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); sciDisplayText(sciREGx, txtTitle, sizeof(txtTitle)); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); sciDisplayText(sciREGx, txtTI, sizeof(txtTI)); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); #ifdef __little_endian__ sciDisplayText(sciREGx, txtLittleEndian, sizeof(txtLittleEndian)); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); #else sciDisplayText(sciREGx, txtBigEndian, sizeof(txtBigEndian)); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); #endif /* Initialze the lwIP library, using DHCP.*/ sciDisplayText(sciREGx, txtEnetInit, sizeof(txtEnetInit)); /// ipAddr = lwIPInit(0, macAddress, 0, 0, 0, IPADDR_USE_DHCP); /* Uncomment the following if you'd like to assign a static IP address. Change address as required, and uncomment the previous statement. */ /// /* /// uint8 ip_addr[4] = { 44, 2, 168, 192 }; /// uint8 netmask[4] = { 0, 255, 255, 255 }; /// uint8 gateway[4] = { 254, 2, 168, 192 }; /* IP4_ADDR(&ipaddr, 192, 168, 2, 44); IP4_ADDR(&netmask, 255, 255, 255, 0); IP4_ADDR(&gateway, 192, 168, 2, 254); LWIP_PLATFORM_BYTE_SWAP LWIP_PLATFORM_HTONS() LWIP_PLATFORM_HTONL()*/ IP4_ADDR(&ipaddr, 44, 2, 168, 192); // my node ip addr IP4_ADDR(&netmask, 0, 255, 255, 255); IP4_ADDR(&gateway, 254, 2, 168, 192); ipAddr = lwIPInit(0, macAddress, /// *((uint32_t *)ip_addr), /// *((uint32_t *)netmask), /// *((uint32_t *)gateway), ipaddr.addr, netmask.addr, gateway.addr, IPADDR_USE_STATIC);///*/ sciDisplayText(sciREGx, (uint8_t*)"..DONE", sizeof("..DONE")); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); if (0 == ipAddr) { sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); sciDisplayText(sciREGx, txtErrorInit, sizeof(txtErrorInit)); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); } else { #if 0 ///削除 /* Convert IP Address to string */ devIPAddress.s_addr = ipAddr; txtIPAddrItoA = (uint8_t *)inet_ntoa(devIPAddress); LocatorConfig(macAddress, "HDK enet_lwip"); /* Initialize the sample httpd server. */ sciDisplayText(sciREGx, (uint8_t*)"Starting Web Server", sizeof("Starting Web Server")); httpd_init(); sciDisplayText(sciREGx, (uint8_t*)"..DONE", sizeof("..DONE")); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); /* Loop forever. All the work is done in interrupt handlers. */ while(1) { sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); sciDisplayText(sciREGx, txtTitle, sizeof(txtTitle)); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); sciDisplayText(sciREGx, txtTI, sizeof(txtTI)); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); #ifdef __little_endian__ sciDisplayText(sciREGx, txtLittleEndian, sizeof(txtLittleEndian)); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); #else sciDisplayText(sciREGx, txtBigEndian, sizeof(txtBigEndian)); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); #endif sciDisplayText(sciREGx, txtIPAddrTxt, sizeof(txtIPAddrTxt)); sciDisplayText(sciREGx, txtIPAddrItoA, 16); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); sciDisplayText(sciREGx, txtNote1, sizeof(txtNote1)); sciDisplayText(sciREGx, txtIPAddrItoA, 16); sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF)); /* Before printing the next set, wait for a character on the terminal */ sciReceive(sciREGx, 1, &testChar); } #endif IP4_ADDR(&server, 1, 2, 168, 192); // server ip addr pcbRcv = tcp_new(); if (!pcbRcv) { exit(1); } //#if 0 //for client // tcp_bind(pcbRcv, IP_ADDR_ANY, rsv_port); // tcp_arg(pcbRcv, NULL); tcp_error = tcp_connect(pcbRcv, &server, rsv_port, connected); //connect to the server if (tcp_error != ERR_OK) { exit(1); } send_bufs = tcp_sndbuf(pcbRcv); // tcp_error = tcp_write(pcbRcv, "ABCDE", 5, 0); // tcp_error = tcp_write(pcbRcv, senddat, 2, TCP_WRITE_FLAG_COPY); /* tcp_error = tcp_write(pcbRcv, send_p.payload, 2, TCP_WRITE_FLAG_COPY); if (tcp_error != ERR_OK) { exit(1); } tcp_error = tcp_output(pcbRcv); if (tcp_error != ERR_OK) { exit(1); } */ //#endif #if 0 //for server tcp_bind(pcbRcv, IP_ADDR_ANY, rsv_port); /* we do not need any arguments to callback functions */ // tcp_arg(pcbRcv, NULL); /* listen for connections */ // pcbRcv = tcp_listen(pcbRcv); pcbRcv = tcp_listen_with_backlog(pcbRcv, 2); if (!pcbRcv) { // xil_printf("Out of memory while tcp_listen\n\r"); // return -3; } /* specify callback to use for incoming connections */ tcp_accept(pcbRcv, accept_callback); #endif //for server while(1){} } }
Customer tries to connect the device to PC(server), but it cannot connect.
The code is in while(1) loop at the end of EMAC_LwIP_Main().
tcp_connect() returns ERR_OK.
Anything is missing?
It seems the sample code is http. Any initialization for TCP/IP required, etc.?
By the way, the above code works fine, if it is configured as TCP/IP server (by commenting out "#if 0 //for server").
Thanks and regards,
Koichiro Tashiro