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

Fork of PicoTCP by Daniele Lacamera

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 }