CDC/ECM driver for mbed, based on USBDevice by mbed-official. Uses PicoTCP to access Ethernet USB device. License: GPLv2

Dependents:   USBEthernet_TEST

Fork of USB_Ethernet by Daniele Lacamera

Committer:
daniele
Date:
Sat Aug 03 13:16:14 2013 +0000
Revision:
2:540f6e142d59
Moved to single package

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 2:540f6e142d59 1 /*********************************************************************
daniele 2:540f6e142d59 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 2:540f6e142d59 3 See LICENSE and COPYING for usage.
daniele 2:540f6e142d59 4
daniele 2:540f6e142d59 5 Authors: Daniele Lacamera
daniele 2:540f6e142d59 6 *********************************************************************/
daniele 2:540f6e142d59 7
daniele 2:540f6e142d59 8
daniele 2:540f6e142d59 9 #include "pico_device.h"
daniele 2:540f6e142d59 10 #include "pico_dev_loop.h"
daniele 2:540f6e142d59 11 #include "pico_stack.h"
daniele 2:540f6e142d59 12
daniele 2:540f6e142d59 13
daniele 2:540f6e142d59 14 #define LOOP_MTU 1500
daniele 2:540f6e142d59 15 static uint8_t l_buf[LOOP_MTU];
daniele 2:540f6e142d59 16 static int l_bufsize = 0;
daniele 2:540f6e142d59 17
daniele 2:540f6e142d59 18
daniele 2:540f6e142d59 19 static int pico_loop_send(struct pico_device *dev, void *buf, int len)
daniele 2:540f6e142d59 20 {
daniele 2:540f6e142d59 21 if (len > LOOP_MTU)
daniele 2:540f6e142d59 22 return 0;
daniele 2:540f6e142d59 23
daniele 2:540f6e142d59 24 if (l_bufsize == 0) {
daniele 2:540f6e142d59 25 memcpy(l_buf, buf, len);
daniele 2:540f6e142d59 26 l_bufsize+=len;
daniele 2:540f6e142d59 27 return len;
daniele 2:540f6e142d59 28 }
daniele 2:540f6e142d59 29 return 0;
daniele 2:540f6e142d59 30 }
daniele 2:540f6e142d59 31
daniele 2:540f6e142d59 32 static int pico_loop_poll(struct pico_device *dev, int loop_score)
daniele 2:540f6e142d59 33 {
daniele 2:540f6e142d59 34 if (loop_score <= 0)
daniele 2:540f6e142d59 35 return 0;
daniele 2:540f6e142d59 36
daniele 2:540f6e142d59 37 if (l_bufsize > 0) {
daniele 2:540f6e142d59 38 pico_stack_recv(dev, l_buf, l_bufsize);
daniele 2:540f6e142d59 39 l_bufsize = 0;
daniele 2:540f6e142d59 40 loop_score--;
daniele 2:540f6e142d59 41 }
daniele 2:540f6e142d59 42 return loop_score;
daniele 2:540f6e142d59 43 }
daniele 2:540f6e142d59 44
daniele 2:540f6e142d59 45 /* Public interface: create/destroy. */
daniele 2:540f6e142d59 46
daniele 2:540f6e142d59 47 void pico_loop_destroy(struct pico_device *dev)
daniele 2:540f6e142d59 48 {
daniele 2:540f6e142d59 49 }
daniele 2:540f6e142d59 50
daniele 2:540f6e142d59 51 struct pico_device *pico_loop_create(void)
daniele 2:540f6e142d59 52 {
daniele 2:540f6e142d59 53 struct pico_device *loop = pico_zalloc(sizeof(struct pico_device));
daniele 2:540f6e142d59 54 if (!loop)
daniele 2:540f6e142d59 55 return NULL;
daniele 2:540f6e142d59 56
daniele 2:540f6e142d59 57 if( 0 != pico_device_init((struct pico_device *)loop, "loop", NULL)) {
daniele 2:540f6e142d59 58 dbg ("Loop init failed.\n");
daniele 2:540f6e142d59 59 pico_loop_destroy((struct pico_device *)loop);
daniele 2:540f6e142d59 60 return NULL;
daniele 2:540f6e142d59 61 }
daniele 2:540f6e142d59 62 loop->send = pico_loop_send;
daniele 2:540f6e142d59 63 loop->poll = pico_loop_poll;
daniele 2:540f6e142d59 64 loop->destroy = pico_loop_destroy;
daniele 2:540f6e142d59 65 dbg("Device %s created.\n", loop->name);
daniele 2:540f6e142d59 66 return (struct pico_device *)loop;
daniele 2:540f6e142d59 67 }
daniele 2:540f6e142d59 68