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:
Fri May 17 12:09:59 2013 +0000
Revision:
1:cfe8984a32b4
Parent:
libraries/picotcp/modules/pico_dev_mbed.cpp@0:d7f2341ab245
Update for smaller SOCKETQ

Who changed what in which revision?

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