Free (GPLv2) TCP/IP stack developed by TASS Belgium

Dependents:   lpc1768-picotcp-demo ZeroMQ_PicoTCP_Publisher_demo TCPSocket_HelloWorld_PicoTCP Pico_TCP_UDP_Test ... more

PicoTCP. Copyright (c) 2013 TASS Belgium NV.

Released under the GNU General Public License, version 2.

Different licensing models may exist, at the sole discretion of the Copyright holders.

Official homepage: http://www.picotcp.com

Bug tracker: https://github.com/tass-belgium/picotcp/issues

Development steps:

  • initial integration with mbed RTOS
  • generic mbed Ethernet driver
  • high performance NXP LPC1768 specific Ethernet driver
  • Multi-threading support for mbed RTOS
  • Berkeley sockets and integration with the New Socket API
  • Fork of the apps running on top of the New Socket API
  • Scheduling optimizations
  • Debugging/benchmarking/testing

Demo application (measuring TCP sender performance):

Import programlpc1768-picotcp-demo

A PicoTCP demo app testing the ethernet throughput on the lpc1768 mbed board.

Committer:
tass
Date:
Mon Nov 04 09:43:44 2013 +0000
Revision:
112:c4463e7a6a41
Parent:
3:b4047e8a0123
Child:
124:a6ecd840c965
Removed serial variable from pico_dev_mbed.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 3:b4047e8a0123 1 /*********************************************************************
daniele 3:b4047e8a0123 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 3:b4047e8a0123 3 See LICENSE and COPYING for usage.
daniele 3:b4047e8a0123 4 Do not redistribute without a written permission by the Copyright
daniele 3:b4047e8a0123 5 holders.
daniele 3:b4047e8a0123 6
daniele 3:b4047e8a0123 7 Authors: Toon Peters, Maxime Vincent
daniele 3:b4047e8a0123 8 *********************************************************************/
daniele 3:b4047e8a0123 9 #include "mbed.h"
daniele 3:b4047e8a0123 10 extern "C" {
daniele 3:b4047e8a0123 11 #include "pico_device.h"
daniele 3:b4047e8a0123 12 #include "pico_dev_mbed.h"
daniele 3:b4047e8a0123 13 #include "pico_stack.h"
daniele 3:b4047e8a0123 14 #include "ethernet_api.h"
daniele 3:b4047e8a0123 15 }
daniele 3:b4047e8a0123 16
daniele 3:b4047e8a0123 17 struct pico_device_mbed {
daniele 3:b4047e8a0123 18 struct pico_device dev;
daniele 3:b4047e8a0123 19 int bytes_left_in_frame;
daniele 3:b4047e8a0123 20 };
daniele 3:b4047e8a0123 21
daniele 3:b4047e8a0123 22 #define ETH_MTU 1514
daniele 3:b4047e8a0123 23 uint8_t buf[ETH_MTU];
daniele 3:b4047e8a0123 24
daniele 3:b4047e8a0123 25 extern "C" {
daniele 3:b4047e8a0123 26
daniele 3:b4047e8a0123 27 static int pico_mbed_send(struct pico_device *dev, void *buf, int len)
daniele 3:b4047e8a0123 28 {
daniele 3:b4047e8a0123 29 int ret, sent;
daniele 3:b4047e8a0123 30 struct pico_device_mbed *mb = (struct pico_device_mbed *) dev;
daniele 3:b4047e8a0123 31
daniele 3:b4047e8a0123 32 if (len > ETH_MTU)
daniele 3:b4047e8a0123 33 return -1;
daniele 3:b4047e8a0123 34
daniele 3:b4047e8a0123 35 /* Write buf content to dev and return amount written */
daniele 3:b4047e8a0123 36 ret = ethernet_write((const char *)buf, len);
daniele 3:b4047e8a0123 37 sent = ethernet_send();
daniele 3:b4047e8a0123 38
tass 112:c4463e7a6a41 39 printf("ETH> sent %d bytes\r\n",ret);
daniele 3:b4047e8a0123 40 if (len != ret || sent != ret)
daniele 3:b4047e8a0123 41 return -1;
daniele 3:b4047e8a0123 42 else
daniele 3:b4047e8a0123 43 return ret;
daniele 3:b4047e8a0123 44 }
daniele 3:b4047e8a0123 45
daniele 3:b4047e8a0123 46 static int pico_mbed_poll(struct pico_device *dev, int loop_score)
daniele 3:b4047e8a0123 47 {
daniele 3:b4047e8a0123 48 int len;
daniele 3:b4047e8a0123 49 struct pico_device_mbed *mb = (struct pico_device_mbed *) dev;
daniele 3:b4047e8a0123 50
daniele 3:b4047e8a0123 51 while(loop_score > 0)
daniele 3:b4047e8a0123 52 {
daniele 3:b4047e8a0123 53 /* check for new frame(s) */
daniele 3:b4047e8a0123 54 len = (int) ethernet_receive();
daniele 3:b4047e8a0123 55
daniele 3:b4047e8a0123 56 /* return if no frame has arrived */
daniele 3:b4047e8a0123 57 if (!len)
daniele 3:b4047e8a0123 58 return loop_score;
daniele 3:b4047e8a0123 59
daniele 3:b4047e8a0123 60 /* read and process frame */
daniele 3:b4047e8a0123 61 len = ethernet_read((char*)buf, ETH_MTU);
tass 112:c4463e7a6a41 62 printf("ETH> recv %d bytes: %x:%x\r\n", len, buf[0],buf[1]);
daniele 3:b4047e8a0123 63 pico_stack_recv(dev, buf, len);
daniele 3:b4047e8a0123 64 loop_score--;
daniele 3:b4047e8a0123 65 }
daniele 3:b4047e8a0123 66 return loop_score;
daniele 3:b4047e8a0123 67 }
daniele 3:b4047e8a0123 68
daniele 3:b4047e8a0123 69 /* Public interface: create/destroy. */
daniele 3:b4047e8a0123 70 void pico_mbed_destroy(struct pico_device *dev)
daniele 3:b4047e8a0123 71 {
daniele 3:b4047e8a0123 72 ethernet_free();
daniele 3:b4047e8a0123 73 pico_device_destroy(dev);
daniele 3:b4047e8a0123 74 }
daniele 3:b4047e8a0123 75
daniele 3:b4047e8a0123 76 struct pico_device *pico_mbed_create(char *name)
daniele 3:b4047e8a0123 77 {
daniele 3:b4047e8a0123 78 std::uint8_t mac[PICO_SIZE_ETH];
daniele 3:b4047e8a0123 79 struct pico_device_mbed *mb = (struct pico_device_mbed*) pico_zalloc(sizeof(struct pico_device_mbed));
daniele 3:b4047e8a0123 80
daniele 3:b4047e8a0123 81 if (!mb)
daniele 3:b4047e8a0123 82 return NULL;
daniele 3:b4047e8a0123 83
daniele 3:b4047e8a0123 84 ethernet_address((char *)mac);
tass 112:c4463e7a6a41 85 printf("ETH> Set MAC address to: %x:%x:%x:%x:%x:%x\r\n", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
daniele 3:b4047e8a0123 86
daniele 3:b4047e8a0123 87 if(0 != pico_device_init((struct pico_device *)mb, name, mac)) {
tass 112:c4463e7a6a41 88 printf ("ETH> Loop init failed.\n");
daniele 3:b4047e8a0123 89 //pico_loop_destroy(mb);
daniele 3:b4047e8a0123 90 return NULL;
daniele 3:b4047e8a0123 91 }
daniele 3:b4047e8a0123 92
daniele 3:b4047e8a0123 93 mb->dev.send = pico_mbed_send;
daniele 3:b4047e8a0123 94 mb->dev.poll = pico_mbed_poll;
daniele 3:b4047e8a0123 95 mb->dev.destroy = pico_mbed_destroy;
daniele 3:b4047e8a0123 96 mb->bytes_left_in_frame = 0;
daniele 3:b4047e8a0123 97
daniele 3:b4047e8a0123 98 if(0 != ethernet_init()) {
tass 112:c4463e7a6a41 99 printf("ETH> Failed to initialize hardware.\r\n");
daniele 3:b4047e8a0123 100 pico_device_destroy((struct pico_device *)mb);
daniele 3:b4047e8a0123 101 return NULL;
daniele 3:b4047e8a0123 102 }
daniele 3:b4047e8a0123 103
daniele 3:b4047e8a0123 104 // future work: make the mac address configurable
daniele 3:b4047e8a0123 105
tass 112:c4463e7a6a41 106 printf("ETH> Device %s created.\r\n", mb->dev.name);
daniele 3:b4047e8a0123 107
daniele 3:b4047e8a0123 108 return (struct pico_device *)mb;
daniele 3:b4047e8a0123 109 }
daniele 3:b4047e8a0123 110
daniele 3:b4047e8a0123 111 void pico_mbed_get_address(char *mac)
daniele 3:b4047e8a0123 112 {
daniele 3:b4047e8a0123 113 ethernet_address(mac);
daniele 3:b4047e8a0123 114 }
daniele 3:b4047e8a0123 115
daniele 3:b4047e8a0123 116 }