This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

LAUNCHXL2-570LC43: UDP Communication using LwIP - Error

Part Number: LAUNCHXL2-570LC43


Hi, 

I am using the LAUNCHXL2-570LC43 Hercules Launchpad to evaluate the UDP Code. I am using the ActiveWebServer code that i cloned from the TI Git. Using the LwIP library, I have run the client server code locally on my laptop and it worked fine. Now, I am trying to set up client on the Launchpad (integrating client code in lwip_main.c in ActiveWebServer example and commented the HTTP server part). It is giving the following errors. 

/workspace_v12/hercules_examples/Application/UDPClient/1.1.0/example/hdk/src/lwip_main.c", line 489: error #20: identifier "AF_INET" is undefined


"/workspace_v12/hercules_examples/Application/UDPClient/1.1.0/example/hdk/src/lwip_main.c", line 489: error #20: identifier "SOCK_DGRAM" is undefined

The sockets.h file has been included in the lwip_main.c.

Any leads on how to sort this ?

Attaching the lwip_main.c file for your ref 

// **************** LwIP main with UDP ***********************************

/** @file sys_main.c 
*   @brief Application main file
*   @date 15.July.2009
*   @version 1.01.000
*
*   This file contains the initialization & control path for the LwIP & EMAC driver
*   and can be called from system main.
*/

/* (c) Texas Instruments 2011, All rights reserved. */

#if defined(_TMS570LC43x_) || defined(_RM57Lx_)
#include "HL_sys_common.h"
#include "HL_system.h"
#include "HL_emac.h"
#include "HL_mdio.h"
#include "HL_phy_dp83640.h"
#include "HL_sci.h"
#include "HL_rti.h"
#include <stdio.h>
#include "lwip/inet.h"
#include "utils/locator.h"
#include "lwip/sockets.h"
#include "lwip/netdb.h"
#include "lwip/init.h"
#include "lwip/udp.h"
#include <string.h>
//**********added now *************
#include <sys/types.h>
#include "lwip/api.h"
#include "lwip/sys.h"

#else
#include "rti.h"
#include "sys_common.h"
#include "system.h"
#include "emac.h"
#include "mdio.h"
#include "phy_dp83640.h"
#include "sci.h"
#endif

#include "lwip/opt.h"
#include "utils/lwiplib.h"

//#if 0 - enable if Active wenServer not req
#include "httpserver_raw/httpd.h"
//#endif



#define TMS570_MDIO_BASE_ADDR 	0xFCF78900u /* Same base address for TMS570 & RM48 devices */
#define TMS570_EMAC_BASE_ADDR	0xFCF78000u /* Same base address for TMS570 & RM48 devices */
#define DPS83640_PHYID			0x20005CE1u	/** PHY ID Register 1 & 2 values for DPS83640 (Same for TMS570 & RM devices */
#define PHY_ADDR				1			/** EVM/Hardware dependent & is same for TMS570 & RM48 HDKs */
//*****************************************************************************
//
// SSI tag indices for each entry in the g_pcSSITags array.
//
//*****************************************************************************
#define SSI_INDEX_LEDSTATE  0
#define SSI_INDEX_FORMVARS  1
#define SSI_INDEX_SPEED     2

//*****************************************************************************

#define SERVER_IP "127.0.0.1" // Change to the IP address of your server
#define SERVER_PORT 12346
#define BUFFER_SIZE 1024


// This array holds all the strings that are to be recognized as SSI tag
// names by the HTTPD server.  The server will call SSIHandler to request a
// replacement string whenever the pattern <!--#tagname--> (where tagname
// appears in the following array) is found in ".ssi", ".shtml" or ".shtm"
// files that it serves.
//
//*****************************************************************************
static const char *g_pcConfigSSITags[] =
{
    "LEDtxt",        // SSI_INDEX_LEDSTATE
    "FormVars",      // SSI_INDEX_FORMVARS
    "speed"          // SSI_INDEX_SPEED
};

//*****************************************************************************
//
// The number of individual SSI tags that the HTTPD server can expect to
// find in our configuration pages.
//
//*****************************************************************************
#define NUM_CONFIG_SSI_TAGS     (sizeof(g_pcConfigSSITags) / sizeof (char *))

//*****************************************************************************
//
// Prototypes for the various CGI handler functions.
//
//*****************************************************************************
static char *ControlCGIHandler(int32_t iIndex, int32_t i32NumParams,
                               char *pcParam[], char *pcValue[]);
static char *SetTextCGIHandler(int32_t iIndex, int32_t i32NumParams,
                               char *pcParam[], char *pcValue[]);

//*****************************************************************************
//
// Prototype for the main handler used to process server-side-includes for the
// application's web-based configuration screens.
//
//*****************************************************************************
static int32_t SSIHandler(int32_t iIndex, char *pcInsert, int32_t iInsertLen);

//*****************************************************************************
//
// CGI URI indices for each entry in the g_psConfigCGIURIs array.
//
//*****************************************************************************
#define CGI_INDEX_CONTROL       0
#define CGI_INDEX_TEXT          1

//*****************************************************************************
//
// This array is passed to the HTTPD server to inform it of special URIs
// that are treated as common gateway interface (CGI) scripts.  Each URI name
// is defined along with a pointer to the function which is to be called to
// process it.
//
//*****************************************************************************
//#if 0 //Uncomment to disable active web server
static const tCGI g_psConfigCGIURIs[] =
{
    { "/iocontrol.cgi", (tCGIHandler)ControlCGIHandler }, // CGI_INDEX_CONTROL
    { "/settxt.cgi", (tCGIHandler)SetTextCGIHandler }     // CGI_INDEX_TEXT
};
//#endif // Uncomment to disable active webserver
//*****************************************************************************
//
// The number of individual CGI URIs that are configured for this system.
//
//*****************************************************************************
#define NUM_CONFIG_CGI_URIS     (sizeof(g_psConfigCGIURIs) / sizeof(tCGI))

//*****************************************************************************
//
// The file sent back to the browser by default following completion of any
// of our CGI handlers.  Each individual handler returns the URI of the page
// to load in response to it being called.
//
//*****************************************************************************
#define DEFAULT_CGI_RESPONSE    "/io_cgi.ssi"

//*****************************************************************************
//
// The file sent back to the browser in cases where a parameter error is
// detected by one of the CGI handlers.  This should only happen if someone
// tries to access the CGI directly via the broswer command line and doesn't
// enter all the required parameters alongside the URI.
//
//*****************************************************************************
#define PARAM_ERROR_RESPONSE    "/perror.htm"

#define JAVASCRIPT_HEADER                                                     \
    "<script type='text/javascript' language='JavaScript'><!--\n"
#define JAVASCRIPT_FOOTER                                                     \
    "//--></script>\n"

/* Choosing the SCI module used depending upon the device HDK */
#if defined(_TMS570LC43x_) || defined(_RM57Lx_)
#define sciREGx	sciREG1
#else
#define sciREGx	scilinREG
#endif

uint8_t		txtCRLF[]			= {'\r', '\n'};
uint8_t  	txtTitle[] 			= {"HERCULES MICROCONTROLLERS"};
uint8_t		txtTI[]				= {"Texas Instruments"};
uint8_t		txtLittleEndian[] 	= {"Little Endian device"};
uint8_t		txtBigEndian[]		= {"Big Endian device"};
uint8_t		txtEnetInit[]		= {"Initializing ethernet (DHCP)"};
uint8_t		txtIPAddrTxt[]		= {"Device IP Address: "};
uint8_t		txtNote1[]			= {"Webserver accessible @ http:\\\\"};
uint8_t		txtErrorInit[]		= {"-------- ERROR INITIALIZING HARDWARE --------"};
uint8_t		 * txtIPAddrItoA;  


void 	iommUnlock			(void);
void 	iommLock			(void);
void 	iommMuxEnableMdio	(void);
void 	iommMuxEnableRmii	(void);
void 	iommMuxEnableMii	(void);
void 	IntMasterIRQEnable	(void);
void 	smallDelay			(void);
void 	sciDisplayText		(sciBASE_t *sci, uint8_t *text,uint32_t length);


//*****************************************************************************
//
// This CGI handler is called whenever the web browser requests iocontrol.cgi.
//
//*****************************************************************************
static char *
ControlCGIHandler(int32_t iIndex, int32_t i32NumParams, char *pcParam[],
                  char *pcValue[])
{
    int32_t i32LEDState, i32Speed;
    bool bParamError;

    //
    // We have not encountered any parameter errors yet.
    //
    bParamError = false;

    //
    // Get each of the expected parameters.
    //
    i32LEDState = FindCGIParameter("LEDOn", pcParam, i32NumParams);
    i32Speed = GetCGIParam("speed_percent", pcParam, pcValue, i32NumParams,
            &bParamError);

    //
    // Was there any error reported by the parameter parser?
    //
    if(bParamError || (i32Speed < 0) || (i32Speed > 100))
    {
        return(PARAM_ERROR_RESPONSE);
    }

    //
    // We got all the parameters and the values were within the expected ranges
    // so go ahead and make the changes.
    //
    io_set_led((i32LEDState == -1) ? false : true);
    io_set_animation_speed(i32Speed);

    //
    // Send back the default response page.
    //
    return(DEFAULT_CGI_RESPONSE);
}

//*****************************************************************************
//
// This CGI handler is called whenever the web browser requests settxt.cgi.
//
//*****************************************************************************
static char *
SetTextCGIHandler(int32_t i32Index, int32_t i32NumParams, char *pcParam[],
                  char *pcValue[])
{
    long lStringParam;
    char pcDecodedString[48];

    //
    // Find the parameter that has the string we need to display.
    //
    lStringParam = FindCGIParameter("DispText", pcParam, i32NumParams);

    //
    // If the parameter was not found, show the error page.
    //
    if(lStringParam == -1)
    {
        return(PARAM_ERROR_RESPONSE);
    }

    //
    // The parameter is present. We need to decode the text for display.
    //
    DecodeFormString(pcValue[lStringParam], pcDecodedString, 48);

    //
    // Print sting over the UART
    //

    sciDisplayText(sciREGx, pcDecodedString, strlen(pcDecodedString));
    sciDisplayText(sciREGx, txtCRLF, sizeof(txtCRLF));

    //
    // Tell the HTTPD server which file to send back to the client.
    //
    return(DEFAULT_CGI_RESPONSE);
}

//*****************************************************************************
//
// This function is called by the HTTP server whenever it encounters an SSI
// tag in a web page.  The iIndex parameter provides the index of the tag in
// the g_pcConfigSSITags array. This function writes the substitution text
// into the pcInsert array, writing no more than iInsertLen characters.
//
//*****************************************************************************
static int32_t
SSIHandler(int32_t iIndex, char *pcInsert, int32_t iInsertLen)
{
    //
    // Which SSI tag have we been passed?
    //
    switch(iIndex)
    {
        case SSI_INDEX_LEDSTATE:
            io_get_ledstate(pcInsert, iInsertLen);
            break;

        case SSI_INDEX_FORMVARS:
            sprintf(pcInsert,
                    "%sls=%d;\nsp=%d;\n%s",
                    JAVASCRIPT_HEADER,
                    io_is_led_on(),
                    io_get_animation_speed(),
                    JAVASCRIPT_FOOTER);
            break;

        case SSI_INDEX_SPEED:
            io_get_animation_speed_string(pcInsert, iInsertLen);
            break;

        default:
            sprintf(pcInsert,"??");
            break;
    }

    //
    // Tell the server how many characters our insert string contains.
    //
    return(strlen(pcInsert));
}

/** @fn void main(void)
*   @brief Application main function
*   @note This function is empty by default.
*
*   This function is called after startup.
*   The user can use this function to implement the application.
*/

/* USER CODE BEGIN (2) */
void smallDelay(void) {
	  static volatile unsigned int delayval;
	  delayval = 10000;   // 100000 are about 10ms
	  while(delayval--);
}
/* USER CODE END */

void EMAC_LwIP_Main (uint8_t * macAddress)
{
    unsigned int 	ipAddr;
    uint8_t 		testChar;
    struct in_addr 	devIPAddress;

#if 1 //UDP Part
    int sockfd;
    struct sockaddr_in server_addr;
    char buffer[BUFFER_SIZE];
    ssize_t bytes_sent, bytes_received;
#endif


	//iommUnlock();
	//iommMuxEnableMdio();
	//iommMuxEnableMii();
	//iommLock();


	gioInit();
	rtiInit();
	sciInit();

#if defined(_TMS570LC43x_) || defined(_RM57Lx_)
    rtiEnableNotification(rtiREG1,rtiNOTIFICATION_COMPARE0);
    rtiEnableNotification(rtiREG1,rtiNOTIFICATION_COMPARE2);
#else
    rtiEnableNotification(rtiNOTIFICATION_COMPARE0);
    rtiEnableNotification(rtiNOTIFICATION_COMPARE2);
#endif

	
	/* 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); //Assign IP using 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] = { 192, 168, 2, 44 };
	uint8 netmask[4] = { 255, 255, 255, 0 };
	uint8 gateway[4] = { 192, 168, 2, 254 };
	ipAddr = lwIPInit(0, macAddress,
			*((uint32_t *)ip_addr),
			*((uint32_t *)netmask),
			*((uint32_t *)gateway),
			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 {
		/* Convert IP Address to string */
		devIPAddress.s_addr = ipAddr;
		txtIPAddrItoA = (uint8_t *)inet_ntoa(devIPAddress);
	    LocatorInit();
	    LocatorMACAddrSet(macAddress);
	    LocatorAppTitleSet("Launchpad iocontrol");

	//	#if 0 Uncomment to disable HTTP server
	
		/* 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));

	    //
	    // Pass our tag information to the HTTP server.
	    //
	    http_set_ssi_handler((tSSIHandler)SSIHandler, g_pcConfigSSITags,
	            NUM_CONFIG_SSI_TAGS);

	    //
	    // Pass our CGI handlers to the HTTP server.
	    //
	    http_set_cgi_handlers(g_psConfigCGIURIs, NUM_CONFIG_CGI_URIS);
	     /* Loop forever.  All the work is done in interrupt handlers. */

	        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 Uncomment to disable HTTP server
	}
	/* start rti for handling tcp servicing and the io animation*/
	rtiStartCounter(rtiREG1,rtiCOUNTER_BLOCK0);
	/* initialize io demo after webserver is up*/

	//#if 0 Uncomment to disable HTTP server
	io_init();
	//#endif Uncomment to disable HTTP server


	    // Initialize lwIP stack
	    lwip_init();

	    //************************* UDP Code ************************************
#if 1
	    // Create socket
	    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	    if (sockfd == -1) {
	        perror("Error creating socket");
	        return -1;
	    }

	    // Initialize server address structure
	    memset(&server_addr, 0, sizeof(server_addr));
	    server_addr.sin_family = AF_INET;
	    server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
	    server_addr.sin_port = htons(SERVER_PORT);

	    // Prompt user for input
	    printf("Enter message to send to server: ");
	    fgets(buffer, BUFFER_SIZE, stdin);

	    // Send message to server
	    bytes_sent = sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
	    if (bytes_sent == -1) {
	        perror("Error sending message to server");
	        close(sockfd);
	        return -1;
	    }

	    // Receive echo message from server
	    bytes_received = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, NULL, NULL);
	    if (bytes_received == -1) {
	        perror("Error receiving echo message from server");
	        close(sockfd);
	        return -1;
	    }

	    // Print received echo message
	    buffer[bytes_received] = '\0';
	    printf("Received echo message from server: %s\n", buffer);

	    // Close socket
	    close(sockfd);
#endif

    while(1);
}


void iommUnlock(void) {
	/*Unlock the IOMM Register*/
	*(int *) 0xFFFFEA38  = 0x83E70B13;  /* kicker 0 register, unlock CPU write access to PINMMR registers */
    *(int *) 0xFFFFEA3C  = 0x95A4F1E0;  /* kicker 1 register, */
}

void iommLock(void) {
	/*lock the IOMM Register*/
	*(int *) 0xFFFFEA38  = 0x00000000;  /* kicker 0 register, lock CPU write access to PINMMR registers */
    *(int *) 0xFFFFEA3C  = 0x00000000;  /* kicker 1 register, */
}

void iommMuxEnableMdio(void) {
	*(int *) 0xFFFFEB2C  = 0x00000400; 
	*(int *) 0xFFFFEB30  = 0x00000400; 
}

void iommMuxEnableRmii(void) {
	*(int *) 0xFFFFEB38  = 0x02010204;//P10  //RMIIRXER
	*(int *) 0xFFFFEB3C  = 0x08020101;//P11  //RMII_RXD0
	*(int *) 0xFFFFEB40  = 0x01010204;//P12  //RMII RXD1
	*(int *) 0xFFFFEB54  = 0x02040200;//P17  //RMII_RMCRSDV
	*(int *) 0xFFFFEB44  = 0x01080808;//P13  //RMII_TXEN , RMII_TX_D1 ,RMII_TX_D0
	*(int *) 0xFFFFEB48  = 0x01010401;//P14; //RMII_REFCLK
}

void iommMuxEnableMii(void) {
	*(int *) 0xFFFFEB38  &= 0xFFFFFF00; //P10[1]  //Mux 10 Rx_ER
	*(int *) 0xFFFFEB38  |= (1 << 1);   //P10[1]  //Mux 10 Rx_ER
	
	*(int *) 0xFFFFEB3C  &= 0x00FFFFFF; //P11[26]   //Mux 11 Rx[0]
	*(int *) 0xFFFFEB3C  |= (1 << 26);  //P11[26]   //Mux 11 Rx[0]

	*(int *) 0xFFFFEB40  &= 0x0000FF00;//P12[1,18,26]    //Mux 12 Rx[3],Rx[2],Rx[1]
	*(int *) 0xFFFFEB40  |= ((1<<26) | (1<<18) | (1<<1));//P12[1,18,26]    //Mux 12 Rx[3],Rx[2],Rx[1]

	*(int *) 0xFFFFEB44  &= 0x00000000;//P13[2, 10, 26,18]   //Mux 13 Tx[2],TxEn,Tx[1],Tx[0]
	*(int *) 0xFFFFEB44  |= ((1<<26)|(1<<18)|(1<<10)|(1<<2)); //P13[2, 10, 26,18]   //Mux 13 Tx[2],TxEn,Tx[1],Tx[0]

	*(int *) 0xFFFFEB48  &= 0xFFFF0000; //P14[9,2,11]   //Mux 14 Tx[3],RxClk
	*(int *) 0xFFFFEB48  |= ((1<<9)|(1<<2));    //P14[9,2]   //Mux 14 Tx[3],RxClk

	*(int *) 0xFFFFEB54  &= 0xFF00FF00      ;//P17[17,1,3]   //Mux 17 CRS,TxClk
	*(int *) 0xFFFFEB54  |= ((1<<17)|(1<<1));          //P17[17,1]   //Mux 17 CRS,TxClk

	*(int *) 0xFFFFEB5C  &= 0xFFFF00FF;  //P19[9]   //Mux 19 RxDV
	*(int *) 0xFFFFEB5C  |= (1<<9);      //P19[9]   //Mux 19 RxDV

	*(int *) 0xFFFFEB60  &= 0xFF00FFFF;  //P20[18]   //Mux 20 COL
	*(int *) 0xFFFFEB60  |= (1<<18);     //P20[18]   //Mux 20 COL

	*(int *) 0xFFFFEB84  &= 0x00FFFFFF;//P29[24]  //Mux 29 MII Select pin (24 bit - 0(MII),1(RMII))
	*(int *) 0xFFFFEB84  |= (0<<24);   //P29[24]  //Mux 29 MII Select pin (24 bit - 0(MII),1(RMII))
}


/*
** Interrupt Handler for Core 0 Receive interrupt
*/
volatile int countEMACCore0RxIsr = 0;
#pragma INTERRUPT(EMACCore0RxIsr, IRQ)
void EMACCore0RxIsr(void)
{
		countEMACCore0RxIsr++;
		lwIPRxIntHandler(0);
}

/*
** Interrupt Handler for Core 0 Transmit interrupt
*/
volatile int countEMACCore0TxIsr = 0;
#pragma INTERRUPT(EMACCore0TxIsr, IRQ)
void EMACCore0TxIsr(void)
{
	countEMACCore0TxIsr++;
    lwIPTxIntHandler(0);
}

void IntMasterIRQEnable(void)
{
	_enable_IRQ();
	return;
}

void IntMasterIRQDisable(void)
{
	_disable_IRQ();
	return;
}

unsigned int IntMasterStatusGet(void)
{
    return (0xC0 & _get_CPSR());
}

void sciDisplayText(sciBASE_t *sci, uint8_t *text,uint32_t length)
{
    while(length--)
    {
        while ((sci->FLR & 0x4) == 4); /* wait until busy */
        sciSendByte(sci,*text++);      /* send out text   */
    };
}

/* sci notification (Not used but must be provided) */
void sciNotification(sciBASE_t *sci, uint32_t flags)
{
	return;
}

I also read that enabling the LWIP_SOCKET macro in lwipopts.h may help. But that in turn is giving a couple other errors. 

Any leads with respect to this would be highly appreciated .

  • Hi Chandana,

    We do have only one ethernet example on UDP using LwIP, that is Ethernet bootloader.

    Hercules_Ethernet_Bootloader « Application - hercules_examples/hercules_examples - Software Examples for Hercules Processors

    Can you please verify your project with this project?

    --
    Thanks & Regards,
    Jagadish.

  • Hello. Using this example , I have tried to establish UDP communication between my Launchpad(as client) and my Laptop(as server). To do this, I have used 3 functions.

    udp_new () - To create a new pcb

    udp_bind() 

    udp_connect(). then using udp_Send I have sent data to server. Sending is completely fine.

    If i try to receive data from the server using udp_recv() I am unable to do so. Can you help me with it. The function and callback is defined as below in my code:

    void udp_client_recv_callback(void *arg, struct udp_pcb *pcb, struct pbuf *p,
    struct ip_addr *addr, u16_t port)
    {

    sciDisplayTextudp(sciREGx, udpTitle, sizeof(udpTitle)); // Just printing to see if callback is hit
    }


    void udp_recvFromServer()
    {

    sciDisplayTextudp(sciREGx, udpTitle, sizeof(udpTitle));
    udp_recv(pcb_udp1,udp_client_recv_callback, NULL);
    }

    udp_recvFromServer is called in my main function, after data is sent to server.

  • Hi Chandana,

    Can you please share your complete project for debugging at my end?

    --
    Thanks & Regards,
    Jagadish.

  •  UDPClient.zip

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    
    #define SERVER_ADDR 
    #define SERVER_PORT 5001
    #define BUFFER_SIZE 1024
    
    #define CLIENT_IP "192.168.2.44"   // IP address of the client
    #define CLIENT_PORT 6001       // Port number of the client
    
    int main() {
        int sockfd;
        struct sockaddr_in server_addr, client_addr;
        socklen_t client_len = sizeof(client_addr);
        char buffer[BUFFER_SIZE];
    
        // Create a UDP socket
        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
            perror("socket creation failed");
            exit(EXIT_FAILURE);
        }
    
        // Initialize server address struct
        memset(&server_addr, 0, sizeof(server_addr));
        server_addr.sin_family = AF_INET;
       // server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        server_addr.sin_port = htons(SERVER_PORT);
        server_addr.sin_addr.s_addr = inet_addr("192.168.2.10");
    
         int sockfd1;
            struct sockaddr_in client_addr1;
            socklen_t client_len1 = sizeof(client_addr1);
            char buffer1[BUFFER_SIZE];
            //char buffer1[] = {"HELLO"};
             // Create a UDP socket
            if ((sockfd1 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
                    perror("socket creation failed");
                    exit(EXIT_FAILURE);
            }
    
            // Setup server address structure
             memset(&client_addr1, 0, sizeof(client_addr1));
             client_addr1.sin_family = AF_INET;
             client_addr1.sin_port = htons(CLIENT_PORT);
             client_addr1.sin_addr.s_addr = inet_addr(CLIENT_IP);
    
        // Bind socket to the server address
        if (bind(sockfd, (const struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
            perror("bind failed");
            exit(EXIT_FAILURE);
        }
    
        printf("UDP server is running on port %d\n", SERVER_PORT);
    
        // Receive and process incoming UDP packets
        while (1) {
            int bytes_received = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&client_addr, &client_len);
            if (bytes_received < 0) {
                perror("recvfrom failed");
                exit(EXIT_FAILURE);
           }
    
        
            // Null-terminate the received data
            buffer[bytes_received] = '\0';
    
            // Print received data and client information
            printf("Received UDP packet from %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
            printf("Received data: %s\n", buffer);
    
    //	sendto(sockfd, buffer, strlen(buffer), 0, (const struct sockaddr *)&client_addr, client_len);
      //      printf("Sending data to client \n");
    
    		
    	
    	//**************************************************************************
    
            // Example: Echo back the received data to the client
            sendto(sockfd1, buffer1, strlen(buffer1), 0, (const struct sockaddr *)&client_addr1, client_len1);
    	printf("Sending data to client \n");
         }
    
        // Close the socket
        close(sockfd);
        close(sockfd1);
        return 0;
    }
    

    Hello Jagadish,

    Here's the project code. Also sharing with you, the server program running on my laptop.

    I basically have two different sockets created. Server: Listens on Port 5001, and Transmits on PORT 6001. 

    Vice Versa for the Client(Launchpad). 

    I have called the functions in httpd.c (server_connect which gets sockets ready and connects with server)

    Then the gio_read_write which sends and receives data .

    Thanks !

  • Also would be great if you could clarify what the udp_connect() function actually does, because the UDP is a connectionless protocol. 

  • Hello, any updates on this ?

  • Hi Chandana,

    My apologies for the delay in my response.

    Actually, i didn't get chance to work on your issue.

    I will try to work on it by tomorrow and will try to give my update by end of tomorrow.

    --
    Thanks & regards,
    Jagadish.

  • Hi Chandana,

    Also would be great if you could clarify what the udp_connect() function actually does, because the UDP is a connectionless protocol. 

    Yes, UDP itself connectionless.

    But here udp_connect API will allow us to specify the default destination address and port for data transfer.

    This doesn't establish a traditional connection like TCP, but it associates the socket with specific destination, making it easier to send packets.

    --
    Thanks & regards,
    Jagadish.

  • Can you please also refer below example, here i am able receive and transfer UDP packets without any issues.

    1512.Hercules_Ethernet_Bootloader.zip

  • Hi, When i try importing the project into Code Composer Studio, and build it, I get the error:

    Also when i build the project , it says Nothing found to build. 

  • Hi Chandana,

    Maybe folder paths were not added properly to the project in the CCS.

    Please review my first comment in the below thread, to rectify this issue.

    (+) RM57L843: Boot file isn't open in CCS - Arm-based microcontrollers forum - Arm-based microcontrollers - TI E2E support forums

    --
    Thanks & regards,
    Jagadish.