Esempio n. 1
0
/************************************************************************
* NAME: fnet_stack_init
*
* DESCRIPTION: TCP/IP Stack initialization.
************************************************************************/
static fnet_return_t fnet_stack_init( void )
{
    fnet_isr_init();
   
    if (fnet_timer_init(FNET_TIMER_PERIOD_MS) == FNET_ERR)
    {
        goto ERROR;
    }

#if FNET_CFG_DEBUG_STARTUP_MS && FNET_CFG_DEBUG
	fnet_println("\n Waiting %d Seconds...", FNET_CFG_DEBUG_STARTUP_MS/1000);
	fnet_timer_delay(fnet_timer_ms2ticks(FNET_CFG_DEBUG_STARTUP_MS));
#endif
 
    if(fnet_prot_init() == FNET_ERR)
    {
        goto ERROR;
    }
    fnet_socket_init();

    if(fnet_netif_init_all() == FNET_ERR)
    {
        goto ERROR;
    }

    return (FNET_OK);
ERROR:
    fnet_stack_release();

    return (FNET_ERR);
}
Esempio n. 2
0
/************************************************************************
* NAME: fapp_boot
*
* DESCRIPTION: 
************************************************************************/
static void fapp_boot(fnet_shell_desc_t desc)
{
/* Bootloader. */
#if FAPP_CFG_BOOTLOADER  

    /* The bootloader wait some time for a key over a serial connection.*/
    /* The wait time is given by the boot_delay parameter.*/
    fnet_time_t delay;

    const struct boot_mode *mode;

    mode = fapp_boot_mode_by_index (fapp_params_boot_config.mode);    
        

    if(mode->handler)
    {
        delay = fapp_params_boot_config.delay;
        
        fnet_shell_printf(desc, FAPP_BOOT_STR, mode->name, delay);

        while(delay > 0u)
        {
            delay--;
            if( fnet_shell_getchar(desc) != FNET_ERR)
            {
                break;
            }
                
            fnet_timer_delay(FNET_TIMER_TICK_IN_SEC); /* 1 sec. delay. */
            fnet_shell_printf(desc, "\b\b\b\b %3d", delay);
        }
       
        fnet_shell_println(desc, "");
       
        if(delay == 0u)
        {
            /* Auto-start*/
            mode->handler(desc);
        }
    }
    else
#endif    
    {
        /* Default startup script. */
        #if FAPP_CFG_STARTUP_SCRIPT_ENABLED
            fnet_shell_println(desc, "Startup script: %s", FAPP_CFG_STARTUP_SCRIPT);
            fnet_shell_script(desc, FAPP_CFG_STARTUP_SCRIPT );
        #endif
    }
    
    FNET_COMP_UNUSED_ARG(desc);
}
Esempio n. 3
0
/************************************************************************
* NAME: fapp_bench_udp_tx
*
* DESCRIPTION: Start TX TCP Benchmark. 
************************************************************************/
static void fapp_bench_udp_tx (struct fapp_bench_tx_params *params)
{
	int                     send_result;
	char                    ip_str[FNET_IP_ADDR_STR_SIZE];
	int                     i;
	int                     received;
    const struct linger     linger_option ={1, /*l_onoff*/
                                            4  /*l_linger*/};
    const unsigned long     bufsize_option = FAPP_BENCH_SOCKET_BUF_SIZE;
    struct sockaddr         foreign_addr;
    int                     exit_flag = 0;
    int                     sock_err;
    unsigned int            option_len;
    fnet_shell_desc_t       desc = params->desc;
    int                     packet_size = params->packet_size;
    int                     cur_packet_number;
    int                     iterations = params->iteration_number;
    fnet_address_family_t   family = params->foreign_addr.sa_family;

	
    if(packet_size > FAPP_BENCH_BUFFER_SIZE) /* Check max size.*/
	    packet_size = FAPP_BENCH_BUFFER_SIZE;
    
    fapp_bench.socket_listen = SOCKET_INVALID;
    
    /* ------ Start test.----------- */
    fnet_shell_println(desc, FAPP_DELIMITER_STR);
    fnet_shell_println(desc, " UDP TX Test" );
    fnet_shell_println(desc, FAPP_DELIMITER_STR);
    fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_S, "Remote IP addr", fnet_inet_ntop(family, params->foreign_addr.sa_data, ip_str, sizeof(ip_str)));
    fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_D, "Remote Port", fnet_ntohs(params->foreign_addr.sa_port));
    fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_D, "Message Size", params->packet_size);
    fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_D, "Num. of messages", params->packet_number);
    fnet_shell_println(desc, FAPP_SHELL_INFO_FORMAT_D, "Num. of iterations", params->iteration_number);
    fnet_shell_println(desc, FAPP_TOCANCEL_STR);
    fnet_shell_println(desc, FAPP_DELIMITER_STR);
    
    while(iterations--)
    {
        /* Create socket */
        if((fapp_bench.socket_foreign = socket(family, SOCK_DGRAM, 0)) == SOCKET_INVALID)
        {
            FNET_DEBUG("BENCH: Socket creation error.\n");
            iterations = 0;
            goto ERROR_1;
        }
        
        /* Set Socket options. */
        if( /* Setup linger option. */
            (setsockopt (fapp_bench.socket_foreign, SOL_SOCKET, SO_LINGER, (char *)&linger_option, sizeof(linger_option)) == SOCKET_ERROR) ||
            /* Set socket buffer size. */
            (setsockopt(fapp_bench.socket_foreign, SOL_SOCKET, SO_RCVBUF, (char *) &bufsize_option, sizeof(bufsize_option))== SOCKET_ERROR) ||
            (setsockopt(fapp_bench.socket_foreign, SOL_SOCKET, SO_SNDBUF, (char *) &bufsize_option, sizeof(bufsize_option))== SOCKET_ERROR) 
          )
        {
            FNET_DEBUG("BENCH: Socket setsockopt error.\n");
            iterations = 0;
            goto ERROR_2;		
        }
        
        /* Bind to the server.*/
        fnet_shell_println(desc,"Connecting.");

        foreign_addr = params->foreign_addr;
        
        if(connect(fapp_bench.socket_foreign, &foreign_addr, sizeof(foreign_addr))== FNET_ERR) 
        {
           fnet_shell_println(desc, "Connection failed.");
           iterations = 0;
           goto ERROR_2;
        } 
    
        /* Sending.*/
        fnet_shell_println(desc,"Sending."); 
        fapp_bench.bytes = 0;
        fapp_bench.remote_bytes = 0;
        cur_packet_number = 0;
        
        fapp_bench.first_time = fnet_timer_ticks();
        
        while(1)
        {
            send_result = send( fapp_bench.socket_foreign, (char*)(&fapp_bench.buffer[0]), packet_size, 0);
            fapp_bench.last_time = fnet_timer_ticks();
            
            
            if ( send_result == SOCKET_ERROR )
            {              
                option_len = sizeof(sock_err); 
                getsockopt(fapp_bench.socket_foreign, SOL_SOCKET, SO_ERROR, (char*)&sock_err, &option_len);
                fnet_shell_println(desc, "socket_error = %d", sock_err);
               
                iterations = 0;
                
                goto ERROR_2;
            }
            else
            {
                fapp_bench.bytes += send_result;
                cur_packet_number ++;
                
                exit_flag = fnet_shell_ctrlc (desc); /* Check [Ctrl+c]*/
                
                if((cur_packet_number >= params->packet_number)|| exit_flag)
                { 
                    if(exit_flag)
                    {
                        fnet_shell_println(desc, FAPP_SHELL_CANCELED_CTRL_C);
                        iterations = 0;
                    }
                     
                    break;/* => TX END. */
                }
            }
        }

        /* Send End mark.*/
        for(i=0; i < FAPP_BENCH_TX_UDP_END_ITERATIONS; i++)
        {
            unsigned long ack_bytes;
            
            /* Send END mark.*/
            send( fapp_bench.socket_foreign, (char*)(&fapp_bench.buffer[0]), 1, 0);
            fnet_timer_delay(1);
            
            /* Check ACK. It should contain recieved amount of data.*/
            received = recv(fapp_bench.socket_foreign, (char*)(&ack_bytes), sizeof(ack_bytes), 0);

            if(received == sizeof(ack_bytes)) /* ACK received.*/
            { 
                fapp_bench.remote_bytes = fnet_ntohl(ack_bytes);
                break;
            }
            else if(received == SOCKET_ERROR)
            {
                break;            
            }
            else
            {}
        }
        
        /* Print benchmark results.*/
        fapp_bench_print_results (desc);

ERROR_2:
        closesocket(fapp_bench.socket_foreign);
    }

ERROR_1:
    fnet_shell_println(desc, FAPP_BENCH_COMPLETED_STR);
}
Esempio n. 4
0
int main(void) {
	SOCKET bcast_s, server_s;
	int connected = 0, disconnect = 0;
	
	/* Setup Hardware */
	init_hw();
	
/* Test SPI and PWM */
#if CONFIG_TEST_HW
#if CONFIG_BOARD == CONFIG_BOARD_ADC
	trigger_isr_start(dspi_read);
#endif
#if CONFIG_BOARD == CONFIG_BOARD_PWM
	pwm_start();
#endif
	while(1);
#endif
	
	/* Initialise 7 Seg */
	sevenseg_set(CONFIG_7SEG_DEFAULT,DP_0);
	sevenseg_init();
	
	/* Initialise UART */
	fnet_cpu_serial_init(FNET_CFG_CPU_SERIAL_PORT_DEFAULT, 115200);

	/* Clear some screen */
	fnet_printf("\n\n\n");
	
	/* Print board type and firmware version */
	fnet_printf("Board Type: %s Firmware compiled %s %s \n",
			CONFIG_BOARD_TYPE_STRING, __TIME__, __DATE__);
	
	/* Initialise FNET stack */
	init_fnet();
	
	/* Set MAC address based on K60 UID*/
	set_mac_address();
	
	/* Wait for Ethernet connection */
	fnet_printf("Waiting for Connection \n");
	sevenseg_set(CONFIG_7SEG_DEFAULT,DP_1); /* First dot = waiting for connection */
	while (!check_connected()) {
		fnet_timer_delay(FNET_TIMER_TICK_IN_SEC * 1); /* 1 Sec */
		fnet_printf("."); /* Print some errors */
	}
	
	/* Wait for DHCP server, if it fails use link local */
	wait_dhcp(CONFIG_DHCP_TRIES);  
	
	/* Print current IP address */
	fnet_printf("Current IP Address:");
	print_cur_ip();
	fnet_printf("\n");
	
	sevenseg_set(CONFIG_7SEG_DEFAULT,DP_2); /* Second dot = have IP Address */
	
	/* Start UDP receiver */
	bcast_s = bcast_setup_listener(CONFIG_BCAST_PORT);
	if (bcast_s == -1) {
		fnet_printf("BCAST: Error, could not initialise port \n");
		while (1);
	}
	
	sevenseg_set(CONFIG_7SEG_DEFAULT,DP_3); /* Third dot = waiting for UDP */

	/* MAIN LOOP */
	while (1) {
		/* CONNECT IF NEEDED */
		if(!connected) {
			connected = netprot_connect(bcast_s, &server_s);
			#if CONFIG_BOARD == CONFIG_BOARD_PWM
				if(connected) {
					sevenseg_set("8888",DP_0); /* Change the screen, this will do for now */
				}
			#endif	
			fnet_poll_services(); /* Poll DHCP while unconnected */
		}
		
		/* WHEN CONNECTED */
		if (connected) {
			int sent = 0, err;
			
			/* Check for disconnection */
			if (disconnect) {
				disconnect = 0; /* Reset */
				netprot_goodbye(&server_s);
				/* Flush UDP port to prevent reconnecting to dead server */
				bcast_flush(bcast_s);
				sevenseg_set(CONFIG_7SEG_DEFAULT,DP_3); /* Third dot = waiting for UDP */
				/* Stop what you are doing */
				#if CONFIG_BOARD == CONFIG_BOARD_ADC
					trigger_isr_stop();
					capture_set_empty();
				#endif
				fnet_printf("Server Disconnected \n");
				connected = 0;
				continue;
			}
			
			/* Send data first if we are a capture type board */
			#if CONFIG_CAPTURE_SUPPORT
				sent = netprot_send_capture(server_s);
				if (sent<0) { /* Error - Disconnect */
					disconnect = 1;
					continue;
				}
			#endif
			
			/* Get commands */
			if (sent <= 0) { /* We have sent nothing or error */
				err = netprot_get_commands(server_s);
				if (err) { /* Error - Disconnect */
					disconnect = 1;
					continue;
				}
			}
		}
	}
	/* END OF MAIN LOOP */
	
	/* Should never end up here */
	return 0;
}
Esempio n. 5
0
/************************************************************************
* NAME: fnet_eth_phy_init
*
* DESCRIPTION: Ethernet Physical Transceiver initialization and/or reset.
*************************************************************************/
void fnet_eth_phy_init(fnet_fec_if_t *ethif)
{

#if FNET_CFG_CPU_MCF52235
#if 1
    fnet_uint16_t reg_value;
    /* Enable EPHY module, Enable auto_neg at start-up, Let PHY PLLs be determined by PHY.*/
    FNET_MCF_EPHY_EPHYCTL0 = (fnet_uint8_t)(FNET_MCF_EPHY_EPHYCTL0_EPHYEN);

    /* Start-up Delay for Kirin2 = 350uS */
    fnet_timer_delay(1); /* Delay for 1 timer tick (100ms) */

    /* Disable ANE that causes problems with some routers.  Enable full-duplex and 100Mbps */
    fnet_fec_mii_read(ethif, FNET_FEC_MII_REG_CR, &reg_value);
    fnet_fec_mii_write(ethif, FNET_FEC_MII_REG_CR, (fnet_uint16_t)(reg_value & (~FNET_FEC_MII_REG_CR_ANE) | FNET_FEC_MII_REG_CR_DPLX | FNET_FEC_MII_REG_CR_DATARATE));

#else /* Old version, just in case.*/
    fnet_uint16_t reg_value;

    /* Set phy address */
    FNET_MCF_EPHY_EPHYCTL1 = (fnet_uint8)FNET_MCF_EPHY_EPHYCTL1_PHYADD(ethif->phy_addr);

    /* Disable device, PHY clocks disabled, Enable autonigatiation, Turn on leds.*/
    FNET_MCF_EPHY_EPHYCTL0 = FNET_MCF_EPHY_EPHYCTL0_DIS100 | FNET_MCF_EPHY_EPHYCTL0_DIS10 | FNET_MCF_EPHY_EPHYCTL0_LEDEN ;

    /* Enable EPHY module.*/
    FNET_MCF_EPHY_EPHYCTL0 |= FNET_MCF_EPHY_EPHYCTL0_EPHYEN;

    /* Reset PHY.*/
    fnet_timer_delay(10);
    fnet_fec_mii_write(ethif, FNET_FEC_MII_REG_CR, FNET_ETH_MII_REG_CR_RESET);

    /* SECF128: EPHY Incorrectly Advertises It Can Receive Next Pages
    * Description:The EPHY from reset incorrectly advertises that it can receive next pages
    *    from the link partner. These next pages are most often used to send gigabit
    *    Ethernet ability information between link partners. This device is 10/100 Mbit
    *    only, so there is no need to advertise this capability. In fact if advertised this
    *    additional pages of information must be handled in a special manor not typical
    *    of 10/100 Ethernet drivers.
    * Workaround: The NXTP bit in the auto-negotiate (A/N) advertisement register (4.15) should
    *    be cleared as soon as possible after reset; ideally before enabling
    *    auto-negotiation.
    */
    if (fnet_fec_mii_read(ethif, FNET_FEC_MII_REG_ANAR, &reg_value) == FNET_OK)
    {
        anar_value &= (~ ( FNET_ETH_MII_REG_ANAR_NEXT_PAGE));/* Turn off next page mode.*/
        fnet_fec_mii_write(ethif, FNET_FEC_MII_REG_ANAR, reg_value);
    }

    /* Turns clocks on. Let PHY PLLs be determined by PHY. */
    FNET_MCF_EPHY_EPHYCTL0 &= (~(FNET_MCF_EPHY_EPHYCTL0_DIS100 | FNET_MCF_EPHY_EPHYCTL0_DIS10));
#endif
#endif

#if FNET_CFG_CPU_MCF52259
    fnet_uint8_t tmp_ptipar;
    fnet_uint8_t tmp_ptjpar;

    fnet_timer_delay(3);
    /* Workaround for PHY reset */
    tmp_ptipar = FNET_MCF5225X_GPIO_PTIPAR; /* Save current state */
    tmp_ptjpar = FNET_MCF5225X_GPIO_PTJPAR;
    FNET_MCF5225X_GPIO_PTIPAR = 0x00;		/* Ethernet signals now GPIO*/
    FNET_MCF5225X_GPIO_PTJPAR = 0x00;
    FNET_MCF5225X_GPIO_DDRTI = 0xFF;		/* GPIO output.*/
    FNET_MCF5225X_GPIO_DDRTJ = 0xFF;
    FNET_MCF5225X_GPIO_PORTTI = 0x00;		/* Force Ethernet signals low.*/
    FNET_MCF5225X_GPIO_PORTTJ = 0x00;

    /* Reset PHY.*/
    fnet_fec_mii_write(ethif, FNET_FEC_MII_REG_CR, FNET_FEC_MII_REG_CR_RESET);
    fnet_timer_delay(5);

    /* RSTO signal.*/
    FNET_MCF_RCM_RCR |= FNET_MCF_RCM_RCR_FRCRSTOUT;     /* Assert RSTO.*/
    fnet_timer_delay(5);
    FNET_MCF_RCM_RCR &= ~(FNET_MCF_RCM_RCR_FRCRSTOUT);  /* Negate RSTO.*/

    FNET_MCF5225X_GPIO_PTIPAR = tmp_ptipar;		/* Restore Ethernet signals.*/
    FNET_MCF5225X_GPIO_PTJPAR = tmp_ptjpar;
#endif

    {
        /* Check if the PHY is powered down or isolated, before using it.*/
        fnet_uint16_t reg_value;

        if (fnet_fec_mii_read(ethif, FNET_FEC_MII_REG_CR, &reg_value) == FNET_OK)
        {
            if(reg_value & (FNET_FEC_MII_REG_CR_PDWN | FNET_FEC_MII_REG_CR_ISOL))
            {
                reg_value &= ~(FNET_FEC_MII_REG_CR_PDWN | FNET_FEC_MII_REG_CR_ISOL);
                fnet_fec_mii_write(ethif, FNET_FEC_MII_REG_CR, reg_value);
            }
        }
    }

}