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:
50:c3b337c38feb
Branch for CDC-ECM: Work in progress

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 50:c3b337c38feb 1 /*********************************************************************
daniele 50:c3b337c38feb 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 50:c3b337c38feb 3 See LICENSE and COPYING for usage.
daniele 50:c3b337c38feb 4 Do not redistribute without a written permission by the Copyright
daniele 50:c3b337c38feb 5 holders.
daniele 50:c3b337c38feb 6
daniele 50:c3b337c38feb 7 Authors: Daniele Lacamera, Julien Duraj
daniele 50:c3b337c38feb 8 *********************************************************************/
daniele 50:c3b337c38feb 9 #include "mbed.h"
daniele 50:c3b337c38feb 10 #include "USBCDC_ECM.h"
daniele 50:c3b337c38feb 11 #include "ethernet_api.h"
daniele 50:c3b337c38feb 12 #include "pico_dev_mbed_usb.h"
daniele 50:c3b337c38feb 13
daniele 50:c3b337c38feb 14 extern "C" {
daniele 50:c3b337c38feb 15 #include "pico_device.h"
daniele 50:c3b337c38feb 16 #include "pico_stack.h"
daniele 50:c3b337c38feb 17 }
daniele 50:c3b337c38feb 18
daniele 50:c3b337c38feb 19 struct pico_device_mbed_usb {
daniele 50:c3b337c38feb 20 struct pico_device dev;
daniele 50:c3b337c38feb 21 int bytes_left_in_frame;
daniele 50:c3b337c38feb 22 USBCDC_ECM *ecm;
daniele 50:c3b337c38feb 23 };
daniele 50:c3b337c38feb 24
daniele 50:c3b337c38feb 25 #define ETH_MTU 1514
daniele 50:c3b337c38feb 26 static uint8_t buf[ETH_MTU];
daniele 50:c3b337c38feb 27
daniele 50:c3b337c38feb 28 Serial __pc(p9, p10, "Serial port"); // tx, rx
daniele 50:c3b337c38feb 29
daniele 50:c3b337c38feb 30 extern "C" {
daniele 50:c3b337c38feb 31
daniele 50:c3b337c38feb 32 static int pico_mbed_usb_send(struct pico_device *dev, void *buffer, int len)
daniele 50:c3b337c38feb 33 {
daniele 50:c3b337c38feb 34 int ret, sent;
daniele 50:c3b337c38feb 35 struct pico_device_mbed_usb *mb = (struct pico_device_mbed_usb *) dev;
daniele 50:c3b337c38feb 36
daniele 50:c3b337c38feb 37 if (len > ETH_MTU)
daniele 50:c3b337c38feb 38 return -1;
daniele 50:c3b337c38feb 39 ret = mb->ecm->send((uint8_t *)buffer, len);
daniele 50:c3b337c38feb 40
daniele 50:c3b337c38feb 41 if (!ret)
daniele 50:c3b337c38feb 42 return -1;
daniele 50:c3b337c38feb 43 return len;
daniele 50:c3b337c38feb 44 }
daniele 50:c3b337c38feb 45
daniele 50:c3b337c38feb 46 static int pico_mbed_usb_poll(struct pico_device *dev, int loop_score)
daniele 50:c3b337c38feb 47 {
daniele 50:c3b337c38feb 48 int size;
daniele 50:c3b337c38feb 49 struct pico_device_mbed_usb *mb = (struct pico_device_mbed_usb *) dev;
daniele 50:c3b337c38feb 50
daniele 50:c3b337c38feb 51 while(loop_score > 0)
daniele 50:c3b337c38feb 52 {
daniele 50:c3b337c38feb 53 bool ret;
daniele 50:c3b337c38feb 54 /* check for new frame(s) */
daniele 50:c3b337c38feb 55 ret = mb->ecm->readEP_NB(buf, (uint32_t *)&size);
daniele 50:c3b337c38feb 56
daniele 50:c3b337c38feb 57 /* return if no frame has arrived */
daniele 50:c3b337c38feb 58 if (!ret)
daniele 50:c3b337c38feb 59 return loop_score;
daniele 50:c3b337c38feb 60
daniele 50:c3b337c38feb 61 /* read and process frame */
daniele 50:c3b337c38feb 62 printf("ETH> recv %d bytes: %x:%x\r\n", size, buf[0],buf[1]);
daniele 50:c3b337c38feb 63 pico_stack_recv(dev, buf, size);
daniele 50:c3b337c38feb 64 loop_score--;
daniele 50:c3b337c38feb 65 }
daniele 50:c3b337c38feb 66 return loop_score;
daniele 50:c3b337c38feb 67 }
daniele 50:c3b337c38feb 68
daniele 50:c3b337c38feb 69 /* Public interface: create/destroy. */
daniele 50:c3b337c38feb 70 void pico_mbed_usb_destroy(struct pico_device *dev)
daniele 50:c3b337c38feb 71 {
daniele 50:c3b337c38feb 72 pico_device_destroy(dev);
daniele 50:c3b337c38feb 73 }
daniele 50:c3b337c38feb 74
daniele 50:c3b337c38feb 75 struct pico_device *pico_mbed_usb_create(char *name, USBCDC_ECM *ecm)
daniele 50:c3b337c38feb 76 {
daniele 50:c3b337c38feb 77 std::uint8_t mac[PICO_SIZE_ETH];
daniele 50:c3b337c38feb 78 struct pico_device_mbed_usb *mb = (struct pico_device_mbed_usb*) pico_zalloc(sizeof(struct pico_device_mbed_usb));
daniele 50:c3b337c38feb 79
daniele 50:c3b337c38feb 80 if (!mb)
daniele 50:c3b337c38feb 81 return NULL;
daniele 50:c3b337c38feb 82
daniele 50:c3b337c38feb 83 if(0 != pico_device_init((struct pico_device *)mb, name, mac)) {
daniele 50:c3b337c38feb 84 __pc.printf ("ETH> Loop init failed.\n");
daniele 50:c3b337c38feb 85 //pico_loop_destroy(mb);
daniele 50:c3b337c38feb 86 return NULL;
daniele 50:c3b337c38feb 87 }
daniele 50:c3b337c38feb 88 mb->ecm = ecm;
daniele 50:c3b337c38feb 89 mb->dev.send = pico_mbed_usb_send;
daniele 50:c3b337c38feb 90 mb->dev.poll = pico_mbed_usb_poll;
daniele 50:c3b337c38feb 91 mb->dev.destroy = pico_mbed_usb_destroy;
daniele 50:c3b337c38feb 92 mb->bytes_left_in_frame = 0;
daniele 50:c3b337c38feb 93
daniele 50:c3b337c38feb 94 if(0 != ethernet_init()) {
daniele 50:c3b337c38feb 95 __pc.printf("ETH> Failed to initialize hardware.\r\n");
daniele 50:c3b337c38feb 96 pico_device_destroy((struct pico_device *)mb);
daniele 50:c3b337c38feb 97 return NULL;
daniele 50:c3b337c38feb 98 }
daniele 50:c3b337c38feb 99
daniele 50:c3b337c38feb 100 __pc.printf("ETH> Device %s created.\r\n", mb->dev.name);
daniele 50:c3b337c38feb 101
daniele 50:c3b337c38feb 102 return (struct pico_device *)mb;
daniele 50:c3b337c38feb 103 }
daniele 50:c3b337c38feb 104
daniele 50:c3b337c38feb 105 void pico_mbed_usb_get_address(char *mac)
daniele 50:c3b337c38feb 106 {
daniele 50:c3b337c38feb 107 /* TODO */
daniele 50:c3b337c38feb 108 }
daniele 50:c3b337c38feb 109
daniele 50:c3b337c38feb 110 }