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

Fork of PicoTCP by Daniele Lacamera

Committer:
daniele
Date:
Sat Aug 03 08:50:27 2013 +0000
Revision:
51:18637a3d071f
Parent:
3:b4047e8a0123
Branch for CDC-ECM: Work in progress

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 Serial pc(p9, p10, "Serial port"); // tx, rx
daniele 3:b4047e8a0123 26
daniele 3:b4047e8a0123 27 extern "C" {
daniele 3:b4047e8a0123 28
daniele 3:b4047e8a0123 29 static int pico_mbed_send(struct pico_device *dev, void *buf, int len)
daniele 3:b4047e8a0123 30 {
daniele 3:b4047e8a0123 31 int ret, sent;
daniele 3:b4047e8a0123 32 struct pico_device_mbed *mb = (struct pico_device_mbed *) dev;
daniele 3:b4047e8a0123 33
daniele 3:b4047e8a0123 34 if (len > ETH_MTU)
daniele 3:b4047e8a0123 35 return -1;
daniele 3:b4047e8a0123 36
daniele 3:b4047e8a0123 37 /* Write buf content to dev and return amount written */
daniele 3:b4047e8a0123 38 ret = ethernet_write((const char *)buf, len);
daniele 3:b4047e8a0123 39 sent = ethernet_send();
daniele 3:b4047e8a0123 40
daniele 3:b4047e8a0123 41 pc.printf("ETH> sent %d bytes\r\n",ret);
daniele 3:b4047e8a0123 42 if (len != ret || sent != ret)
daniele 3:b4047e8a0123 43 return -1;
daniele 3:b4047e8a0123 44 else
daniele 3:b4047e8a0123 45 return ret;
daniele 3:b4047e8a0123 46 }
daniele 3:b4047e8a0123 47
daniele 3:b4047e8a0123 48 static int pico_mbed_poll(struct pico_device *dev, int loop_score)
daniele 3:b4047e8a0123 49 {
daniele 3:b4047e8a0123 50 int len;
daniele 3:b4047e8a0123 51 struct pico_device_mbed *mb = (struct pico_device_mbed *) dev;
daniele 3:b4047e8a0123 52
daniele 3:b4047e8a0123 53 while(loop_score > 0)
daniele 3:b4047e8a0123 54 {
daniele 3:b4047e8a0123 55 /* check for new frame(s) */
daniele 3:b4047e8a0123 56 len = (int) ethernet_receive();
daniele 3:b4047e8a0123 57
daniele 3:b4047e8a0123 58 /* return if no frame has arrived */
daniele 3:b4047e8a0123 59 if (!len)
daniele 3:b4047e8a0123 60 return loop_score;
daniele 3:b4047e8a0123 61
daniele 3:b4047e8a0123 62 /* read and process frame */
daniele 3:b4047e8a0123 63 len = ethernet_read((char*)buf, ETH_MTU);
daniele 3:b4047e8a0123 64 pc.printf("ETH> recv %d bytes: %x:%x\r\n", len, buf[0],buf[1]);
daniele 3:b4047e8a0123 65 pico_stack_recv(dev, buf, len);
daniele 3:b4047e8a0123 66 loop_score--;
daniele 3:b4047e8a0123 67 }
daniele 3:b4047e8a0123 68 return loop_score;
daniele 3:b4047e8a0123 69 }
daniele 3:b4047e8a0123 70
daniele 3:b4047e8a0123 71 /* Public interface: create/destroy. */
daniele 3:b4047e8a0123 72 void pico_mbed_destroy(struct pico_device *dev)
daniele 3:b4047e8a0123 73 {
daniele 3:b4047e8a0123 74 ethernet_free();
daniele 3:b4047e8a0123 75 pico_device_destroy(dev);
daniele 3:b4047e8a0123 76 }
daniele 3:b4047e8a0123 77
daniele 3:b4047e8a0123 78 struct pico_device *pico_mbed_create(char *name)
daniele 3:b4047e8a0123 79 {
daniele 3:b4047e8a0123 80 std::uint8_t mac[PICO_SIZE_ETH];
daniele 3:b4047e8a0123 81 struct pico_device_mbed *mb = (struct pico_device_mbed*) pico_zalloc(sizeof(struct pico_device_mbed));
daniele 3:b4047e8a0123 82
daniele 3:b4047e8a0123 83 if (!mb)
daniele 3:b4047e8a0123 84 return NULL;
daniele 3:b4047e8a0123 85
daniele 3:b4047e8a0123 86 ethernet_address((char *)mac);
daniele 3:b4047e8a0123 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 3:b4047e8a0123 88
daniele 3:b4047e8a0123 89 if(0 != pico_device_init((struct pico_device *)mb, name, mac)) {
daniele 3:b4047e8a0123 90 pc.printf ("ETH> Loop init failed.\n");
daniele 3:b4047e8a0123 91 //pico_loop_destroy(mb);
daniele 3:b4047e8a0123 92 return NULL;
daniele 3:b4047e8a0123 93 }
daniele 3:b4047e8a0123 94
daniele 3:b4047e8a0123 95 mb->dev.send = pico_mbed_send;
daniele 3:b4047e8a0123 96 mb->dev.poll = pico_mbed_poll;
daniele 3:b4047e8a0123 97 mb->dev.destroy = pico_mbed_destroy;
daniele 3:b4047e8a0123 98 mb->bytes_left_in_frame = 0;
daniele 3:b4047e8a0123 99
daniele 3:b4047e8a0123 100 if(0 != ethernet_init()) {
daniele 3:b4047e8a0123 101 pc.printf("ETH> Failed to initialize hardware.\r\n");
daniele 3:b4047e8a0123 102 pico_device_destroy((struct pico_device *)mb);
daniele 3:b4047e8a0123 103 return NULL;
daniele 3:b4047e8a0123 104 }
daniele 3:b4047e8a0123 105
daniele 3:b4047e8a0123 106 // future work: make the mac address configurable
daniele 3:b4047e8a0123 107
daniele 3:b4047e8a0123 108 pc.printf("ETH> Device %s created.\r\n", mb->dev.name);
daniele 3:b4047e8a0123 109
daniele 3:b4047e8a0123 110 return (struct pico_device *)mb;
daniele 3:b4047e8a0123 111 }
daniele 3:b4047e8a0123 112
daniele 3:b4047e8a0123 113 void pico_mbed_get_address(char *mac)
daniele 3:b4047e8a0123 114 {
daniele 3:b4047e8a0123 115 ethernet_address(mac);
daniele 3:b4047e8a0123 116 }
daniele 3:b4047e8a0123 117
daniele 3:b4047e8a0123 118 }