/************************************************************************ * 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); }
/************************************************************************ * 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); }
/************************************************************************ * 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); }
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; }
/************************************************************************ * 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, ®_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, ®_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, ®_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); } } } }